You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ds...@apache.org on 2017/04/05 12:59:59 UTC

lucene-solr:branch_6x: SOLR-10404: fetch() streaming expression: escape values in generated query.

Repository: lucene-solr
Updated Branches:
  refs/heads/branch_6x 29b59f593 -> 048705e0e


SOLR-10404: fetch() streaming expression: escape values in generated query.

(cherry picked from commit cb9f151)


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/048705e0
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/048705e0
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/048705e0

Branch: refs/heads/branch_6x
Commit: 048705e0e47ac04b6914e73c7ec3cc8daa12f2e0
Parents: 29b59f5
Author: David Smiley <ds...@apache.org>
Authored: Wed Apr 5 08:56:50 2017 -0400
Committer: David Smiley <ds...@apache.org>
Committed: Wed Apr 5 08:59:51 2017 -0400

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  3 +++
 .../client/solrj/io/stream/FetchStream.java     | 20 +++++++-------------
 .../solrj/io/stream/StreamExpressionTest.java   | 18 +++++++++++++++++-
 3 files changed, 27 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/048705e0/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index e66d722..d80a0cc 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -135,6 +135,9 @@ Bug Fixes
 * SOLR-10421: Fix params persistence for solr/contrib/ltr (MinMax|Standard)Normalizer classes.
   (Jianxiong Dong, Christine Poerschke)
 
+* SOLR-10404: The fetch() streaming expression wouldn't work if a value included query syntax chars (like :+-).
+  Fixed, and enhanced the generated query to not pollute the queryCache. (David Smiley)
+
 ==================  6.5.0 ==================
 
 Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/048705e0/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/FetchStream.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/FetchStream.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/FetchStream.java
index 06e6fdc..2cd60ec 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/FetchStream.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/FetchStream.java
@@ -35,6 +35,7 @@ import org.apache.solr.client.solrj.io.stream.expr.StreamExpression;
 import org.apache.solr.client.solrj.io.stream.expr.StreamExpressionNamedParameter;
 import org.apache.solr.client.solrj.io.stream.expr.StreamExpressionValue;
 import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
+import org.apache.solr.client.solrj.util.ClientUtils;
 import org.apache.solr.common.params.ModifiableSolrParams;
 
 import static org.apache.solr.common.params.CommonParams.SORT;
@@ -208,9 +209,8 @@ public class FetchStream extends TupleStream implements Expressible {
   }
 
   private void fetchBatch() throws IOException {
-
     Tuple EOFTuple = null;
-    List<Tuple> batch = new ArrayList();
+    List<Tuple> batch = new ArrayList<>(batchSize);
     for(int i=0; i<batchSize; i++) {
       Tuple tuple = stream.read();
       if(tuple.EOF) {
@@ -222,18 +222,12 @@ public class FetchStream extends TupleStream implements Expressible {
     }
 
     if(batch.size() > 0) {
-      StringBuilder buf = new StringBuilder();
-      buf.append(rightKey);
-      buf.append(":(");
-      for (int i = 0; i < batch.size(); i++) {
-        if (i > 0) {
-          buf.append(" ");
-        }
-        Tuple tuple = batch.get(i);
+      StringBuilder buf = new StringBuilder(batch.size() * 10 + 20);
+      buf.append("{! df=").append(rightKey).append(" q.op=OR cache=false }");//disable queryCache
+      for (Tuple tuple : batch) {
         String key = tuple.getString(leftKey);
-        buf.append(key);
+        buf.append(' ').append(ClientUtils.escapeQueryChars(key));
       }
-      buf.append(")");
 
       ModifiableSolrParams params = new ModifiableSolrParams();
       params.add("q", buf.toString());
@@ -245,7 +239,7 @@ public class FetchStream extends TupleStream implements Expressible {
       StreamContext newContext = new StreamContext();
       newContext.setSolrClientCache(streamContext.getSolrClientCache());
       cloudSolrStream.setStreamContext(newContext);
-      Map<String, Tuple> fetched = new HashMap();
+      Map<String, Tuple> fetched = new HashMap<>();
       try {
         cloudSolrStream.open();
         while (true) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/048705e0/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
index f153a1b..581013f 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
@@ -1044,7 +1044,7 @@ public class StreamExpressionTest extends SolrCloudTestCase {
   @Test
   public void testFetchStream() throws Exception {
 
-    SolrClientCache solrClientCache = new SolrClientCache();
+    SolrClientCache solrClientCache = new SolrClientCache();//TODO share in @Before ; close in @After ?
 
     new UpdateRequest()
         .add(id, "0", "a_s", "hello0", "a_i", "0", "a_f", "1", "subject", "blah blah blah 0")
@@ -1123,6 +1123,22 @@ public class StreamExpressionTest extends SolrCloudTestCase {
     assertTrue("blah blah blah 8".equals(t.getString("subject")));
     t = tuples.get(9);
     assertTrue("blah blah blah 9".equals(t.getString("subject")));
+
+    // SOLR-10404 test that "hello 99" as a value gets escaped
+    new UpdateRequest()
+        .add(id, "99", "a1_s", "hello 99", "a2_s", "hello 99", "subject", "blah blah blah 99")
+        .commit(cluster.getSolrClient(), COLLECTIONORALIAS);
+
+    stream = factory.constructStream("fetch("+ COLLECTIONORALIAS +",  search(" + COLLECTIONORALIAS + ", q=" + id + ":99, fl=\"id,a1_s\", sort=\"id asc\"), on=\"a1_s=a2_s\", fl=\"subject\")");
+    context = new StreamContext();
+    context.setSolrClientCache(solrClientCache);
+    stream.setStreamContext(context);
+    tuples = getTuples(stream);
+
+    assertEquals(1, tuples.size());
+    t = tuples.get(0);
+    assertTrue("blah blah blah 99".equals(t.getString("subject")));
+
     solrClientCache.close();
   }