You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-dev@lucene.apache.org by "Nestor Oviedo (JIRA)" <ji...@apache.org> on 2009/12/17 16:35:18 UTC

[jira] Updated: (SOLR-1666) SolrParams conversion to NamedList and back to SolrParams misses the Arrays with more than one value

     [ https://issues.apache.org/jira/browse/SOLR-1666?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Nestor Oviedo updated SOLR-1666:
--------------------------------

    Description: 
When a parameter in a SolrParams instance is an Array that has more than one element, the method SolrParams.toNamedList() generates a NamedList<Object> correctly, but when the method SolrParams.toSolrParams() is invoked with that NamedList instance, the resultant SolrParams instance has that parameter as a String, wich is the result of the String[].toString() method.

TestCase:

{code}
public class TestDismaxQParserPlugin extends DisMaxQParserPlugin {
	private Log log = LogFactory.getLog(this.getClass());
	public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {

		// TestCase with the param facet.field
		if(params.getParams(FacetParams.FACET_FIELD) != null) {
			// Original Values
			log.debug("FACET.FIELD Param - Before");
			String[] facetFieldBefore = params.getParams(FacetParams.FACET_FIELD);
			log.debug("toString():"+facetFieldBefore.toString());
			log.debug("length:"+facetFieldBefore.length);
			log.debug("Elements:");
			for(String value : facetFieldBefore) 
				log.debug("[class "+value.getClass().getName()+"] "+value);
			
			// Transforming
			NamedList<Object> paramsList = params.toNamedList();
			params = SolrParams.toSolrParams(paramsList);

			// Result Values
			log.debug("FACET.FIELD Param - After");
			String[] facetFieldAfter = params.getParams(FacetParams.FACET_FIELD);
			log.debug("toString():"+facetFieldAfter.toString());
			log.debug("length:"+facetFieldAfter.length);
			log.debug("Elements:");
			for(String value : facetFieldAfter) 
				log.debug("[class "+value.getClass().getName()+"] "+value);
		} else {
			log.debug("FACET.FIELD NOT SPECIFIED");
		}
		return super.createParser(qstr, localParams, params, req);
	}
}
{code}

Editing the solrconfig.xml file for this QueryParser to be used and using an URL like "http://host:port/path/select?q=something&facet=true&facet.field=subject&facet.field=date" the output is (only the interesting lines):

FINA: FACET.FIELD Param - Before
FINA: toString():[Ljava.lang.String;@c96ad7c
FINA: length:2
FINA: Elements:
FINA: [class java.lang.String] subject
FINA: [class java.lang.String] date
FINA: FACET.FIELD Param - After
FINA: toString():[Ljava.lang.String;@44775121
FINA: length:1
FINA: Elements:
FINA: [class java.lang.String] [Ljava.lang.String;@c96ad7c



  was:
When a parameter in a SolrParams instance is an Array that has more than one element, the method SolrParams.toNamedList() generates a NamedList<Object> correctly, but when the method SolrParams.toSolrParams() is invoked with that NamedList instance, the resultant SolrParams instance has that parameter as a String, wich is the result of the String[].toString() method.

TestCase:

public class TestDismaxQParserPlugin extends DisMaxQParserPlugin {
	private Log log = LogFactory.getLog(this.getClass());
	public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {

		// TestCase with the param facet.field
		if(params.getParams(FacetParams.FACET_FIELD) != null) {
			// Original Values
			log.debug("FACET.FIELD Param - Before");
			String[] facetFieldBefore = params.getParams(FacetParams.FACET_FIELD);
			log.debug("toString():"+facetFieldBefore.toString());
			log.debug("length:"+facetFieldBefore.length);
			log.debug("Elements:");
			for(String value : facetFieldBefore) 
				log.debug("[class "+value.getClass().getName()+"] "+value);
			
			// Transforming
			NamedList<Object> paramsList = params.toNamedList();
			params = SolrParams.toSolrParams(paramsList);

			// Result Values
			log.debug("FACET.FIELD Param - After");
			String[] facetFieldAfter = params.getParams(FacetParams.FACET_FIELD);
			log.debug("toString():"+facetFieldAfter.toString());
			log.debug("length:"+facetFieldAfter.length);
			log.debug("Elements:");
			for(String value : facetFieldAfter) 
				log.debug("[class "+value.getClass().getName()+"] "+value);
		} else {
			log.debug("FACET.FIELD NOT SPECIFIED");
		}
		return super.createParser(qstr, localParams, params, req);
	}
}

Editing the solrconfig.xml file for this QueryParser to be used and using an URL like "http://host:port/path/select?q=something&facet=true&facet.field=subject&facet.field=date" the output is (only the interesting lines):

FINA: FACET.FIELD Param - Before
FINA: toString():[Ljava.lang.String;@c96ad7c
FINA: length:2
FINA: Elements:
FINA: [class java.lang.String] subject
FINA: [class java.lang.String] date
FINA: FACET.FIELD Param - After
FINA: toString():[Ljava.lang.String;@44775121
FINA: length:1
FINA: Elements:
FINA: [class java.lang.String] [Ljava.lang.String;@c96ad7c




> SolrParams conversion to NamedList and back to SolrParams misses the Arrays with more than one value
> ----------------------------------------------------------------------------------------------------
>
>                 Key: SOLR-1666
>                 URL: https://issues.apache.org/jira/browse/SOLR-1666
>             Project: Solr
>          Issue Type: Bug
>          Components: search
>    Affects Versions: 1.3, 1.4
>            Reporter: Nestor Oviedo
>            Priority: Minor
>
> When a parameter in a SolrParams instance is an Array that has more than one element, the method SolrParams.toNamedList() generates a NamedList<Object> correctly, but when the method SolrParams.toSolrParams() is invoked with that NamedList instance, the resultant SolrParams instance has that parameter as a String, wich is the result of the String[].toString() method.
> TestCase:
> {code}
> public class TestDismaxQParserPlugin extends DisMaxQParserPlugin {
> 	private Log log = LogFactory.getLog(this.getClass());
> 	public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
> 		// TestCase with the param facet.field
> 		if(params.getParams(FacetParams.FACET_FIELD) != null) {
> 			// Original Values
> 			log.debug("FACET.FIELD Param - Before");
> 			String[] facetFieldBefore = params.getParams(FacetParams.FACET_FIELD);
> 			log.debug("toString():"+facetFieldBefore.toString());
> 			log.debug("length:"+facetFieldBefore.length);
> 			log.debug("Elements:");
> 			for(String value : facetFieldBefore) 
> 				log.debug("[class "+value.getClass().getName()+"] "+value);
> 			
> 			// Transforming
> 			NamedList<Object> paramsList = params.toNamedList();
> 			params = SolrParams.toSolrParams(paramsList);
> 			// Result Values
> 			log.debug("FACET.FIELD Param - After");
> 			String[] facetFieldAfter = params.getParams(FacetParams.FACET_FIELD);
> 			log.debug("toString():"+facetFieldAfter.toString());
> 			log.debug("length:"+facetFieldAfter.length);
> 			log.debug("Elements:");
> 			for(String value : facetFieldAfter) 
> 				log.debug("[class "+value.getClass().getName()+"] "+value);
> 		} else {
> 			log.debug("FACET.FIELD NOT SPECIFIED");
> 		}
> 		return super.createParser(qstr, localParams, params, req);
> 	}
> }
> {code}
> Editing the solrconfig.xml file for this QueryParser to be used and using an URL like "http://host:port/path/select?q=something&facet=true&facet.field=subject&facet.field=date" the output is (only the interesting lines):
> FINA: FACET.FIELD Param - Before
> FINA: toString():[Ljava.lang.String;@c96ad7c
> FINA: length:2
> FINA: Elements:
> FINA: [class java.lang.String] subject
> FINA: [class java.lang.String] date
> FINA: FACET.FIELD Param - After
> FINA: toString():[Ljava.lang.String;@44775121
> FINA: length:1
> FINA: Elements:
> FINA: [class java.lang.String] [Ljava.lang.String;@c96ad7c

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.