This is an automated email from the ASF dual-hosted git repository. jsweeney pushed a commit to branch SOLR-17022-glob-patterns-export-stream-handlers in repository https://gitbox.apache.org/repos/asf/solr.git
commit fe66c1fb38b83a337594d05db55a0e55ee76e7c0 Author: Justin Sweeney <[email protected]> AuthorDate: Tue Oct 10 13:55:18 2023 -0400 Adding support for glob expression for fields in SelectStream --- solr/solrj-streaming/build.gradle | 1 + .../solr/client/solrj/io/stream/SelectStream.java | 29 ++++++++++++++++++++-- .../io/stream/StreamExpressionToExpessionTest.java | 3 ++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/solr/solrj-streaming/build.gradle b/solr/solrj-streaming/build.gradle index 9e4b6b4f3cc..b5c2de8cbe6 100644 --- a/solr/solrj-streaming/build.gradle +++ b/solr/solrj-streaming/build.gradle @@ -27,6 +27,7 @@ dependencies { implementation 'org.apache.httpcomponents:httpclient' implementation 'org.apache.httpcomponents:httpcore' implementation 'org.apache.commons:commons-math3' + implementation 'commons-io:commons-io' testImplementation project(':solr:test-framework') testImplementation project(':solr:core') diff --git a/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/SelectStream.java b/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/SelectStream.java index 80219e797bb..57cc75985eb 100644 --- a/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/SelectStream.java +++ b/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/SelectStream.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; +import org.apache.commons.io.FilenameUtils; import org.apache.solr.client.solrj.io.Tuple; import org.apache.solr.client.solrj.io.comp.StreamComparator; import org.apache.solr.client.solrj.io.eval.EvaluatorException; @@ -52,14 +53,21 @@ public class SelectStream extends TupleStream implements Expressible { private TupleStream stream; private StreamContext streamContext; private Map<String, String> selectedFields; + private List<String> selectedFieldGlobPatterns; private Map<StreamEvaluator, String> selectedEvaluators; private List<StreamOperation> operations; public SelectStream(TupleStream stream, List<String> selectedFields) throws IOException { this.stream = stream; this.selectedFields = new HashMap<>(); + this.selectedFieldGlobPatterns = new ArrayList<>(); for (String selectedField : selectedFields) { - this.selectedFields.put(selectedField, selectedField); + if (selectedField.contains("*")) { + // selected field is a glob pattern + this.selectedFieldGlobPatterns.add(selectedField); + } else { + this.selectedFields.put(selectedField, selectedField); + } } operations = new ArrayList<>(); selectedEvaluators = new LinkedHashMap<>(); @@ -68,6 +76,7 @@ public class SelectStream extends TupleStream implements Expressible { public SelectStream(TupleStream stream, Map<String, String> selectedFields) throws IOException { this.stream = stream; this.selectedFields = selectedFields; + selectedFieldGlobPatterns = new ArrayList<>(); operations = new ArrayList<>(); selectedEvaluators = new LinkedHashMap<>(); } @@ -123,6 +132,7 @@ public class SelectStream extends TupleStream implements Expressible { stream = factory.constructStream(streamExpressions.get(0)); selectedFields = new HashMap<>(); + selectedFieldGlobPatterns = new ArrayList<>(); selectedEvaluators = new LinkedHashMap<>(); for (StreamExpressionParameter parameter : selectAsFieldsExpressions) { StreamExpressionValue selectField = (StreamExpressionValue) parameter; @@ -175,7 +185,11 @@ public class SelectStream extends TupleStream implements Expressible { selectedFields.put(asValue, asName); } } else { - selectedFields.put(value, value); + if (value.contains("*")) { + selectedFieldGlobPatterns.add(value); + } else { + selectedFields.put(value, value); + } } } @@ -217,6 +231,11 @@ public class SelectStream extends TupleStream implements Expressible { } } + // selected glob patterns + for (String selectFieldGlobPattern : selectedFieldGlobPatterns) { + expression.addParameter(selectFieldGlobPattern); + } + // selected evaluators for (Map.Entry<StreamEvaluator, String> selectedEvaluator : selectedEvaluators.entrySet()) { expression.addParameter( @@ -308,6 +327,12 @@ public class SelectStream extends TupleStream implements Expressible { workingForEvaluators.put(fieldName, original.get(fieldName)); if (selectedFields.containsKey(fieldName)) { workingToReturn.put(selectedFields.get(fieldName), original.get(fieldName)); + } else { + for (String globPattern : selectedFieldGlobPatterns) { + if (FilenameUtils.wildcardMatch(fieldName, globPattern)) { + workingToReturn.put(fieldName, original.get(fieldName)); + } + } } } diff --git a/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionToExpessionTest.java b/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionToExpessionTest.java index 4069b671b32..2c941f142d7 100644 --- a/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionToExpessionTest.java +++ b/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionToExpessionTest.java @@ -105,7 +105,7 @@ public class StreamExpressionToExpessionTest extends SolrTestCase { try (SelectStream stream = new SelectStream( StreamExpressionParser.parse( - "select(\"a_s as fieldA\", search(collection1, q=*:*, fl=\"id,a_s,a_i,a_f\", sort=\"a_f asc, a_i asc\"))"), + "select(\"a_s as fieldA\", a_*, search(collection1, q=*:*, fl=\"id,a_s,a_i,a_f\", sort=\"a_f asc, a_i asc\"))"), factory)) { expressionString = stream.toExpression(factory).toString(); assertTrue(expressionString.contains("select(search(collection1,")); @@ -113,6 +113,7 @@ public class StreamExpressionToExpessionTest extends SolrTestCase { assertTrue(expressionString.contains("fl=\"id,a_s,a_i,a_f\"")); assertTrue(expressionString.contains("sort=\"a_f asc, a_i asc\"")); assertTrue(expressionString.contains("a_s as fieldA")); + assertTrue(expressionString.contains("a_*")); } }
