You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by no...@apache.org on 2019/12/20 22:14:15 UTC

[lucene-solr] branch jira/solr14125 updated: solr14125 initial commit

This is an automated email from the ASF dual-hosted git repository.

noble pushed a commit to branch jira/solr14125
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git


The following commit(s) were added to refs/heads/jira/solr14125 by this push:
     new 6ca1133  solr14125 initial commit
6ca1133 is described below

commit 6ca11337ff8bb9152e5ffabfd7dc0c47182eb582
Author: noble <no...@apache.org>
AuthorDate: Sat Dec 21 09:13:54 2019 +1100

    solr14125 initial commit
---
 .../java/org/apache/solr/handler/GraphHandler.java | 25 ++++++--
 .../org/apache/solr/handler/StreamHandler.java     | 35 ++++++++++-
 .../org/apache/solr/pkg/PackagePluginHolder.java   |  4 ++
 .../client/solrj/io/stream/expr/StreamFactory.java | 69 ++++++++++++++--------
 .../org/apache/solr/client/solrj/io/TestLang.java  |  5 +-
 5 files changed, 102 insertions(+), 36 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/handler/GraphHandler.java b/solr/core/src/java/org/apache/solr/handler/GraphHandler.java
index ed5ae0a..621a4db 100644
--- a/solr/core/src/java/org/apache/solr/handler/GraphHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/GraphHandler.java
@@ -19,6 +19,7 @@ package org.apache.solr.handler;
 
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -27,7 +28,9 @@ import java.util.Map.Entry;
 import org.apache.solr.client.solrj.io.Tuple;
 import org.apache.solr.client.solrj.io.comp.StreamComparator;
 import org.apache.solr.client.solrj.io.graph.Traversal;
-import org.apache.solr.client.solrj.io.stream.*;
+import org.apache.solr.client.solrj.io.stream.ExceptionStream;
+import org.apache.solr.client.solrj.io.stream.StreamContext;
+import org.apache.solr.client.solrj.io.stream.TupleStream;
 import org.apache.solr.client.solrj.io.stream.expr.DefaultStreamFactory;
 import org.apache.solr.client.solrj.io.stream.expr.Explanation;
 import org.apache.solr.client.solrj.io.stream.expr.Expressible;
@@ -38,6 +41,8 @@ import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.CoreContainer;
+import org.apache.solr.core.PluginInfo;
+import org.apache.solr.core.SolrConfig;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
@@ -90,11 +95,21 @@ public class GraphHandler extends RequestHandlerBase implements SolrCoreAware, P
     Object functionMappingsObj = initArgs.get("streamFunctions");
     if(null != functionMappingsObj){
       NamedList<?> functionMappings = (NamedList<?>)functionMappingsObj;
-      for(Entry<String,?> functionMapping : functionMappings){
-        Class<? extends Expressible> clazz = core.getResourceLoader().findClass((String)functionMapping.getValue(),
-            Expressible.class);
-        streamFactory.withFunctionName(functionMapping.getKey(), clazz);
+      for(Entry<String,?> functionMapping : functionMappings) {
+        String key = functionMapping.getKey();
+        PluginInfo pluginInfo = new PluginInfo(key, Collections.singletonMap("class", functionMapping.getValue()));
+
+        if (pluginInfo.pkgName == null) {
+          Class<? extends Expressible> clazz = core.getResourceLoader().findClass((String) functionMapping.getValue(),
+              Expressible.class);
+          streamFactory.withFunctionName(key, clazz);
+        } else {
+          StreamHandler.ExpressibleHolder holder = new StreamHandler.ExpressibleHolder(pluginInfo, core, SolrConfig.classVsSolrPluginInfo.get(Expressible.class));
+          streamFactory.withFunctionName(key, () -> holder.getClazz());
+        }
+
       }
+
     }
   }
 
diff --git a/solr/core/src/java/org/apache/solr/handler/StreamHandler.java b/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
index 5d8bd5c..4bb5409 100644
--- a/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
@@ -33,7 +33,10 @@ import org.apache.solr.client.solrj.io.ModelCache;
 import org.apache.solr.client.solrj.io.SolrClientCache;
 import org.apache.solr.client.solrj.io.Tuple;
 import org.apache.solr.client.solrj.io.comp.StreamComparator;
