SOLR-7059: Using paramset with multi-valued keys leads to a 500. SolrParams need an aray instead of a list

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1655541 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Noble Paul 2015-01-29 07:40:32 +00:00
parent ce8efb0d93
commit 7121dbc494
4 changed files with 72 additions and 11 deletions

View File

@ -23,6 +23,7 @@ import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.solr.cloud.ZkSolrResourceLoader;
@ -58,7 +59,7 @@ public class RequestParams implements MapSerializable{
Map.Entry e = (Map.Entry) o;
if (e.getValue() instanceof Map) {
Map value = (Map) e.getValue();
Map copy = new LinkedHashMap<>(value);
Map copy = getMapCopy(value);
Map meta = (Map) copy.remove("");
this.paramsets.put((String) e.getKey(), new VersionedParams(Collections.unmodifiableMap(copy) ,meta));
}
@ -67,6 +68,32 @@ public class RequestParams implements MapSerializable{
this.znodeVersion = znodeVersion;
}
private static Map getMapCopy(Map value) {
Map copy = new LinkedHashMap<>();
for (Object o1 : value.entrySet()) {
Map.Entry entry = (Map.Entry) o1;
if("".equals( entry.getKey())){
copy.put(entry.getKey(),entry.getValue());
continue;
}
if (entry.getValue() != null) {
if (entry.getValue() instanceof List) {
List l = (List) entry.getValue();
String[] sarr = new String[l.size()];
for (int i = 0; i < l.size(); i++) {
if( l.get(i) != null) sarr[i]= String.valueOf(l.get(i));
}
copy.put(entry.getKey(), sarr);
} else {
copy.put(entry.getKey(), String.valueOf(entry.getValue()));
}
} else {
copy.put(entry.getKey(), entry.getValue());
}
}
return copy;
}
public VersionedParams getParams(String name){
return paramsets.get(name);
}
@ -77,7 +104,7 @@ public class RequestParams implements MapSerializable{
@Override
public Map<String, Object> toMap() {
return getMapWithVersion(data,znodeVersion);
return getMapWithVersion(data, znodeVersion);
}
public static Map<String, Object> getMapWithVersion(Map<String, Object> data, int znodeVersion) {

View File

@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableList;
import org.apache.commons.io.FileUtils;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.handler.TestSolrConfigHandlerCloud;
import org.apache.solr.handler.TestSolrConfigHandlerConcurrent;
import org.apache.solr.util.RestTestBase;
import org.apache.solr.util.RestTestHarness;
@ -47,8 +48,10 @@ import java.util.SortedMap;
import java.util.TreeMap;
import java.util.concurrent.TimeUnit;
import static java.util.Arrays.asList;
import static org.apache.solr.core.ConfigOverlay.getObjectByPath;
import static org.apache.solr.handler.TestBlobHandler.getAsString;
import static org.apache.solr.handler.TestSolrConfigHandlerCloud.compareValues;
public class TestSolrConfigHandler extends RestTestBase {
public static final Logger log = LoggerFactory.getLogger(TestSolrConfigHandler.class);
@ -341,7 +344,8 @@ public class TestSolrConfigHandler extends RestTestBase {
payload = " {\n" +
" 'set' : {'y':{\n" +
" 'c':'CY val',\n" +
" 'b': 'BY val'}\n" +
" 'b': 'BY val', " +
" 'd': ['val 1', 'val 2']}\n" +
" }\n" +
" }";
@ -384,6 +388,15 @@ public class TestSolrConfigHandler extends RestTestBase {
null,
5);
TestSolrConfigHandler.testForResponseElement(
harness,
null,
"/dump1?wt=json&useParams=y",
null,
Arrays.asList("params", "d"),
Arrays.asList("val 1", "val 2") ,
5);
payload = " {\n" +
" 'update' : {'y': {\n" +
" 'c':'CY val modified',\n" +

View File

@ -20,10 +20,12 @@ package org.apache.solr.handler;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
@ -174,7 +176,9 @@ public class TestSolrConfigHandlerCloud extends AbstractFullDistribZkTestBase {
payload = " {\n" +
" 'set' : {'y':{\n" +
" 'c':'CY val',\n" +
" 'b': 'BY val'}\n" +
" 'b': 'BY val', " +
" 'i': 20, " +
" 'd': ['val 1', 'val 2']}\n" +
" }\n" +
" }";
@ -189,6 +193,8 @@ public class TestSolrConfigHandlerCloud extends AbstractFullDistribZkTestBase {
asList("response", "params", "y", "c"),
"CY val",
10);
compareValues(result, 20l, asList("response", "params", "y", "i"));
result = TestSolrConfigHandler.testForResponseElement(null,
urls.get(random().nextInt(urls.size())),
@ -199,6 +205,8 @@ public class TestSolrConfigHandlerCloud extends AbstractFullDistribZkTestBase {
5);
compareValues(result, "BY val", asList("params", "b"));
compareValues(result, null, asList("params", "a"));
compareValues(result, Arrays.asList("val 1", "val 2") , asList("params", "d"));
compareValues(result, "20" , asList("params", "i"));
payload = " {\n" +
" 'update' : {'y': {\n" +
" 'c':'CY val modified',\n" +
@ -256,7 +264,7 @@ public class TestSolrConfigHandlerCloud extends AbstractFullDistribZkTestBase {
}
public static void compareValues(Map result, String expected, List<String> jsonPath) {
public static void compareValues(Map result, Object expected, List<String> jsonPath) {
assertTrue(MessageFormat.format("Could not get expected value {0} for path {1} full output {2}", expected, jsonPath, getAsString(result)),
Objects.equals(expected, ConfigOverlay.getObjectByPath(result, false, jsonPath)));
}

View File

@ -19,6 +19,7 @@ package org.apache.solr.common.params;
import org.apache.solr.common.util.StrUtils;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import java.io.IOException;
@ -35,13 +36,22 @@ public class MapSolrParams extends SolrParams {
@Override
public String get(String name) {
return map.get(name);
Object o = map.get(name);
if(o == null) return null;
if (o instanceof String) return (String) o;
if (o instanceof String[]) {
String[] strings = (String[]) o;
if(strings.length == 0) return null;
return strings[0];
}
return String.valueOf(o);
}
@Override
public String[] getParams(String name) {
String val = map.get(name);
return val==null ? null : new String[]{val};
Object val = map.get(name);
if (val instanceof String[]) return (String[]) val;
return val==null ? null : new String[]{String.valueOf(val)};
}
@Override
@ -59,13 +69,16 @@ public class MapSolrParams extends SolrParams {
for (Map.Entry<String,String> entry : map.entrySet()) {
String key = entry.getKey();
String val = entry.getValue();
Object val = entry.getValue();
if (val instanceof String[]) {
String[] strings = (String[]) val;
val = StrUtils.join(Arrays.asList(strings),',');
}
if (!first) sb.append('&');
first=false;
sb.append(key);
sb.append('=');
StrUtils.partialURLEncodeVal(sb, val==null ? "" : val);
StrUtils.partialURLEncodeVal(sb, val==null ? "" : String.valueOf(val));
}
}
catch (IOException e) {throw new RuntimeException(e);} // can't happen