You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by dp...@apache.org on 2017/06/18 15:54:49 UTC
[3/8] lucene-solr:master: SOLR-10882: LengthEvaluator now supports
collections of any type
SOLR-10882: LengthEvaluator now supports collections of any type
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/f1695104
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/f1695104
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/f1695104
Branch: refs/heads/master
Commit: f1695104fa8df6d9b484ef94d13eac16bcb3cf36
Parents: fffbe67
Author: Dennis Gove <dp...@gmail.com>
Authored: Tue Jun 13 09:06:00 2017 -0400
Committer: Dennis Gove <dp...@gmail.com>
Committed: Sun Jun 18 11:50:57 2017 -0400
----------------------------------------------------------------------
.../client/solrj/io/eval/LengthEvaluator.java | 23 +++-
.../io/stream/eval/LengthEvaluatorTest.java | 119 +++++++++++++++++++
2 files changed, 138 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f1695104/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/LengthEvaluator.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/LengthEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/LengthEvaluator.java
index da55ee4..b070fe8 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/LengthEvaluator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/LengthEvaluator.java
@@ -17,7 +17,8 @@
package org.apache.solr.client.solrj.io.eval;
import java.io.IOException;
-import java.util.List;
+import java.util.Collection;
+import java.util.Locale;
import org.apache.solr.client.solrj.io.Tuple;
import org.apache.solr.client.solrj.io.stream.expr.Explanation;
@@ -33,12 +34,26 @@ public class LengthEvaluator extends ComplexEvaluator implements Expressible {
public LengthEvaluator(StreamExpression expression, StreamFactory factory) throws IOException {
super(expression, factory);
+
+ if(1 != subEvaluators.size()){
+ throw new IOException(String.format(Locale.ROOT,"Invalid expression %s - expecting one value but found %d",expression,subEvaluators.size()));
+ }
}
public Number evaluate(Tuple tuple) throws IOException {
- StreamEvaluator colEval1 = subEvaluators.get(0);
- List<Number> numbers = (List<Number>)colEval1.evaluate(tuple);
- return numbers.size();
+
+ Object result = subEvaluators.get(0).evaluate(tuple);
+
+ if(null == result){
+ throw new IOException(String.format(Locale.ROOT, "Unable to find %s(...) because the value is null", constructingFactory.getFunctionName(getClass())));
+ }
+
+ if(result instanceof Collection<?>){
+ // Cause other evaluators expect Long instead of Integer
+ return new Long(((Collection<?>)result).size());
+ }
+
+ throw new IOException(String.format(Locale.ROOT, "Unable to find %s(...) because the value is not a collection, instead a %s was found", constructingFactory.getFunctionName(getClass()), result.getClass().getSimpleName()));
}
@Override
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f1695104/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/eval/LengthEvaluatorTest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/eval/LengthEvaluatorTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/eval/LengthEvaluatorTest.java
new file mode 100644
index 0000000..4b137b5
--- /dev/null
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/eval/LengthEvaluatorTest.java
@@ -0,0 +1,119 @@
+/*
+ * 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.eval;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.client.solrj.io.Tuple;
+import org.apache.solr.client.solrj.io.eval.LengthEvaluator;
+import org.apache.solr.client.solrj.io.eval.SequenceEvaluator;
+import org.apache.solr.client.solrj.io.eval.StreamEvaluator;
+import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
+import org.junit.Test;
+
+import junit.framework.Assert;
+
+public class LengthEvaluatorTest extends LuceneTestCase {
+
+ StreamFactory factory;
+ Map<String, Object> values;
+
+ public LengthEvaluatorTest() {
+ super();
+
+ factory = new StreamFactory()
+ .withFunctionName("length", LengthEvaluator.class)
+ .withFunctionName("sequence", SequenceEvaluator.class);
+ values = new HashMap<String,Object>();
+ }
+
+ @Test
+ public void lengthField() throws Exception{
+ StreamEvaluator evaluator = factory.constructEvaluator("length(a)");
+ Object result;
+
+ values.clear();
+ values.put("a", new ArrayList<Integer>(){{ add(1); add(2); add(4); }});
+ result = evaluator.evaluate(new Tuple(values));
+ Assert.assertTrue(result instanceof Long);
+ Assert.assertEquals(3L, result);
+
+ values.clear();
+ values.put("a", new ArrayList<String>(){{ add("a"); add("b"); }});
+ result = evaluator.evaluate(new Tuple(values));
+ Assert.assertTrue(result instanceof Long);
+ Assert.assertEquals(2L, result);
+
+ values.clear();
+ values.put("a", new ArrayList<String>(){{ }});
+ result = evaluator.evaluate(new Tuple(values));
+ Assert.assertTrue(result instanceof Long);
+ Assert.assertEquals(0L, result);
+ }
+
+ @Test
+ public void lengthEvaluator() throws Exception{
+ StreamEvaluator evaluator = factory.constructEvaluator("length(sequence(3,4,10))");
+ Object result;
+
+ values.clear();
+ result = evaluator.evaluate(new Tuple(values));
+ Assert.assertTrue(result instanceof Long);
+ Assert.assertEquals(3L, result);
+ }
+
+ @Test(expected = IOException.class)
+ public void lengthValueNotCollection() throws Exception{
+ StreamEvaluator evaluator = factory.constructEvaluator("length(a)");
+
+ values.clear();
+ values.put("a", "foo");
+ evaluator.evaluate(new Tuple(values));
+ }
+
+ @Test(expected = IOException.class)
+ public void lengthNoField() throws Exception{
+ factory.constructEvaluator("length()");
+ }
+
+ @Test(expected = IOException.class)
+ public void lengthTwoFields() throws Exception{
+ factory.constructEvaluator("length(a,b)");
+ }
+
+ @Test(expected = IOException.class)
+ public void lengthNoValue() throws Exception{
+ StreamEvaluator evaluator = factory.constructEvaluator("length(a)");
+
+ values.clear();
+ Object result = evaluator.evaluate(new Tuple(values));
+ assertNull(result);
+ }
+ @Test(expected = IOException.class)
+ public void lengthNullValue() throws Exception{
+ StreamEvaluator evaluator = factory.constructEvaluator("length(a)");
+
+ values.clear();
+ values.put("a", null);
+ Object result = evaluator.evaluate(new Tuple(values));
+ assertNull(result);
+ }
+}