You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mk...@apache.org on 2017/04/27 10:07:10 UTC
lucene-solr:branch_6x: SOLR-10500: fix many parents with nested
children per /update/json/docs request
Repository: lucene-solr
Updated Branches:
refs/heads/branch_6x e40044fa4 -> 1791f6924
SOLR-10500: fix many parents with nested children per /update/json/docs request
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/1791f692
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/1791f692
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/1791f692
Branch: refs/heads/branch_6x
Commit: 1791f6924a063867e04b53fc85bfbef0f26af2c7
Parents: e40044f
Author: Mikhail Khludnev <mk...@apache.org>
Authored: Thu Apr 27 13:01:07 2017 +0300
Committer: Mikhail Khludnev <mk...@apache.org>
Committed: Thu Apr 27 13:06:39 2017 +0300
----------------------------------------------------------------------
solr/CHANGES.txt | 3 +
.../org/apache/solr/handler/JsonLoaderTest.java | 139 ++++++++++++++-----
.../solr/common/util/JsonRecordReader.java | 1 +
3 files changed, 106 insertions(+), 37 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1791f692/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 0c37304..d5bee36 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -151,6 +151,9 @@ Bug Fixes
* SOLR-10526: facet.heatmap didn't honor facet exclusions ('ex') for distributed search. (David Smiley)
+* SOLR-10500: nested child docs are adopted by neighbour when several parents come in update/json/docs
+ (Alexey Suprun,noble via Mikhail Khludnev)
+
Other Changes
----------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1791f692/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java b/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java
index 5ca51c8..f193165 100644
--- a/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java
@@ -31,10 +31,14 @@ import org.apache.solr.update.processor.BufferingRequestProcessor;
import org.junit.BeforeClass;
import org.junit.Test;
import org.noggit.ObjectBuilder;
+
+import java.util.Collections;
import java.util.List;
import java.util.Map;
+import java.util.function.UnaryOperator;
public class JsonLoaderTest extends SolrTestCaseJ4 {
+
@BeforeClass
public static void beforeTests() throws Exception {
initCore("solrconfig.xml","schema.xml");
@@ -385,51 +389,112 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
assertEquals(d.getFieldValue("e"), "e2");
assertEquals(d.getFieldValue("d.p"), "q");
- json = "{\n" +
- " \"id\": \"1\",\n" +
- " \"name\": \"i am the parent\",\n" +
- " \"cat\": \"parent\",\n" +
- " \"children\": [\n" +
- " {\n" +
- " \"id\": \"1.1\",\n" +
- " \"name\": \"i am the 1st child\",\n" +
- " \"cat\": \"child\"\n" +
- " },\n" +
- " {\n" +
- " \"id\": \"1.2\",\n" +
- " \"name\": \"i am the 2nd child\",\n" +
- " \"cat\": \"child\",\n" +
- " \"grandchildren\": [\n" +
- " {\n" +
- " \"id\": \"1.2.1\",\n" +
- " \"name\": \"i am the grandchild\",\n" +
- " \"cat\": \"grandchild\"\n" +
- " }\n" +
- " ]\n" +
- " }\n" +
- " ]\n" +
- "}";
- req = req(
- "split", "/|/children|/children/grandchildren",
- "f","$FQN:/**",
- "f", "id:/children/id",
- "f", "/name",
- "f", "/children/name",
- "f", "cat:/children/cat",
- "f", "id:/children/grandchildren/id",
- "f", "name:/children/grandchildren/name",
- "f", "cat:/children/grandchildren/cat");
+ req = req(PARENT_TWO_CHILDREN_PARAMS);
req.getContext().put("path", "/update/json/docs");
rsp = new SolrQueryResponse();
p = new BufferingRequestProcessor(null);
loader = new JsonLoader();
- loader.load(req, rsp, new ContentStreamBase.StringStream(json), p);
+ loader.load(req, rsp, new ContentStreamBase.StringStream(PARENT_TWO_CHILDREN_JSON), p);
assertEquals(2, p.addCommands.get(0).solrDoc.getChildDocuments().size());
assertEquals(1, p.addCommands.get(0).solrDoc.getChildDocuments().get(1).getChildDocuments().size());
}
-
-
+
+ private static final String PARENT_TWO_CHILDREN_JSON = "{\n" +
+ " \"id\": \"1\",\n" +
+ " \"name\": \"i am the parent\",\n" +
+ " \"cat\": \"parent\",\n" +
+ " \"children\": [\n" +
+ " {\n" +
+ " \"id\": \"1.1\",\n" +
+ " \"name\": \"i am the 1st child\",\n" +
+ " \"cat\": \"child\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"id\": \"1.2\",\n" +
+ " \"name\": \"i am the 2nd child\",\n" +
+ " \"cat\": \"child\",\n" +
+ " \"grandchildren\": [\n" +
+ " {\n" +
+ " \"id\": \"1.2.1\",\n" +
+ " \"name\": \"i am the grandchild\",\n" +
+ " \"cat\": \"grandchild\"\n" +
+ " }\n" +
+ " ]\n" +
+ " }\n" +
+ " ]\n" +
+ "}";
+
+ private static final String[] PARENT_TWO_CHILDREN_PARAMS = new String[] { "split", "/|/children|/children/grandchildren",
+ "f","$FQN:/**",
+ "f", "id:/children/id",
+ "f", "/name",
+ "f", "/children/name",
+ "f", "cat:/children/cat",
+ "f", "id:/children/grandchildren/id",
+ "f", "name:/children/grandchildren/name",
+ "f", "cat:/children/grandchildren/cat"};
+
+ public void testFewParentsJsonDoc() throws Exception {
+ String json = PARENT_TWO_CHILDREN_JSON;
+ SolrQueryRequest req;
+ SolrQueryResponse rsp;
+ BufferingRequestProcessor p;
+ JsonLoader loader;
+ { //multichild test case
+ final boolean array = random().nextBoolean();
+ StringBuilder b = new StringBuilder();
+ if (array) {
+ b.append("[");
+ }
+ final int passes = atLeast(2);
+ for (int i=1;i<=passes;i++){
+ b.append(json.replace("1",""+i));
+ if (array) {
+ b.append(i<passes ? "," :"]");
+ }
+ }
+
+ req = req(PARENT_TWO_CHILDREN_PARAMS);
+ req.getContext().put("path", "/update/json/docs");
+ rsp = new SolrQueryResponse();
+ p = new BufferingRequestProcessor(null);
+ loader = new JsonLoader();
+ loader.load(req, rsp, new ContentStreamBase.StringStream(b.toString()), p);
+ for (int i=1; i<=passes; i++){
+ final int ii = i;
+ UnaryOperator<String> s = (v)-> v.replace("1",""+ii);
+ final SolrInputDocument parent = p.addCommands.get(i-1).solrDoc;
+ assertOnlyValue(s.apply("1"), parent,"id");
+ assertOnlyValue("i am the parent", parent, "name");
+ assertOnlyValue("parent", parent, "cat");
+
+ assertEquals(2, parent.getChildDocuments().size());
+ {
+ final SolrInputDocument child1 = parent.getChildDocuments().get(0);
+ assertOnlyValue(s.apply("1.1"), child1, "id");
+ assertOnlyValue(s.apply("i am the 1st child"), child1, "name");
+ assertOnlyValue("child", child1,"cat");
+ }
+ {
+ final SolrInputDocument child2 = parent.getChildDocuments().get(1);
+ assertOnlyValue(s.apply("1.2"), child2, "id");
+ assertOnlyValue("i am the 2nd child", child2, "name");
+ assertOnlyValue("child", child2, "cat");
+
+ assertEquals(1, child2.getChildDocuments().size());
+ final SolrInputDocument grandChild = child2.getChildDocuments().get(0);
+ assertOnlyValue(s.apply("1.2.1"), grandChild,"id");
+ assertOnlyValue("i am the grandchild", grandChild, "name");
+ assertOnlyValue("grandchild", grandChild, "cat");
+ }
+ }
+ }
+ }
+
+ private static void assertOnlyValue(String expected, SolrInputDocument doc, String field) {
+ assertEquals(Collections.singletonList(expected), doc.getFieldValues(field));
+ }
public void testExtendedFieldValues() throws Exception {
String str = "[{'id':'1', 'val_s':{'add':'foo'}}]".replace('\'', '"');
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1791f692/solr/solrj/src/java/org/apache/solr/common/util/JsonRecordReader.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/JsonRecordReader.java b/solr/solrj/src/java/org/apache/solr/common/util/JsonRecordReader.java
index 4dafd39..24adb90 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/JsonRecordReader.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/JsonRecordReader.java
@@ -433,6 +433,7 @@ public class JsonRecordReader {
for (String fld : valuesAddedinThisFrame) {
values.remove(fld);
}
+ values.remove(null);
}
}
}