From 17210362736c220ff4c12a448b238eed1212a9a8 Mon Sep 17 00:00:00 2001 From: Joel Bernstein Date: Mon, 15 May 2017 15:02:42 -0400 Subject: [PATCH] SOLR-10661: Add copyOf Stream Evaluator --- .../apache/solr/handler/StreamHandler.java | 1 + .../solrj/io/stream/CopyOfEvaluator.java | 84 +++++++++++++++++++ .../solrj/io/stream/StreamExpressionTest.java | 69 +++++++++++++++ 3 files changed, 154 insertions(+) create mode 100644 solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/CopyOfEvaluator.java 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 270542ac74b..ae62965b311 100644 --- a/solr/core/src/java/org/apache/solr/handler/StreamHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/StreamHandler.java @@ -178,6 +178,7 @@ public class StreamHandler extends RequestHandlerBase implements SolrCoreAware, .withFunctionName("rank", RankEvaluator.class) .withFunctionName("scale", ScaleEvaluator.class) .withFunctionName("distance", DistanceEvaluator.class) + .withFunctionName("copyOf", CopyOfEvaluator.class) // metrics .withFunctionName("min", MinMetric.class) diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/CopyOfEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/CopyOfEvaluator.java new file mode 100644 index 00000000000..2380e8fce89 --- /dev/null +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/CopyOfEvaluator.java @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.solr.client.solrj.io.stream; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.apache.solr.client.solrj.io.Tuple; +import org.apache.solr.client.solrj.io.eval.ComplexEvaluator; +import org.apache.solr.client.solrj.io.eval.StreamEvaluator; +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; +import org.apache.solr.client.solrj.io.stream.expr.StreamExpression; +import org.apache.solr.client.solrj.io.stream.expr.StreamExpressionParameter; +import org.apache.solr.client.solrj.io.stream.expr.StreamFactory; + +public class CopyOfEvaluator extends ComplexEvaluator implements Expressible { + + private static final long serialVersionUID = 1; + + public CopyOfEvaluator(StreamExpression expression, StreamFactory factory) throws IOException { + super(expression, factory); + } + + public List evaluate(Tuple tuple) throws IOException { + StreamEvaluator colEval1 = subEvaluators.get(0); + + List numbers1 = (List)colEval1.evaluate(tuple); + double[] vals = new double[numbers1.size()]; + + for(int i=0; i copyOf = new ArrayList(vals.length); + + for(int i=0; i tuples = getTuples(solrStream); + assertTrue(tuples.size() == 1); + List copy1 = (List)tuples.get(0).get("copy1"); + assertTrue(copy1.size() == 10); + assertTrue(copy1.get(0).doubleValue() == 100D); + assertTrue(copy1.get(1).doubleValue() == 500D); + assertTrue(copy1.get(2).doubleValue() == 300D); + assertTrue(copy1.get(3).doubleValue() == 400D); + assertTrue(copy1.get(4).doubleValue() == 0D); + assertTrue(copy1.get(5).doubleValue() == 0D); + assertTrue(copy1.get(6).doubleValue() == 0D); + assertTrue(copy1.get(7).doubleValue() == 0D); + assertTrue(copy1.get(8).doubleValue() == 0D); + assertTrue(copy1.get(9).doubleValue() == 0D); + + List copy2 = (List)tuples.get(0).get("copy2"); + assertTrue(copy2.size() == 4); + assertTrue(copy2.get(0).doubleValue() == 100D); + assertTrue(copy2.get(1).doubleValue() == 500D); + assertTrue(copy2.get(2).doubleValue() == 300D); + assertTrue(copy2.get(3).doubleValue() == 400D); + + List copy3 = (List)tuples.get(0).get("copy3"); + assertTrue(copy3.size() == 2); + assertTrue(copy3.get(0).doubleValue() == 100D); + assertTrue(copy3.get(1).doubleValue() == 500D); + } + @Test public void testRankTransform() throws Exception { UpdateRequest updateRequest = new UpdateRequest();