You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by cp...@apache.org on 2017/06/02 10:56:25 UTC
[02/38] lucene-solr:jira/solr-8668: SOLR-10770: Add date formatting
to timeseries Streaming Expression
SOLR-10770: Add date formatting to timeseries Streaming Expression
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/52076291
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/52076291
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/52076291
Branch: refs/heads/jira/solr-8668
Commit: 520762913af97f761377e03139499aeee31d2a9f
Parents: d14ca98
Author: Joel Bernstein <jb...@apache.org>
Authored: Tue May 30 14:38:50 2017 -0400
Committer: Joel Bernstein <jb...@apache.org>
Committed: Tue May 30 14:39:38 2017 -0400
----------------------------------------------------------------------
.../solrj/io/stream/TimeSeriesStream.java | 36 ++++++++-
.../solrj/io/stream/StreamExpressionTest.java | 81 ++++++++++++++++++++
2 files changed, 114 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/52076291/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/TimeSeriesStream.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/TimeSeriesStream.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/TimeSeriesStream.java
index bb965b0..f38da85 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/TimeSeriesStream.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/TimeSeriesStream.java
@@ -17,6 +17,10 @@
package org.apache.solr.client.solrj.io.stream;
import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -53,6 +57,8 @@ public class TimeSeriesStream extends TupleStream implements Expressible {
private String end;
private String gap;
private String field;
+ private DateTimeFormatter formatter;
+ private SimpleDateFormat ISOFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
private Metric[] metrics;
private List<Tuple> tuples = new ArrayList();
@@ -70,8 +76,9 @@ public class TimeSeriesStream extends TupleStream implements Expressible {
String field,
String start,
String end,
- String gap) throws IOException {
- init(collection, params, field, metrics, start, end, gap, zkHost);
+ String gap,
+ String format) throws IOException {
+ init(collection, params, field, metrics, start, end, gap, format, zkHost);
}
public TimeSeriesStream(StreamExpression expression, StreamFactory factory) throws IOException{
@@ -82,9 +89,17 @@ public class TimeSeriesStream extends TupleStream implements Expressible {
StreamExpressionNamedParameter endExpression = factory.getNamedOperand(expression, "end");
StreamExpressionNamedParameter fieldExpression = factory.getNamedOperand(expression, "field");
StreamExpressionNamedParameter gapExpression = factory.getNamedOperand(expression, "gap");
+ StreamExpressionNamedParameter formatExpression = factory.getNamedOperand(expression, "format");
+ StreamExpressionNamedParameter qExpression = factory.getNamedOperand(expression, "q");
+
StreamExpressionNamedParameter zkHostExpression = factory.getNamedOperand(expression, "zkHost");
List<StreamExpression> metricExpressions = factory.getExpressionOperandsRepresentingTypes(expression, Expressible.class, Metric.class);
+
+ if(qExpression == null) {
+ throw new IOException("The timeseries expression requires the q parameter");
+ }
+
String start = null;
if(startExpression != null) {
start = ((StreamExpressionValue)startExpression.getParameter()).getValue();
@@ -105,6 +120,11 @@ public class TimeSeriesStream extends TupleStream implements Expressible {
field = ((StreamExpressionValue)fieldExpression.getParameter()).getValue();
}
+ String format = null;
+ if(formatExpression != null) {
+ format = ((StreamExpressionValue)formatExpression.getParameter()).getValue();
+ }
+
// Collection Name
if(null == collectionName){
throw new IOException(String.format(Locale.ROOT,"invalid expression %s - collectionName expected as first operand",expression));
@@ -149,7 +169,7 @@ public class TimeSeriesStream extends TupleStream implements Expressible {
}
// We've got all the required items
- init(collectionName, params, field, metrics, start, end, gap , zkHost);
+ init(collectionName, params, field, metrics, start, end, gap, format, zkHost);
}
public String getCollection() {
@@ -163,6 +183,7 @@ public class TimeSeriesStream extends TupleStream implements Expressible {
String start,
String end,
String gap,
+ String format,
String zkHost) throws IOException {
this.zkHost = zkHost;
this.collection = collection;
@@ -175,6 +196,9 @@ public class TimeSeriesStream extends TupleStream implements Expressible {
this.field = field;
this.params = params;
this.end = end;
+ if(format != null) {
+ formatter = DateTimeFormatter.ofPattern(format);
+ }
}
@Override
@@ -348,6 +372,12 @@ public class TimeSeriesStream extends TupleStream implements Expressible {
for(int b=0; b<allBuckets.size(); b++) {
NamedList bucket = (NamedList)allBuckets.get(b);
Object val = bucket.get("val");
+
+ if(formatter != null) {
+ LocalDateTime localDateTime = LocalDateTime.ofInstant(((java.util.Date) val).toInstant(), ZoneOffset.UTC);
+ val = localDateTime.format(formatter);
+ }
+
Tuple t = currentTuple.clone();
t.put(field, val);
int m = 0;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/52076291/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
index d82ca2a..3957915 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
@@ -5368,6 +5368,87 @@ public class StreamExpressionTest extends SolrCloudTestCase {
assertTrue(tuples.get(3).getDouble("max(price_f)").equals(400D));
assertTrue(tuples.get(3).getDouble("min(price_f)").equals(400D));
+
+ expr = "timeseries("+COLLECTIONORALIAS+", q=\"*:*\", start=\"2013-01-01T01:00:00.000Z\", " +
+ "end=\"2016-12-01T01:00:00.000Z\", " +
+ "gap=\"+1YEAR\", " +
+ "field=\"test_dt\", " +
+ "format=\"yyyy\", " +
+ "count(*), sum(price_f), max(price_f), min(price_f))";
+ 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() == 4);
+
+ assertTrue(tuples.get(0).get("test_dt").equals("2013"));
+ assertTrue(tuples.get(0).getLong("count(*)").equals(100L));
+ assertTrue(tuples.get(0).getDouble("sum(price_f)").equals(10000D));
+ assertTrue(tuples.get(0).getDouble("max(price_f)").equals(100D));
+ assertTrue(tuples.get(0).getDouble("min(price_f)").equals(100D));
+
+ assertTrue(tuples.get(1).get("test_dt").equals("2014"));
+ assertTrue(tuples.get(1).getLong("count(*)").equals(50L));
+ assertTrue(tuples.get(1).getDouble("sum(price_f)").equals(25000D));
+ assertTrue(tuples.get(1).getDouble("max(price_f)").equals(500D));
+ assertTrue(tuples.get(1).getDouble("min(price_f)").equals(500D));
+
+ assertTrue(tuples.get(2).get("test_dt").equals("2015"));
+ assertTrue(tuples.get(2).getLong("count(*)").equals(50L));
+ assertTrue(tuples.get(2).getDouble("sum(price_f)").equals(15000D));
+ assertTrue(tuples.get(2).getDouble("max(price_f)").equals(300D));
+ assertTrue(tuples.get(2).getDouble("min(price_f)").equals(300D));
+
+ assertTrue(tuples.get(3).get("test_dt").equals("2016"));
+ assertTrue(tuples.get(3).getLong("count(*)").equals(50L));
+ assertTrue(tuples.get(3).getDouble("sum(price_f)").equals(20000D));
+ assertTrue(tuples.get(3).getDouble("max(price_f)").equals(400D));
+ assertTrue(tuples.get(3).getDouble("min(price_f)").equals(400D));
+
+ expr = "timeseries("+COLLECTIONORALIAS+", q=\"*:*\", start=\"2013-01-01T01:00:00.000Z\", " +
+ "end=\"2016-12-01T01:00:00.000Z\", " +
+ "gap=\"+1YEAR\", " +
+ "field=\"test_dt\", " +
+ "format=\"yyyy-MM\", " +
+ "count(*), sum(price_f), max(price_f), min(price_f))";
+ 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() == 4);
+
+ assertTrue(tuples.get(0).get("test_dt").equals("2013-01"));
+ assertTrue(tuples.get(0).getLong("count(*)").equals(100L));
+ assertTrue(tuples.get(0).getDouble("sum(price_f)").equals(10000D));
+ assertTrue(tuples.get(0).getDouble("max(price_f)").equals(100D));
+ assertTrue(tuples.get(0).getDouble("min(price_f)").equals(100D));
+
+ assertTrue(tuples.get(1).get("test_dt").equals("2014-01"));
+ assertTrue(tuples.get(1).getLong("count(*)").equals(50L));
+ assertTrue(tuples.get(1).getDouble("sum(price_f)").equals(25000D));
+ assertTrue(tuples.get(1).getDouble("max(price_f)").equals(500D));
+ assertTrue(tuples.get(1).getDouble("min(price_f)").equals(500D));
+
+ assertTrue(tuples.get(2).get("test_dt").equals("2015-01"));
+ assertTrue(tuples.get(2).getLong("count(*)").equals(50L));
+ assertTrue(tuples.get(2).getDouble("sum(price_f)").equals(15000D));
+ assertTrue(tuples.get(2).getDouble("max(price_f)").equals(300D));
+ assertTrue(tuples.get(2).getDouble("min(price_f)").equals(300D));
+
+ assertTrue(tuples.get(3).get("test_dt").equals("2016-01"));
+ assertTrue(tuples.get(3).getLong("count(*)").equals(50L));
+ assertTrue(tuples.get(3).getDouble("sum(price_f)").equals(20000D));
+ assertTrue(tuples.get(3).getDouble("max(price_f)").equals(400D));
+ assertTrue(tuples.get(3).getDouble("min(price_f)").equals(400D));
+
}
@Test