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();
}