You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by da...@apache.org on 2018/10/31 05:07:33 UTC

[47/50] [abbrv] lucene-solr:jira/http2_benchmark: SOLR-12936: Allow percentiles Stream Evaluator to accept an array of percentiles to calculate

SOLR-12936: Allow percentiles Stream Evaluator to accept an array of percentiles to calculate


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/ac192504
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/ac192504
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/ac192504

Branch: refs/heads/jira/http2_benchmark
Commit: ac1925045d137d4762c6cb5d6940bfec784bdd4f
Parents: e618e83
Author: Joel Bernstein <jb...@apache.org>
Authored: Mon Oct 29 16:29:04 2018 -0400
Committer: Joel Bernstein <jb...@apache.org>
Committed: Mon Oct 29 16:29:04 2018 -0400

----------------------------------------------------------------------
 .../solrj/io/eval/PercentileEvaluator.java      | 25 ++++++++++++++------
 .../solrj/io/stream/MathExpressionTest.java     | 17 +++++++++++++
 2 files changed, 35 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ac192504/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/PercentileEvaluator.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/PercentileEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/PercentileEvaluator.java
index b545f4b..63fce52 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/PercentileEvaluator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/PercentileEvaluator.java
@@ -17,6 +17,7 @@
 package org.apache.solr.client.solrj.io.eval;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 
@@ -39,16 +40,26 @@ public class PercentileEvaluator extends RecursiveNumericEvaluator implements Tw
     if(null == second){
       throw new IOException(String.format(Locale.ROOT,"Invalid expression %s - null found for the second value",toExpression(constructingFactory)));
     }
-    if(!(first instanceof List<?>)){
+    if(!(first instanceof List<?>)) {
       throw new IOException(String.format(Locale.ROOT,"Invalid expression %s - found type %s for the first value, expecting a List",toExpression(constructingFactory), first.getClass().getSimpleName()));
     }
-    if(!(second instanceof Number)){
-      throw new IOException(String.format(Locale.ROOT,"Invalid expression %s - found type %s for the second value, expecting a Number",toExpression(constructingFactory), first.getClass().getSimpleName()));
+    if((second instanceof Number)) {
+      Percentile percentile = new Percentile();
+      percentile.setData(((List<?>) first).stream().mapToDouble(value -> ((Number) value).doubleValue()).toArray());
+      return percentile.evaluate(((Number) second).doubleValue());
+    } else if(second instanceof List){
+      Percentile percentile = new Percentile();
+      percentile.setData(((List<?>) first).stream().mapToDouble(value -> ((Number) value).doubleValue()).toArray());
+      List<Number> values = (List<Number>) second;
+      List<Number> percentiles = new ArrayList();
+      for(Number value : values) {
+        percentiles.add(percentile.evaluate(value.doubleValue()));
+      }
+
+      return percentiles;
+    } else {
+      throw new IOException(String.format(Locale.ROOT,"Invalid expression %s - found type %s for the second value, expecting a number or a numeric array",toExpression(constructingFactory), first.getClass().getSimpleName()));
     }
-    
-    Percentile percentile = new Percentile();
-    percentile.setData(((List<?>)first).stream().mapToDouble(value -> ((Number)value).doubleValue()).toArray());
-    return percentile.evaluate(((Number)second).doubleValue());    
   }
   
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ac192504/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/MathExpressionTest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/MathExpressionTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/MathExpressionTest.java
index 2bff1ab..b5f9c0a 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/MathExpressionTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/MathExpressionTest.java
@@ -985,6 +985,23 @@ public class MathExpressionTest extends SolrCloudTestCase {
     tuple = tuples.get(0);
     p = tuple.getDouble("return-value");
     assertEquals(p, 2.4, 0.001);
+
+
+    cexpr = "percentile(array(11,10,3,4,5,6,7,8,9,2,1), array(20, 50))";
+    paramsLoc = new ModifiableSolrParams();
+    paramsLoc.set("expr", cexpr);
+    paramsLoc.set("qt", "/stream");
+
+    solrStream = new SolrStream(url, paramsLoc);
+
+    context = new StreamContext();
+    solrStream.setStreamContext(context);
+    tuples = getTuples(solrStream);
+    assertTrue(tuples.size() == 1);
+    tuple = tuples.get(0);
+    List<Number> percentiles = (List<Number>)tuple.get("return-value");
+    assertEquals(percentiles.get(0).doubleValue(), 2.4, 0.001);
+    assertEquals(percentiles.get(1).doubleValue(), 6.0, 0.001);
   }
 
   @Test