Uploaded image for project: 'XWiki Platform'
  1. XWiki Platform
  2. XWIKI-22102

Solr search redirect replaces facet parameters

    XMLWordPrintable

Details

    • Bug
    • Resolution: Unresolved
    • Major
    • None
    • 16.2.0
    • Search - Solr
    • None
    • Unknown

    Description

      See how, in the following requests, f_type=OBJECT_PROPERTY is dropped / replaced with f_type=DOCUMENT.

      curl --head 'http://localhost:8080/xwiki/bin/view/Main/Search?text=Hello&f_type=OBJECT_PROPERTY&f_locale=en&f_locale='
      HTTP/1.1 302 Found

      Location: http://localhost:8080/xwiki/bin/view/Main/Search?text=Hello&f_type=DOCUMENT&f_locale=en&f_locale=&r=1

      curl --head 'http://localhost:8091/xwiki/bin/view/Main/Search?text=Hello&f_type=DOCUMENT&f_type=OBJECT_PROPERTY&f_locale=en&f_locale='
      HTTP/1.1 302 Found

      Location: http://localhost:8080/xwiki/bin/view/Main/Search?text=Hello&f_type=DOCUMENT&f_locale=en&f_locale=&r=1

      After investigation, this seems to happen in macro handleSolrSearchRequest, in xwiki-platform/xwiki-platform-core/xwiki-platform-search/xwiki-platform-search-solr/xwiki-platform-search-solr-ui/src/main/resources/Main/SolrSearchMacros.xml, when it calls extendQueryString.

      extendQueryString doesn't extend, but overwrites, because its extraParameters is a Map<String, String> while $request.getParameterMap() is a Map<String, String[]> (or something equivalent), so its second addAll call overwrites everything.

      The following "fixed" version of extendQueryString behaves as I would expect, where parameters in $extraParameters are added to the existing parameters, if not already there, keeping the order (though I'm not sure this last part matters much in the case of Solr. (By the way, extendQueryString seems like a useful function to expose more generally to velocity code in XWiki).

      I don't know if this "fixed" version has unwanted side effects though.

      #macro (extendQueryString $url $extraParameters)
        #set ($parameters = {})
        #set ($discard = $parameters.putAll($request.getParameterMap()))
        #foreach ($entry in $extraParameters.entrySet())
           #set ($currentValues = $parameters[$entry.key])
           #if ($objecttool.isNull($currentValues))
             #set ($extendedValue = $entry.value)
           #else
             #set ($extendedValue = $collectiontool.getOrderedSet())
             #foreach ($v in $currentValues)
               #set ($discard = $extendedValue.add($v))
             #end
             #set ($discard = $extendedValue.add($entry.value))
             #set ($discard = $parameters.put($entry.key, $extendedValue))
           #end
        #end
        #set ($queryString = $escapetool.url($parameters))
        #set ($url = $NULL)
        #setVariable("$url" $doc.getURL('view', $queryString))
      #end
      

      Attachments

        Activity

          People

            Unassigned Unassigned
            rjakse Raphaƫl Jakse
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated: