blob: a7ceb0d07763c01e0dcc9780ce2ad9cc0483549a [file] [log] [blame]
/*
* 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.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.lucene.util.LuceneTestCase;
import org.apache.lucene.util.LuceneTestCase.Slow;
import org.apache.solr.client.solrj.embedded.JettySolrRunner;
import org.apache.solr.client.solrj.io.SolrClientCache;
import org.apache.solr.client.solrj.io.Tuple;
import org.apache.solr.client.solrj.request.CollectionAdminRequest;
import org.apache.solr.client.solrj.request.UpdateRequest;
import org.apache.solr.cloud.AbstractDistribZkTestBase;
import org.apache.solr.cloud.SolrCloudTestCase;
import org.apache.solr.common.cloud.ClusterState;
import org.apache.solr.common.cloud.DocCollection;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
@Slow
@LuceneTestCase.SuppressCodecs({"Lucene3x", "Lucene40","Lucene41","Lucene42","Lucene45"})
public class MathExpressionTest extends SolrCloudTestCase {
private static final String COLLECTIONORALIAS = "collection1";
private static final int TIMEOUT = DEFAULT_TIMEOUT;
private static final String id = "id";
private static boolean useAlias;
@BeforeClass
public static void setupCluster() throws Exception {
configureCluster(4)
.addConfig("conf", getFile("solrj").toPath().resolve("solr").resolve("configsets").resolve("streaming").resolve("conf"))
.addConfig("ml", getFile("solrj").toPath().resolve("solr").resolve("configsets").resolve("ml").resolve("conf"))
.configure();
String collection;
useAlias = random().nextBoolean();
if (useAlias) {
collection = COLLECTIONORALIAS + "_collection";
} else {
collection = COLLECTIONORALIAS;
}
CollectionAdminRequest.createCollection(collection, "conf", 2, 1)
.setPerReplicaState(SolrCloudTestCase.USE_PER_REPLICA_STATE)
.process(cluster.getSolrClient());
AbstractDistribZkTestBase.waitForRecoveriesToFinish(collection, cluster.getSolrClient().getZkStateReader(),
false, true, TIMEOUT);
if (useAlias) {
CollectionAdminRequest.createAlias(COLLECTIONORALIAS, collection).process(cluster.getSolrClient());
}
}
@Before
public void cleanIndex() throws Exception {
new UpdateRequest()
.deleteByQuery("*:*")
.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
}
@Test
public void testAnalyzeEvaluator() throws Exception {
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.add(id, "1", "test_t", "l b c d c");
updateRequest.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
SolrClientCache cache = new SolrClientCache();
try {
String expr = "cartesianProduct(search("+COLLECTIONORALIAS+", q=\"*:*\", fl=\"id, test_t\", sort=\"id desc\"), analyze(test_t, test_t) as test_t)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
SolrStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 5);
Tuple t = tuples.get(0);
assertTrue(t.getString("test_t").equals("l"));
assertTrue(t.getString("id").equals("1"));
t = tuples.get(1);
assertTrue(t.getString("test_t").equals("b"));
assertTrue(t.getString("id").equals("1"));
t = tuples.get(2);
assertTrue(t.getString("test_t").equals("c"));
assertTrue(t.getString("id").equals("1"));
t = tuples.get(3);
assertTrue(t.getString("test_t").equals("d"));
assertTrue(t.getString("id").equals("1"));
t = tuples.get(4);
assertTrue(t.getString("test_t").equals("c"));
assertTrue(t.getString("id").equals("1"));
expr = "analyze(\"hello world\", test_t)";
paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
solrStream = new SolrStream(url, paramsLoc);
context = new StreamContext();
solrStream.setStreamContext(context);
tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
@SuppressWarnings({"rawtypes"})
List terms = (List)tuples.get(0).get("return-value");
assertTrue(terms.get(0).equals("hello"));
assertTrue(terms.get(1).equals("world"));
//Try with single param
expr = "cartesianProduct(search("+COLLECTIONORALIAS+", q=\"*:*\", fl=\"id, test_t\", sort=\"id desc\"), analyze(test_t) as test_t)";
paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
solrStream = new SolrStream(url, paramsLoc);
context = new StreamContext();
solrStream.setStreamContext(context);
tuples = getTuples(solrStream);
assertTrue(tuples.size() == 5);
t = tuples.get(0);
assertTrue(t.getString("test_t").equals("l"));
assertTrue(t.getString("id").equals("1"));
t = tuples.get(1);
assertTrue(t.getString("test_t").equals("b"));
assertTrue(t.getString("id").equals("1"));
t = tuples.get(2);
assertTrue(t.getString("test_t").equals("c"));
assertTrue(t.getString("id").equals("1"));
t = tuples.get(3);
assertTrue(t.getString("test_t").equals("d"));
assertTrue(t.getString("id").equals("1"));
t = tuples.get(4);
assertTrue(t.getString("test_t").equals("c"));
assertTrue(t.getString("id").equals("1"));
//Try with null in the test_t field
expr = "cartesianProduct(search("+COLLECTIONORALIAS+", q=\"*:*\", fl=\"id\", sort=\"id desc\"), analyze(test_t, test_t) as test_t)";
paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
solrStream = new SolrStream(url, paramsLoc);
context = new StreamContext();
solrStream.setStreamContext(context);
tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
//Test annotating tuple
expr = "select(search("+COLLECTIONORALIAS+", q=\"*:*\", fl=\"id, test_t\", sort=\"id desc\"), analyze(test_t, test_t) as test1_t)";
paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
solrStream = new SolrStream(url, paramsLoc);
context = new StreamContext();
solrStream.setStreamContext(context);
tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"rawtypes"})
List l = (List)tuples.get(0).get("test1_t");
assertTrue(l.get(0).equals("l"));
assertTrue(l.get(1).equals("b"));
assertTrue(l.get(2).equals("c"));
assertTrue(l.get(3).equals("d"));
assertTrue(l.get(4).equals("c"));
} finally {
cache.close();
}
}
@Test
public void testConcat() throws Exception {
String expr = " select(list(tuple(field1=\"a\", field2=\"b\"), tuple(field1=\"c\", field2=\"d\")), concat(field1, field2, \"hello\", delim=\"-\") as field3)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 2);
String s1= tuples.get(0).getString("field3");
assertEquals(s1, "a-b-hello");
String s2= tuples.get(1).getString("field3");
assertEquals(s2, "c-d-hello");
}
@Test
public void testTrunc() throws Exception {
String expr = " select(list(tuple(field1=\"abcde\", field2=\"012345\")), trunc(field1, 2) as field3, trunc(field2, 4) as field4)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
String s1 = tuples.get(0).getString("field3");
assertEquals(s1, "ab");
String s2 = tuples.get(0).getString("field4");
assertEquals(s2, "0123");
}
@Test
public void testUpperLowerSingle() throws Exception {
String expr = " select(list(tuple(field1=\"a\", field2=\"C\")), upper(field1) as field3, lower(field2) as field4)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
String s1 = tuples.get(0).getString("field3");
assertEquals(s1, "A");
String s2 = tuples.get(0).getString("field4");
assertEquals(s2, "c");
}
@Test
public void testTruncArray() throws Exception {
String expr = " select(list(tuple(field1=array(\"aaaa\",\"bbbb\",\"cccc\"))), trunc(field1, 3) as field2)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
@SuppressWarnings({"unchecked"})
List<String> l1 = (List<String>)tuples.get(0).get("field2");
assertEquals(l1.get(0), "aaa");
assertEquals(l1.get(1), "bbb");
assertEquals(l1.get(2), "ccc");
}
@Test
public void testUpperLowerArray() throws Exception {
String expr = " select(list(tuple(field1=array(\"a\",\"b\",\"c\"), field2=array(\"X\",\"Y\",\"Z\"))), upper(field1) as field3, lower(field2) as field4)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
@SuppressWarnings({"unchecked"})
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
@SuppressWarnings({"unchecked"})
List<String> l1 = (List<String>)tuples.get(0).get("field3");
assertEquals(l1.get(0), "A");
assertEquals(l1.get(1), "B");
assertEquals(l1.get(2), "C");
@SuppressWarnings({"unchecked"})
List<String> l2 = (List<String>)tuples.get(0).get("field4");
assertEquals(l2.get(0), "x");
assertEquals(l2.get(1), "y");
assertEquals(l2.get(2), "z");
}
@Test
public void testSplitTrim() throws Exception {
String expr = " select(list(tuple(field1=\"a, b, c\")), trim(split(field1, \",\")) as field2)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
@SuppressWarnings({"unchecked"})
List<String> l1 = (List<String>)tuples.get(0).get("field2");
assertEquals(l1.get(0), "a");
assertEquals(l1.get(1), "b");
assertEquals(l1.get(2), "c");
}
@Test
public void testMemset() throws Exception {
String expr = "let(echo=\"b, c\"," +
" a=memset(list(tuple(field1=val(1), field2=val(10)), tuple(field1=val(2), field2=val(20))), " +
" cols=\"field1, field2\", " +
" vars=\"f1, f2\")," +
" b=add(f1)," +
" c=add(f2))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
Number f1 = (Number)tuples.get(0).get("b");
assertEquals(f1.doubleValue(), 3, 0.0);
Number f2 = (Number)tuples.get(0).get("c");
assertEquals(f2.doubleValue(), 30, 0.0);
}
@Test
public void testMemsetSize() throws Exception {
String expr = "let(echo=\"b, c\"," +
" a=memset(plist(tuple(field1=val(1), field2=val(10)), tuple(field1=val(2), field2=val(20))), " +
" cols=\"field1, field2\", " +
" vars=\"f1, f2\"," +
" size=1)," +
" b=add(f1)," +
" c=add(f2))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
Number f1 = (Number)tuples.get(0).get("b");
assertEquals(f1.doubleValue(), 1, 0.0);
Number f2 = (Number)tuples.get(0).get("c");
assertEquals(f2.doubleValue(), 10, 0.0);
}
@Test
public void testMemsetTimeSeries() throws Exception {
UpdateRequest updateRequest = new UpdateRequest();
int i=0;
while(i<50) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2016", "5", "1"), "price_f", "400.00");
}
while(i<100) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2015", "5", "1"), "price_f", "300.0");
}
while(i<150) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2014", "5", "1"), "price_f", "500.0");
}
while(i<250) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2013", "5", "1"), "price_f", "100.00");
}
updateRequest.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
String expr = "memset(timeseries("+COLLECTIONORALIAS+", " +
" q=\"*:*\", " +
" start=\"2013-01-01T01:00:00.000Z\", " +
" end=\"2016-12-01T01:00:00.000Z\", " +
" gap=\"+1YEAR\", " +
" field=\"test_dt\", " +
" count(*)), " +
" cols=\"count(*)\"," +
" vars=\"a\")";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
Map<String, List<Number>> mem = (Map)tuples.get(0).get("return-value");
List<Number> array = mem.get("a");
assertEquals(array.get(0).intValue(), 100);
assertEquals(array.get(1).intValue(), 50);
assertEquals(array.get(2).intValue(), 50);
assertEquals(array.get(3).intValue(), 50);
}
@Test
public void testLatlonFunctions() throws Exception {
UpdateRequest updateRequest = new UpdateRequest();
int i=0;
while(i<5) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2016", "5", "1"),
"price_i", Integer.toString(i), "loc_p", (42.906797030808235+i)+","+(76.69455762489834+i));
}
updateRequest.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
String expr = "let(echo=true," +
" a=search("+COLLECTIONORALIAS+", q=*:*, fl=\"id, loc_p, price_i\",rows=100, sort=\"price_i asc\"),"+
" b=latlonVectors(a, field=loc_p)," +
" c=distance(array(40.7128, 74.0060), array(45.7128, 74.0060), haversineMeters()))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<List<Number>>locVectors = (List<List<Number>>)tuples.get(0).get("b");
int v=1;
for(List<Number> row : locVectors) {
double lat = row.get(0).doubleValue();
double lon = row.get(1).doubleValue();
assertEquals(lat, 42.906797030808235+v, 0);
assertEquals(lon, 76.69455762489834+v, 0);
++v;
}
double distance = tuples.get(0).getDouble("c");
assertEquals(distance, 555975.3986718428, 1.0);
}
@Test
public void testHist() throws Exception {
String expr = "hist(sequence(100, 0, 1), 10)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 10);
for(int i=0; i<tuples.size(); i++) {
Tuple stats = tuples.get(i);
assertTrue(((Number)stats.get("N")).intValue() == 10);
assertTrue(((Number)stats.get("min")).intValue() == 10*i);
assertTrue(((Number)stats.get("var")).doubleValue() == 9.166666666666666);
assertTrue(((Number)stats.get("stdev")).doubleValue() == 3.0276503540974917);
}
expr = "hist(sequence(100, 0, 1), 5)";
paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
solrStream = new SolrStream(url, paramsLoc);
solrStream.setStreamContext(context);
tuples = getTuples(solrStream);
assertTrue(tuples.size() == 5);
for(int i=0; i<tuples.size(); i++) {
Tuple stats = tuples.get(i);
assertTrue(((Number)stats.get("N")).intValue() == 20);
assertTrue(((Number)stats.get("min")).intValue() == 20*i);
assertTrue(((Number)stats.get("var")).doubleValue() == 35);
assertTrue(((Number)stats.get("stdev")).doubleValue() == 5.916079783099616);
}
}
@Test
public void testConvexHull() throws Exception {
String expr = "let(echo=true," +
" x=array(96.42894739701268, 99.11076410926444, 95.71563821370013,101.4356840561301, 96.17912865782684, 113.430677406492, 109.5927785287056, 87.26561260238425, 103.3122002816537, 100.4959815617706, 92.78972440872515, 92.98815024042877, 89.1448359089767, 104.9410622701036, 106.5546761317927, 102.0132643274808, 119.6726096270366, 97.61388415294184, 106.7928221374049, 94.31369945729962, 87.37098859879977, 82.8015657665458, 88.84342877874248, 94.58797342988339, 92.38720473619748)," +
" y=array(97.43395922838836, 109.5441846957560, 78.82698890096127, 96.67181538737611,95.52423701473863, 85.3391529394878, 87.01956497912255, 111.5289690656729,86.41034184809114, 84.11696923489203, 109.3874354244069, 102.3391063812790,109.0604436531823,102.7957014900897,114.4376483055848,107.4387578165579,106.2490201384653,103.4490197583837,93.8201540211101,101.6060721649409, 115.3512636715722,119.1046170610335,99.74910277836263,104.2116724112481, 86.02222520549304)," +
" c=transpose(matrix(x, y))," +
" d=convexHull(c)," +
" e=getVertices(d)," +
" f=getArea(d)," +
" g=getBoundarySize(d)," +
" h=getBaryCenter(d)," +
" i=projectToBorder(d, matrix(array(99.11076410926444, 109.5441846957560))))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<List<Number>> points = (List<List<Number>>)tuples.get(0).get("e");
assertTrue(points.size() == 6);
List<Number> point1 = points.get(0);
assertEquals(point1.size(), 2);
assertEquals(point1.get(0).doubleValue(), 82.8015657665458, 0.0);
assertEquals(point1.get(1).doubleValue(), 119.1046170610335, 0.0);
List<Number> point2 = points.get(1);
assertEquals(point2.size(), 2);
assertEquals(point2.get(0).doubleValue(), 92.38720473619748, 0.0);
assertEquals(point2.get(1).doubleValue(), 86.02222520549304, 0.0);
List<Number> point3 = points.get(2);
assertEquals(point3.size(), 2);
assertEquals(point3.get(0).doubleValue(), 95.71563821370013, 0.0);
assertEquals(point3.get(1).doubleValue(), 78.82698890096127, 0.0);
List<Number> point4 = points.get(3);
assertEquals(point4.size(), 2);
assertEquals(point4.get(0).doubleValue(), 113.430677406492, 0.0);
assertEquals(point4.get(1).doubleValue(), 85.3391529394878, 0.0);
List<Number> point5 = points.get(4);
assertEquals(point5.size(), 2);
assertEquals(point5.get(0).doubleValue(), 119.6726096270366, 0.0);
assertEquals(point5.get(1).doubleValue(), 106.2490201384653, 0.0);
List<Number> point6 = points.get(5);
assertEquals(point6.size(), 2);
assertEquals(point6.get(0).doubleValue(), 106.5546761317927, 0.0);
assertEquals(point6.get(1).doubleValue(), 114.4376483055848, 0.0);
double area = tuples.get(0).getDouble("f");
assertEquals(area, 911.6283603859929, 0.0);
double boundarySize = tuples.get(0).getDouble("g");
assertEquals(boundarySize, 122.73784789223708, 0.0);
@SuppressWarnings({"unchecked"})
List<Number> baryCenter = (List<Number>)tuples.get(0).get("h");
assertEquals(baryCenter.size(), 2);
assertEquals(baryCenter.get(0).doubleValue(), 101.3021125450865, 0.0);
assertEquals(baryCenter.get(1).doubleValue(), 100.07343616615786, 0.0);
@SuppressWarnings({"unchecked"})
List<List<Number>> borderPoints = (List<List<Number>>)tuples.get(0).get("i");
assertEquals(borderPoints.get(0).get(0).doubleValue(), 100.31316833934775, 0);
assertEquals(borderPoints.get(0).get(1).doubleValue(), 115.6639686234851, 0);
}
@Test
public void testEnclosingDisk() throws Exception {
String expr = "let(echo=true," +
" x=array(96.42894739701268, 99.11076410926444, 95.71563821370013,101.4356840561301, 96.17912865782684, 113.430677406492, 109.5927785287056, 87.26561260238425, 103.3122002816537, 100.4959815617706, 92.78972440872515, 92.98815024042877, 89.1448359089767, 104.9410622701036, 106.5546761317927, 102.0132643274808, 119.6726096270366, 97.61388415294184, 106.7928221374049, 94.31369945729962, 87.37098859879977, 82.8015657665458, 88.84342877874248, 94.58797342988339, 92.38720473619748)," +
" y=array(97.43395922838836, 109.5441846957560, 78.82698890096127, 96.67181538737611,95.52423701473863, 85.3391529394878, 87.01956497912255, 111.5289690656729,86.41034184809114, 84.11696923489203, 109.3874354244069, 102.3391063812790,109.0604436531823,102.7957014900897,114.4376483055848,107.4387578165579,106.2490201384653,103.4490197583837,93.8201540211101,101.6060721649409, 115.3512636715722,119.1046170610335,99.74910277836263,104.2116724112481, 86.02222520549304)," +
" c=transpose(matrix(x, y))," +
" d=enclosingDisk(c)," +
" e=getCenter(d)," +
" f=getRadius(d)," +
" g=getSupportPoints(d))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> center = (List<Number>)tuples.get(0).get("e");
assertEquals(center.get(0).doubleValue(), 97.40659699625388, 0.0);
assertEquals(center.get(1).doubleValue(), 101.57826559647323, 0.0);
double radius =tuples.get(0).getDouble("f");
assertEquals(radius, 22.814029299535, 0.0);
@SuppressWarnings({"unchecked"})
List<List<Number>> supportPoints = (List<List<Number>>)tuples.get(0).get("g");
List<Number> support1 = supportPoints.get(0);
assertEquals(support1.get(0).doubleValue(), 95.71563821370013, 0.0);
assertEquals(support1.get(1).doubleValue(), 78.82698890096127, 0.0);
List<Number> support2 = supportPoints.get(1);
assertEquals(support2.get(0).doubleValue(), 82.8015657665458, 0.0);
assertEquals(support2.get(1).doubleValue(), 119.1046170610335, 0.0);
List<Number> support3 = supportPoints.get(2);
assertEquals(support3.get(0).doubleValue(), 113.430677406492, 0.0);
assertEquals(support3.get(1).doubleValue(), 85.3391529394878, 0.0);
}
@Test
public void testCumulativeProbability() throws Exception {
String expr = "cumulativeProbability(normalDistribution(500, 40), 500)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Number number = (Number)tuples.get(0).get("return-value");
assertTrue(number.doubleValue() == .5D);
}
private String getDateString(String year, String month, String day) {
return year+"-"+month+"-"+day+"T00:00:00Z";
}
@Test
public void testCorrelationStream() throws Exception {
UpdateRequest updateRequest = new UpdateRequest();
int i=0;
while(i<50) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2016", "5", "1"), "price_f", "400.00");
}
while(i<100) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2015", "5", "1"), "price_f", "300.0");
}
while(i<150) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2014", "5", "1"), "price_f", "500.0");
}
while(i<250) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2013", "5", "1"), "price_f", "100.00");
}
updateRequest.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
String expr = "timeseries("+COLLECTIONORALIAS+", q=\"*:*\", start=\"2013-01-01T01:00:00.000Z\", " +
"end=\"2016-12-01T01:00:00.000Z\", " +
"gap=\"+1YEAR\", " +
"field=\"test_dt\", " +
"count(*), sum(price_f), max(price_f), min(price_f))";
String cexpr = "let(a="+expr+", b=select("+expr+",mult(-1, count(*)) as nvalue), c=col(a, count(*)), d=col(b, nvalue), " +
"tuple(corr=corr(c,d), scorr=corr(array(500, 50, 50, 50),d, type=spearmans), kcorr=corr(array(500, 50, 50, 50),d, type=kendalls), d=d))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
assertTrue(tuples.get(0).getDouble("corr").equals(-1.0D));
assertTrue(tuples.get(0).getDouble("scorr").equals(-1.0D));
assertTrue(tuples.get(0).getDouble("kcorr").equals(-1.0D));
}
@Test
public void testCovariance() throws Exception {
UpdateRequest updateRequest = new UpdateRequest();
int i=0;
while(i<50) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2016", "5", "1"), "price_f", "400.00");
}
while(i<100) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2015", "5", "1"), "price_f", "300.0");
}
while(i<150) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2014", "5", "1"), "price_f", "500.0");
}
while(i<250) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2013", "5", "1"), "price_f", "100.00");
}
updateRequest.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
String expr = "timeseries("+COLLECTIONORALIAS+", q=\"*:*\", start=\"2013-01-01T01:00:00.000Z\", " +
"end=\"2016-12-01T01:00:00.000Z\", " +
"gap=\"+1YEAR\", " +
"field=\"test_dt\", " +
"count(*), sum(price_f), max(price_f), min(price_f))";
String cexpr = "let(a="+expr+", b=select("+expr+",mult(-1, count(*)) as nvalue), c=col(a, count(*)), d=col(b, nvalue), tuple(colc=c, cold=d, cov=cov(c,d)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
assertTrue(tuples.get(0).getDouble("cov").equals(-625.0D));
}
@Test
public void testCosineDistance() throws Exception {
String cexpr = "let(echo=true, " +
"a=array(1,2,3,4)," +
"b=array(10, 20, 30, 45), " +
"c=distance(a, b, cosine()), " +
")";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Number d = (Number) tuples.get(0).get("c");
assertEquals(d.doubleValue(), 0.0017046159, 0.0001);
}
@Test
public void testDistance() throws Exception {
String cexpr = "let(echo=true, " +
"a=array(1,2,3,4)," +
"b=array(2,3,4,5), " +
"c=array(3,4,5,6), " +
"d=distance(a, b), " +
"e=distance(a, c)," +
"f=distance(b, c)," +
"g=transpose(matrix(a, b, c))," +
"h=distance(g)," +
"i=distance(a, b, manhattan()), " +
"j=distance(a, c, manhattan())," +
"k=distance(b, c, manhattan())," +
"l=transpose(matrix(a, b, c))," +
"m=distance(l, manhattan())," +
"n=distance(a, b, canberra()), " +
"o=distance(a, c, canberra())," +
"p=distance(b, c, canberra())," +
"q=transpose(matrix(a, b, c))," +
"r=distance(q, canberra())," +
"s=distance(a, b, earthMovers()), " +
"t=distance(a, c, earthMovers())," +
"u=distance(b, c, earthMovers())," +
"w=transpose(matrix(a, b, c))," +
"x=distance(w, earthMovers())," +
")";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Number d = (Number)tuples.get(0).get("d");
assertEquals(d.doubleValue(), 2.0, 0.0);
Number e = (Number)tuples.get(0).get("e");
assertEquals(e.doubleValue(), 4.0, 0.0);
Number f = (Number)tuples.get(0).get("f");
assertEquals(f.doubleValue(), 2.0, 0.0);
@SuppressWarnings({"unchecked"})
List<List<Number>> h = (List<List<Number>>)tuples.get(0).get("h");
assertEquals(h.size(), 3);
assertEquals(h.get(0).size(), 3);
List<Number> row0 = h.get(0);
assertEquals(row0.get(0).doubleValue(), 0, 0);
assertEquals(row0.get(1).doubleValue(), 2, 0);
assertEquals(row0.get(2).doubleValue(), 4, 0);
List<Number> row1 = h.get(1);
assertEquals(row1.get(0).doubleValue(), 2, 0);
assertEquals(row1.get(1).doubleValue(), 0, 0);
assertEquals(row1.get(2).doubleValue(), 2, 0);
List<Number> row2 = h.get(2);
assertEquals(row2.get(0).doubleValue(), 4, 0);
assertEquals(row2.get(1).doubleValue(), 2, 0);
assertEquals(row2.get(2).doubleValue(), 0, 0);
Number i = (Number)tuples.get(0).get("i");
assertEquals(i.doubleValue(), 4.0, 0.0);
Number j = (Number)tuples.get(0).get("j");
assertEquals(j.doubleValue(), 8.0, 0.0);
Number k = (Number)tuples.get(0).get("k");
assertEquals(k.doubleValue(), 4.0, 0.0);
@SuppressWarnings({"unchecked"})
List<List<Number>> m = (List<List<Number>>)tuples.get(0).get("m");
assertEquals(m.size(), 3);
assertEquals(m.get(0).size(), 3);
row0 = m.get(0);
assertEquals(row0.get(0).doubleValue(), 0, 0);
assertEquals(row0.get(1).doubleValue(), 4, 0);
assertEquals(row0.get(2).doubleValue(), 8, 0);
row1 = m.get(1);
assertEquals(row1.get(0).doubleValue(), 4, 0);
assertEquals(row1.get(1).doubleValue(), 0, 0);
assertEquals(row1.get(2).doubleValue(), 4, 0);
row2 = m.get(2);
assertEquals(row2.get(0).doubleValue(), 8, 0);
assertEquals(row2.get(1).doubleValue(), 4, 0);
assertEquals(row2.get(2).doubleValue(), 0, 0);
Number n = (Number)tuples.get(0).get("n");
assertEquals(n.doubleValue(), 0.787302, 0.0001);
Number o = (Number)tuples.get(0).get("o");
assertEquals(o.doubleValue(), 1.283333, 0.0001);
Number p = (Number)tuples.get(0).get("p");
assertEquals(p.doubleValue(), 0.544877, 0.0001);
@SuppressWarnings({"unchecked"})
List<List<Number>> r = (List<List<Number>>)tuples.get(0).get("r");
assertEquals(r.size(), 3);
assertEquals(r.get(0).size(), 3);
row0 = r.get(0);
assertEquals(row0.get(0).doubleValue(), 0, 0);
assertEquals(row0.get(1).doubleValue(), 0.787302, .0001);
assertEquals(row0.get(2).doubleValue(), 1.283333, .0001);
row1 = r.get(1);
assertEquals(row1.get(0).doubleValue(), 0.787302, .0001);
assertEquals(row1.get(1).doubleValue(), 0, 0);
assertEquals(row1.get(2).doubleValue(), 0.544877, .0001);
row2 = r.get(2);
assertEquals(row2.get(0).doubleValue(), 1.283333, .0001);
assertEquals(row2.get(1).doubleValue(), 0.544877, .0001);
assertEquals(row2.get(2).doubleValue(), 0, 0);
Number s = (Number)tuples.get(0).get("s");
assertEquals(s.doubleValue(), 10.0, 0);
Number t = (Number)tuples.get(0).get("t");
assertEquals(t.doubleValue(), 20.0, 0);
Number u = (Number)tuples.get(0).get("u");
assertEquals(u.doubleValue(), 10.0, 0);
@SuppressWarnings({"unchecked"})
List<List<Number>> x = (List<List<Number>>)tuples.get(0).get("x");
assertEquals(x.size(), 3);
assertEquals(x.get(0).size(), 3);
row0 = x.get(0);
assertEquals(row0.get(0).doubleValue(), 0, 0);
assertEquals(row0.get(1).doubleValue(), 10.0, 0);
assertEquals(row0.get(2).doubleValue(), 20, 0);
row1 = x.get(1);
assertEquals(row1.get(0).doubleValue(), 10, 0);
assertEquals(row1.get(1).doubleValue(), 0, 0);
assertEquals(row1.get(2).doubleValue(), 10, 0);
row2 = x.get(2);
assertEquals(row2.get(0).doubleValue(), 20, 0);
assertEquals(row2.get(1).doubleValue(), 10, 0);
assertEquals(row2.get(2).doubleValue(), 0, 0);
}
@Test
public void testReverse() throws Exception {
UpdateRequest updateRequest = new UpdateRequest();
int i=0;
while(i<50) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2016", "5", "1"), "price_f", "400.00");
}
while(i<100) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2015", "5", "1"), "price_f", "300.0");
}
while(i<150) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2014", "5", "1"), "price_f", "500.0");
}
while(i<250) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2013", "5", "1"), "price_f", "100.00");
}
updateRequest.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
String expr = "timeseries("+COLLECTIONORALIAS+", q=\"*:*\", start=\"2013-01-01T01:00:00.000Z\", " +
"end=\"2016-12-01T01:00:00.000Z\", " +
"gap=\"+1YEAR\", " +
"field=\"test_dt\", " +
"count(*), sum(price_f), max(price_f), min(price_f))";
String cexpr = "let(a="+expr+", c=col(a, max(price_f)), tuple(reverse=rev(c)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> reverse = (List<Number>)tuples.get(0).get("reverse");
assertTrue(reverse.size() == 4);
assertTrue(reverse.get(0).doubleValue() == 400D);
assertTrue(reverse.get(1).doubleValue() == 300D);
assertTrue(reverse.get(2).doubleValue() == 500D);
assertTrue(reverse.get(3).doubleValue() == 100D);
}
@Test
public void testCopyOf() throws Exception {
UpdateRequest updateRequest = new UpdateRequest();
int i=0;
while(i<50) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2016", "5", "1"), "price_f", "400.00");
}
while(i<100) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2015", "5", "1"), "price_f", "300.0");
}
while(i<150) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2014", "5", "1"), "price_f", "500.0");
}
while(i<250) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2013", "5", "1"), "price_f", "100.00");
}
updateRequest.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
String expr = "timeseries("+COLLECTIONORALIAS+", q=\"*:*\", start=\"2013-01-01T01:00:00.000Z\", " +
"end=\"2016-12-01T01:00:00.000Z\", " +
"gap=\"+1YEAR\", " +
"field=\"test_dt\", " +
"count(*), sum(price_f), max(price_f), min(price_f))";
String cexpr = "let(a="+expr+", c=col(a, max(price_f)), tuple(copy1=copyOf(c, 10), copy2=copyOf(c), copy3=copyOf(c, 2) ))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> copy1 = (List<Number>)tuples.get(0).get("copy1");
assertTrue(copy1.size() == 4);
assertTrue(copy1.get(0).doubleValue() == 100D);
assertTrue(copy1.get(1).doubleValue() == 500D);
assertTrue(copy1.get(2).doubleValue() == 300D);
assertTrue(copy1.get(3).doubleValue() == 400D);
@SuppressWarnings({"unchecked"})
List<Number> copy2 = (List<Number>)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);
@SuppressWarnings({"unchecked"})
List<Number> copy3 = (List<Number>)tuples.get(0).get("copy3");
assertTrue(copy3.size() == 2);
assertTrue(copy3.get(0).doubleValue() == 100D);
assertTrue(copy3.get(1).doubleValue() == 500D);
}
@Test
public void testCopyOfRange() throws Exception {
UpdateRequest updateRequest = new UpdateRequest();
int i=0;
while(i<50) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2016", "5", "1"), "price_f", "400.00");
}
while(i<100) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2015", "5", "1"), "price_f", "300.0");
}
while(i<150) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2014", "5", "1"), "price_f", "500.0");
}
while(i<250) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2013", "5", "1"), "price_f", "100.00");
}
updateRequest.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
String expr = "timeseries("+COLLECTIONORALIAS+", q=\"*:*\", start=\"2013-01-01T01:00:00.000Z\", " +
"end=\"2016-12-01T01:00:00.000Z\", " +
"gap=\"+1YEAR\", " +
"field=\"test_dt\", " +
"count(*), sum(price_f), max(price_f), min(price_f))";
String cexpr = "let(a="+expr+", c=col(a, max(price_f)), tuple(copy=copyOfRange(c, 1, 3), copy2=copyOfRange(c, 2, 4), l=length(c)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> copy1 = (List<Number>)tuples.get(0).get("copy");
assertTrue(copy1.size() == 2);
assertTrue(copy1.get(0).doubleValue() == 500D);
assertTrue(copy1.get(1).doubleValue() == 300D);
@SuppressWarnings({"unchecked"})
List<Number> copy2 = (List<Number>)tuples.get(0).get("copy2");
assertTrue(copy2.size() == 2);
assertTrue(copy2.get(0).doubleValue() == 300D);
assertTrue(copy2.get(1).doubleValue() == 400D);
long l = tuples.get(0).getLong("l");
assertTrue(l == 4);
}
@Test
public void testPercentile() throws Exception {
String cexpr = "percentile(array(1,2,3,4,5,6,7,8,9,10,11), 50)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Tuple tuple = tuples.get(0);
double p = tuple.getDouble("return-value");
assertEquals(p, 6, 0.0);
cexpr = "percentile(array(11,10,3,4,5,6,7,8,9,2,1), 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);
p = tuple.getDouble("return-value");
assertEquals(p, 6, 0.0);
cexpr = "percentile(array(11,10,3,4,5,6,7,8,9,2,1), 20)";
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);
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);
@SuppressWarnings({"unchecked"})
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
public void testPrimes() throws Exception {
String cexpr = "primes(10, 0)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Tuple tuple = tuples.get(0);
@SuppressWarnings({"unchecked"})
List<Number> asort = (List<Number>)tuple.get("return-value");
assertEquals(asort.size(), 10);
assertEquals(asort.get(0).intValue(), 2);
assertEquals(asort.get(1).intValue(), 3);
assertEquals(asort.get(2).intValue(), 5);
assertEquals(asort.get(3).intValue(), 7);
assertEquals(asort.get(4).intValue(), 11);
assertEquals(asort.get(5).intValue(), 13);
assertEquals(asort.get(6).intValue(), 17);
assertEquals(asort.get(7).intValue(), 19);
assertEquals(asort.get(8).intValue(), 23);
assertEquals(asort.get(9).intValue(), 29);
}
@Test
public void testBinomialCoefficient() throws Exception {
String cexpr = "binomialCoefficient(8,3)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Tuple tuple = tuples.get(0);
long binomialCoefficient = tuple.getLong("return-value");
assertEquals(binomialCoefficient, 56);
}
@Test
public void testAscend() throws Exception {
String cexpr = "asc(array(11.5, 12.3, 4, 3, 1, 0))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Tuple tuple = tuples.get(0);
@SuppressWarnings({"unchecked"})
List<Number> asort = (List<Number>)tuple.get("return-value");
assertEquals(asort.size(), 6);
assertEquals(asort.get(0).doubleValue(), 0, 0.0);
assertEquals(asort.get(1).doubleValue(), 1, 0.0);
assertEquals(asort.get(2).doubleValue(), 3, 0.0);
assertEquals(asort.get(3).doubleValue(), 4, 0.0);
assertEquals(asort.get(4).doubleValue(), 11.5, 0.0);
assertEquals(asort.get(5).doubleValue(), 12.3, 0.0);
}
@Test
public void testRankTransform() throws Exception {
UpdateRequest updateRequest = new UpdateRequest();
int i=0;
while(i<50) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2016", "5", "1"), "price_f", "400.00");
}
while(i<100) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2015", "5", "1"), "price_f", "300.0");
}
while(i<150) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2014", "5", "1"), "price_f", "500.0");
}
while(i<250) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2013", "5", "1"), "price_f", "100.00");
}
updateRequest.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
String expr = "timeseries("+COLLECTIONORALIAS+", q=\"*:*\", start=\"2013-01-01T01:00:00.000Z\", " +
"end=\"2016-12-01T01:00:00.000Z\", " +
"gap=\"+1YEAR\", " +
"field=\"test_dt\", " +
"count(*), sum(price_f), max(price_f), min(price_f))";
String cexpr = "let(a="+expr+", c=col(a, max(price_f)), tuple(reverse=rev(c), ranked=rank(c)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> reverse = (List<Number>)tuples.get(0).get("reverse");
assertTrue(reverse.size() == 4);
assertTrue(reverse.get(0).doubleValue() == 400D);
assertTrue(reverse.get(1).doubleValue() == 300D);
assertTrue(reverse.get(2).doubleValue() == 500D);
assertTrue(reverse.get(3).doubleValue() == 100D);
@SuppressWarnings({"unchecked"})
List<Number> ranked = (List<Number>)tuples.get(0).get("ranked");
assertTrue(ranked.size() == 4);
assertTrue(ranked.get(0).doubleValue() == 1D);
assertTrue(ranked.get(1).doubleValue() == 4D);
assertTrue(ranked.get(2).doubleValue() == 2D);
assertTrue(ranked.get(3).doubleValue() == 3D);
}
@Test
@SuppressWarnings({"unchecked"})
public void testArray() throws Exception {
String cexpr = "array(1, 2, 3, 300, 2, 500)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
List<Number> out = (List<Number>)tuples.get(0).get("return-value");
assertTrue(out.size() == 6);
assertTrue(out.get(0).intValue() == 1);
assertTrue(out.get(1).intValue() == 2);
assertTrue(out.get(2).intValue() == 3);
assertTrue(out.get(3).intValue() == 300);
assertTrue(out.get(4).intValue() == 2);
assertTrue(out.get(5).intValue() == 500);
cexpr = "array(1.122, 2.222, 3.333, 300.1, 2.13, 500.23)";
paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
solrStream = new SolrStream(url, paramsLoc);
solrStream.setStreamContext(context);
tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
out = (List<Number>)tuples.get(0).get("return-value");
assertTrue(out.size() == 6);
assertTrue(out.get(0).doubleValue() == 1.122D);
assertTrue(out.get(1).doubleValue() == 2.222D);
assertTrue(out.get(2).doubleValue() == 3.333D);
assertTrue(out.get(3).doubleValue() == 300.1D);
assertTrue(out.get(4).doubleValue() == 2.13D);
assertTrue(out.get(5).doubleValue() == 500.23D);
}
@Test
public void testPairSort() throws Exception {
String cexpr = "let(a=array(4.5, 7.7, 2.1, 2.1, 6.3)," +
" b=array(1, 2, 3, 4, 5)," +
" c=pairSort(a, b))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<List<Number>> out = (List<List<Number>>)tuples.get(0).get("c");
assertEquals(out.size(), 2);
List<Number> row1 = out.get(0);
assertEquals(row1.get(0).doubleValue(), 2.1, 0);
assertEquals(row1.get(1).doubleValue(), 2.1, 0);
assertEquals(row1.get(2).doubleValue(), 4.5, 0);
assertEquals(row1.get(3).doubleValue(), 6.3, 0);
assertEquals(row1.get(4).doubleValue(), 7.7, 0);
List<Number> row2 = out.get(1);
assertEquals(row2.get(0).doubleValue(), 3, 0);
assertEquals(row2.get(1).doubleValue(), 4, 0);
assertEquals(row2.get(2).doubleValue(), 1, 0);
assertEquals(row2.get(3).doubleValue(), 5, 0);
assertEquals(row2.get(4).doubleValue(), 2, 0);
}
@Test
public void testOnes() throws Exception {
String cexpr = "ones(6)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("return-value");
assertEquals(out.size(), 6);
assertEquals(out.get(0).intValue(), 1);
assertEquals(out.get(1).intValue(), 1);
assertEquals(out.get(2).intValue(), 1);
assertEquals(out.get(3).intValue(), 1);
assertEquals(out.get(4).intValue(), 1);
assertEquals(out.get(5).intValue(), 1);
}
@Test
public void testNatural() throws Exception {
String cexpr = "natural(6)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("return-value");
assertEquals(out.size(), 6);
assertEquals(out.get(0).intValue(), 0);
assertEquals(out.get(1).intValue(), 1);
assertEquals(out.get(2).intValue(), 2);
assertEquals(out.get(3).intValue(), 3);
assertEquals(out.get(4).intValue(), 4);
assertEquals(out.get(5).intValue(), 5);
}
@Test
public void testRepeat() throws Exception {
String cexpr = "repeat(6.5, 6)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("return-value");
assertEquals(out.size(), 6);
assertEquals(out.get(0).doubleValue(), 6.5, 0);
assertEquals(out.get(1).doubleValue(), 6.5, 0);
assertEquals(out.get(2).doubleValue(), 6.5, 0);
assertEquals(out.get(3).doubleValue(), 6.5, 0);
assertEquals(out.get(4).doubleValue(), 6.5, 0);
assertEquals(out.get(5).doubleValue(), 6.5, 0);
}
@Test
public void testLtrim() throws Exception {
String cexpr = "ltrim(array(1,2,3,4,5,6), 2)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("return-value");
assertEquals(out.size(), 4);
assertEquals(out.get(0).intValue(), 3);
assertEquals(out.get(1).intValue(), 4);
assertEquals(out.get(2).intValue(), 5);
assertEquals(out.get(3).intValue(), 6);
}
@Test
public void testRtrim() throws Exception {
String cexpr = "rtrim(array(1,2,3,4,5,6), 2)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("return-value");
assertEquals(out.size(), 4);
assertEquals(out.get(0).intValue(), 1);
assertEquals(out.get(1).intValue(), 2);
assertEquals(out.get(2).intValue(), 3);
assertEquals(out.get(3).intValue(), 4);
}
@Test
public void testZeros() throws Exception {
String cexpr = "zeros(6)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("return-value");
assertEquals(out.size(), 6);
assertEquals(out.get(0).intValue(), 0);
assertEquals(out.get(1).intValue(), 0);
assertEquals(out.get(2).intValue(), 0);
assertEquals(out.get(3).intValue(), 0);
assertEquals(out.get(4).intValue(), 0);
assertEquals(out.get(5).intValue(), 0);
}
@Test
public void testMatrix() throws Exception {
String cexpr = "let(echo=true," +
" a=setColumnLabels(matrix(array(1, 2, 3), " +
" rev(array(4,5,6)))," +
" array(\"col1\", \"col2\", \"col3\"))," +
" b=rowAt(a, 1)," +
" c=colAt(a, 2)," +
" d=getColumnLabels(a)," +
" e=topFeatures(a, 1)," +
" f=rowCount(a)," +
" g=columnCount(a)," +
" h=indexOf(d, \"col2\")," +
" i=indexOf(d, \"col3\"))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<List<Number>> out = (List<List<Number>>)tuples.get(0).get("a");
List<Number> array1 = out.get(0);
assertEquals(array1.size(), 3);
assertEquals(array1.get(0).doubleValue(), 1.0, 0.0);
assertEquals(array1.get(1).doubleValue(), 2.0, 0.0);
assertEquals(array1.get(2).doubleValue(), 3.0, 0.0);
List<Number> array2 = out.get(1);
assertEquals(array2.size(), 3);
assertEquals(array2.get(0).doubleValue(), 6.0, 0.0);
assertEquals(array2.get(1).doubleValue(), 5.0, 0.0);
assertEquals(array2.get(2).doubleValue(), 4.0, 0.0);
@SuppressWarnings({"unchecked"})
List<Number> row = (List<Number>)tuples.get(0).get("b");
assertEquals(row.size(), 3);
assertEquals(array2.get(0).doubleValue(), 6.0, 0.0);
assertEquals(array2.get(1).doubleValue(), 5.0, 0.0);
assertEquals(array2.get(2).doubleValue(), 4.0, 0.0);
@SuppressWarnings({"unchecked"})
List<Number> col = (List<Number>)tuples.get(0).get("c");
assertEquals(col.size(), 2);
assertEquals(col.get(0).doubleValue(), 3.0, 0.0);
assertEquals(col.get(1).doubleValue(), 4.0, 0.0);
@SuppressWarnings({"unchecked"})
List<String> colLabels = (List<String>)tuples.get(0).get("d");
assertEquals(colLabels.size(), 3);
assertEquals(colLabels.get(0), "col1");
assertEquals(colLabels.get(1), "col2");
assertEquals(colLabels.get(2), "col3");
@SuppressWarnings({"unchecked"})
List<List<String>> features = (List<List<String>>)tuples.get(0).get("e");
assertEquals(features.size(), 2);
assertEquals(features.get(0).size(), 1);
assertEquals(features.get(1).size(), 1);
assertEquals(features.get(0).get(0), "col3");
assertEquals(features.get(1).get(0), "col1");
assertTrue(tuples.get(0).getLong("f") == 2);
assertTrue(tuples.get(0).getLong("g")== 3);
assertTrue(tuples.get(0).getLong("h")== 1);
assertTrue(tuples.get(0).getLong("i")== 2);
}
@Test
@SuppressWarnings({"unchecked", "rawtypes"})
public void testZplot() throws Exception {
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
String cexpr = "let(a=array(1,2,3,4)," +
" b=array(10,11,12,13),"+
" zplot(x=a, y=b))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 4);
Tuple out = tuples.get(0);
assertEquals(out.getDouble("x").doubleValue(), 1.0, 0.0);
assertEquals(out.getDouble("y").doubleValue(), 10.0, 0.0);
out = tuples.get(1);
assertEquals(out.getDouble("x").doubleValue(), 2.0, 0.0);
assertEquals(out.getDouble("y").doubleValue(), 11.0, 0.0);
out = tuples.get(2);
assertEquals(out.getDouble("x").doubleValue(), 3.0, 0.0);
assertEquals(out.getDouble("y").doubleValue(), 12.0, 0.0);
out = tuples.get(3);
assertEquals(out.getDouble("x").doubleValue(), 4.0, 0.0);
assertEquals(out.getDouble("y").doubleValue(), 13.0, 0.0);
cexpr = "let(b=array(10,11,12,13),"+
" zplot(y=b))";
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() == 4);
out = tuples.get(0);
assertEquals(out.getDouble("x").doubleValue(), 0.0, 0.0);
assertEquals(out.getDouble("y").doubleValue(), 10.0, 0.0);
out = tuples.get(1);
assertEquals(out.getDouble("x").doubleValue(), 1.0, 0.0);
assertEquals(out.getDouble("y").doubleValue(), 11.0, 0.0);
out = tuples.get(2);
assertEquals(out.getDouble("x").doubleValue(), 2.0, 0.0);
assertEquals(out.getDouble("y").doubleValue(), 12.0, 0.0);
out = tuples.get(3);
assertEquals(out.getDouble("x").doubleValue(), 3.0, 0.0);
assertEquals(out.getDouble("y").doubleValue(), 13.0, 0.0);
cexpr = "zplot(dist=binomialDistribution(10, .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);
assertEquals(tuples.size(),11);
long x = tuples.get(5).getLong("x");
double y = tuples.get(5).getDouble("y");
assertEquals(x, 5);
assertEquals(y, 0.24609375000000003, 0);
//Due to random errors (bugs) in Apache Commons Math EmpiricalDistribution
//there are times when tuples are discarded because
//they contain values with NaN values. This will occur
//only on the very end of the tails of the normal distribution or other
//real distributions and doesn't effect the visual quality of the curve very much.
//But it does effect the reliability of tests.
//For this reason the loop below is in place to run the test N times looking
//for the correct number of tuples before asserting the mean.
int n = 0;
int limit = 15;
while(true) {
cexpr = "zplot(dist=normalDistribution(100, 10))";
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);
//Assert the mean
if (tuples.size() == 32) {
double x1 = tuples.get(15).getDouble("x");
double y1 = tuples.get(15).getDouble("y");
assertEquals(x1, 100, 10);
assertEquals(y1, .039, .02);
break;
} else {
++n;
if(n == limit) {
throw new Exception("Reached iterations limit without correct tuple count.");
}
}
}
cexpr = "let(a=sample(normalDistribution(40, 1.5), 700)," +
" b=sample(normalDistribution(40, 1.5), 700)," +
" c=transpose(matrix(a, b)),"+
" d=kmeans(c, 5),"+
" zplot(clusters=d))";
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() == 700);
Set clusters = new HashSet();
for(Tuple tup : tuples) {
assertNotNull(tup.get("x"));
assertNotNull(tup.get("y"));
clusters.add(tup.getString("cluster"));
}
assertEquals(clusters.size(), 5);
assertTrue(clusters.contains("cluster1"));
assertTrue(clusters.contains("cluster2"));
assertTrue(clusters.contains("cluster3"));
assertTrue(clusters.contains("cluster4"));
assertTrue(clusters.contains("cluster5"));
cexpr = "let(a=matrix(array(0,1,2,3,4,5,6,7,8,9,10,11), array(10,11,12,13,14,15,16,17,18,19,20,21))," +
" zplot(heat=a))";
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() == 24);
Tuple tuple = tuples.get(0);
String xLabel = tuple.getString("x");
String yLabel = tuple.getString("y");
Number z = tuple.getLong("z");
assertEquals(xLabel, "col00");
assertEquals(yLabel, "row0");
assertEquals(z.longValue(), 0L);
tuple = tuples.get(1);
xLabel = tuple.getString("x");
yLabel = tuple.getString("y");
z = tuple.getLong("z");
assertEquals(xLabel, "col01");
assertEquals(yLabel, "row0");
assertEquals(z.longValue(), 1L);
tuple = tuples.get(2);
xLabel = tuple.getString("x");
yLabel = tuple.getString("y");
z = tuple.getLong("z");
assertEquals(xLabel, "col02");
assertEquals(yLabel, "row0");
assertEquals(z.longValue(), 2L);
tuple = tuples.get(12);
xLabel = tuple.getString("x");
yLabel = tuple.getString("y");
z = tuple.getLong("z");
assertEquals(xLabel, "col00");
assertEquals(yLabel, "row1");
assertEquals(z.longValue(), 10L);
cexpr = "let(a=transpose(matrix(array(0, 1, 2, 3, 4, 5, 6, 7,8,9,10,11), " +
" array(10,11,12,13,14,15,16,17,18,19,20,21)))," +
" zplot(heat=a))";
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() == 24);
tuple = tuples.get(0);
xLabel = tuple.getString("x");
yLabel = tuple.getString("y");
z = tuple.getLong("z");
assertEquals(xLabel, "col0");
assertEquals(yLabel, "row00");
assertEquals(z.longValue(), 0L);
tuple = tuples.get(1);
xLabel = tuple.getString("x");
yLabel = tuple.getString("y");
z = tuple.getLong("z");
assertEquals(xLabel, "col1");
assertEquals(yLabel, "row00");
assertEquals(z.longValue(), 10L);
tuple = tuples.get(2);
xLabel = tuple.getString("x");
yLabel = tuple.getString("y");
z = tuple.getLong("z");
assertEquals(xLabel, "col0");
assertEquals(yLabel, "row01");
assertEquals(z.longValue(), 1L);
tuple = tuples.get(12);
xLabel = tuple.getString("x");
yLabel = tuple.getString("y");
z = tuple.getLong("z");
assertEquals(xLabel, "col0");
assertEquals(yLabel, "row06");
assertEquals(z.longValue(), 6L);
cexpr = "let(a=matrix(array(0, 1, 2, 3, 4, 5, 6, 7,8,9,10,11), " +
" array(10,11,12,13,14,15,16,17,18,19,20,21))," +
" b=setRowLabels(a, array(\"blah1\", \"blah2\")),"+
" c=setColumnLabels(b, array(\"rah1\", \"rah2\", \"rah3\", \"rah4\", \"rah5\", \"rah6\", \"rah7\", \"rah8\", \"rah9\", \"rah10\", \"rah11\", \"rah12\")),"+
" zplot(heat=c))";
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() == 24);
tuple = tuples.get(0);
xLabel = tuple.getString("x");
yLabel = tuple.getString("y");
z = tuple.getLong("z");
assertEquals(xLabel, "rah1");
assertEquals(yLabel, "blah1");
assertEquals(z.longValue(), 0L);
tuple = tuples.get(1);
xLabel = tuple.getString("x");
yLabel = tuple.getString("y");
z = tuple.getLong("z");
assertEquals(xLabel, "rah2");
assertEquals(yLabel, "blah1");
assertEquals(z.longValue(), 1L);
tuple = tuples.get(2);
xLabel = tuple.getString("x");
yLabel = tuple.getString("y");
z = tuple.getLong("z");
assertEquals(xLabel, "rah3");
assertEquals(yLabel, "blah1");
assertEquals(z.longValue(), 2L);
tuple = tuples.get(12);
xLabel = tuple.getString("x");
yLabel = tuple.getString("y");
z = tuple.getLong("z");
assertEquals(xLabel, "rah1");
assertEquals(yLabel, "blah2");
assertEquals(z.longValue(), 10L);
}
@Test
@SuppressWarnings({"unchecked"})
public void testMatrixMath() throws Exception {
String cexpr = "let(echo=true, a=matrix(array(1.5, 2.5, 3.5), array(4.5,5.5,6.5)), " +
"b=grandSum(a), " +
"c=sumRows(a), " +
"d=sumColumns(a), " +
"e=scalarAdd(1, a)," +
"f=scalarSubtract(1, a)," +
"g=scalarMultiply(1.5, a)," +
"h=scalarDivide(1.5, a)," +
"i=scalarAdd(1.5, array(1.5, 2.5, 3.5))," +
"j=scalarSubtract(1.5, array(1.5, 2.5, 3.5))," +
"k=scalarMultiply(1.5, array(1.5, 2.5, 3.5))," +
"l=scalarDivide(1.5, array(1.5, 2.5, 3.5)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
double grandSum = tuples.get(0).getDouble("b");
assertEquals(grandSum, 24, 0.0);
List<Number> sumRows = (List<Number>)tuples.get(0).get("c");
assertEquals(sumRows.size(), 2);
assertEquals(sumRows.get(0).doubleValue(), 7.5, 0.0);
assertEquals(sumRows.get(1).doubleValue(), 16.5, 0.0);
List<Number> sumCols = (List<Number>)tuples.get(0).get("d");
assertEquals(sumCols.size(), 3);
assertEquals(sumCols.get(0).doubleValue(), 6.0, 0.0);
assertEquals(sumCols.get(1).doubleValue(), 8.0, 0.0);
assertEquals(sumCols.get(2).doubleValue(), 10, 0.0);
List<List<Number>> scalarAdd = (List<List<Number>>)tuples.get(0).get("e");
List<Number> row1 = scalarAdd.get(0);
assertEquals(row1.size(), 3);
assertEquals(row1.get(0).doubleValue(), 2.5, 0.0);
assertEquals(row1.get(1).doubleValue(), 3.5, 0.0);
assertEquals(row1.get(2).doubleValue(), 4.5, 0.0);
List<Number> row2 = scalarAdd.get(1);
assertEquals(row2.get(0).doubleValue(), 5.5, 0.0);
assertEquals(row2.get(1).doubleValue(), 6.5, 0.0);
assertEquals(row2.get(2).doubleValue(), 7.5, 0.0);
List<List<Number>> scalarSubtract = (List<List<Number>>)tuples.get(0).get("f");
row1 = scalarSubtract.get(0);
assertEquals(row1.size(), 3);
assertEquals(row1.get(0).doubleValue(), 0.5, 0.0);
assertEquals(row1.get(1).doubleValue(), 1.5, 0.0);
assertEquals(row1.get(2).doubleValue(), 2.5, 0.0);
row2 = scalarSubtract.get(1);
assertEquals(row2.get(0).doubleValue(), 3.5, 0.0);
assertEquals(row2.get(1).doubleValue(), 4.5, 0.0);
assertEquals(row2.get(2).doubleValue(), 5.5, 0.0);
List<List<Number>> scalarMultiply = (List<List<Number>>)tuples.get(0).get("g");
row1 = scalarMultiply.get(0);
assertEquals(row1.size(), 3);
assertEquals(row1.get(0).doubleValue(), 2.25, 0.0);
assertEquals(row1.get(1).doubleValue(), 3.75, 0.0);
assertEquals(row1.get(2).doubleValue(), 5.25, 0.0);
row2 = scalarMultiply.get(1);
assertEquals(row2.get(0).doubleValue(), 6.75, 0.0);
assertEquals(row2.get(1).doubleValue(), 8.25, 0.0);
assertEquals(row2.get(2).doubleValue(), 9.75, 0.0);
List<List<Number>> scalarDivide = (List<List<Number>>)tuples.get(0).get("h");
row1 = scalarDivide.get(0);
assertEquals(row1.size(), 3);
assertEquals(row1.get(0).doubleValue(), 1.0, 0.0);
assertEquals(row1.get(1).doubleValue(), 1.66666666666667, 0.001);
assertEquals(row1.get(2).doubleValue(), 2.33333333333333, 0.001);
row2 = scalarDivide.get(1);
assertEquals(row2.get(0).doubleValue(), 3, 0.0);
assertEquals(row2.get(1).doubleValue(), 3.66666666666667, 0.001);
assertEquals(row2.get(2).doubleValue(), 4.33333333333333, 0.001);
List<Number> rowA = (List<Number>)tuples.get(0).get("i");
assertEquals(rowA.size(), 3);
assertEquals(rowA.get(0).doubleValue(), 3.0, 0.0);
assertEquals(rowA.get(1).doubleValue(), 4.0, 0.0);
assertEquals(rowA.get(2).doubleValue(), 5.0, 0.0);
rowA = (List<Number>)tuples.get(0).get("j");
assertEquals(rowA.size(), 3);
assertEquals(rowA.get(0).doubleValue(), 0, 0.0);
assertEquals(rowA.get(1).doubleValue(), 1.0, 0.0);
assertEquals(rowA.get(2).doubleValue(), 2.0, 0.0);
rowA = (List<Number>)tuples.get(0).get("k");
assertEquals(rowA.size(), 3);
assertEquals(rowA.get(0).doubleValue(), 2.25, 0.0);
assertEquals(rowA.get(1).doubleValue(), 3.75, 0.0);
assertEquals(rowA.get(2).doubleValue(), 5.25, 0.0);
rowA = (List<Number>)tuples.get(0).get("l");
assertEquals(rowA.size(), 3);
assertEquals(rowA.get(0).doubleValue(), 1.0, 0.0);
assertEquals(rowA.get(1).doubleValue(), 1.66666666666667, 0.001);
assertEquals(rowA.get(2).doubleValue(), 2.33333333333333, 0.001);
}
@Test
public void testTranspose() throws Exception {
String cexpr = "let(a=matrix(array(1,2,3), array(4,5,6)), b=transpose(a))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<List<Number>> out = (List<List<Number>>)tuples.get(0).get("b");
assertEquals(out.size(), 3);
List<Number> array1 = out.get(0);
assertEquals(array1.size(), 2);
assertEquals(array1.get(0).doubleValue(), 1.0, 0.0);
assertEquals(array1.get(1).doubleValue(), 4.0, 0.0);
List<Number> array2 = out.get(1);
assertEquals(array2.size(), 2);
assertEquals(array2.get(0).doubleValue(), 2.0, 0.0);
assertEquals(array2.get(1).doubleValue(), 5.0, 0.0);
List<Number> array3 = out.get(2);
assertEquals(array3.size(), 2);
assertEquals(array3.get(0).doubleValue(), 3.0, 0.0);
assertEquals(array3.get(1).doubleValue(), 6.0, 0.0);
}
@Test
public void testUnitize() throws Exception {
String cexpr = "let(echo=true, a=unitize(matrix(array(1,2,3), array(4,5,6))), b=unitize(array(4,5,6)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<List<Number>> out = (List<List<Number>>)tuples.get(0).get("a");
assertEquals(out.size(), 2);
List<Number> array1 = out.get(0);
assertEquals(array1.size(), 3);
assertEquals(array1.get(0).doubleValue(), 0.2672612419124244, 0.0);
assertEquals(array1.get(1).doubleValue(), 0.5345224838248488, 0.0);
assertEquals(array1.get(2).doubleValue(), 0.8017837257372732, 0.0);
List<Number> array2 = out.get(1);
assertEquals(array2.size(), 3);
assertEquals(array2.get(0).doubleValue(), 0.4558423058385518, 0.0);
assertEquals(array2.get(1).doubleValue(), 0.5698028822981898, 0.0);
assertEquals(array2.get(2).doubleValue(), 0.6837634587578276, 0.0);
@SuppressWarnings({"unchecked"})
List<Number> array3 = (List<Number>)tuples.get(0).get("b");
assertEquals(array3.size(), 3);
assertEquals(array3.get(0).doubleValue(), 0.4558423058385518, 0.0);
assertEquals(array3.get(1).doubleValue(), 0.5698028822981898, 0.0);
assertEquals(array3.get(2).doubleValue(), 0.6837634587578276, 0.0);
}
@Test
public void testNormalizeSum() throws Exception {
String cexpr = "let(echo=true, " +
"a=normalizeSum(matrix(array(1,2,3), array(4,5,6))), " +
"b=normalizeSum(array(1,2,3))," +
"c=normalizeSum(array(1,2,3), 100))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<List<Number>> out = (List<List<Number>>)tuples.get(0).get("a");
assertEquals(out.size(), 2);
List<Number> array1 = out.get(0);
assertEquals(array1.size(), 3);
assertEquals(array1.get(0).doubleValue(), 0.16666666666666666, 0.0001);
assertEquals(array1.get(1).doubleValue(), 0.3333333333333333, 0.00001);
assertEquals(array1.get(2).doubleValue(), 0.5, 0.0001);
List<Number> array2 = out.get(1);
assertEquals(array2.size(), 3);
assertEquals(array2.get(0).doubleValue(), 0.26666666666666666, 0.0001);
assertEquals(array2.get(1).doubleValue(), 0.3333333333333333, 0.0001);
assertEquals(array2.get(2).doubleValue(), 0.4, 0.0001);
@SuppressWarnings({"unchecked"})
List<Number> array3 = (List<Number>)tuples.get(0).get("b");
assertEquals(array3.size(), 3);
assertEquals(array3.get(0).doubleValue(), 0.16666666666666666, 0.0001);
assertEquals(array3.get(1).doubleValue(), 0.3333333333333333, 0.0001);
assertEquals(array3.get(2).doubleValue(), 0.5, 0.0001);
@SuppressWarnings({"unchecked"})
List<Number> array4 = (List<Number>)tuples.get(0).get("c");
assertEquals(array4.size(), 3);
assertEquals(array4.get(0).doubleValue(), 16.666666666666666, 0.0001);
assertEquals(array4.get(1).doubleValue(), 33.33333333333333, 0.00001);
assertEquals(array4.get(2).doubleValue(), 50, 0.0001);
}
@Test
public void testStandardize() throws Exception {
String cexpr = "let(echo=true, a=standardize(matrix(array(1,2,3), array(4,5,6))), b=standardize(array(4,5,6)), c=zscores(array(4,5,6)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<List<Number>> out = (List<List<Number>>)tuples.get(0).get("a");
assertEquals(out.size(), 2);
List<Number> array1 = out.get(0);
assertEquals(array1.size(), 3);
assertEquals(array1.get(0).doubleValue(), -1, 0.0);
assertEquals(array1.get(1).doubleValue(), 0, 0.0);
assertEquals(array1.get(2).doubleValue(), 1, 0.0);
List<Number> array2 = out.get(1);
assertEquals(array2.size(), 3);
assertEquals(array2.get(0).doubleValue(), -1, 0.0);
assertEquals(array2.get(1).doubleValue(), 0, 0.0);
assertEquals(array2.get(2).doubleValue(), 1, 0.0);
@SuppressWarnings({"unchecked"})
List<Number> array3 = (List<Number>)tuples.get(0).get("b");
assertEquals(array3.size(), 3);
assertEquals(array3.get(0).doubleValue(), -1, 0.0);
assertEquals(array3.get(1).doubleValue(), 0, 0.0);
assertEquals(array3.get(2).doubleValue(), 1, 0.0);
@SuppressWarnings({"unchecked"})
List<Number> array4 = (List<Number>)tuples.get(0).get("c");
assertEquals(array4.size(), 3);
assertEquals(array4.get(0).doubleValue(), -1, 0.0);
assertEquals(array4.get(1).doubleValue(), 0, 0.0);
assertEquals(array4.get(2).doubleValue(), 1, 0.0);
}
@Test
public void testMarkovChain() throws Exception {
String cexpr = "let(state0=array(.5,.5),\n" +
" state1=array(.5,.5),\n" +
" states=matrix(state0, state1),\n" +
" m=markovChain(states, 0),\n" +
" s=sample(m, 50000),\n" +
" f=freqTable(s))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 2);
Tuple bin0 = tuples.get(0);
double state0Pct = bin0.getDouble("pct");
assertEquals(state0Pct, .5, .015);
Tuple bin1 = tuples.get(1);
double state1Pct = bin1.getDouble("pct");
assertEquals(state1Pct, .5, .015);
}
@Test
public void testAddAll() throws Exception {
String cexpr = "addAll(array(1, 2, 3), array(4.5, 5.5, 6.5), array(7,8,9))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("return-value");
assertTrue(out.size() == 9);
assertTrue(out.get(0).intValue() == 1);
assertTrue(out.get(1).intValue() == 2);
assertTrue(out.get(2).intValue() == 3);
assertTrue(out.get(3).doubleValue() == 4.5D);
assertTrue(out.get(4).doubleValue() == 5.5D);
assertTrue(out.get(5).doubleValue() == 6.5D);
assertTrue(out.get(6).intValue() == 7);
assertTrue(out.get(7).intValue() == 8);
assertTrue(out.get(8).intValue() == 9);
}
@Test
public void testProbabilityRange() throws Exception {
String cexpr = "let(a=normalDistribution(500, 20), " +
"b=probability(a, 520, 530))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Number prob = (Number)tuples.get(0).get("b");
assertEquals(prob.doubleValue(), 0.09184805266259899, 0.0);
}
@Test
// 12-Jun-2018 @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028")
// commented out on: 24-Dec-2018 @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // added 20-Jul-2018
public void testDistributions() throws Exception {
String cexpr = "let(a=normalDistribution(10, 2), " +
"b=sample(a, 250), " +
"c=normalDistribution(100, 6), " +
"d=sample(c, 250), " +
"u=uniformDistribution(1, 6),"+
"t=sample(u, 250),"+
"e=empiricalDistribution(d),"+
"f=sample(e, 250),"+
"tuple(sample=b, ks=ks(a,b), ks2=ks(a, d), ks3=ks(u, t)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
try {
sampleTest(paramsLoc, url);
} catch(AssertionError e) {
//This test will have random failures do to the random sampling. So if it fails try it again.
try {
sampleTest(paramsLoc, url);
} catch(AssertionError e2) {
try {
sampleTest(paramsLoc, url);
} catch(AssertionError e3) {
//If it fails a lot in a row, we probably broke some code. (TODO: bad test)
sampleTest(paramsLoc, url);
}
}
}
}
private void sampleTest(ModifiableSolrParams paramsLoc, String url) throws IOException {
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>) tuples.get(0).get("sample");
@SuppressWarnings({"rawtypes"})
Map ks = (Map) tuples.get(0).get("ks");
@SuppressWarnings({"rawtypes"})
Map ks2 = (Map) tuples.get(0).get("ks2");
@SuppressWarnings({"rawtypes"})
Map ks3 = (Map) tuples.get(0).get("ks3");
assertTrue(out.size() == 250);
Number pvalue = (Number) ks.get("p-value");
Number pvalue2 = (Number) ks2.get("p-value");
Number pvalue3 = (Number) ks3.get("p-value");
assertTrue(pvalue.doubleValue() > .05D);
assertTrue(pvalue2.doubleValue() == 0);
assertTrue(pvalue3.doubleValue() > .05D);
}
@Test
public void testSumDifference() throws Exception {
String cexpr = "sumDifference(array(2,4,6,8,10,12),array(1,2,3,4,5,6))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
double sd = tuples.get(0).getDouble("return-value");
assertEquals(sd, 21.0D, 0.0);
}
@Test
public void testMeanDifference() throws Exception {
String cexpr = "meanDifference(array(2,4,6,8,10,12),array(1,2,3,4,5,6))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
double sd = tuples.get(0).getDouble("return-value");
assertEquals(sd, 3.5, 0.0);
}
@Test
public void testSelectWithSequentialEvaluators() throws Exception {
String cexpr = "select(list(tuple(a=add(1,2)), tuple(a=add(2,2))), " +
" add(1, a) as blah, " +
" add(1, blah) as blah1," +
" recNum() as recNum)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 2);
Tuple tuple0 = tuples.get(0);
assertEquals(tuple0.getLong("blah").longValue(), 4L);
assertEquals(tuple0.getLong("blah1").longValue(), 5L);
assertEquals(tuple0.getLong("recNum").longValue(), 0);
Tuple tuple1 = tuples.get(1);
assertEquals(tuple1.getLong("blah").longValue(), 5L);
assertEquals(tuple1.getLong("blah1").longValue(), 6L);
assertEquals(tuple1.getLong("recNum").longValue(), 1);
}
@Test
public void testMatches() throws Exception {
String cexpr = "having(list(tuple(a=\"Hello World\"), tuple(a=\"Good bye\")), matches(a, \"Hello\"))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
Tuple tuple0 = tuples.get(0);
assertEquals(tuple0.getString("a"), "Hello World");
cexpr = "having(list(tuple(a=\"Hello World\"), tuple(a=\"Good bye\")), matches(a, \"(?i)good\"))";
paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
solrStream = new SolrStream(url, paramsLoc);
context = new StreamContext();
solrStream.setStreamContext(context);
tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
tuple0 = tuples.get(0);
assertEquals(tuple0.getString("a"), "Good bye");
}
@Test
public void testNotNullHaving() throws Exception {
String cexpr = "having(list(tuple(a=add(1, 1)), tuple(b=add(1, 2))), notNull(b))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
Tuple tuple0 = tuples.get(0);
assertEquals(tuple0.getLong("b").longValue(), 3L);
}
@Test
public void testIsNullHaving() throws Exception {
String cexpr = "having(list(tuple(a=add(1, 1)), tuple(b=add(1, 2))), isNull(b))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
Tuple tuple0 = tuples.get(0);
assertEquals(tuple0.getLong("a").longValue(), 2L);
}
@Test
public void testNotNullSelect() throws Exception {
String cexpr = "select(list(tuple(a=add(1, 1)), tuple(b=add(1, 2))), if(notNull(a),a, 0) as out)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 2);
Tuple tuple0 = tuples.get(0);
assertEquals(tuple0.getLong("out").longValue(), 2L);
Tuple tuple1 = tuples.get(1);
assertEquals(tuple1.getLong("out").longValue(), 0L);
}
@Test
public void testIsNullSelect() throws Exception {
String cexpr = "select(list(tuple(a=add(1, 1)), tuple(b=add(1, 2))), if(isNull(a), 0, a) as out)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 2);
Tuple tuple0 = tuples.get(0);
assertEquals(tuple0.getLong("out").longValue(), 2L);
Tuple tuple1 = tuples.get(1);
assertEquals(tuple1.getLong("out").longValue(), 0L);
}
@Test
public void testLetWithNumericVariables() throws Exception {
String cexpr = "let(echo=true, a=1.88888, b=8888888888.98)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
Tuple tuple = tuples.get(0);
assertEquals(tuple.getDouble("a").doubleValue(), 1.88888, 0.0);
assertEquals(tuple.getDouble("b").doubleValue(), 8888888888.98, 0.0);
}
@Test
public void testLog10() throws Exception {
String cexpr = "let(echo=true, a=array(10, 20, 30), b=log10(a), c=log10(30.5))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
Tuple tuple = tuples.get(0);
@SuppressWarnings({"unchecked"})
List<Number> logs = (List<Number>)tuple.get("b");
assertEquals(logs.size(), 3);
assertEquals(logs.get(0).doubleValue(), 1, 0.0);
assertEquals(logs.get(1).doubleValue(), 1.3010299956639813, 0.0);
assertEquals(logs.get(2).doubleValue(), 1.4771212547196624, 0.0);
Number log = (Number)tuple.get("c");
assertEquals(log.doubleValue(), 1.4842998393467859, 0.0);
}
@Test
public void testRecip() throws Exception {
String cexpr = "let(echo=true, a=array(10, 20, 30), b=recip(a), c=recip(30.5))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
Tuple tuple = tuples.get(0);
@SuppressWarnings({"unchecked"})
List<Number> logs = (List<Number>)tuple.get("b");
assertEquals(logs.size(), 3);
assertEquals(logs.get(0).doubleValue(), .1, 0.0);
assertEquals(logs.get(1).doubleValue(), .05, 0.0);
assertEquals(logs.get(2).doubleValue(), 0.03333333333333333, 0.0);
Number log = (Number)tuple.get("c");
assertEquals(log.doubleValue(), 0.03278688524590164, 0.0);
}
@Test
@SuppressWarnings({"unchecked"})
public void testPow() throws Exception {
String cexpr = "let(echo=true, a=array(10, 20, 30), b=pow(a, 2), c=pow(2, a), d=pow(10, 3), e=pow(a, array(1, 2, 3)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
Tuple tuple = tuples.get(0);
List<Number> pows = (List<Number>)tuple.get("b");
assertEquals(pows.size(), 3);
assertEquals(pows.get(0).doubleValue(), 100, 0.0);
assertEquals(pows.get(1).doubleValue(), 400, 0.0);
assertEquals(pows.get(2).doubleValue(), 900, 0.0);
pows = (List<Number>)tuple.get("c");
assertEquals(pows.size(), 3);
assertEquals(pows.get(0).doubleValue(), 1024, 0.0);
assertEquals(pows.get(1).doubleValue(), 1048576, 0.0);
assertEquals(pows.get(2).doubleValue(), 1073741824, 0.0);
double p = tuple.getDouble("d");
assertEquals(p, 1000, 0.0);
pows = (List<Number>)tuple.get("e");
assertEquals(pows.size(), 3);
assertEquals(pows.get(0).doubleValue(), 10, 0.0);
assertEquals(pows.get(1).doubleValue(), 400, 0.0);
assertEquals(pows.get(2).doubleValue(), 27000, 0.0);
}
@Test
@SuppressWarnings({"unchecked"})
public void testTermVectors() throws Exception {
// Test termVectors with only documents and default termVector settings
String cexpr = "let(echo=true," +
"a=select(list(tuple(id=\"1\", text=\"hello world\"), " +
"tuple(id=\"2\", text=\"hello steve\"), " +
"tuple(id=\"3\", text=\"hello jim jim\"), " +
"tuple(id=\"4\", text=\"hello jack\")), id, analyze(text, test_t) as terms)," +
" b=termVectors(a, minDocFreq=0, maxDocFreq=1)," +
" c=getRowLabels(b)," +
" d=getColumnLabels(b)," +
" e=getAttribute(b, \"docFreqs\"))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
List<List<Number>> termVectors = (List<List<Number>>)tuples.get(0).get("b");
assertEquals(termVectors.size(), 4);
List<Number> termVector = termVectors.get(0);
assertEquals(termVector.size(), 5);
assertEquals(termVector.get(0).doubleValue(), 1.0, 0.0);
assertEquals(termVector.get(1).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(2).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(3).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(4).doubleValue(), 1.916290731874155, 0.0);
termVector = termVectors.get(1);
assertEquals(termVector.size(), 5);
assertEquals(termVector.get(0).doubleValue(), 1.0, 0.0);
assertEquals(termVector.get(1).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(2).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(3).doubleValue(), 1.916290731874155, 0.0);
assertEquals(termVector.get(4).doubleValue(), 0.0, 0.0);
termVector = termVectors.get(2);
assertEquals(termVector.size(), 5);
assertEquals(termVector.get(0).doubleValue(), 1.0, 0.0);
assertEquals(termVector.get(1).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(2).doubleValue(), 2.7100443424662948, 0.0);
assertEquals(termVector.get(3).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(4).doubleValue(), 0.0, 0.0);
termVector = termVectors.get(3);
assertEquals(termVector.size(), 5);
assertEquals(termVector.get(0).doubleValue(), 1.0, 0.0);
assertEquals(termVector.get(1).doubleValue(), 1.916290731874155, 0.0);
assertEquals(termVector.get(2).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(3).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(4).doubleValue(), 0.0, 0.0);
List<String> rowLabels = (List<String>)tuples.get(0).get("c");
assertEquals(rowLabels.size(), 4);
assertEquals(rowLabels.get(0), "1");
assertEquals(rowLabels.get(1), "2");
assertEquals(rowLabels.get(2), "3");
assertEquals(rowLabels.get(3), "4");
List<String> columnLabels = (List<String>)tuples.get(0).get("d");
assertEquals(columnLabels.size(), 5);
assertEquals(columnLabels.get(0), "hello");
assertEquals(columnLabels.get(1), "jack");
assertEquals(columnLabels.get(2), "jim");
assertEquals(columnLabels.get(3), "steve");
assertEquals(columnLabels.get(4), "world");
Map<String, Number> docFreqs = (Map<String, Number>)tuples.get(0).get("e");
assertEquals(docFreqs.size(), 5);
assertEquals(docFreqs.get("hello").intValue(), 4);
assertEquals(docFreqs.get("jack").intValue(), 1);
assertEquals(docFreqs.get("jim").intValue(), 1);
assertEquals(docFreqs.get("steve").intValue(), 1);
assertEquals(docFreqs.get("world").intValue(), 1);
//Test minTermLength. This should drop off the term jim
cexpr = "let(echo=true," +
"a=select(list(tuple(id=\"1\", text=\"hello world\"), " +
"tuple(id=\"2\", text=\"hello steve\"), " +
"tuple(id=\"3\", text=\"hello jim jim\"), " +
"tuple(id=\"4\", text=\"hello jack\")), id, analyze(text, test_t) as terms)," +
" b=termVectors(a, minTermLength=4, minDocFreq=0, maxDocFreq=1)," +
" c=getRowLabels(b)," +
" d=getColumnLabels(b)," +
" e=getAttribute(b, \"docFreqs\"))";
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);
termVectors = (List<List<Number>>)tuples.get(0).get("b");
assertEquals(termVectors.size(), 4);
termVector = termVectors.get(0);
assertEquals(termVector.size(), 4);
assertEquals(termVector.get(0).doubleValue(), 1.0, 0.0);
assertEquals(termVector.get(1).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(2).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(3).doubleValue(), 1.916290731874155, 0.0);
termVector = termVectors.get(1);
assertEquals(termVector.size(), 4);
assertEquals(termVector.get(0).doubleValue(), 1.0, 0.0);
assertEquals(termVector.get(1).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(2).doubleValue(), 1.916290731874155, 0.0);
assertEquals(termVector.get(3).doubleValue(), 0.0, 0.0);
termVector = termVectors.get(2);
assertEquals(termVector.size(), 4);
assertEquals(termVector.get(0).doubleValue(), 1.0, 0.0);
assertEquals(termVector.get(1).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(2).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(3).doubleValue(), 0.0, 0.0);
termVector = termVectors.get(3);
assertEquals(termVector.size(), 4);
assertEquals(termVector.get(0).doubleValue(), 1.0, 0.0);
assertEquals(termVector.get(1).doubleValue(), 1.916290731874155, 0.0);
assertEquals(termVector.get(2).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(3).doubleValue(), 0.0, 0.0);
rowLabels = (List<String>)tuples.get(0).get("c");
assertEquals(rowLabels.size(), 4);
assertEquals(rowLabels.get(0), "1");
assertEquals(rowLabels.get(1), "2");
assertEquals(rowLabels.get(2), "3");
assertEquals(rowLabels.get(3), "4");
columnLabels = (List<String>)tuples.get(0).get("d");
assertEquals(columnLabels.size(), 4);
assertEquals(columnLabels.get(0), "hello");
assertEquals(columnLabels.get(1), "jack");
assertEquals(columnLabels.get(2), "steve");
assertEquals(columnLabels.get(3), "world");
docFreqs = (Map<String, Number>)tuples.get(0).get("e");
assertEquals(docFreqs.size(), 4);
assertEquals(docFreqs.get("hello").intValue(), 4);
assertEquals(docFreqs.get("jack").intValue(), 1);
assertEquals(docFreqs.get("steve").intValue(), 1);
assertEquals(docFreqs.get("world").intValue(), 1);
//Test exclude. This should drop off the term jim
cexpr = "let(echo=true," +
" a=select(plist(tuple(id=\"1\", text=\"hello world\"), " +
" tuple(id=\"2\", text=\"hello steve\"), " +
" tuple(id=\"3\", text=\"hello jim jim\"), " +
" tuple(id=\"4\", text=\"hello jack\")), id, analyze(text, test_t) as terms)," +
" b=termVectors(a, exclude=jim, minDocFreq=0, maxDocFreq=1)," +
" c=getRowLabels(b)," +
" d=getColumnLabels(b)," +
" e=getAttribute(b, \"docFreqs\"))";
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);
termVectors = (List<List<Number>>)tuples.get(0).get("b");
assertEquals(termVectors.size(), 4);
termVector = termVectors.get(0);
assertEquals(termVector.size(), 4);
assertEquals(termVector.get(0).doubleValue(), 1.0, 0.0);
assertEquals(termVector.get(1).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(2).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(3).doubleValue(), 1.916290731874155, 0.0);
termVector = termVectors.get(1);
assertEquals(termVector.size(), 4);
assertEquals(termVector.get(0).doubleValue(), 1.0, 0.0);
assertEquals(termVector.get(1).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(2).doubleValue(), 1.916290731874155, 0.0);
assertEquals(termVector.get(3).doubleValue(), 0.0, 0.0);
termVector = termVectors.get(2);
assertEquals(termVector.size(), 4);
assertEquals(termVector.get(0).doubleValue(), 1.0, 0.0);
assertEquals(termVector.get(1).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(2).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(3).doubleValue(), 0.0, 0.0);
termVector = termVectors.get(3);
assertEquals(termVector.size(), 4);
assertEquals(termVector.get(0).doubleValue(), 1.0, 0.0);
assertEquals(termVector.get(1).doubleValue(), 1.916290731874155, 0.0);
assertEquals(termVector.get(2).doubleValue(), 0.0, 0.0);
assertEquals(termVector.get(3).doubleValue(), 0.0, 0.0);
rowLabels = (List<String>)tuples.get(0).get("c");
assertEquals(rowLabels.size(), 4);
assertEquals(rowLabels.get(0), "1");
assertEquals(rowLabels.get(1), "2");
assertEquals(rowLabels.get(2), "3");
assertEquals(rowLabels.get(3), "4");
columnLabels = (List<String>)tuples.get(0).get("d");
assertEquals(columnLabels.size(), 4);
assertEquals(columnLabels.get(0), "hello");
assertEquals(columnLabels.get(1), "jack");
assertEquals(columnLabels.get(2), "steve");
assertEquals(columnLabels.get(3), "world");
docFreqs = (Map<String, Number>)tuples.get(0).get("e");
assertEquals(docFreqs.size(), 4);
assertEquals(docFreqs.get("hello").intValue(), 4);
assertEquals(docFreqs.get("jack").intValue(), 1);
assertEquals(docFreqs.get("steve").intValue(), 1);
assertEquals(docFreqs.get("world").intValue(), 1);
//Test minDocFreq attribute at .5. This should eliminate all but the term hello
cexpr = "let(echo=true," +
"a=select(plist(tuple(id=\"1\", text=\"hello world\"), " +
"tuple(id=\"2\", text=\"hello steve\"), " +
"tuple(id=\"3\", text=\"hello jim jim\"), " +
"tuple(id=\"4\", text=\"hello jack\")), id, analyze(text, test_t) as terms)," +
" b=termVectors(a, minDocFreq=.5, maxDocFreq=1)," +
" c=getRowLabels(b)," +
" d=getColumnLabels(b)," +
" e=getAttribute(b, \"docFreqs\"))";
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);
termVectors = (List<List<Number>>)tuples.get(0).get("b");
assertEquals(termVectors.size(), 4);
termVector = termVectors.get(0);
assertEquals(termVector.size(), 1);
assertEquals(termVector.get(0).doubleValue(), 1.0, 0.0);
termVector = termVectors.get(1);
assertEquals(termVector.size(), 1);
assertEquals(termVector.get(0).doubleValue(), 1.0, 0.0);
termVector = termVectors.get(2);
assertEquals(termVector.size(), 1);
assertEquals(termVector.get(0).doubleValue(), 1.0, 0.0);
termVector = termVectors.get(3);
assertEquals(termVector.size(), 1);
assertEquals(termVector.get(0).doubleValue(), 1.0, 0.0);
rowLabels = (List<String>)tuples.get(0).get("c");
assertEquals(rowLabels.size(), 4);
assertEquals(rowLabels.get(0), "1");
assertEquals(rowLabels.get(1), "2");
assertEquals(rowLabels.get(2), "3");
assertEquals(rowLabels.get(3), "4");
columnLabels = (List<String>)tuples.get(0).get("d");
assertEquals(columnLabels.size(), 1);
assertEquals(columnLabels.get(0), "hello");
docFreqs = (Map<String, Number>)tuples.get(0).get("e");
assertEquals(docFreqs.size(), 1);
assertEquals(docFreqs.get("hello").intValue(), 4);
//Test maxDocFreq attribute at 0. This should eliminate all terms
cexpr = "let(echo=true," +
"a=select(plist(tuple(id=\"1\", text=\"hello world\"), " +
"tuple(id=\"2\", text=\"hello steve\"), " +
"tuple(id=\"3\", text=\"hello jim jim\"), " +
"tuple(id=\"4\", text=\"hello jack\")), id, analyze(text, test_t) as terms)," +
" b=termVectors(a, maxDocFreq=0)," +
" c=getRowLabels(b)," +
" d=getColumnLabels(b)," +
" e=getAttribute(b, \"docFreqs\"))";
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);
termVectors = (List<List<Number>>)tuples.get(0).get("b");
assertEquals(termVectors.size(), 4);
assertEquals(termVectors.get(0).size(), 0);
}
@Test
public void testPivot() throws Exception {
String cexpr = "let(echo=true," +
" a=list(tuple(fx=x1, fy=f1, fv=add(1,1)), " +
" tuple(fx=x1, fy=f2, fv=add(1,3)), " +
" tuple(fx=x2, fy=f1, fv=add(1,7)), " +
" tuple(fx=x3, fy=f1, fv=add(1,4))," +
" tuple(fx=x3, fy=f3, fv=add(1,7)))," +
" b=pivot(a, \"fx\", \"fy\", \"fv\")," +
" c=getRowLabels(b)," +
" d=getColumnLabels(b))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
@SuppressWarnings({"unchecked"})
List<List<Number>> matrix = (List<List<Number>>)tuples.get(0).get("b");
List<Number> row1 = matrix.get(0);
assertEquals(row1.get(0).doubleValue(), 2.0,0);
assertEquals(row1.get(1).doubleValue(), 4.0,0);
assertEquals(row1.get(2).doubleValue(), 0,0);
List<Number> row2 = matrix.get(1);
assertEquals(row2.get(0).doubleValue(), 8.0,0);
assertEquals(row2.get(1).doubleValue(), 0,0);
assertEquals(row2.get(2).doubleValue(), 0,0);
List<Number> row3 = matrix.get(2);
assertEquals(row3.get(0).doubleValue(), 5.0,0);
assertEquals(row3.get(1).doubleValue(), 0,0);
assertEquals(row3.get(2).doubleValue(), 8.0,0);
@SuppressWarnings({"unchecked"})
List<String> rowLabels = (List<String>)tuples.get(0).get("c");
assertEquals(rowLabels.get(0), "x1");
assertEquals(rowLabels.get(1), "x2");
assertEquals(rowLabels.get(2), "x3");
@SuppressWarnings({"unchecked"})
List<String> columnLabels = (List<String>)tuples.get(0).get("d");
assertEquals(columnLabels.get(0), "f1");
assertEquals(columnLabels.get(1), "f2");
assertEquals(columnLabels.get(2), "f3");
}
@Test
public void testEbeSubtract() throws Exception {
String cexpr = "let(echo=true," +
" a=array(2, 4, 6, 8, 10, 12)," +
" b=array(1, 2, 3, 4, 5, 6)," +
" c=ebeSubtract(a,b)," +
" d=array(10, 11, 12, 13, 14, 15)," +
" e=array(100, 200, 300, 400, 500, 600)," +
" f=matrix(a, b)," +
" g=matrix(d, e)," +
" h=ebeSubtract(f, g))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("c");
assertEquals(out.size(), 6);
assertEquals(out.get(0).doubleValue(), 1.0, 0.0);
assertEquals(out.get(1).doubleValue(), 2.0, 0.0);
assertEquals(out.get(2).doubleValue(), 3.0, 0.0);
assertEquals(out.get(3).doubleValue(), 4.0, 0.0);
assertEquals(out.get(4).doubleValue(), 5.0, 0.0);
assertEquals(out.get(5).doubleValue(), 6.0, 0.0);
@SuppressWarnings({"unchecked"})
List<List<Number>> mout = (List<List<Number>>)tuples.get(0).get("h");
assertEquals(mout.size(), 2);
List<Number> row1 = mout.get(0);
assertEquals(row1.size(), 6);
assertEquals(row1.get(0).doubleValue(), -8.0, 0.0);
assertEquals(row1.get(1).doubleValue(), -7.0, 0.0);
assertEquals(row1.get(2).doubleValue(), -6.0, 0.0);
assertEquals(row1.get(3).doubleValue(), -5.0, 0.0);
assertEquals(row1.get(4).doubleValue(), -4.0, 0.0);
assertEquals(row1.get(5).doubleValue(), -3.0, 0.0);
List<Number> row2 = mout.get(1);
assertEquals(row2.size(), 6);
assertEquals(row2.get(0).doubleValue(), -99.0, 0.0);
assertEquals(row2.get(1).doubleValue(), -198.0, 0.0);
assertEquals(row2.get(2).doubleValue(), -297.0, 0.0);
assertEquals(row2.get(3).doubleValue(), -396.0, 0.0);
assertEquals(row2.get(4).doubleValue(), -495.0, 0.0);
assertEquals(row2.get(5).doubleValue(), -594.0, 0.0);
}
@Test
@SuppressWarnings({"unchecked"})
public void testMatrixMult() throws Exception {
String cexpr = "let(echo=true," +
" a=array(1,2,3)," +
" b=matrix(array(4), array(5), array(6))," +
" c=matrixMult(a, b)," +
" d=matrix(array(3, 4), array(10,11), array(30, 40))," +
" e=matrixMult(a, d)," +
" f=array(4,8,10)," +
" g=matrix(a, f)," +
" h=matrixMult(d, g)," +
" i=matrixMult(b, a))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
List<List<Number>> matrix = (List<List<Number>>)tuples.get(0).get("c");
assertEquals(matrix.size(), 1);
List<Number> row = matrix.get(0);
assertEquals(row.size(), 1);
assertEquals(row.get(0).doubleValue(), 32.0, 0.0);
matrix = (List<List<Number>>)tuples.get(0).get("e");
assertEquals(matrix.size(), 1);
row = matrix.get(0);
assertEquals(row.size(), 2);
assertEquals(row.get(0).doubleValue(), 113.0, 0.0);
assertEquals(row.get(1).doubleValue(), 146.0, 0.0);
matrix = (List<List<Number>>)tuples.get(0).get("h");
assertEquals(matrix.size(), 3);
row = matrix.get(0);
assertEquals(row.size(), 3);
assertEquals(row.get(0).doubleValue(), 19.0, 0.0);
assertEquals(row.get(1).doubleValue(), 38.0, 0.0);
assertEquals(row.get(2).doubleValue(), 49.0, 0.0);
row = matrix.get(1);
assertEquals(row.size(), 3);
assertEquals(row.get(0).doubleValue(), 54.0, 0.0);
assertEquals(row.get(1).doubleValue(), 108.0, 0.0);
assertEquals(row.get(2).doubleValue(), 140.0, 0.0);
row = matrix.get(2);
assertEquals(row.size(), 3);
assertEquals(row.get(0).doubleValue(), 190.0, 0.0);
assertEquals(row.get(1).doubleValue(), 380.0, 0.0);
assertEquals(row.get(2).doubleValue(), 490.0, 0.0);
matrix = (List<List<Number>>)tuples.get(0).get("i");
assertEquals(matrix.size(), 3);
row = matrix.get(0);
assertEquals(row.size(), 3);
assertEquals(row.get(0).doubleValue(), 4.0, 0.0);
assertEquals(row.get(1).doubleValue(), 8.0, 0.0);
assertEquals(row.get(2).doubleValue(), 12.0, 0.0);
row = matrix.get(1);
assertEquals(row.size(), 3);
assertEquals(row.get(0).doubleValue(), 5.0, 0.0);
assertEquals(row.get(1).doubleValue(), 10.0, 0.0);
assertEquals(row.get(2).doubleValue(), 15.0, 0.0);
row = matrix.get(2);
assertEquals(row.size(), 3);
assertEquals(row.get(0).doubleValue(), 6.0, 0.0);
assertEquals(row.get(1).doubleValue(), 12.0, 0.0);
assertEquals(row.get(2).doubleValue(), 18.0, 0.0);
}
@Test
public void testKmeans() throws Exception {
String cexpr = "let(echo=true," +
" a=array(1,1,1,0,0,0)," +
" b=array(1,1,1,0,0,0)," +
" c=array(0,0,0,1,1,1)," +
" d=array(0,0,0,1,1,1)," +
" e=setRowLabels(matrix(a,b,c,d), " +
" array(\"doc1\", \"doc2\", \"doc3\", \"doc4\"))," +
" f=kmeans(e, 2)," +
" g=getCluster(f, 0)," +
" h=getCluster(f, 1)," +
" i=getCentroids(f)," +
" j=getRowLabels(g)," +
" k=getRowLabels(h))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<List<Number>> cluster1 = (List<List<Number>>)tuples.get(0).get("g");
@SuppressWarnings({"unchecked"})
List<List<Number>> cluster2 = (List<List<Number>>)tuples.get(0).get("h");
@SuppressWarnings({"unchecked"})
List<List<Number>> centroids = (List<List<Number>>)tuples.get(0).get("i");
@SuppressWarnings({"unchecked"})
List<String> labels1 = (List<String>)tuples.get(0).get("j");
@SuppressWarnings({"unchecked"})
List<String> labels2 = (List<String>)tuples.get(0).get("k");
assertEquals(cluster1.size(), 2);
assertEquals(cluster2.size(), 2);
assertEquals(centroids.size(), 2);
//Assert that the docs are not in both clusters
assertTrue(!(labels1.contains("doc1") && labels2.contains("doc1")));
assertTrue(!(labels1.contains("doc2") && labels2.contains("doc2")));
assertTrue(!(labels1.contains("doc3") && labels2.contains("doc3")));
assertTrue(!(labels1.contains("doc4") && labels2.contains("doc4")));
//Assert that (doc1 and doc2) or (doc3 and doc4) are in labels1
assertTrue((labels1.contains("doc1") && labels1.contains("doc2")) ||
((labels1.contains("doc3") && labels1.contains("doc4"))));
//Assert that (doc1 and doc2) or (doc3 and doc4) are in labels2
assertTrue((labels2.contains("doc1") && labels2.contains("doc2")) ||
((labels2.contains("doc3") && labels2.contains("doc4"))));
if(labels1.contains("doc1")) {
assertEquals(centroids.get(0).get(0).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(0).get(1).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(0).get(2).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(0).get(3).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(0).get(4).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(0).get(5).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(1).get(0).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(1).get(1).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(1).get(2).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(1).get(3).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(1).get(4).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(1).get(5).doubleValue(), 1.0, 0.0);
} else {
assertEquals(centroids.get(0).get(0).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(0).get(1).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(0).get(2).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(0).get(3).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(0).get(4).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(0).get(5).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(1).get(0).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(1).get(1).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(1).get(2).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(1).get(3).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(1).get(4).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(1).get(5).doubleValue(), 0.0, 0.0);
}
}
@Test
public void testDbscanBasic() throws Exception {
String cexpr = "let(echo=true," +
" a=array(5,4,5,1,1,1)," +
" b=array(5,5,5,1,2,1)," +
" f=dbscan(transpose(matrix(a,b)), 2, 2)," +
" zplot(clusters=f))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 6);
Tuple tuple0 = tuples.get(0);
assertEquals(tuple0.getString("cluster"), "cluster1");
Tuple tuple1 = tuples.get(1);
assertEquals(tuple1.getString("cluster"), "cluster1");
Tuple tuple2 = tuples.get(2);
assertEquals(tuple2.getString("cluster"), "cluster1");
Tuple tuple3 = tuples.get(3);
assertEquals(tuple3.getString("cluster"), "cluster2");
Tuple tuple4 = tuples.get(4);
assertEquals(tuple4.getString("cluster"), "cluster2");
Tuple tuple5 = tuples.get(5);
assertEquals(tuple5.getString("cluster"), "cluster2");
}
@Test
public void testDbscanDistance() throws Exception {
String cexpr = "let(echo=true," +
" a=array(5,4,5,1,1,1)," +
" b=array(5,5,5,1,2,1)," +
" f=dbscan(transpose(matrix(a,b)), 500000, 2, haversineMeters())," +
" zplot(clusters=f))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 6);
Tuple tuple0 = tuples.get(0);
assertEquals(tuple0.getString("cluster"), "cluster1");
Tuple tuple1 = tuples.get(1);
assertEquals(tuple1.getString("cluster"), "cluster1");
Tuple tuple2 = tuples.get(2);
assertEquals(tuple2.getString("cluster"), "cluster1");
Tuple tuple3 = tuples.get(3);
assertEquals(tuple3.getString("cluster"), "cluster1");
Tuple tuple4 = tuples.get(4);
assertEquals(tuple4.getString("cluster"), "cluster1");
Tuple tuple5 = tuples.get(5);
assertEquals(tuple5.getString("cluster"), "cluster1");
}
@Test
public void testDbscanNoClusters() throws Exception {
String cexpr = "let(echo=true," +
" a=array(5,4,5,1,1,1)," +
" b=array(5,5,5,1,2,1)," +
" f=dbscan(transpose(matrix(a,b)), 5000, 2, haversineMeters())," +
" zplot(clusters=f))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 0);
}
@Test
public void testMultiKmeans() throws Exception {
String cexpr = "let(echo=true," +
" a=array(1,1,1,0,0,0)," +
" b=array(1,1,1,0,0,0)," +
" c=array(0,0,0,1,1,1)," +
" d=array(0,0,0,1,1,1)," +
" e=setRowLabels(matrix(a,b,c,d), " +
" array(\"doc1\", \"doc2\", \"doc3\", \"doc4\"))," +
" f=multiKmeans(e, 2, 5)," +
" g=getCluster(f, 0)," +
" h=getCluster(f, 1)," +
" i=getCentroids(f)," +
" j=getRowLabels(g)," +
" k=getRowLabels(h))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<List<Number>> cluster1 = (List<List<Number>>)tuples.get(0).get("g");
@SuppressWarnings({"unchecked"})
List<List<Number>> cluster2 = (List<List<Number>>)tuples.get(0).get("h");
@SuppressWarnings({"unchecked"})
List<List<Number>> centroids = (List<List<Number>>)tuples.get(0).get("i");
@SuppressWarnings({"unchecked"})
List<String> labels1 = (List<String>)tuples.get(0).get("j");
@SuppressWarnings({"unchecked"})
List<String> labels2 = (List<String>)tuples.get(0).get("k");
assertEquals(cluster1.size(), 2);
assertEquals(cluster2.size(), 2);
assertEquals(centroids.size(), 2);
//Assert that the docs are not in both clusters
assertTrue(!(labels1.contains("doc1") && labels2.contains("doc1")));
assertTrue(!(labels1.contains("doc2") && labels2.contains("doc2")));
assertTrue(!(labels1.contains("doc3") && labels2.contains("doc3")));
assertTrue(!(labels1.contains("doc4") && labels2.contains("doc4")));
//Assert that (doc1 and doc2) or (doc3 and doc4) are in labels1
assertTrue((labels1.contains("doc1") && labels1.contains("doc2")) ||
((labels1.contains("doc3") && labels1.contains("doc4"))));
//Assert that (doc1 and doc2) or (doc3 and doc4) are in labels2
assertTrue((labels2.contains("doc1") && labels2.contains("doc2")) ||
((labels2.contains("doc3") && labels2.contains("doc4"))));
if(labels1.contains("doc1")) {
assertEquals(centroids.get(0).get(0).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(0).get(1).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(0).get(2).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(0).get(3).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(0).get(4).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(0).get(5).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(1).get(0).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(1).get(1).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(1).get(2).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(1).get(3).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(1).get(4).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(1).get(5).doubleValue(), 1.0, 0.0);
} else {
assertEquals(centroids.get(0).get(0).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(0).get(1).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(0).get(2).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(0).get(3).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(0).get(4).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(0).get(5).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(1).get(0).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(1).get(1).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(1).get(2).doubleValue(), 1.0, 0.0);
assertEquals(centroids.get(1).get(3).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(1).get(4).doubleValue(), 0.0, 0.0);
assertEquals(centroids.get(1).get(5).doubleValue(), 0.0, 0.0);
}
}
@Test
public void testFuzzyKmeans() throws Exception {
String cexpr = "let(echo=true," +
" a=array(1,1,1,0,0,0)," +
" b=array(1,1,1,0,0,0)," +
" c=array(0,0,0,1,1,1)," +
" d=array(0,0,0,1,1,1)," +
" e=setRowLabels(matrix(a,b,c,d), " +
" array(\"doc1\", \"doc2\", \"doc3\", \"doc4\"))," +
" f=fuzzyKmeans(e, 2)," +
" g=getCluster(f, 0)," +
" h=getCluster(f, 1)," +
" i=getCentroids(f)," +
" j=getRowLabels(g)," +
" k=getRowLabels(h)," +
" l=getMembershipMatrix(f))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<List<Number>> cluster1 = (List<List<Number>>)tuples.get(0).get("g");
@SuppressWarnings({"unchecked"})
List<List<Number>> cluster2 = (List<List<Number>>)tuples.get(0).get("h");
@SuppressWarnings({"unchecked"})
List<List<Number>> centroids = (List<List<Number>>)tuples.get(0).get("i");
@SuppressWarnings({"unchecked"})
List<List<Number>> membership = (List<List<Number>>)tuples.get(0).get("l");
@SuppressWarnings({"unchecked"})
List<String> labels1 = (List<String>)tuples.get(0).get("j");
@SuppressWarnings({"unchecked"})
List<String> labels2 = (List<String>)tuples.get(0).get("k");
assertEquals(cluster1.size(), 2);
assertEquals(cluster2.size(), 2);
assertEquals(centroids.size(), 2);
//Assert that the docs are not in both clusters
assertTrue(!(labels1.contains("doc1") && labels2.contains("doc1")));
assertTrue(!(labels1.contains("doc2") && labels2.contains("doc2")));
assertTrue(!(labels1.contains("doc3") && labels2.contains("doc3")));
assertTrue(!(labels1.contains("doc4") && labels2.contains("doc4")));
//Assert that (doc1 and doc2) or (doc3 and doc4) are in labels1
assertTrue((labels1.contains("doc1") && labels1.contains("doc2")) ||
((labels1.contains("doc3") && labels1.contains("doc4"))));
//Assert that (doc1 and doc2) or (doc3 and doc4) are in labels2
assertTrue((labels2.contains("doc1") && labels2.contains("doc2")) ||
((labels2.contains("doc3") && labels2.contains("doc4"))));
if(labels1.contains("doc1")) {
assertEquals(centroids.get(0).get(0).doubleValue(), 1.0, 0.001);
assertEquals(centroids.get(0).get(1).doubleValue(), 1.0, 0.001);
assertEquals(centroids.get(0).get(2).doubleValue(), 1.0, 0.001);
assertEquals(centroids.get(0).get(3).doubleValue(), 0.0, 0.001);
assertEquals(centroids.get(0).get(4).doubleValue(), 0.0, 0.001);
assertEquals(centroids.get(0).get(5).doubleValue(), 0.0, 0.001);
assertEquals(centroids.get(1).get(0).doubleValue(), 0.0, 0.001);
assertEquals(centroids.get(1).get(1).doubleValue(), 0.0, 0.001);
assertEquals(centroids.get(1).get(2).doubleValue(), 0.0, 0.001);
assertEquals(centroids.get(1).get(3).doubleValue(), 1.0, 0.001);
assertEquals(centroids.get(1).get(4).doubleValue(), 1.0, 0.001);
assertEquals(centroids.get(1).get(5).doubleValue(), 1.0, 0.001);
//Assert the membership matrix
assertEquals(membership.get(0).get(0).doubleValue(), 1.0, 0.001);
assertEquals(membership.get(0).get(1).doubleValue(), 0.0, 0.001);
assertEquals(membership.get(1).get(0).doubleValue(), 1.0, 0.001);
assertEquals(membership.get(1).get(1).doubleValue(), 0.0, 0.001);
assertEquals(membership.get(2).get(0).doubleValue(), 0.0, 0.001);
assertEquals(membership.get(2).get(1).doubleValue(), 1.0, 0.001);
assertEquals(membership.get(3).get(0).doubleValue(), 0.0, 0.001);
assertEquals(membership.get(3).get(1).doubleValue(), 1.0, 0.001);
} else {
assertEquals(centroids.get(0).get(0).doubleValue(), 0.0, 0.001);
assertEquals(centroids.get(0).get(1).doubleValue(), 0.0, 0.001);
assertEquals(centroids.get(0).get(2).doubleValue(), 0.0, 0.001);
assertEquals(centroids.get(0).get(3).doubleValue(), 1.0, 0.001);
assertEquals(centroids.get(0).get(4).doubleValue(), 1.0, 0.001);
assertEquals(centroids.get(0).get(5).doubleValue(), 1.0, 0.001);
assertEquals(centroids.get(1).get(0).doubleValue(), 1.0, 0.001);
assertEquals(centroids.get(1).get(1).doubleValue(), 1.0, 0.001);
assertEquals(centroids.get(1).get(2).doubleValue(), 1.0, 0.001);
assertEquals(centroids.get(1).get(3).doubleValue(), 0.0, 0.001);
assertEquals(centroids.get(1).get(4).doubleValue(), 0.0, 0.001);
assertEquals(centroids.get(1).get(5).doubleValue(), 0.0, 0.001);
//Assert the membership matrix
assertEquals(membership.get(0).get(0).doubleValue(), 0.0, 0.001);
assertEquals(membership.get(0).get(1).doubleValue(), 1.0, 0.001);
assertEquals(membership.get(1).get(0).doubleValue(), 0.0, 0.001);
assertEquals(membership.get(1).get(1).doubleValue(), 1.0, 0.001);
assertEquals(membership.get(2).get(0).doubleValue(), 1.0, 0.001);
assertEquals(membership.get(2).get(1).doubleValue(), 0.0, 0.001);
assertEquals(membership.get(3).get(0).doubleValue(), 1.0, 0.001);
assertEquals(membership.get(3).get(1).doubleValue(), 0.0, 0.001);
}
}
@Test
public void testEbeMultiply() throws Exception {
String cexpr = "ebeMultiply(array(2,4,6,8,10,12),array(1,2,3,4,5,6))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("return-value");
assertTrue(out.size() == 6);
assertTrue(out.get(0).intValue() == 2);
assertTrue(out.get(1).intValue() == 8);
assertTrue(out.get(2).intValue() == 18);
assertTrue(out.get(3).intValue() == 32);
assertTrue(out.get(4).intValue() == 50);
assertTrue(out.get(5).intValue() == 72);
}
@Test
public void testOscillate() throws Exception {
String cexpr = "let(echo=true," +
" a=oscillate(10, .3, 2.9)," +
" b=describe(a)," +
" c=getValue(b, \"min\")," +
" d=getValue(b, \"max\")," +
" e=harmfit(a)," +
" f=getAmplitude(e)," +
" g=getAngularFrequency(e)," +
" h=getPhase(e)," +
" i=derivative(a))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> wave = (List<Number>)tuples.get(0).get("a");
assertEquals(wave.size(), 128);
Number min = (Number)tuples.get(0).get("c");
Number max = (Number)tuples.get(0).get("d");
assertEquals(min.doubleValue(), -9.9, .1);
assertEquals(max.doubleValue(), 9.9, .1);
@SuppressWarnings({"unchecked"})
List<Number> wave1 = (List<Number>)tuples.get(0).get("e");
assertEquals(wave1.size(), 128);
Number amp = (Number)tuples.get(0).get("f");
Number freq = (Number)tuples.get(0).get("g");
Number pha = (Number)tuples.get(0).get("h");
assertEquals(amp.doubleValue(), 10, .1);
assertEquals(freq.doubleValue(), .3, .1);
assertEquals(pha.doubleValue(), 2.9, .1);
@SuppressWarnings({"unchecked"})
List<Number> der = (List<Number>)tuples.get(0).get("i");
assertEquals(der.size(), 128);
assertEquals(der.get(0).doubleValue(), -0.7177479876419472, 0);
assertEquals(der.get(127).doubleValue(), 0.47586800641412696, 0);
}
@Test
public void testEbeAdd() throws Exception {
String cexpr = "let(echo=true," +
" a=array(2, 4, 6, 8, 10, 12)," +
" b=array(1, 2, 3, 4, 5, 6)," +
" c=ebeAdd(a,b)," +
" d=array(10, 11, 12, 13, 14, 15)," +
" e=array(100, 200, 300, 400, 500, 600)," +
" f=matrix(a, b)," +
" g=matrix(d, e)," +
" h=ebeAdd(f, g))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("c");
assertEquals(out.size(), 6);
assertEquals(out.get(0).doubleValue(), 3.0, 0.0);
assertEquals(out.get(1).doubleValue(), 6.0, 0.0);
assertEquals(out.get(2).doubleValue(), 9.0, 0.0);
assertEquals(out.get(3).doubleValue(), 12.0, 0.0);
assertEquals(out.get(4).doubleValue(), 15.0, 0.0);
assertEquals(out.get(5).doubleValue(), 18.0, 0.0);
@SuppressWarnings({"unchecked"})
List<List<Number>> mout = (List<List<Number>>)tuples.get(0).get("h");
assertEquals(mout.size(), 2);
List<Number> row1 = mout.get(0);
assertEquals(row1.size(), 6);
assertEquals(row1.get(0).doubleValue(), 12.0, 0.0);
assertEquals(row1.get(1).doubleValue(), 15.0, 0.0);
assertEquals(row1.get(2).doubleValue(), 18.0, 0.0);
assertEquals(row1.get(3).doubleValue(), 21.0, 0.0);
assertEquals(row1.get(4).doubleValue(), 24.0, 0.0);
assertEquals(row1.get(5).doubleValue(), 27.0, 0.0);
List<Number> row2 = mout.get(1);
assertEquals(row2.size(), 6);
assertEquals(row2.get(0).doubleValue(), 101.0, 0.0);
assertEquals(row2.get(1).doubleValue(), 202.0, 0.0);
assertEquals(row2.get(2).doubleValue(), 303.0, 0.0);
assertEquals(row2.get(3).doubleValue(), 404.0, 0.0);
assertEquals(row2.get(4).doubleValue(), 505.0, 0.0);
assertEquals(row2.get(5).doubleValue(), 606.0, 0.0);
}
@Test
public void testSetAndGetValue() throws Exception {
String cexpr = "let(echo=true," +
" a=describe(array(1,2,3,4,5,6,7))," +
" b=getValue(a, \"geometricMean\")," +
" c=setValue(a, \"test\", add(b, 1))," +
" d=getValue(c, \"test\")," +
" e=setValue(c, \"blah\", array(8.11,9.55,10.1))," +
" f=getValue(e, \"blah\"))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Number mean = (Number)tuples.get(0).get("b");
assertEquals(mean.doubleValue(), 3.3800151591412964, 0.0);
Number mean1 = (Number)tuples.get(0).get("d");
assertEquals(mean1.doubleValue(), 4.3800151591412964, 0.0);
@SuppressWarnings({"unchecked"})
List<Number> vals = (List<Number>)tuples.get(0).get("f");
assertEquals(vals.size(), 3);
assertEquals(vals.get(0).doubleValue(), 8.11, 0);
assertEquals(vals.get(1).doubleValue(), 9.55, 0);
assertEquals(vals.get(2).doubleValue(), 10.1, 0);
}
@Test
public void testEbeDivide() throws Exception {
String cexpr = "ebeDivide(array(2,4,6,8,10,12),array(1,2,3,4,5,6))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("return-value");
assertTrue(out.size() == 6);
assertTrue(out.get(0).intValue() == 2);
assertTrue(out.get(1).intValue() == 2);
assertTrue(out.get(2).intValue() == 2);
assertTrue(out.get(3).intValue() == 2);
assertTrue(out.get(4).intValue() == 2);
assertTrue(out.get(5).intValue() == 2);
}
@Test
public void testFreqTable() throws Exception {
String cexpr = "freqTable(array(2,4,6,8,10,12,12,4,8,8,8,2))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 6);
Tuple bucket = tuples.get(0);
assertEquals(bucket.getLong("value").longValue(), 2);
assertEquals(bucket.getLong("count").longValue(), 2);
bucket = tuples.get(1);
assertEquals(bucket.getLong("value").longValue(), 4);
assertEquals(bucket.getLong("count").longValue(), 2);
bucket = tuples.get(2);
assertEquals(bucket.getLong("value").longValue(), 6);
assertEquals(bucket.getLong("count").longValue(), 1);
bucket = tuples.get(3);
assertEquals(bucket.getLong("value").longValue(), 8);
assertEquals(bucket.getLong("count").longValue(), 4);
bucket = tuples.get(4);
assertEquals(bucket.getLong("value").longValue(), 10);
assertEquals(bucket.getLong("count").longValue(), 1);
bucket = tuples.get(5);
assertEquals(bucket.getLong("value").longValue(), 12);
assertEquals(bucket.getLong("count").longValue(), 2);
}
@Test
public void testFFT() throws Exception {
String cexpr = "let(echo=true," +
" a=fft(array(1, 4, 8, 4, 1, 4, 8, 4, 1, 4, 8, 4, 1, 4, 8, 4))," +
" b=ifft(a))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
@SuppressWarnings({"unchecked"})
List<List<Number>> fft = (List<List<Number>>)tuples.get(0).get("a");
assertEquals(fft.size(), 2);
List<Number> reals = fft.get(0);
assertEquals(reals.get(0).doubleValue(), 68, 0.0);
assertEquals(reals.get(1).doubleValue(), 0, 0.0);
assertEquals(reals.get(2).doubleValue(), 0, 0.0);
assertEquals(reals.get(3).doubleValue(), 0, 0.0);
assertEquals(reals.get(4).doubleValue(), -28, 0.0);
assertEquals(reals.get(5).doubleValue(), 0, 0.0);
assertEquals(reals.get(6).doubleValue(), 0, 0.0);
assertEquals(reals.get(7).doubleValue(), 0, 0.0);
assertEquals(reals.get(8).doubleValue(), 4, 0.0);
assertEquals(reals.get(9).doubleValue(), 0, 0.0);
assertEquals(reals.get(10).doubleValue(), 0, 0.0);
assertEquals(reals.get(11).doubleValue(), 0, 0.0);
assertEquals(reals.get(12).doubleValue(), -28, 0.0);
assertEquals(reals.get(13).doubleValue(), 0, 0.0);
assertEquals(reals.get(14).doubleValue(), 0, 0.0);
assertEquals(reals.get(15).doubleValue(), 0, 0.0);
List<Number> imaginary = fft.get(1);
for(int i=0; i<imaginary.size(); i++) {
assertEquals(imaginary.get(i).doubleValue(), 0.0, 0.0);
}
@SuppressWarnings({"unchecked"})
List<Number> ifft = (List<Number>)tuples.get(0).get("b");
assertEquals(ifft.get(0).doubleValue(), 1, 0.0);
assertEquals(ifft.get(1).doubleValue(), 4, 0.0);
assertEquals(ifft.get(2).doubleValue(), 8, 0.0);
assertEquals(ifft.get(3).doubleValue(), 4, 0.0);
assertEquals(ifft.get(4).doubleValue(), 1, 0.0);
assertEquals(ifft.get(5).doubleValue(), 4, 0.0);
assertEquals(ifft.get(6).doubleValue(), 8, 0.0);
assertEquals(ifft.get(7).doubleValue(), 4, 0.0);
assertEquals(ifft.get(8).doubleValue(), 1, 0.0);
assertEquals(ifft.get(9).doubleValue(), 4, 0.0);
assertEquals(ifft.get(10).doubleValue(), 8, 0.0);
assertEquals(ifft.get(11).doubleValue(), 4, 0.0);
assertEquals(ifft.get(12).doubleValue(), 1, 0.0);
assertEquals(ifft.get(13).doubleValue(), 4, 0.0);
assertEquals(ifft.get(14).doubleValue(), 8, 0.0);
assertEquals(ifft.get(15).doubleValue(), 4, 0.0);
}
@Test
public void testCosineSimilarity() throws Exception {
String cexpr = "cosineSimilarity(array(2,4,6,8),array(1,1,3,4))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Number cs = (Number)tuples.get(0).get("return-value");
assertEquals(cs.doubleValue(),0.9838197164968291, .00000001);
}
@Test
public void testCosineSimilaritySort() throws Exception {
String cexpr = "sort(select(list(tuple(id=\"1\", f=array(1,2,3,4)), tuple(id=\"2\",f=array(10,2,3,4)))," +
" cosineSimilarity(f, array(1,2,3,4)) as sim, id)," +
" by=\"sim desc\")";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 2);
assertEquals(tuples.get(0).getString("id"), "1");
}
@Test
public void testPoissonDistribution() throws Exception {
String cexpr = "let(a=poissonDistribution(100)," +
" b=sample(a, 10000)," +
" tuple(d=describe(b), " +
" p=probability(a, 100), " +
" c=cumulativeProbability(a, 100)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"rawtypes"})
Map map = (Map)tuples.get(0).get("d");
Number mean = (Number)map.get("mean");
Number var = (Number)map.get("var");
//The mean and variance should be almost the same for poisson distribution
assertEquals(mean.doubleValue(), var.doubleValue(), 7.0);
Number prob = (Number)tuples.get(0).get("p");
assertEquals(prob.doubleValue(), 0.03986099680914713, 0.0);
Number cprob = (Number)tuples.get(0).get("c");
assertEquals(cprob.doubleValue(), 0.5265621985303708, 0.0);
}
@Test
public void testGeometricDistribution() throws Exception {
String cexpr = "let(a=geometricDistribution(.2)," +
" b=geometricDistribution(.5)," +
" c=geometricDistribution(.8)," +
" d=sample(a, 10000)," +
" e=sample(b, 10000)," +
" f=sample(c, 10000)," +
" g=freqTable(d)," +
" h=freqTable(e)," +
" i=freqTable(f)," +
" tuple(g=g, h=h, i=i))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked", "rawtypes"})
List<Map> listg = (List<Map>)tuples.get(0).get("g");
@SuppressWarnings({"rawtypes"})
Map mapg = listg.get(0);
double pctg = (double) mapg.get("pct");
assertEquals(pctg, .2, .02);
@SuppressWarnings({"unchecked", "rawtypes"})
List<Map> listh = (List<Map>)tuples.get(0).get("h");
@SuppressWarnings({"rawtypes"})
Map maph = listh.get(0);
double pcth = (double)maph.get("pct");
assertEquals(pcth, .5, .02);
@SuppressWarnings({"unchecked", "rawtypes"})
List<Map> listi = (List<Map>)tuples.get(0).get("i");
@SuppressWarnings({"rawtypes"})
Map mapi = listi.get(0);
double pcti = (double)mapi.get("pct");
assertEquals(pcti, .8, .02);
}
@Test
public void testBinomialDistribution() throws Exception {
String cexpr = "let(a=binomialDistribution(100, .50)," +
" b=sample(a, 10000)," +
" tuple(d=describe(b), " +
" p=probability(a, 50), " +
" c=cumulativeProbability(a, 50)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Number prob = (Number)tuples.get(0).get("p");
assertEquals(prob.doubleValue(),0.07958923738717877, 0.0);
Number cprob = (Number)tuples.get(0).get("c");
assertEquals(cprob.doubleValue(), 0.5397946186935851, 0.0);
}
@Test
public void testUniformIntegerDistribution() throws Exception {
String cexpr = "let(a=uniformIntegerDistribution(1, 10)," +
" b=sample(a, 10000)," +
" tuple(d=describe(b), " +
" p=probability(a, 5), " +
" c=cumulativeProbability(a, 5)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"rawtypes"})
Map map = (Map)tuples.get(0).get("d");
Number N = (Number)map.get("N");
assertEquals(N.intValue(), 10000);
Number prob = (Number)tuples.get(0).get("p");
assertEquals(prob.doubleValue(), 0.1, 0.0);
Number cprob = (Number)tuples.get(0).get("c");
assertEquals(cprob.doubleValue(), 0.5, 0.0);
}
@Test
public void testZipFDistribution() throws Exception {
String cexpr = "let(a=sample(zipFDistribution(10, 1), 50000), b=freqTable(a), c=col(b, count))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> counts = (List<Number>)tuples.get(0).get("c");
assertTrue(counts.size() == 10);
int lastCount = Integer.MAX_VALUE;
for(Number number : counts) {
int current = number.intValue();
if(current > lastCount) {
throw new Exception("Zipf distribution not descending!!!");
} else {
lastCount = current;
}
}
}
@Test
public void testValueAt() throws Exception {
String cexpr = "let(echo=true, " +
" b=array(1,2,3,4), " +
" c=matrix(array(5,6,7), " +
" array(8,9,10)), " +
" d=valueAt(b, 3)," +
" e=valueAt(c, 1, 0))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Number value1 = (Number)tuples.get(0).get("d");
Number value2 = (Number)tuples.get(0).get("e");
assertEquals(value1.intValue(), 4);
assertEquals(value2.intValue(), 8);
}
@Test
@SuppressWarnings({"unchecked"})
public void testBetaDistribution() throws Exception {
String cexpr = "let(a=sample(betaDistribution(1, 5), 50000), b=hist(a, 11), c=col(b, N))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
List<Number> counts = (List<Number>)tuples.get(0).get("c");
int lastCount = Integer.MAX_VALUE;
for(Number number : counts) {
int current = number.intValue();
if(current > lastCount) {
throw new Exception("This beta distribution should be descending");
} else {
lastCount = current;
}
}
cexpr = "let(a=sample(betaDistribution(5, 1), 50000), b=hist(a, 11), c=col(b, N))";
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);
counts = (List<Number>)tuples.get(0).get("c");
lastCount = Integer.MIN_VALUE;
for(Number number : counts) {
int current = number.intValue();
if(current < lastCount) {
throw new Exception("This beta distribution should be ascending");
} else {
lastCount = current;
}
}
}
@Test
public void testEnumeratedDistribution() throws Exception {
String cexpr = "let(a=uniformIntegerDistribution(1, 10)," +
" b=sample(a, 10000)," +
" c=enumeratedDistribution(b),"+
" tuple(d=describe(b), " +
" p=probability(c, 5), " +
" c=cumulativeProbability(c, 5)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"rawtypes"})
Map map = (Map)tuples.get(0).get("d");
Number N = (Number)map.get("N");
assertEquals(N.intValue(), 10000);
Number prob = (Number)tuples.get(0).get("p");
assertEquals(prob.doubleValue(), 0.1, 0.07);
Number cprob = (Number)tuples.get(0).get("c");
assertEquals(cprob.doubleValue(), 0.5, 0.07);
cexpr = "let(a=sample(enumeratedDistribution(array(1,2,3,4), array(40, 30, 20, 10)), 50000),"+
"b=freqTable(a),"+
"y=col(b, pct))";
paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
solrStream = new SolrStream(url, paramsLoc);
context = new StreamContext();
solrStream.setStreamContext(context);
tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> freqs = (List<Number>)tuples.get(0).get("y");
assertEquals(freqs.get(0).doubleValue(), .40, .03);
assertEquals(freqs.get(1).doubleValue(), .30, .03);
assertEquals(freqs.get(2).doubleValue(), .20, .03);
assertEquals(freqs.get(3).doubleValue(), .10, .03);
}
@Test
public void testDotProduct() throws Exception {
String cexpr = "dotProduct(array(2,4,6,8,10,12),array(1,2,3,4,5,6))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Number dotProduct = (Number)tuples.get(0).get("return-value");
assertTrue(dotProduct.doubleValue() == 182);
}
@Test
public void testVarianceAndStandardDeviation() throws Exception {
String cexpr = "let(echo=true,a=var(array(1,2,3,4,5)),b=stddev(array(2,2,2,2)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Number variance = (Number)tuples.get(0).get("a");
assertTrue(variance.doubleValue() == 2.5);
Number stddev = (Number)tuples.get(0).get("b");
assertTrue(stddev.doubleValue() == 0);
}
// NOTE: cache evaluators work only locally, on
// the same node where the replica that executes
// the stream is located
@Test
@SuppressWarnings({"unchecked"})
public void testCache() throws Exception {
String cexpr = "putCache(\"space1\", \"key1\", dotProduct(array(2,4,6,8,10,12),array(1,2,3,4,5,6)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
// find a node with a replica
ClusterState clusterState = cluster.getSolrClient().getClusterStateProvider().getClusterState();
String collection = useAlias ? COLLECTIONORALIAS + "_collection" : COLLECTIONORALIAS;
DocCollection coll = clusterState.getCollection(collection);
String node = coll.getReplicas().iterator().next().getNodeName();
String url = null;
for (JettySolrRunner jetty : cluster.getJettySolrRunners()) {
if (jetty.getNodeName().equals(node)) {
url = jetty.getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
break;
}
}
if (url == null) {
fail("unable to find a node with replica");
}
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Number dotProduct = (Number)tuples.get(0).get("return-value");
assertTrue(dotProduct.doubleValue() == 182);
cexpr = "getCache(\"space1\", \"key1\")";
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);
dotProduct = (Number)tuples.get(0).get("return-value");
assertTrue(dotProduct.doubleValue() == 182);
cexpr = "listCache(\"space1\")";
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);
List<String> keys = (List<String>)tuples.get(0).get("return-value");
assertEquals(keys.size(), 1);
assertEquals(keys.get(0), "key1");
cexpr = "listCache()";
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);
keys = (List<String>)tuples.get(0).get("return-value");
assertEquals(keys.size(), 1);
assertEquals(keys.get(0), "space1");
cexpr = "removeCache(\"space1\", \"key1\")";
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);
dotProduct = (Number)tuples.get(0).get("return-value");
assertTrue(dotProduct.doubleValue() == 182);
cexpr = "listCache(\"space1\")";
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);
keys = (List<String>)tuples.get(0).get("return-value");
assertEquals(keys.size(), 0);
}
@Test
public void testExponentialMovingAverage() throws Exception {
String cexpr = "expMovingAvg(array(22.27, 22.19, 22.08, 22.17, 22.18, 22.13, 22.23, 22.43, 22.24, 22.29, " +
"22.15, 22.39, 22.38, 22.61, 23.36, 24.05, 23.75, 23.83, 23.95, 23.63, 23.82, 23.87, 23.65, 23.19,"+
"23.10, 23.33, 22.68, 23.10, 22.40, 22.17), 10)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("return-value");
assertTrue(out.size() == 21);
assertEquals((double) out.get(0), 22.22, 0.009);
assertEquals((double) out.get(1), 22.21, 0.009);
assertEquals((double)out.get(2), 22.24, 0.009);
assertEquals((double)out.get(3), 22.27, 0.009);
assertEquals((double)out.get(4), 22.33, 0.009);
assertEquals((double)out.get(5), 22.52, 0.009);
assertEquals((double)out.get(6), 22.80, 0.009);
assertEquals((double)out.get(7), 22.97, 0.009);
assertEquals((double)out.get(8), 23.13, 0.009);
assertEquals((double)out.get(9), 23.28, 0.009);
assertEquals((double)out.get(10), 23.34, 0.009);
assertEquals((double)out.get(11), 23.43, 0.009);
assertEquals((double)out.get(12), 23.51, 0.009);
assertEquals((double)out.get(13), 23.54, 0.009);
assertEquals((double)out.get(14), 23.47, 0.009);
assertEquals((double)out.get(15), 23.40, 0.009);
assertEquals((double)out.get(16), 23.39, 0.009);
assertEquals((double)out.get(17), 23.26, 0.009);
assertEquals((double)out.get(18), 23.23, 0.009);
assertEquals((double)out.get(19), 23.08, 0.009);
assertEquals((double)out.get(20), 22.92, 0.009);
}
@Test
public void testTimeDifferencingMatrix() throws Exception {
String cexpr = "let(echo=\"c, d\",\n" +
" a=matrix(array(1,2,3,4,5),array(7.5,9,11,15.5,50.2)),\n" +
" b=setColumnLabels(a, array(\"a\",\"b\",\"c\",\"d\",\"e\")),\n" +
" c=diff(b, 2),\n" +
" d=getColumnLabels(c))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<List<Number>> matrix = (List<List<Number>>)tuples.get(0).get("c");
@SuppressWarnings({"unchecked"})
List<String> columnsLabels = (List<String>)tuples.get(0).get("d");
assertEquals(columnsLabels.size(), 3);
assertEquals(columnsLabels.get(0), "c");
assertEquals(columnsLabels.get(1), "d");
assertEquals(columnsLabels.get(2), "e");
assertEquals(matrix.size(), 2);
List<Number> row1 = matrix.get(0);
List<Number> row2 = matrix.get(1);
assertEquals(row1.size(), 3);
assertEquals(row1.get(0).doubleValue(), 2.0, 0);
assertEquals(row1.get(1).doubleValue(), 2.0, 0);
assertEquals(row1.get(2).doubleValue(), 2.0, 0);
assertEquals(row2.size(), 3 );
assertEquals(row2.get(0).doubleValue(), 3.5, 0);
assertEquals(row2.get(1).doubleValue(), 6.5, 0);
assertEquals(row2.get(2).doubleValue(), 39.2, 0);
}
@Test
public void testTimeDifferencingDefaultLag() throws Exception {
String cexpr = "diff(array(1709.0, 1621.0, 1973.0, 1812.0, 1975.0, 1862.0, 1940.0, 2013.0, 1596.0, 1725.0, 1676.0, 1814.0, 1615.0, 1557.0, 1891.0, 1956.0, 1885.0, 1623.0, 1903.0, 1997.0))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("return-value");
assertTrue(out.size() == 19);
assertEquals(out.get(0).doubleValue(),-88.0, 0.01);
assertEquals(out.get(1).doubleValue(),352.0, 0.01);
assertEquals(out.get(2).doubleValue(),-161.0, 0.01);
assertEquals(out.get(3).doubleValue(),163.0, 0.01);
assertEquals(out.get(4).doubleValue(),-113.0, 0.01);
assertEquals(out.get(5).doubleValue(),78.0, 0.01);
assertEquals(out.get(6).doubleValue(),73.0, 0.01);
assertEquals(out.get(7).doubleValue(),-417.0, 0.01);
assertEquals(out.get(8).doubleValue(),129.0, 0.01);
assertEquals(out.get(9).doubleValue(),-49.0, 0.01);
assertEquals(out.get(10).doubleValue(),138.0, 0.01);
assertEquals(out.get(11).doubleValue(),-199.0, 0.01);
assertEquals(out.get(12).doubleValue(),-58.0, 0.01);
assertEquals(out.get(13).doubleValue(),334.0, 0.01);
assertEquals(out.get(14).doubleValue(),65.0, 0.01);
assertEquals(out.get(15).doubleValue(),-71.0, 0.01);
assertEquals(out.get(16).doubleValue(),-262.0, 0.01);
assertEquals(out.get(17).doubleValue(),280.0, 0.01);
assertEquals(out.get(18).doubleValue(),94.0, 0.01);
}
@Test
public void testTimeDifferencingDefinedLag() throws Exception {
String cexpr = "diff(array(1709.0, 1621.0, 1973.0, 1812.0, 1975.0, 1862.0, 1940.0, 2013.0, 1596.0, 1725.0, 1676.0, 1814.0, 1615.0, 1557.0, 1891.0, 1956.0, 1885.0, 1623.0, 1903.0, 1997.0), 12)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("return-value");
assertTrue(out.size() == 8);
assertEquals(out.get(0).doubleValue(), -94.0, 0.01);
assertEquals(out.get(1).doubleValue(),-64.0, 0.01);
assertEquals(out.get(2).doubleValue(),-82.0, 0.01);
assertEquals(out.get(3).doubleValue(),144.0, 0.01);
assertEquals(out.get(4).doubleValue(),-90.0, 0.01);
assertEquals(out.get(5).doubleValue(),-239.0, 0.01);
assertEquals(out.get(6).doubleValue(),-37.0, 0.01);
assertEquals(out.get(7).doubleValue(),-16.0, 0.01);
}
@Test
public void testNestedDoubleTimeDifference() throws Exception {
String cexpr = "diff(diff(array(1709.0, 1621.0, 1973.0, 1812.0, 1975.0, 1862.0, 1940.0, 2013.0, 1596.0, 1725.0, 1676.0, 1814.0, 1615.0, 1557.0, 1891.0, 1956.0, 1885.0, 1623.0, 1903.0, 1997.0)), 12)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("return-value");
assertTrue(out.size() == 7);
assertEquals(out.get(0).doubleValue(), 30.0, 0.01);
assertEquals(out.get(1).doubleValue(), -18.0, 0.01);
assertEquals(out.get(2).doubleValue(), 226.0, 0.01);
assertEquals(out.get(3).doubleValue(), -234.0, 0.01);
assertEquals(out.get(4).doubleValue(), -149.0, 0.01);
assertEquals(out.get(5).doubleValue(), 202.0, 0.01);
assertEquals(out.get(6).doubleValue(), 21.0, 0.01);
}
@Test
@SuppressWarnings({"unchecked"})
public void testPolyfit() throws Exception {
String cexpr = "let(echo=true," +
" a=array(0,1,2,3,4,5,6,7)," +
" fit=polyfit(a, 1)," +
" predictions=predict(fit, a))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
List<Number> out = (List<Number>)tuples.get(0).get("fit");
assertTrue(out.size() == 8);
assertTrue(out.get(0).intValue() == 0);
assertTrue(out.get(1).intValue() == 1);
assertTrue(out.get(2).intValue() == 2);
assertTrue(out.get(3).intValue() == 3);
assertTrue(out.get(4).intValue() == 4);
assertTrue(out.get(5).intValue() == 5);
assertTrue(out.get(6).intValue() == 6);
assertTrue(out.get(7).intValue() == 7);
out = (List<Number>)tuples.get(0).get("predictions");
assertTrue(out.size() == 8);
assertTrue(out.get(0).intValue() == 0);
assertTrue(out.get(1).intValue() == 1);
assertTrue(out.get(2).intValue() == 2);
assertTrue(out.get(3).intValue() == 3);
assertTrue(out.get(4).intValue() == 4);
assertTrue(out.get(5).intValue() == 5);
assertTrue(out.get(6).intValue() == 6);
assertTrue(out.get(7).intValue() == 7);
}
@Test
public void testTtest() throws Exception {
String cexpr = "let(echo=true," +
"a=array(0,1,2,3,4,5,6,7,9,10,11,12), " +
"b=array(0,1,2,3,4,5,6,7,1,1,1,1), " +
"ttest=ttest(a, b)," +
"sample2Mean=mean(b),"+
"onesamplettest=ttest(sample2Mean, b)," +
"pairedttest=pairedTtest(a,b))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"rawtypes"})
Map testResult = (Map)tuples.get(0).get("ttest");
Number tstat = (Number)testResult.get("t-statistic");
Number pval = (Number)testResult.get("p-value");
assertEquals(tstat.doubleValue(), 2.3666107120397575, .0001);
assertEquals(pval.doubleValue(), 0.029680704317867967, .0001);
@SuppressWarnings({"rawtypes"})
Map testResult2 = (Map)tuples.get(0).get("onesamplettest");
Number tstat2 = (Number)testResult2.get("t-statistic");
Number pval2 = (Number)testResult2.get("p-value");
assertEquals(tstat2.doubleValue(), 0, .0001);
assertEquals(pval2.doubleValue(), 1, .0001);
@SuppressWarnings({"rawtypes"})
Map testResult3 = (Map)tuples.get(0).get("pairedttest");
Number tstat3 = (Number)testResult3.get("t-statistic");
Number pval3 = (Number)testResult3.get("p-value");
assertEquals(tstat3.doubleValue(), 2.321219442769799, .0001);
assertEquals(pval3.doubleValue(), 0.0404907407662755, .0001);
}
@Test
public void testChiSquareDataSet() throws Exception {
String cexpr = "let(echo=true," +
" a=array(1,1,2,3,4,5,6,7,9,10,11,12), " +
" b=array(1,1,2,3,4,5,6,7,1,1,1,1), " +
" chisquare=chiSquareDataSet(a, b))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"rawtypes"})
Map testResult = (Map)tuples.get(0).get("chisquare");
Number tstat = (Number)testResult.get("chisquare-statistic");
Number pval = (Number)testResult.get("p-value");
assertEquals(tstat.doubleValue(), 20.219464814599252, .0001);
assertEquals(pval.doubleValue(), 0.04242018685334226, .0001);
}
@Test
public void testGtestDataSet() throws Exception {
String cexpr = "let(echo=true," +
" a=array(1,1,2,3,4,5,6,7,9,10,11,12), " +
" b=array(1,1,2,3,4,5,6,7,1,1,1,1), " +
" gtest=gtestDataSet(a, b))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"rawtypes"})
Map testResult = (Map)tuples.get(0).get("gtest");
Number gstat = (Number)testResult.get("G-statistic");
Number pval = (Number)testResult.get("p-value");
assertEquals(gstat.doubleValue(), 22.41955157784917, .0001);
assertEquals(pval.doubleValue(), 0.021317102314826752, .0001);
}
@Test
// 12-Jun-2018 @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") //2018-03-10
// commented out on: 17-Feb-2019 @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // added 20-Sep-2018
public void testMultiVariateNormalDistribution() throws Exception {
String cexpr = "let(echo=true," +
" a=array(1,2,3,4,5,6,7)," +
" b=array(100, 110, 120, 130,140,150,180)," +
" c=transpose(matrix(a, b))," +
" d=array(mean(a), mean(b))," +
" e=cov(c)," +
" f=multiVariateNormalDistribution(d, e)," +
" g=sample(f, 10000)," +
" h=cov(g)," +
" i=sample(f)," +
" j=density(f, array(4.016093243274465, 138.7283428008585)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<List<Number>> cov = (List<List<Number>>)tuples.get(0).get("h");
assertEquals(cov.size(), 2);
List<Number> row1 = cov.get(0);
assertEquals(row1.size(), 2);
double a = row1.get(0).doubleValue();
double b = row1.get(1).doubleValue();
assertEquals(a, 4.666666666666667, 2.5);
assertEquals(b, 56.66666666666667, 7);
List<Number> row2 = cov.get(1);
double c = row2.get(0).doubleValue();
double d = row2.get(1).doubleValue();
assertEquals(c, 56.66666666666667, 7);
assertEquals(d, 723.8095238095239, 50);
@SuppressWarnings({"unchecked"})
List<Number> sample = (List<Number>)tuples.get(0).get("i");
assertEquals(sample.size(), 2);
Number sample1 = sample.get(0);
Number sample2 = sample.get(1);
assertTrue(sample.toString(), sample1.doubleValue() > -30 && sample1.doubleValue() < 30);
assertTrue(sample.toString(), sample2.doubleValue() > 30 && sample2.doubleValue() < 251);
Number density = (Number)tuples.get(0).get("j");
assertEquals(density.doubleValue(), 0.007852638121596995, .00001);
}
@Test
@SuppressWarnings({"unchecked"})
public void testKnn() throws Exception {
String cexpr = "let(echo=true," +
" a=setRowLabels(matrix(array(1,1,1,0,0,0),"+
" array(1,0,0,0,1,1),"+
" array(0,0,0,1,1,1)), array(\"row1\",\"row2\",\"row3\")),"+
" b=array(0,0,0,1,1,1),"+
" c=knn(a, b, 2),"+
" d=getRowLabels(c),"+
" e=getAttributes(c)," +
" f=knn(a, b, 2, manhattan())," +
" g=getAttributes(f))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
List<List<Number>> knnMatrix = (List<List<Number>>)tuples.get(0).get("c");
assertEquals(knnMatrix.size(), 2);
List<Number> row1 = knnMatrix.get(0);
assertEquals(row1.size(), 6);
assertEquals(row1.get(0).doubleValue(), 0.0, 0.0);
assertEquals(row1.get(1).doubleValue(), 0.0, 0.0);
assertEquals(row1.get(2).doubleValue(), 0.0, 0.0);
assertEquals(row1.get(3).doubleValue(), 1.0, 0.0);
assertEquals(row1.get(4).doubleValue(), 1.0, 0.0);
assertEquals(row1.get(5).doubleValue(), 1.0, 0.0);
List<Number> row2 = knnMatrix.get(1);
assertEquals(row2.size(), 6);
assertEquals(row2.get(0).doubleValue(), 1.0, 0.0);
assertEquals(row2.get(1).doubleValue(), 0.0, 0.0);
assertEquals(row2.get(2).doubleValue(), 0.0, 0.0);
assertEquals(row2.get(3).doubleValue(), 0.0, 0.0);
assertEquals(row2.get(4).doubleValue(), 1.0, 0.0);
assertEquals(row2.get(5).doubleValue(), 1.0, 0.0);
@SuppressWarnings({"rawtypes"})
Map atts = (Map)tuples.get(0).get("e");
List<Number> dists = (List<Number>)atts.get("distances");
assertEquals(dists.size(), 2);
assertEquals(dists.get(0).doubleValue(), 0.0, 0.0);
assertEquals(dists.get(1).doubleValue(), 1.4142135623730951, 0.0);
List<String> rowLabels = (List<String>)tuples.get(0).get("d");
assertEquals(rowLabels.size(), 2);
assertEquals(rowLabels.get(0), "row3");
assertEquals(rowLabels.get(1), "row2");
atts = (Map)tuples.get(0).get("g");
dists = (List<Number>)atts.get("distances");
assertEquals(dists.size(), 2);
assertEquals(dists.get(0).doubleValue(), 0.0, 0.0);
assertEquals(dists.get(1).doubleValue(), 2.0, 0.0);
}
@Test
public void testIntegrate() throws Exception {
String cexpr = "let(echo=true, " +
"a=sequence(50, 1, 0), " +
"b=spline(a), " +
"c=integral(b, 0, 49), " +
"d=integral(b, 0, 20), " +
"e=integral(b, 20, 49)," +
"f=integral(b))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Number integral = (Number)tuples.get(0).get("c");
assertEquals(integral.doubleValue(), 49, 0.0);
integral = (Number)tuples.get(0).get("d");
assertEquals(integral.doubleValue(), 20, 0.0);
integral = (Number)tuples.get(0).get("e");
assertEquals(integral.doubleValue(), 29, 0.0);
@SuppressWarnings({"unchecked"})
List<Number> integrals = (List<Number>)tuples.get(0).get("f");
assertEquals(integrals.size(), 50);
assertEquals(integrals.get(49).intValue(), 49);
}
@Test
public void testLoess() throws Exception {
String cexpr = "let(echo=true," +
" a=array(0,1,2,3,4,5,6,7)," +
" fit=loess(a), " +
" der=derivative(fit))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("fit");
assertTrue(out.size() == 8);
assertEquals(out.get(0).doubleValue(), 0.0, 0.0);
assertEquals(out.get(1).doubleValue(), 1.0, 0.0);
assertEquals(out.get(2).doubleValue(), 2.0, 0.0);
assertEquals(out.get(3).doubleValue(), 3.0, 0.0);
assertEquals(out.get(4).doubleValue(), 4.0, 0.0);
assertEquals(out.get(5).doubleValue(), 5.0, 0.0);
assertEquals(out.get(6).doubleValue(), 6.0, 0.0);
assertEquals(out.get(7).doubleValue(), 7.0, 0.0);
@SuppressWarnings({"unchecked"})
List<Number> out1 = (List<Number>)tuples.get(0).get("der");
assertTrue(out1.size() == 8);
assertEquals(out1.get(0).doubleValue(), 1.0, 0.0);
assertEquals(out1.get(1).doubleValue(), 1.0, 0.0);
assertEquals(out1.get(2).doubleValue(), 1.0, 0.0);
assertEquals(out1.get(3).doubleValue(), 1.0, 0.0);
assertEquals(out1.get(4).doubleValue(), 1.0, 0.0);
assertEquals(out1.get(5).doubleValue(), 1.0, 0.0);
assertEquals(out1.get(6).doubleValue(), 1.0, 0.0);
assertEquals(out1.get(7).doubleValue(), 1.0, 0.0);
}
@Test
public void testSpline() throws Exception {
String cexpr = "let(echo=true," +
" a=array(0,1,2,3,4,5,6,7), " +
" b=array(1,70,90,10,78, 100, 1, 9)," +
" fit=spline(a, b), " +
" der=derivative(fit))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("fit");
assertTrue(out.size() == 8);
assertEquals(out.get(0).doubleValue(), 1.0, 0.0001);
assertEquals(out.get(1).doubleValue(), 70.0, 0.0001);
assertEquals(out.get(2).doubleValue(), 90.0, 0.0001);
assertEquals(out.get(3).doubleValue(), 10.0, 0.0001);
assertEquals(out.get(4).doubleValue(), 78.0, 0.0001);
assertEquals(out.get(5).doubleValue(), 100.0, 0.0001);
assertEquals(out.get(6).doubleValue(), 1.0, 0.0001);
assertEquals(out.get(7).doubleValue(), 9.0, 0.0001);
@SuppressWarnings({"unchecked"})
List<Number> out1 = (List<Number>)tuples.get(0).get("der");
assertTrue(out1.size() == 8);
assertEquals(out1.get(0).doubleValue(), 72.06870491240123, 0.0001);
assertEquals(out1.get(1).doubleValue(), 62.86259017519753, 0.0001);
assertEquals(out1.get(2).doubleValue(),-56.519065613191344, 0.0001);
assertEquals(out1.get(3).doubleValue(), -16.786327722432148, 0.0001);
assertEquals(out1.get(4).doubleValue(), 87.66437650291996, 0.0001);
assertEquals(out1.get(5).doubleValue(), -63.87117828924769, 0.0001);
assertEquals(out1.get(6).doubleValue(), -63.17966334592923, 0.0001);
assertEquals(out1.get(7).doubleValue(), 43.58983167296462, 0.0001);
}
@Test
public void testBicubicSpline() throws Exception {
String cexpr = "let(echo=true," +
" a=array(300, 400, 500, 600, 700), " +
" b=array(340, 410, 495, 590, 640)," +
" c=array(600, 395, 550, 510, 705),"+
" d=array(500, 420, 510, 601, 690),"+
" e=array(420, 411, 511, 611, 711),"+
" f=matrix(a, b, c, d, e),"+
" x=array(1,2,3,4,5),"+
" y=array(100, 200, 300, 400, 500),"+
" bspline=bicubicSpline(x, y, f), " +
" p1=predict(bspline, 1.5, 250)," +
" p2=predict(bspline, 3.5, 350)," +
" p3=predict(bspline, 4.5, 450)," +
" p4=predict(bspline,matrix(array(1.5, 250), array(3.5, 350), array(4.5, 450))))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Number p1 = (Number)tuples.get(0).get("p1");
assertEquals(p1.doubleValue(), 449.7837701612903, 0.0);
Number p2 = (Number)tuples.get(0).get("p2");
assertEquals(p2.doubleValue(), 536.8916383774491, 0.0);
Number p3 = (Number)tuples.get(0).get("p3");
assertEquals(p3.doubleValue(), 659.921875, 0.0);
@SuppressWarnings({"unchecked"})
List<Number> p4 = (List<Number>)tuples.get(0).get("p4");
assertEquals(p4.get(0).doubleValue(), 449.7837701612903, 0.0);
assertEquals(p4.get(1).doubleValue(), 536.8916383774491, 0.0);
assertEquals(p4.get(2).doubleValue(), 659.921875, 0.0);
}
@Test
public void testAkima() throws Exception {
String cexpr = "let(echo=true," +
" a=array(0,1,2,3,4,5,6,7), " +
" b=array(1,70,90,10,78, 100, 1, 9)," +
" fit=akima(a, b), " +
" der=derivative(fit))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("fit");
assertTrue(out.size() == 8);
assertEquals(out.get(0).doubleValue(), 1.0, 0.0001);
assertEquals(out.get(1).doubleValue(), 70.0, 0.0001);
assertEquals(out.get(2).doubleValue(), 90.0, 0.0001);
assertEquals(out.get(3).doubleValue(), 10.0, 0.0001);
assertEquals(out.get(4).doubleValue(), 78.0, 0.0001);
assertEquals(out.get(5).doubleValue(), 100.0, 0.0001);
assertEquals(out.get(6).doubleValue(), 1.0, 0.0001);
assertEquals(out.get(7).doubleValue(), 9.0, 0.0001);
@SuppressWarnings({"unchecked"})
List<Number> out1 = (List<Number>)tuples.get(0).get("der");
assertTrue(out1.size() == 8);
assertEquals(out1.get(0).doubleValue(), 93.5, 0.0001);
assertEquals(out1.get(1).doubleValue(), 44.5, 0.0001);
assertEquals(out1.get(2).doubleValue(), -4.873096446700508, 0.0001);
assertEquals(out1.get(3).doubleValue(), 21.36986301369863, 0.0001);
assertEquals(out1.get(4).doubleValue(), 42.69144981412639, 0.0001);
assertEquals(out1.get(5).doubleValue(), -14.379084967320262, 0.0001);
assertEquals(out1.get(6).doubleValue(), -45.5, 0.0001);
assertEquals(out1.get(7).doubleValue(), 61.5, 0.0001);
}
@Test
public void testOutliers() throws Exception {
String cexpr = "let(echo=true," +
" a=list(tuple(id=0.0), tuple(id=1), tuple(id=2), tuple(id=3)), " +
" b=normalDistribution(100, 5)," +
" d=array(100, 110, 90, 99), " +
" e=outliers(b, d, .05, .95, a)," +
" f=outliers(b, d, .05, .95))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked", "rawtypes"})
List<Map> out = (List<Map>)tuples.get(0).get("e");
assertEquals(out.size(), 2);
@SuppressWarnings({"rawtypes"})
Map high = out.get(0);
assertEquals(((String)high.get("id")), "1");
assertEquals(((Number)high.get("cumulativeProbablity_d")).doubleValue(), 0.9772498680518208, 0.0 );
assertEquals(((Number)high.get("highOutlierValue_d")).doubleValue(), 110.0, 0.0);
@SuppressWarnings({"rawtypes"})
Map low = out.get(1);
assertEquals(((String)low.get("id")), "2");
assertEquals(((Number)low.get("cumulativeProbablity_d")).doubleValue(), 0.022750131948179167, 0.0 );
assertEquals(((Number)low.get("lowOutlierValue_d")).doubleValue(), 90, 0.0);
@SuppressWarnings({"unchecked", "rawtypes"})
List<Map> out1 = (List<Map>)tuples.get(0).get("f");
assertEquals(out1.size(), 2);
@SuppressWarnings({"rawtypes"})
Map high1 = out1.get(0);
assert(high1.get("id") == null);
assertEquals(((Number)high1.get("cumulativeProbablity_d")).doubleValue(), 0.9772498680518208, 0.0 );
assertEquals(((Number)high1.get("highOutlierValue_d")).doubleValue(), 110.0, 0.0);
@SuppressWarnings({"rawtypes"})
Map low1 = out1.get(1);
assert(low1.get("id") == null);
assertEquals(((Number)low1.get("cumulativeProbablity_d")).doubleValue(), 0.022750131948179167, 0.0 );
assertEquals(((Number)low1.get("lowOutlierValue_d")).doubleValue(), 90, 0.0);
}
@Test
public void testLerp() throws Exception {
String cexpr = "let(echo=true," +
" a=array(0,1,2,3,4,5,6,7), " +
" b=array(1,70,90,10,78, 100, 1, 9)," +
" fit=lerp(a, b), " +
" der=derivative(fit))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("fit");
assertTrue(out.size() == 8);
assertEquals(out.get(0).doubleValue(), 1.0, 0.0001);
assertEquals(out.get(1).doubleValue(), 70.0, 0.0001);
assertEquals(out.get(2).doubleValue(), 90.0, 0.0001);
assertEquals(out.get(3).doubleValue(), 10.0, 0.0001);
assertEquals(out.get(4).doubleValue(), 78.0, 0.0001);
assertEquals(out.get(5).doubleValue(), 100.0, 0.0001);
assertEquals(out.get(6).doubleValue(), 1.0, 0.0001);
assertEquals(out.get(7).doubleValue(), 9.0, 0.0001);
@SuppressWarnings({"unchecked"})
List<Number> out1 = (List<Number>)tuples.get(0).get("der");
assertTrue(out1.size() == 8);
assertEquals(out1.get(0).doubleValue(), 69.0, 0.0001);
assertEquals(out1.get(1).doubleValue(), 20.0, 0.0001);
assertEquals(out1.get(2).doubleValue(),-80.0, 0.0001);
assertEquals(out1.get(3).doubleValue(), 68, 0.0001);
assertEquals(out1.get(4).doubleValue(), 22.0, 0.0001);
assertEquals(out1.get(5).doubleValue(),-99.0, 0.0001);
assertEquals(out1.get(6).doubleValue(), 8.0, 0.0001);
assertEquals(out1.get(7).doubleValue(), 8.0, 0.0001);
}
@Test
public void testHarmonicFit() throws Exception {
String cexpr = "let(a=sin(sequence(100, 1, 6)), b=harmonicFit(a), s=ebeSubtract(a, b))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("s");
assertTrue(out.size() == 100);
for(Number n : out) {
assertEquals(n.doubleValue(), 0.0, .01);
}
}
@Test
public void testAnova() throws Exception {
String cexpr = "anova(array(1,2,3,5,4,6), array(5,2,3,5,4,6), array(1,2,7,5,4,6))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Tuple out = tuples.get(0);
assertEquals((double) out.get("p-value"), 0.788298D, .0001);
assertEquals((double) out.get("f-ratio"), 0.24169D, .0001);
}
@Test
public void testOlsRegress() throws Exception {
String cexpr = "let(echo=true, a=array(8.5, 12.89999962, 5.199999809, 10.69999981, 3.099999905, 3.5, 9.199999809, 9, 15.10000038, 10.19999981), " +
"b=array(5.099999905, 5.800000191, 2.099999905, 8.399998665, 2.900000095, 1.200000048, 3.700000048, 7.599999905, 7.699999809, 4.5)," +
"c=array(4.699999809, 8.800000191, 15.10000038, 12.19999981, 10.60000038, 3.5, 9.699999809, 5.900000095, 20.79999924, 7.900000095)," +
"d=array(85.09999847, 106.3000031, 50.20000076, 130.6000061, 54.79999924, 30.29999924, 79.40000153, 91, 135.3999939, 89.30000305)," +
"e=transpose(matrix(a, b, c))," +
"f=olsRegress(e, d)," +
"g=predict(f, e))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"rawtypes"})
Map regression = (Map)tuples.get(0).get("f");
Number rsquared = (Number)regression.get("RSquared");
assertEquals(rsquared.doubleValue(), 0.9667887860584002, .000001);
@SuppressWarnings({"unchecked"})
List<Number> regressionParameters = (List<Number>)regression.get("regressionParameters");
assertEquals(regressionParameters.get(0).doubleValue(), 7.676028542255028, .0001);
assertEquals(regressionParameters.get(1).doubleValue(), 3.661604009261836, .0001);
assertEquals(regressionParameters.get(2).doubleValue(), 7.621051256504592, .0001);
assertEquals(regressionParameters.get(3).doubleValue(), 0.8284680662898674, .0001);
@SuppressWarnings({"unchecked"})
List<Number> predictions = (List<Number>)tuples.get(0).get("g");
assertEquals(predictions.get(0).doubleValue(), 81.56082305847914, .0001);
assertEquals(predictions.get(1).doubleValue(), 106.40333675525883, .0001);
assertEquals(predictions.get(2).doubleValue(), 55.23044372150484, .0001);
assertEquals(predictions.get(3).doubleValue(), 120.97932137751451, .0001);
assertEquals(predictions.get(4).doubleValue(), 49.90981180846799, .0001);
assertEquals(predictions.get(5).doubleValue(), 32.53654268030196, .0001);
assertEquals(predictions.get(6).doubleValue(), 77.59681482774931, .0001);
assertEquals(predictions.get(7).doubleValue(), 103.43841512086125, .0001);
assertEquals(predictions.get(8).doubleValue(), 138.88047884217636, .0001);
assertEquals(predictions.get(9).doubleValue(), 85.86401719768607, .0001);
}
@Test
@SuppressWarnings({"unchecked"})
public void testKnnRegress() throws Exception {
String cexpr = "let(echo=true, a=array(8.5, 12.89999962, 5.199999809, 10.69999981, 3.099999905, 3.5, 9.199999809, 9, 15.10000038, 10.19999981), " +
"b=array(5.099999905, 5.800000191, 2.099999905, 8.399998665, 2.900000095, 1.200000048, 3.700000048, 7.599999905, 7.699999809, 4.5)," +
"c=array(4.699999809, 8.800000191, 15.10000038, 12.19999981, 10.60000038, 3.5, 9.699999809, 5.900000095, 20.79999924, 7.900000095)," +
"d=array(85.09999847, 106.3000031, 50.20000076, 130.6000061, 54.79999924, 30.29999924, 79.40000153, 91, 135.3999939, 89.30000305)," +
"e=transpose(matrix(a, b, c))," +
"f=knnRegress(e, d, 1, scale=true)," +
"g=predict(f, e))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
List<Number> predictions = (List<Number>)tuples.get(0).get("g");
assertEquals(predictions.size(), 10);
//k=1 should bring back only one prediction for the exact match in the training set
assertEquals(predictions.get(0).doubleValue(), 85.09999847, 0);
assertEquals(predictions.get(1).doubleValue(), 106.3000031, 0);
assertEquals(predictions.get(2).doubleValue(), 50.20000076, 0);
assertEquals(predictions.get(3).doubleValue(), 130.6000061, 0);
assertEquals(predictions.get(4).doubleValue(), 54.79999924, 0);
assertEquals(predictions.get(5).doubleValue(), 30.29999924, 0);
assertEquals(predictions.get(6).doubleValue(), 79.40000153, 0);
assertEquals(predictions.get(7).doubleValue(), 91, 0);
assertEquals(predictions.get(8).doubleValue(), 135.3999939, 0);
assertEquals(predictions.get(9).doubleValue(), 89.30000305, 0);
cexpr = "let(echo=true, a=array(8.5, 12.89999962, 5.199999809, 10.69999981, 3.099999905, 3.5, 9.199999809, 9, 15.10000038, 10.19999981), " +
"b=array(5.099999905, 5.800000191, 2.099999905, 8.399998665, 2.900000095, 1.200000048, 3.700000048, 7.599999905, 7.699999809, 4.5)," +
"c=array(4.699999809, 8.800000191, 15.10000038, 12.19999981, 10.60000038, 3.5, 9.699999809, 5.900000095, 20.79999924, 7.900000095)," +
"d=array(85.09999847, 106.3000031, 50.20000076, 130.6000061, 54.79999924, 30.29999924, 79.40000153, 91, 135.3999939, 89.30000305)," +
"e=transpose(matrix(a, b, c))," +
"f=knnRegress(e, d, 1, scale=true)," +
"g=predict(f, array(8, 5, 4)))";
paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
solrStream = new SolrStream(url, paramsLoc);
context = new StreamContext();
solrStream.setStreamContext(context);
tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Number prediction = (Number)tuples.get(0).get("g");
assertEquals(prediction.doubleValue(), 85.09999847, 0);
//Test robust. Take the median rather then average
cexpr = "let(echo=true, a=array(8.5, 12.89999962, 5.199999809, 10.69999981, 3.099999905, 3.5, 9.199999809, 9, 8.10000038, 8.19999981), " +
"b=array(5.099999905, 5.800000191, 2.099999905, 8.399998665, 2.900000095, 1.200000048, 3.700000048, 5.599999905, 5.699999809, 4.5)," +
"c=array(4.699999809, 8.800000191, 15.10000038, 12.19999981, 10.60000038, 3.5, 9.699999809, 5.900000095, 4.79999924, 4.900000095)," +
"d=array(85.09999847, 106.3000031, 50.20000076, 130.6000061, 54.79999924, 30.29999924, 79.40000153, 91, 135.3999939, 89.30000305)," +
"e=transpose(matrix(a, b, c))," +
"f=knnRegress(e, d, 3, scale=true, robust=true)," +
"g=predict(f, array(8, 5, 4)))";
paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
solrStream = new SolrStream(url, paramsLoc);
context = new StreamContext();
solrStream.setStreamContext(context);
tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
prediction = (Number)tuples.get(0).get("g");
assertEquals(prediction.doubleValue(), 89.30000305, 0);
//Test univariate regression with scaling off
cexpr = "let(echo=true, a=sequence(10, 0, 1), " +
"c=knnRegress(a, a, 3)," +
"d=predict(c, 3))";
paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
solrStream = new SolrStream(url, paramsLoc);
context = new StreamContext();
solrStream.setStreamContext(context);
tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
prediction = (Number)tuples.get(0).get("d");
assertEquals(prediction.doubleValue(), 3, 0);
cexpr = "let(echo=true, a=sequence(10, 0, 1), " +
"c=knnRegress(a, a, 3)," +
"d=predict(c, array(3,4)))";
paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
solrStream = new SolrStream(url, paramsLoc);
context = new StreamContext();
solrStream.setStreamContext(context);
tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
predictions = (List<Number>)tuples.get(0).get("d");
assertEquals(predictions.size(), 2);
assertEquals(predictions.get(0).doubleValue(), 3, 0);
assertEquals(predictions.get(1).doubleValue(), 4, 0);
}
@Test
public void testDateTime() throws Exception {
String expr = "select(list(tuple(a=20001011:10:11:01), tuple(a=20071011:14:30:20)), dateTime(a, \"yyyyMMdd:kk:mm:ss\") as date)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
String date = (String)tuples.get(0).get("date");
assertEquals(date, "2000-10-11T10:11:01Z");
date = (String)tuples.get(1).get("date");
assertEquals(date, "2007-10-11T14:30:20Z");
}
@Test
public void testDateTimeTZ() throws Exception {
String expr = "select(list(tuple(a=20001011), tuple(a=20071011)), dateTime(a, \"yyyyMMdd\", \"UTC\") as date, dateTime(a, \"yyyyMMdd\", \"EST\") as date1, dateTime(a, \"yyyyMMdd\") as date2)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
String date = (String)tuples.get(0).get("date");
String date1 = (String)tuples.get(0).get("date1");
String date2 = (String)tuples.get(0).get("date2");
assertEquals(date, "2000-10-11T00:00:00Z");
assertEquals(date1, "2000-10-11T05:00:00Z");
assertEquals(date2, "2000-10-11T00:00:00Z");
date = (String)tuples.get(1).get("date");
date1 = (String)tuples.get(1).get("date1");
date2 = (String)tuples.get(1).get("date2");
assertEquals(date, "2007-10-11T00:00:00Z");
assertEquals(date1, "2007-10-11T05:00:00Z");
assertEquals(date2, "2007-10-11T00:00:00Z");
}
@Test
public void testDoubleLong() throws Exception {
String expr = "select(tuple(d=\"1.1\", l=\"5000\"), double(d) as d, long(l) as l)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
assertTrue(tuples.get(0).get("d") instanceof Double);
assertTrue(tuples.get(0).get("l") instanceof Long);
assertEquals(tuples.get(0).getDouble("d"), 1.1D, 0);
assertEquals(tuples.get(0).getLong("l").longValue(), 5000L);
}
public void testDoubleArray() throws Exception {
String expr = "let(a=list(tuple(d=\"1.1\", l=\"5000\"), tuple(d=\"1.3\", l=\"7000\"))," +
" b=col(a, d)," +
" tuple(doubles=double(b)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
@SuppressWarnings({"unchecked"})
List<Double> doubles = (List<Double>)tuples.get(0).get("doubles");
assertEquals(doubles.get(0), 1.1, 0);
assertEquals(doubles.get(1), 1.3, 0);
}
@Test
public void testGaussfit() throws Exception {
String cexpr = "let(echo=true, " +
"x=array(79.56,81.32,82.82,84.64,86.18,87.89,89.53,91.14,92.8,94.43,96.08,97.72,99.37,101,102.66,104.3,105.94,107.59,109.23,110.87,112.52,114.13,115.82,117.44,119.27), " +
"y=array(3, 3, 26, 54, 139, 344, 685, 1289, 2337, 3593, 4781, 5964, 6538, 6357, 5705, 4548, 3280, 2058, 1191, 649, 285, 112, 34, 18, 7)," +
"g=gaussfit(x,y))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> predictions = (List<Number>)tuples.get(0).get("g");
assertEquals(predictions.size(), 25);
assertEquals(predictions.get(0).doubleValue(), 1.5217511259930976, 0);
assertEquals(predictions.get(1).doubleValue(), 6.043059526517849, 0);
assertEquals(predictions.get(2).doubleValue(), 17.74876254851105, 0);
assertEquals(predictions.get(3).doubleValue(), 58.12355990996735, 0);
assertEquals(predictions.get(4).doubleValue(), 142.98079858358975, 0);
assertEquals(predictions.get(5).doubleValue(), 347.5571069372449, 0);
assertEquals(predictions.get(6).doubleValue(), 729.8016076579886, 0);
assertEquals(predictions.get(7).doubleValue(), 1361.3981561397804, 0);
assertEquals(predictions.get(8).doubleValue(), 2322.566306687647, 0);
assertEquals(predictions.get(9).doubleValue(), 3524.6949840829216, 0);
assertEquals(predictions.get(10).doubleValue(), 4824.273031596218, 0);
assertEquals(predictions.get(11).doubleValue(), 5915.519574509397, 0);
assertEquals(predictions.get(12).doubleValue(), 6514.552728035438, 0);
assertEquals(predictions.get(13).doubleValue(), 6438.3295998729845, 0);
assertEquals(predictions.get(14).doubleValue(), 5702.59200814961, 0);
assertEquals(predictions.get(15).doubleValue(), 4538.7945530007, 0);
assertEquals(predictions.get(16).doubleValue(), 3243.606591784876, 0);
assertEquals(predictions.get(17).doubleValue(), 2074.9937785806937, 0);
assertEquals(predictions.get(18).doubleValue(), 1194.697766441063, 0);
assertEquals(predictions.get(19).doubleValue(), 617.6162726398896, 0);
assertEquals(predictions.get(20).doubleValue(), 285.248193084953, 0);
assertEquals(predictions.get(21).doubleValue(), 120.84133189889134, 0);
assertEquals(predictions.get(22).doubleValue(), 43.87052382491055, 0);
assertEquals(predictions.get(23).doubleValue(), 14.918461016939522, 0);
assertEquals(predictions.get(24).doubleValue(), 3.887269101204326, 0);
}
@Test
public void testPlot() throws Exception {
String cexpr = "let(a=array(3,2,3), plot(type=scatter, x=a, y=array(5,6,3)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
String plot = tuples.get(0).getString("plot");
assertTrue(plot.equals("scatter"));
@SuppressWarnings({"unchecked"})
List<List<Number>> data = (List<List<Number>>)tuples.get(0).get("data");
assertTrue(data.size() == 3);
List<Number> pair1 = data.get(0);
assertTrue(pair1.get(0).intValue() == 3);
assertTrue(pair1.get(1).intValue() == 5);
List<Number> pair2 = data.get(1);
assertTrue(pair2.get(0).intValue() == 2);
assertTrue(pair2.get(1).intValue() == 6);
List<Number> pair3 = data.get(2);
assertTrue(pair3.get(0).intValue() == 3);
assertTrue(pair3.get(1).intValue() == 3);
}
@Test
public void testMovingAverage() throws Exception {
String cexpr = "movingAvg(array(1,2,3,4,5,6,7), 4)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("return-value");
assertTrue(out.size()==4);
assertEquals((double) out.get(0), 2.5, .0);
assertEquals((double) out.get(1), 3.5, .0);
assertEquals((double) out.get(2), 4.5, .0);
assertEquals((double) out.get(3), 5.5, .0);
}
@Test
public void testMovingMAD() throws Exception {
String cexpr = "movingMAD(array(1,2,3,4,5,6,9.25), 4)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("return-value");
assertTrue(out.size()==4);
System.out.println("MAD:"+out);
assertEquals(out.get(0).doubleValue(), 1, .0);
assertEquals(out.get(1).doubleValue(), 1, .0);
assertEquals(out.get(2).doubleValue(), 1, .0);
assertEquals(out.get(3).doubleValue(), 1.59375, .0);
}
@Test
public void testMannWhitney() throws Exception {
String cexpr = "mannWhitney(array(0.15,0.10,0.11,0.24,0.08,0.08,0.10,0.10,0.10,0.12,0.04,0.07), " +
"array(0.10,0.20,0.30,0.10,0.10,0.02,0.05,0.07))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Tuple out = tuples.get(0);
assertEquals((double) out.get("u-statistic"), 52.5, .1);
assertEquals((double) out.get("p-value"), 0.7284, .001);
}
@Test
public void testMovingMedian() throws Exception {
String cexpr = "movingMedian(array(1,2,6,9,10,12,15), 5)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("return-value");
assertTrue(out.size() == 3);
assertEquals(out.get(0).doubleValue(), 6.0, .0);
assertEquals(out.get(1).doubleValue(), 9.0, .0);
assertEquals(out.get(2).doubleValue(), 10.0, .0);
}
@Test
public void testSumSq() throws Exception {
String cexpr = "sumSq(array(-3,-2.5, 10))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Number sumSq = (Number)tuples.get(0).get("return-value");
assertEquals(sumSq.doubleValue(), 115.25D, 0.0D);
}
@Test
public void testMonteCarlo() throws Exception {
String cexpr = "let(a=constantDistribution(10), b=constantDistribution(20), c=monteCarlo(add(sample(a), sample(b)), 10))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("c");
assertTrue(out.size()==10);
assertEquals(out.get(0).doubleValue(), 30.0, .0);
assertEquals(out.get(1).doubleValue(), 30.0, .0);
assertEquals(out.get(2).doubleValue(), 30.0, .0);
assertEquals(out.get(3).doubleValue(), 30.0, .0);
assertEquals(out.get(4).doubleValue(), 30.0, .0);
assertEquals(out.get(5).doubleValue(), 30.0, .0);
assertEquals(out.get(6).doubleValue(), 30.0, .0);
assertEquals(out.get(7).doubleValue(), 30.0, .0);
assertEquals(out.get(8).doubleValue(), 30.0, .0);
assertEquals(out.get(9).doubleValue(), 30.0, .0);
}
@Test
public void testMonteCarloWithVariables() throws Exception {
String cexpr = "let(a=constantDistribution(10), " +
" b=constantDistribution(20), " +
" c=monteCarlo(d=sample(a),"+
" e=sample(b),"+
" add(d, add(e, 10)), " +
" 10))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> out = (List<Number>)tuples.get(0).get("c");
assertTrue(out.size()==10);
assertEquals(out.get(0).doubleValue(), 40.0, .0);
assertEquals(out.get(1).doubleValue(), 40.0, .0);
assertEquals(out.get(2).doubleValue(), 40.0, .0);
assertEquals(out.get(3).doubleValue(), 40.0, .0);
assertEquals(out.get(4).doubleValue(), 40.0, .0);
assertEquals(out.get(5).doubleValue(), 40.0, .0);
assertEquals(out.get(6).doubleValue(), 40.0, .0);
assertEquals(out.get(7).doubleValue(), 40.0, .0);
assertEquals(out.get(8).doubleValue(), 40.0, .0);
assertEquals(out.get(9).doubleValue(), 40.0, .0);
}
@Test
public void testWeibullDistribution() throws Exception {
String cexpr = "let(echo=true, " +
"a=describe(sample(weibullDistribution(.1, 10),10000)), " +
"b=describe(sample(weibullDistribution(.5, 10),10000)), " +
"c=describe(sample(weibullDistribution(1, 10),10000))," +
"d=describe(sample(weibullDistribution(6, 10),10000))," +
"e=mean(sample(weibullDistribution(1, 10),10000))," +
"f=mean(sample(weibullDistribution(1, 20),10000))," +
"g=mean(sample(weibullDistribution(1, 30),10000)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"rawtypes"})
Map a = (Map)tuples.get(0).get("a");
@SuppressWarnings({"rawtypes"})
Map b = (Map)tuples.get(0).get("b");
@SuppressWarnings({"rawtypes"})
Map c = (Map)tuples.get(0).get("c");
@SuppressWarnings({"rawtypes"})
Map d = (Map)tuples.get(0).get("d");
Number sa = (Number)a.get("skewness");
Number sb = (Number)b.get("skewness");
Number sc = (Number)c.get("skewness");
Number sd = (Number)d.get("skewness");
//Test shape change
assertTrue(sa.doubleValue() > sb.doubleValue());
assertTrue(sb.doubleValue() > sc.doubleValue());
assertTrue(sc.doubleValue() > sd.doubleValue());
assertTrue(sd.doubleValue() < 0.0);
//Test scale change
Number e = (Number)tuples.get(0).get("e");
Number f = (Number)tuples.get(0).get("f");
Number g = (Number)tuples.get(0).get("g");
assertTrue(e.doubleValue() < f.doubleValue());
assertTrue(f.doubleValue() < g.doubleValue());
}
@Test
// 12-Jun-2018 @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // 04-May-2018
public void testGammaDistribution() throws Exception {
String cexpr = "#comment\nlet(echo=true, " +
"a=gammaDistribution(1, 10)," +
"b=sample(a, 10)," +
"c=cumulativeProbability(a, 5.10)," +
"d=probability(a, 5, 6))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertEquals(tuples.size(), 1);
@SuppressWarnings({"unchecked"})
List<Number> b = (List<Number>)tuples.get(0).get("b");
assertEquals(10, b.size());
Number c = (Number)tuples.get(0).get("c");
assertEquals(c.doubleValue(), 0.39950442118773394D, 0);
Number d = (Number)tuples.get(0).get("d");
assertEquals(d.doubleValue(), 0.05771902361860709D, 0);
}
@Test
public void testLogNormalDistribution() throws Exception {
String cexpr = "let(echo=true, " +
"a=describe(sample(logNormalDistribution(.1, 0),10000)), " +
"b=describe(sample(logNormalDistribution(.3, 0),10000)), " +
"c=describe(sample(logNormalDistribution(.6, 0),10000))," +
"d=mean(sample(logNormalDistribution(.3, 0),10000)), " +
"e=mean(sample(logNormalDistribution(.3, 2),10000)), " +
")";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"rawtypes"})
Map a = (Map)tuples.get(0).get("a");
@SuppressWarnings({"rawtypes"})
Map b = (Map)tuples.get(0).get("b");
@SuppressWarnings({"rawtypes"})
Map c = (Map)tuples.get(0).get("c");
Number sa = (Number)a.get("skewness");
Number sb = (Number)b.get("skewness");
Number sc = (Number)c.get("skewness");
assertTrue(sa.doubleValue() < sb.doubleValue());
assertTrue(sb.doubleValue() < sc.doubleValue());
Number d = (Number)tuples.get(0).get("d");
Number e = (Number)tuples.get(0).get("e");
assertTrue(d.doubleValue() < e.doubleValue());
}
@Test
public void testTriangularDistribution() throws Exception {
String cexpr = "let(echo=true, " +
"a=describe(sample(triangularDistribution(10, 15, 30),10000)), " +
"b=describe(sample(triangularDistribution(10, 25, 30),10000)), " +
")";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"rawtypes"})
Map a = (Map)tuples.get(0).get("a");
@SuppressWarnings({"rawtypes"})
Map b = (Map)tuples.get(0).get("b");
Number sa = (Number)a.get("skewness");
Number sb = (Number)b.get("skewness");
Number mina = (Number)a.get("min");
Number maxa = (Number)a.get("max");
assertTrue(sa.doubleValue() > 0);
assertTrue(sb.doubleValue() < 0);
assertEquals(mina.doubleValue(), 10, .6);
assertEquals(maxa.doubleValue(), 30, .6);
}
@Test
public void testCovMatrix() throws Exception {
String cexpr = "let(a=array(1,2,3), b=array(2,4,6), c=array(4, 8, 12), d=transpose(matrix(a, b, c)), f=cov(d))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<List<Number>> cm = (List<List<Number>>)tuples.get(0).get("f");
assertEquals(cm.size(), 3);
List<Number> row1 = cm.get(0);
assertEquals(row1.size(), 3);
assertEquals(row1.get(0).longValue(), 1);
assertEquals(row1.get(1).longValue(), 2);
assertEquals(row1.get(2).longValue(), 4);
List<Number> row2 = cm.get(1);
assertEquals(row2.size(), 3);
assertEquals(row2.get(0).longValue(), 2);
assertEquals(row2.get(1).longValue(), 4);
assertEquals(row2.get(2).longValue(), 8);
List<Number> row3 = cm.get(2);
assertEquals(row3.size(), 3);
assertEquals(row3.get(0).longValue(), 4);
assertEquals(row3.get(1).longValue(), 8);
assertEquals(row3.get(2).longValue(), 16);
}
@Test
@SuppressWarnings({"unchecked"})
public void testCorrMatrix() throws Exception {
String cexpr = "let(echo=true," +
"a=array(1,2,3), " +
"b=array(2,4,6), " +
"c=array(4, 8, 52), " +
"d=transpose(matrix(a, b, c)), " +
"f=corr(d), " +
"g=corr(d, type=kendalls), " +
"h=corr(d, type=spearmans)," +
"i=corrPValues(f)," +
" j=getRowLabels(f)," +
" k=getColumnLabels(f))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
List<List<Number>> cm = (List<List<Number>>)tuples.get(0).get("f");
assertEquals(cm.size(), 3);
List<Number> row1 = cm.get(0);
assertEquals(row1.size(), 3);
assertEquals(row1.get(0).doubleValue(), 1, 0);
assertEquals(row1.get(1).doubleValue(), 1, 0);
assertEquals(row1.get(2).doubleValue(), 0.901127113779166, 0);
List<Number> row2 = cm.get(1);
assertEquals(row2.size(), 3);
assertEquals(row2.get(0).doubleValue(), 1, 0);
assertEquals(row2.get(1).doubleValue(), 1, 0);
assertEquals(row2.get(2).doubleValue(), 0.901127113779166, 0);
List<Number> row3 = cm.get(2);
assertEquals(row3.size(), 3);
assertEquals(row3.get(0).doubleValue(), 0.901127113779166, 0);
assertEquals(row3.get(1).doubleValue(), 0.901127113779166, 0);
assertEquals(row3.get(2).doubleValue(), 1, 0);
cm = (List<List<Number>>)tuples.get(0).get("g");
assertEquals(cm.size(), 3);
row1 = cm.get(0);
assertEquals(row1.size(), 3);
assertEquals(row1.get(0).doubleValue(), 1, 0);
assertEquals(row1.get(1).doubleValue(), 1, 0);
assertEquals(row1.get(2).doubleValue(), 1, 0);
row2 = cm.get(1);
assertEquals(row2.size(), 3);
assertEquals(row2.get(0).doubleValue(), 1, 0);
assertEquals(row2.get(1).doubleValue(), 1, 0);
assertEquals(row2.get(2).doubleValue(), 1, 0);
row3 = cm.get(2);
assertEquals(row3.size(), 3);
assertEquals(row3.get(0).doubleValue(), 1, 0);
assertEquals(row3.get(1).doubleValue(), 1, 0);
assertEquals(row3.get(2).doubleValue(), 1, 0);
cm = (List<List<Number>>)tuples.get(0).get("h");
assertEquals(cm.size(), 3);
row1 = cm.get(0);
assertEquals(row1.size(), 3);
assertEquals(row1.get(0).doubleValue(), 1, 0);
assertEquals(row1.get(1).doubleValue(), 1, 0);
assertEquals(row1.get(2).doubleValue(), 1, 0);
row2 = cm.get(1);
assertEquals(row2.size(), 3);
assertEquals(row2.get(0).doubleValue(), 1, 0);
assertEquals(row2.get(1).doubleValue(), 1, 0);
assertEquals(row2.get(2).doubleValue(), 1, 0);
row3 = cm.get(2);
assertEquals(row3.size(), 3);
assertEquals(row3.get(0).doubleValue(), 1, 0);
assertEquals(row3.get(1).doubleValue(), 1, 0);
assertEquals(row3.get(2).doubleValue(), 1, 0);
cm = (List<List<Number>>)tuples.get(0).get("i");
assertEquals(cm.size(), 3);
row1 = cm.get(0);
assertEquals(row1.size(), 3);
assertEquals(row1.get(0).doubleValue(), 0, 0);
assertEquals(row1.get(1).doubleValue(), 0, 0);
assertEquals(row1.get(2).doubleValue(), 0.28548201004998375, 0);
row2 = cm.get(1);
assertEquals(row2.size(), 3);
assertEquals(row2.get(0).doubleValue(), 0, 0);
assertEquals(row2.get(1).doubleValue(), 0, 0);
assertEquals(row2.get(2).doubleValue(), 0.28548201004998375, 0);
row3 = cm.get(2);
assertEquals(row3.size(), 3);
assertEquals(row3.get(0).doubleValue(), 0.28548201004998375, 0);
assertEquals(row3.get(1).doubleValue(), 0.28548201004998375, 0);
assertEquals(row3.get(2).doubleValue(), 0, 0);
List<String> rowLabels = (List<String>)tuples.get(0).get("j");
assertEquals(rowLabels.size(), 3);
assertEquals(rowLabels.get(0), "col0");
assertEquals(rowLabels.get(1), "col1");
assertEquals(rowLabels.get(2), "col2");
List<String> colLabels = (List<String>)tuples.get(0).get("k");
assertEquals(colLabels.size(), 3);
assertEquals(colLabels.get(0), "col0");
assertEquals(colLabels.get(1), "col1");
assertEquals(colLabels.get(2), "col2");
}
@Test
public void testPrecision() throws Exception {
String cexpr = "let(echo=true, a=precision(array(1.44445, 1, 2.00006), 4), b=precision(1.44445, 4))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> nums = (List<Number>)tuples.get(0).get("a");
assertTrue(nums.size() == 3);
assertEquals(nums.get(0).doubleValue(), 1.4445, 0.0);
assertEquals(nums.get(1).doubleValue(), 1, 0.0);
assertEquals(nums.get(2).doubleValue(), 2.0001, 0.0);
double num = tuples.get(0).getDouble("b");
assertEquals(num, 1.4445, 0.0);
}
@Test
public void testPrecisionMatrix() throws Exception {
String cexpr = "let(a=matrix(array(1.3333999, 2.4444445), array(2.333333, 10.10009)), b=precision(a, 4))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<List<Number>> rows = (List<List<Number>>)tuples.get(0).get("b");
assertTrue(rows.size() == 2);
List<Number> row1 = rows.get(0);
assertTrue(row1.size() == 2);
assertEquals(row1.get(0).doubleValue(), 1.3334, 0);
assertEquals(row1.get(1).doubleValue(), 2.4444, 0);
List<Number> row2 = rows.get(1);
assertTrue(row2.size() == 2);
assertEquals(row2.get(0).doubleValue(), 2.3333, 0);
assertEquals(row2.get(1).doubleValue(), 10.1001, 0);
}
@Test
@SuppressWarnings({"unchecked"})
public void testMinMaxScale() throws Exception {
String cexpr = "let(echo=true, a=minMaxScale(matrix(array(1,2,3,4,5), array(10,20,30,40,50))), " +
"b=minMaxScale(matrix(array(1,2,3,4,5), array(10,20,30,40,50)), 0, 100)," +
"c=minMaxScale(array(1,2,3,4,5))," +
"d=minMaxScale(array(1,2,3,4,5), 0, 100))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
List<List<Number>> matrix = (List<List<Number>>)tuples.get(0).get("a");
List<Number> row1 = matrix.get(0);
assertEquals(row1.get(0).doubleValue(), 0,0);
assertEquals(row1.get(1).doubleValue(), .25,0);
assertEquals(row1.get(2).doubleValue(), .5,0);
assertEquals(row1.get(3).doubleValue(), .75, 0);
assertEquals(row1.get(4).doubleValue(), 1, 0);
List<Number> row2 = matrix.get(1);
assertEquals(row2.get(0).doubleValue(), 0,0);
assertEquals(row2.get(1).doubleValue(), .25,0);
assertEquals(row2.get(2).doubleValue(), .5,0);
assertEquals(row2.get(3).doubleValue(), .75,0);
assertEquals(row2.get(4).doubleValue(), 1,0);
matrix = (List<List<Number>>)tuples.get(0).get("b");
row1 = matrix.get(0);
assertEquals(row1.get(0).doubleValue(), 0,0);
assertEquals(row1.get(1).doubleValue(), 25,0);
assertEquals(row1.get(2).doubleValue(), 50,0);
assertEquals(row1.get(3).doubleValue(), 75,0);
assertEquals(row1.get(4).doubleValue(), 100,0);
row2 = matrix.get(1);
assertEquals(row2.get(0).doubleValue(), 0,0);
assertEquals(row2.get(1).doubleValue(), 25,0);
assertEquals(row2.get(2).doubleValue(), 50,0);
assertEquals(row2.get(3).doubleValue(), 75,0);
assertEquals(row2.get(4).doubleValue(), 100,0);
List<Number> row3= (List<Number>)tuples.get(0).get("c");
assertEquals(row3.get(0).doubleValue(), 0,0);
assertEquals(row3.get(1).doubleValue(), .25,0);
assertEquals(row3.get(2).doubleValue(), .5,0);
assertEquals(row3.get(3).doubleValue(), .75,0);
assertEquals(row3.get(4).doubleValue(), 1,0);
List<Number> row4= (List<Number>)tuples.get(0).get("d");
assertEquals(row4.get(0).doubleValue(), 0,0);
assertEquals(row4.get(1).doubleValue(), 25,0);
assertEquals(row4.get(2).doubleValue(), 50,0);
assertEquals(row4.get(3).doubleValue(), 75,0);
assertEquals(row4.get(4).doubleValue(), 100,0);
}
@Test
public void testMean() throws Exception {
String cexpr = "mean(array(1,2,3,4,5))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Number mean = (Number)tuples.get(0).get("return-value");
assertEquals(mean.doubleValue(), 3.0D, 0.0D);
}
@Test
public void testNorms() throws Exception {
String cexpr = "let(echo=true, " +
" a=array(1,2,3,4,5,6), " +
" b=l1norm(a), " +
" c=l2norm(a), " +
" d=linfnorm(a), " +
" e=sqrt(add(pow(a, 2)))," +
" f=add(abs(a)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Number l1norm = (Number)tuples.get(0).get("b");
assertEquals(l1norm.doubleValue(), 21.0D, 0.0D);
Number norm = (Number)tuples.get(0).get("c");
assertEquals(norm.doubleValue(), 9.5393920141695, 0.0001D);
Number inorm = (Number)tuples.get(0).get("d");
assertEquals(inorm.doubleValue(), 6.0, 0.0);
Number norm2 = (Number)tuples.get(0).get("e");
assertEquals(norm.doubleValue(), norm2.doubleValue(), 0.0);
Number l1norm2 = (Number)tuples.get(0).get("f");
assertEquals(l1norm.doubleValue(), l1norm2.doubleValue(), 0.0);
}
@Test
public void testScale() throws Exception {
UpdateRequest updateRequest = new UpdateRequest();
int i=0;
while(i<50) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2016", "5", "1"), "price_f", "400.00");
}
while(i<100) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2015", "5", "1"), "price_f", "300.0");
}
while(i<150) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2014", "5", "1"), "price_f", "500.0");
}
while(i<250) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2013", "5", "1"), "price_f", "100.00");
}
updateRequest.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
String expr = "timeseries("+COLLECTIONORALIAS+", q=\"*:*\", start=\"2013-01-01T01:00:00.000Z\", " +
"end=\"2016-12-01T01:00:00.000Z\", " +
"gap=\"+1YEAR\", " +
"field=\"test_dt\", " +
"count(*), sum(price_f), max(price_f), min(price_f))";
String cexpr = "let(a="+expr+", c=col(a, max(price_f)), tuple(reverse=rev(c), scaled=scale(2, c)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> reverse = (List<Number>)tuples.get(0).get("reverse");
assertTrue(reverse.size() == 4);
assertTrue(reverse.get(0).doubleValue() == 400D);
assertTrue(reverse.get(1).doubleValue() == 300D);
assertTrue(reverse.get(2).doubleValue() == 500D);
assertTrue(reverse.get(3).doubleValue() == 100D);
@SuppressWarnings({"unchecked"})
List<Number> ranked = (List<Number>)tuples.get(0).get("scaled");
assertTrue(ranked.size() == 4);
assertTrue(ranked.get(0).doubleValue() == 200D);
assertTrue(ranked.get(1).doubleValue() == 1000D);
assertTrue(ranked.get(2).doubleValue() == 600D);
assertTrue(ranked.get(3).doubleValue() == 800D);
}
@Test
public void testConvolution() throws Exception {
UpdateRequest updateRequest = new UpdateRequest();
int i=0;
while(i<50) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2016", "5", "1"), "price_f", "400.00");
}
while(i<100) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2015", "5", "1"), "price_f", "300.0");
}
while(i<150) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2014", "5", "1"), "price_f", "500.0");
}
while(i<250) {
updateRequest.add(id, "id_"+(++i),"test_dt", getDateString("2013", "5", "1"), "price_f", "100.00");
}
updateRequest.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
String expr = "timeseries("+COLLECTIONORALIAS+", q=\"*:*\", start=\"2013-01-01T01:00:00.000Z\", " +
"end=\"2016-12-01T01:00:00.000Z\", " +
"gap=\"+1YEAR\", " +
"field=\"test_dt\", " +
"count(*), sum(price_f), max(price_f), min(price_f))";
String cexpr = "let(a="+expr+", b=select("+expr+",mult(2, count(*)) as nvalue), c=col(a, count(*)), d=col(b, nvalue), tuple(colc=c, cold=d, conv=conv(c,d)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
@SuppressWarnings({"unchecked"})
List<Number> convolution = (List<Number>)(tuples.get(0)).get("conv");
assertTrue(convolution.size() == 7);
assertTrue(convolution.get(0).equals(20000D));
assertTrue(convolution.get(1).equals(20000D));
assertTrue(convolution.get(2).equals(25000D));
assertTrue(convolution.get(3).equals(30000D));
assertTrue(convolution.get(4).equals(15000D));
assertTrue(convolution.get(5).equals(10000D));
assertTrue(convolution.get(6).equals(5000D));
}
@Test
public void testRegressAndPredict() throws Exception {
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.add(id, "1", "price_f", "100.0", "col_s", "a", "order_i", "1");
updateRequest.add(id, "2", "price_f", "200.0", "col_s", "a", "order_i", "2");
updateRequest.add(id, "3", "price_f", "300.0", "col_s", "a", "order_i", "3");
updateRequest.add(id, "4", "price_f", "100.0", "col_s", "a", "order_i", "4");
updateRequest.add(id, "5", "price_f", "200.0", "col_s", "a", "order_i", "5");
updateRequest.add(id, "6", "price_f", "400.0", "col_s", "a", "order_i", "6");
updateRequest.add(id, "7", "price_f", "600.0", "col_s", "a", "order_i", "7");
updateRequest.add(id, "8", "price_f", "200.0", "col_s", "b", "order_i", "1");
updateRequest.add(id, "9", "price_f", "400.0", "col_s", "b", "order_i", "2");
updateRequest.add(id, "10", "price_f", "600.0", "col_s", "b", "order_i", "3");
updateRequest.add(id, "11", "price_f", "200.0", "col_s", "b", "order_i", "4");
updateRequest.add(id, "12", "price_f", "400.0", "col_s", "b", "order_i", "5");
updateRequest.add(id, "13", "price_f", "800.0", "col_s", "b", "order_i", "6");
updateRequest.add(id, "14", "price_f", "1200.0", "col_s", "b", "order_i", "7");
updateRequest.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
String expr1 = "search("+COLLECTIONORALIAS+", q=\"col_s:a\", fl=\"price_f, order_i\", sort=\"order_i asc\")";
String expr2 = "search("+COLLECTIONORALIAS+", q=\"col_s:b\", fl=\"price_f, order_i\", sort=\"order_i asc\")";
String cexpr = "let(a="+expr1+", b="+expr2+", c=col(a, price_f), d=col(b, price_f), e=regress(c, d), tuple(regress=e, p=predict(e, 300), pl=predict(e, c)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Tuple tuple = tuples.get(0);
@SuppressWarnings({"rawtypes"})
Map regression = (Map)tuple.get("regress");
double slope = (double)regression.get("slope");
double intercept= (double) regression.get("intercept");
double rSquare= (double) regression.get("RSquared");
assertTrue(slope == 2.0D);
assertTrue(intercept == 0.0D);
assertTrue(rSquare == 1.0D);
double prediction = tuple.getDouble("p");
assertTrue(prediction == 600.0D);
@SuppressWarnings({"unchecked"})
List<Number> predictions = (List<Number>)tuple.get("pl");
assertList(predictions, 200D, 400D, 600D, 200D, 400D, 800D, 1200D);
}
@Test
public void testFinddelay() throws Exception {
UpdateRequest updateRequest = new UpdateRequest();
//Pad column 1 with three zeros.
updateRequest.add(id, "10", "price_f", "0.0", "col_s", "a", "order_i", "0");
updateRequest.add(id, "11", "price_f", "0.0", "col_s", "a", "order_i", "0");
updateRequest.add(id, "12", "price_f", "0.0", "col_s", "a", "order_i", "0");
updateRequest.add(id, "1", "price_f", "100.0", "col_s", "a", "order_i", "1");
updateRequest.add(id, "2", "price_f", "200.0", "col_s", "a", "order_i", "2");
updateRequest.add(id, "3", "price_f", "300.0", "col_s", "a", "order_i", "3");
updateRequest.add(id, "4", "price_f", "100.0", "col_s", "a", "order_i", "4");
updateRequest.add(id, "5", "price_f", "200.0", "col_s", "a", "order_i", "5");
updateRequest.add(id, "6", "price_f", "400.0", "col_s", "a", "order_i", "6");
updateRequest.add(id, "7", "price_f", "600.0", "col_s", "a", "order_i", "7");
updateRequest.add(id, "100", "price_f", "200.0", "col_s", "b", "order_i", "1");
updateRequest.add(id, "101", "price_f", "400.0", "col_s", "b", "order_i", "2");
updateRequest.add(id, "102", "price_f", "600.0", "col_s", "b", "order_i", "3");
updateRequest.add(id, "103", "price_f", "200.0", "col_s", "b", "order_i", "4");
updateRequest.add(id, "104", "price_f", "400.0", "col_s", "b", "order_i", "5");
updateRequest.add(id, "105", "price_f", "800.0", "col_s", "b", "order_i", "6");
updateRequest.add(id, "106", "price_f", "1200.0", "col_s", "b", "order_i", "7");
updateRequest.add(id, "200", "price_f", "-200.0", "col_s", "c", "order_i", "1");
updateRequest.add(id, "301", "price_f", "-400.0", "col_s", "c", "order_i", "2");
updateRequest.add(id, "402", "price_f", "-600.0", "col_s", "c", "order_i", "3");
updateRequest.add(id, "503", "price_f", "-200.0", "col_s", "c", "order_i", "4");
updateRequest.add(id, "604", "price_f", "-400.0", "col_s", "c", "order_i", "5");
updateRequest.add(id, "705", "price_f", "-800.0", "col_s", "c", "order_i", "6");
updateRequest.add(id, "806", "price_f", "-1200.0", "col_s", "c", "order_i", "7");
updateRequest.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
String expr1 = "search("+COLLECTIONORALIAS+", q=\"col_s:a\", fl=\"price_f, order_i\", sort=\"order_i asc\")";
String expr2 = "search("+COLLECTIONORALIAS+", q=\"col_s:b\", fl=\"price_f, order_i\", sort=\"order_i asc\")";
String cexpr = "let(a="+expr1+", b="+expr2+", c=col(a, price_f), d=col(b, price_f), tuple(delay=finddelay(c, d)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Tuple tuple = tuples.get(0);
long delay = tuple.getLong("delay");
assert(delay == 3);
expr1 = "search("+COLLECTIONORALIAS+", q=\"col_s:a\", fq=\"id:(1 2 3 4 5 6 7)\", fl=\"price_f, order_i\", sort=\"order_i asc\")";
expr2 = "search("+COLLECTIONORALIAS+", q=\"col_s:b\", fl=\"price_f, order_i\", sort=\"order_i asc\")";
cexpr = "let(a="+expr1+", b="+expr2+", c=col(a, price_f), d=col(b, price_f), tuple(delay=finddelay(c, d)))";
paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
solrStream = new SolrStream(url, paramsLoc);
solrStream.setStreamContext(context);
tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
tuple = tuples.get(0);
delay = tuple.getLong("delay");
assert(delay == 0);
//Test negative correlation.
expr1 = "search("+COLLECTIONORALIAS+", q=\"col_s:a\", fq=\"id:(1 2 3 4 5 6 7 11 12)\",fl=\"price_f, order_i\", sort=\"order_i asc\")";
expr2 = "search("+COLLECTIONORALIAS+", q=\"col_s:c\", fl=\"price_f, order_i\", sort=\"order_i asc\")";
cexpr = "let(a="+expr1+", b="+expr2+", c=col(a, price_f), d=col(b, price_f), tuple(delay=finddelay(c, d)))";
paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
solrStream = new SolrStream(url, paramsLoc);
solrStream.setStreamContext(context);
tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
tuple = tuples.get(0);
delay = tuple.getLong("delay");
assert(delay == 2);
}
@Test
public void testDescribe() throws Exception {
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.add(id, "1", "price_f", "100.0", "col_s", "a", "order_i", "1");
updateRequest.add(id, "2", "price_f", "200.0", "col_s", "a", "order_i", "2");
updateRequest.add(id, "3", "price_f", "300.0", "col_s", "a", "order_i", "3");
updateRequest.add(id, "4", "price_f", "100.0", "col_s", "a", "order_i", "4");
updateRequest.add(id, "5", "price_f", "200.0", "col_s", "a", "order_i", "5");
updateRequest.add(id, "6", "price_f", "400.0", "col_s", "a", "order_i", "6");
updateRequest.add(id, "7", "price_f", "600.0", "col_s", "a", "order_i", "7");
updateRequest.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
String expr1 = "search("+COLLECTIONORALIAS+", q=\"col_s:a\", fl=\"price_f, order_i\", sort=\"order_i asc\")";
String cexpr = "let(a="+expr1+", b=col(a, price_f), stats=describe(b))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Tuple stats = tuples.get(0);
Number min = (Number)stats.get("min");
Number max = (Number)stats.get("max");
Number mean = (Number)stats.get("mean");
Number stdev = (Number)stats.get("stdev");
Number popVar = (Number)stats.get("popVar");
Number skewness = (Number)stats.get("skewness");
Number kurtosis = (Number)stats.get("kurtosis");
Number var = (Number)stats.get("var");
Number geometricMean = (Number)stats.get("geometricMean");
Number N = (Number)stats.get("N");
assertEquals(min.doubleValue(), 100.0D, 0.0);
assertEquals(max.doubleValue(), 600.0D, 0.0);
assertEquals(N.doubleValue(), 7.0D, 0.0);
assertEquals(mean.doubleValue(), 271.42D, 0.5);
assertEquals(popVar.doubleValue(), 27755.10, 0.5);
assertEquals(kurtosis.doubleValue(), .70D, 0.5);
assertEquals(skewness.doubleValue(), 1.07D, 0.5);
assertEquals(var.doubleValue(), 32380.95D, 0.5);
assertEquals(geometricMean.doubleValue(), 224.56D, 0.5);
assertEquals(stdev.doubleValue(), 179.94D, 0.5);
}
@Test
public void testLength() throws Exception {
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.add(id, "1", "price_f", "100.0", "col_s", "a", "order_i", "1");
updateRequest.add(id, "2", "price_f", "200.0", "col_s", "a", "order_i", "2");
updateRequest.add(id, "3", "price_f", "300.0", "col_s", "a", "order_i", "3");
updateRequest.add(id, "4", "price_f", "100.0", "col_s", "a", "order_i", "4");
updateRequest.add(id, "5", "price_f", "200.0", "col_s", "a", "order_i", "5");
updateRequest.add(id, "6", "price_f", "400.0", "col_s", "a", "order_i", "6");
updateRequest.add(id, "7", "price_f", "600.0", "col_s", "a", "order_i", "7");
updateRequest.add(id, "8", "price_f", "200.0", "col_s", "b", "order_i", "1");
updateRequest.add(id, "9", "price_f", "400.0", "col_s", "b", "order_i", "2");
updateRequest.add(id, "10", "price_f", "600.0", "col_s", "b", "order_i", "3");
updateRequest.add(id, "11", "price_f", "200.0", "col_s", "b", "order_i", "4");
updateRequest.add(id, "12", "price_f", "400.0", "col_s", "b", "order_i", "5");
updateRequest.add(id, "13", "price_f", "800.0", "col_s", "b", "order_i", "6");
updateRequest.add(id, "14", "price_f", "1200.0", "col_s", "b", "order_i", "7");
updateRequest.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
String expr1 = "search("+COLLECTIONORALIAS+", q=\"col_s:a\", fl=\"price_f, order_i\", sort=\"order_i asc\")";
String expr2 = "search("+COLLECTIONORALIAS+", q=\"col_s:b\", fl=\"price_f, order_i\", sort=\"order_i asc\")";
String cexpr = "let(a="+expr1+", b="+expr2+", c=col(a, price_f), d=col(b, price_f), e=regress(c, d), tuple(regress=e, p=predict(e, 300), l=length(d)))";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", cexpr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
Tuple tuple = tuples.get(0);
@SuppressWarnings({"rawtypes"})
Map regression = (Map)tuple.get("regress");
double slope = (double)regression.get("slope");
double intercept= (double) regression.get("intercept");
double length = tuple.getDouble("l");
assertTrue(slope == 2.0D);
assertTrue(intercept == 0.0D);
double prediction = tuple.getDouble("p");
assertTrue(prediction == 600.0D);
assertTrue(length == 7);
}
@Test
public void testConvertEvaluator() throws Exception {
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.add(id, "1", "miles_i", "50");
updateRequest.add(id, "2", "miles_i", "70");
updateRequest.commit(cluster.getSolrClient(), COLLECTIONORALIAS);
//Test annotating tuple
String expr = "select(calc(), convert(miles, kilometers, 10) as kilometers)";
ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
TupleStream solrStream = new SolrStream(url, paramsLoc);
StreamContext context = new StreamContext();
solrStream.setStreamContext(context);
List<Tuple> tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
double d = (double)tuples.get(0).get("kilometers");
assertTrue(d == (10*1.61));
expr = "select(search("+COLLECTIONORALIAS+", q=\"*:*\", sort=\"miles_i asc\", fl=\"miles_i\"), convert(miles, kilometers, miles_i) as kilometers)";
paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
solrStream = new SolrStream(url, paramsLoc);
context = new StreamContext();
solrStream.setStreamContext(context);
tuples = getTuples(solrStream);
assertTrue(tuples.size() == 2);
d = (double)tuples.get(0).get("kilometers");
assertTrue(d == (50*1.61));
d = (double)tuples.get(1).get("kilometers");
assertTrue(d == (70*1.61));
expr = "parallel("+COLLECTIONORALIAS+", workers=2, sort=\"miles_i asc\", select(search("+COLLECTIONORALIAS+", q=\"*:*\", partitionKeys=miles_i, sort=\"miles_i asc\", fl=\"miles_i\", qt=\"/export\"), convert(miles, kilometers, miles_i) as kilometers))";
paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
solrStream = new SolrStream(url, paramsLoc);
context = new StreamContext();
solrStream.setStreamContext(context);
tuples = getTuples(solrStream);
assertTrue(tuples.size() == 2);
d = (double)tuples.get(0).get("kilometers");
assertTrue(d == (50*1.61));
d = (double)tuples.get(1).get("kilometers");
assertTrue(d == (70*1.61));
expr = "select(stats("+COLLECTIONORALIAS+", q=\"*:*\", sum(miles_i)), convert(miles, kilometers, sum(miles_i)) as kilometers)";
paramsLoc = new ModifiableSolrParams();
paramsLoc.set("expr", expr);
paramsLoc.set("qt", "/stream");
solrStream = new SolrStream(url, paramsLoc);
context = new StreamContext();
solrStream.setStreamContext(context);
tuples = getTuples(solrStream);
assertTrue(tuples.size() == 1);
d = (double)tuples.get(0).get("kilometers");
assertTrue(d == (120*1.61));
}
protected List<Tuple> getTuples(TupleStream tupleStream) throws IOException {
List<Tuple> tuples = new ArrayList<Tuple>();
try {
tupleStream.open();
for (Tuple t = tupleStream.read(); !t.EOF; t = tupleStream.read()) {
tuples.add(t);
}
} finally {
tupleStream.close();
}
return tuples;
}
public boolean assertLong(Tuple tuple, String fieldName, long l) throws Exception {
long lv = (long)tuple.get(fieldName);
if(lv != l) {
throw new Exception("Longs not equal:"+l+" : "+lv);
}
return true;
}
public boolean assertString(Tuple tuple, String fieldName, String expected) throws Exception {
String actual = (String)tuple.get(fieldName);
if( (null == expected && null != actual) ||
(null != expected && null == actual) ||
(null != expected && !expected.equals(actual))){
throw new Exception("Longs not equal:"+expected+" : "+actual);
}
return true;
}
private boolean assertList(@SuppressWarnings({"rawtypes"})List list, Object... vals) throws Exception {
if(list.size() != vals.length) {
throw new Exception("Lists are not the same size:"+list.size() +" : "+vals.length);
}
for(int i=0; i<list.size(); i++) {
Object a = list.get(i);
Object b = vals[i];
if(!a.equals(b)) {
throw new Exception("List items not equals:"+a+" : "+b);
}
}
return true;
}
}