-import org.apache.solr.client.solrj.io.stream.*;
+import org.apache.solr.client.solrj.io.stream.DaemonStream;
+import org.apache.solr.client.solrj.io.stream.ExceptionStream;
+import org.apache.solr.client.solrj.io.stream.StreamContext;
+import org.apache.solr.client.solrj.io.stream.TupleStream;
 import org.apache.solr.client.solrj.io.stream.expr.Explanation;
 import org.apache.solr.client.solrj.io.stream.expr.Explanation.ExpressionType;
 import org.apache.solr.client.solrj.io.stream.expr.Expressible;
@@ -52,7 +55,10 @@ import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.core.CloseHook;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.PluginInfo;
+import org.apache.solr.core.SolrConfig;
 import org.apache.solr.core.SolrCore;
+import org.apache.solr.pkg.PackageLoader;
+import org.apache.solr.pkg.PackagePluginHolder;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.security.AuthorizationContext;
@@ -118,8 +124,14 @@ public class StreamHandler extends RequestHandlerBase implements SolrCoreAware,
     // This pulls all the overrides and additions from the config
     List<PluginInfo> pluginInfos = core.getSolrConfig().getPluginInfos(Expressible.class.getName());
     for (PluginInfo pluginInfo : pluginInfos) {
-      Class<? extends Expressible> clazz = core.getMemClassLoader().findClass(pluginInfo.className, Expressible.class);
-      streamFactory.withFunctionName(pluginInfo.name, clazz);
+      if (pluginInfo.pkgName != null) {
+        ExpressibleHolder holder = new ExpressibleHolder(pluginInfo, core, SolrConfig.classVsSolrPluginInfo.get(Expressible.class));
+        streamFactory.withFunctionName(pluginInfo.name,
+            () -> holder.getClazz());
+      } else {
+        Class<? extends Expressible> clazz = core.getMemClassLoader().findClass(pluginInfo.className, Expressible.class);
+        streamFactory.withFunctionName(pluginInfo.name, () -> clazz);
+      }
     }
 
     core.addCloseHook(new CloseHook() {
@@ -134,6 +146,23 @@ public class StreamHandler extends RequestHandlerBase implements SolrCoreAware,
       }
     });
   }
+  public static class ExpressibleHolder extends PackagePluginHolder {
+    private Class clazz;
+
+    public ExpressibleHolder(PluginInfo info, SolrCore core, SolrConfig.SolrPluginInfo pluginMeta) {
+      super(info, core, pluginMeta);
+    }
+
+    public Class getClazz() {
+      return clazz;
+    }
+
+    @Override
+    protected void initNewInstance(PackageLoader.Package.Version newest) {
+      clazz = newest.getLoader().findClass(pluginInfo.className, Expressible.class);
+    }
+
+  }
 
   public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
     SolrParams params = req.getParams();
