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) {