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_*"));
     }
   }
 

Reply via email to