diff --git a/solr/core/src/java/org/apache/solr/pkg/PackagePluginHolder.java b/solr/core/src/java/org/apache/solr/pkg/PackagePluginHolder.java
index 63facde..cb9724b 100644
--- a/solr/core/src/java/org/apache/solr/pkg/PackagePluginHolder.java
+++ b/solr/core/src/java/org/apache/solr/pkg/PackagePluginHolder.java
@@ -104,6 +104,10 @@ public class PackagePluginHolder<T> extends PluginBag.PluginHolder<T> {
     log.info("loading plugin: {} -> {} using  package {}:{}",
         pluginInfo.type, pluginInfo.name, pkg.name(), newest.getVersion());
 
+    initNewInstance(newest);
+  }
+
+  protected void initNewInstance(PackageLoader.Package.Version newest) {
     Object instance = SolrCore.createInstance(pluginInfo.className,
         pluginMeta.clazz, pluginMeta.getCleanTag(), core, newest.getLoader());
     PluginBag.initInstance(instance, pluginInfo);
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamFactory.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamFactory.java
index 0ba5d5c..d51bda3 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamFactory.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamFactory.java
@@ -24,8 +24,8 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
-import java.util.Map;
 import java.util.Map.Entry;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
 import org.apache.solr.client.solrj.io.comp.ComparatorOrder;
@@ -44,7 +44,7 @@ import org.apache.solr.client.solrj.io.stream.metrics.Metric;
 public class StreamFactory implements Serializable {
   
   private transient HashMap<String,String> collectionZkHosts;
-  private transient HashMap<String,Class<? extends Expressible>> functionNames;
+  private transient HashMap<String,Supplier<Class<? extends Expressible>>> functionNames;
   private transient String defaultZkHost;
   private transient String defaultCollection;
   
@@ -79,14 +79,20 @@ public class StreamFactory implements Serializable {
     return null;
   }
   
-  public Map<String,Class<? extends Expressible>> getFunctionNames(){
+  public HashMap<String, Supplier<Class<? extends Expressible>>> getFunctionNames(){
     return functionNames;
   }
   public StreamFactory withFunctionName(String functionName, Class<? extends Expressible> clazz){
+    this.functionNames.put(functionName, (Supplier<Class<? extends Expressible>>) () -> clazz);
+    return this;
+  }
+
+   public StreamFactory withFunctionName(String functionName, Supplier< Class<? extends Expressible>> clazz){
     this.functionNames.put(functionName, clazz);
     return this;
   }
-  
+
+
   public StreamExpressionParameter getOperand(StreamExpression expression, int parameterIndex){
     if(null == expression.getParameters() || parameterIndex >= expression.getParameters().size()){
       return null;
@@ -174,9 +180,10 @@ public class StreamFactory implements Serializable {
     
     parameterLoop:
     for(StreamExpression streamExpression : allStreamExpressions){
-      if(functionNames.containsKey(streamExpression.getFunctionName())){
+      Supplier<Class<? extends Expressible>> classSupplier = functionNames.get(streamExpression.getFunctionName());
+      if(classSupplier != null){
         for(Class clazz : clazzes){
-          if(!clazz.isAssignableFrom(functionNames.get(streamExpression.getFunctionName()))){
+          if(!clazz.isAssignableFrom(classSupplier.get())){
             continue parameterLoop;
           }
         }
@@ -189,9 +196,10 @@ public class StreamFactory implements Serializable {
   }
   
   public boolean doesRepresentTypes(StreamExpression expression, Class ... clazzes){
-    if(functionNames.containsKey(expression.getFunctionName())){
+    Supplier<Class<? extends Expressible>> classSupplier = functionNames.get(expression.getFunctionName());
+    if(classSupplier != null){
       for(Class clazz : clazzes){
-        if(!clazz.isAssignableFrom(functionNames.get(expression.getFunctionName()))){
+        if(!clazz.isAssignableFrom(classSupplier.get())){
           return false;
         }
       }
@@ -241,10 +249,12 @@ public class StreamFactory implements Serializable {
   }
   public TupleStream constructStream(StreamExpression expression) throws IOException{
     String function = expression.getFunctionName();
-    if(functionNames.containsKey(function)){
-      Class<? extends Expressible> clazz = functionNames.get(function);
+    Supplier<Class<? extends Expressible>> classSupplier = functionNames.get(function);
+
+    if(classSupplier != null){
+      Class<? extends Expressible> clazz =  classSupplier.get();
       if(Expressible.class.isAssignableFrom(clazz) && TupleStream.class.isAssignableFrom(clazz)){
-        return (TupleStream)createInstance(functionNames.get(function), new Class[]{ StreamExpression.class, StreamFactory.class }, new Object[]{ expression, this});
+        return (TupleStream)createInstance(clazz, new Class[]{ StreamExpression.class, StreamFactory.class }, new Object[]{ expression, this});
       }
     }
     
@@ -256,10 +266,11 @@ public class StreamFactory implements Serializable {
   }
   public Metric constructMetric(StreamExpression expression) throws IOException{
     String function = expression.getFunctionName();
-    if(functionNames.containsKey(function)){
-      Class<? extends Expressible> clazz = functionNames.get(function);
+    Supplier<Class<? extends Expressible>> classSupplier = functionNames.get(function);
+    if(classSupplier != null){
+      Class<? extends Expressible> clazz = classSupplier.get();
       if(Expressible.class.isAssignableFrom(clazz) && Metric.class.isAssignableFrom(clazz)){
-        return (Metric)createInstance(functionNames.get(function), new Class[]{ StreamExpression.class, StreamFactory.class }, new Object[]{ expression, this});
+        return (Metric)createInstance(clazz, new Class[]{ StreamExpression.class, StreamFactory.class }, new Object[]{ expression, this});
       }
     }
     
@@ -358,10 +369,11 @@ public class StreamFactory implements Serializable {
   }
   public StreamOperation constructOperation(StreamExpression expression) throws IOException{
     String function = expression.getFunctionName();
-    if(functionNames.containsKey(function)){
-      Class<? extends Expressible> clazz = functionNames.get(function);
+    Supplier<Class<? extends Expressible>> classSupplier = functionNames.get(function);
+    if(classSupplier != null){
+      Class<? extends Expressible> clazz = classSupplier.get();
       if(Expressible.class.isAssignableFrom(clazz) && StreamOperation.class.isAssignableFrom(clazz)){
-        return (StreamOperation)createInstance(functionNames.get(function), new Class[]{ StreamExpression.class, StreamFactory.class }, new Object[]{ expression, this});
+        return (StreamOperation)createInstance(clazz, new Class[]{ StreamExpression.class, StreamFactory.class }, new Object[]{ expression, this});
       }
     }
     
@@ -373,10 +385,12 @@ public class StreamFactory implements Serializable {
   }
   public org.apache.solr.client.solrj.io.eval.StreamEvaluator constructEvaluator(StreamExpression expression) throws IOException{
     String function = expression.getFunctionName();
-    if(functionNames.containsKey(function)){
-      Class<? extends Expressible> clazz = functionNames.get(function);
+    Supplier<Class<? extends Expressible>> classSupplier = functionNames.get(function);
+
+    if(classSupplier != null){
+      Class<? extends Expressible> clazz = classSupplier.get();
       if(Expressible.class.isAssignableFrom(clazz) && StreamEvaluator.class.isAssignableFrom(clazz)){
-        return (org.apache.solr.client.solrj.io.eval.StreamEvaluator)createInstance(functionNames.get(function), new Class[]{ StreamExpression.class, StreamFactory.class }, new Object[]{ expression, this});
+        return (org.apache.solr.client.solrj.io.eval.StreamEvaluator)createInstance(clazz, new Class[]{ StreamExpression.class, StreamFactory.class }, new Object[]{ expression, this});
       }
     }
     
@@ -385,8 +399,9 @@ public class StreamFactory implements Serializable {
 
   public boolean isStream(StreamExpression expression) throws IOException{
     String function = expression.getFunctionName();
-    if(functionNames.containsKey(function)){
-      Class<? extends Expressible> clazz = functionNames.get(function);
+    Supplier<Class<? extends Expressible>> classSupplier = functionNames.get(function);
+    if(classSupplier != null){
+      Class<? extends Expressible> clazz = classSupplier.get();
       if(Expressible.class.isAssignableFrom(clazz) && TupleStream.class.isAssignableFrom(clazz)){
         return true;
       }
@@ -397,8 +412,9 @@ public class StreamFactory implements Serializable {
   
   public boolean isEvaluator(StreamExpression expression) throws IOException{
     String function = expression.getFunctionName();
-    if(functionNames.containsKey(function)){
-      Class<? extends Expressible> clazz = functionNames.get(function);
+    Supplier<Class<? extends Expressible>> classSupplier = functionNames.get(function);
+    if(classSupplier != null){
+      Class<? extends Expressible> clazz = classSupplier.get();
       if(Expressible.class.isAssignableFrom(clazz) && StreamEvaluator.class.isAssignableFrom(clazz)){
         return true;
       }
@@ -424,11 +440,12 @@ public class StreamFactory implements Serializable {
   }
   
   public String getFunctionName(Class<? extends Expressible> clazz) throws IOException{
-    for(Entry<String,Class<? extends Expressible>> entry : functionNames.entrySet()){
-      if(entry.getValue() == clazz){
+    for (Entry<String, Supplier<Class<? extends Expressible>>> entry : functionNames.entrySet()) {
+      if(entry.getValue().get() == clazz){
         return entry.getKey();
       }
     }
+
     
     throw new IOException(String.format(Locale.ROOT, "Unable to find function name for class '%s'", clazz.getName()));
   }
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/TestLang.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/TestLang.java
index 7e510f4..f18cf51 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/TestLang.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/TestLang.java
@@ -17,9 +17,10 @@
 package org.apache.solr.client.solrj.io;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
+import java.util.function.Supplier;
 
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.LuceneTestCase.Slow;
@@ -94,7 +95,7 @@ public class TestLang extends SolrTestCase {
     }
     StreamFactory factory = new StreamFactory();
     Lang.register(factory);
-    Map<String,Class<? extends Expressible>> registeredFunctions = factory.getFunctionNames();
+    HashMap<String, Supplier<Class<? extends Expressible>>> registeredFunctions = factory.getFunctionNames();
 
     //Check that each function that is expected is registered.
     for(String func : functions) {