This is an automated email from the ASF dual-hosted git repository.
ccaominh pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git
The following commit(s) were added to refs/heads/master by this push:
new b5dfa53 Make it easier for devs to add CalciteQueryTests (#9922)
b5dfa53 is described below
commit b5dfa5322b2611eb7626dbe8c4023f4946ea46f9
Author: Suneet Saldanha <[email protected]>
AuthorDate: Wed May 27 13:03:53 2020 -0700
Make it easier for devs to add CalciteQueryTests (#9922)
* Add ingestion specs for CalciteQueryTests
This PR introduces ingestion specs that can be used for local testing
so that CalciteQueryTests can be built on a druid cluster.
* Add README
* Update sql/src/test/resources/calcite/tests/README.md
---
.../druid/sql/calcite/util/CalciteTests.java | 348 ++++++++++-----------
sql/src/test/resources/calcite/tests/README.md | 7 +
sql/src/test/resources/calcite/tests/foo.json | 53 ++++
sql/src/test/resources/calcite/tests/foo2.json | 47 +++
sql/src/test/resources/calcite/tests/foo4.json | 52 +++
sql/src/test/resources/calcite/tests/lookyloo.json | 6 +
sql/src/test/resources/calcite/tests/numFoo.json | 79 +++++
7 files changed, 413 insertions(+), 179 deletions(-)
diff --git
a/sql/src/test/java/org/apache/druid/sql/calcite/util/CalciteTests.java
b/sql/src/test/java/org/apache/druid/sql/calcite/util/CalciteTests.java
index 0874281..588d5ad 100644
--- a/sql/src/test/java/org/apache/druid/sql/calcite/util/CalciteTests.java
+++ b/sql/src/test/java/org/apache/druid/sql/calcite/util/CalciteTests.java
@@ -124,6 +124,7 @@ import java.util.Map;
import java.util.Set;
import java.util.concurrent.Executor;
import java.util.function.BooleanSupplier;
+import java.util.stream.Collectors;
/**
* Utility functions for Calcite tests.
@@ -309,189 +310,178 @@ public class CalciteTests
.withRollup(false)
.build();
- public static final List<InputRow> ROWS1 = ImmutableList.of(
- createRow(
- ImmutableMap.<String, Object>builder()
- .put("t", "2000-01-01")
- .put("m1", "1.0")
- .put("m2", "1.0")
- .put("dim1", "")
- .put("dim2", ImmutableList.of("a"))
- .put("dim3", ImmutableList.of("a", "b"))
- .build()
- ),
- createRow(
- ImmutableMap.<String, Object>builder()
- .put("t", "2000-01-02")
- .put("m1", "2.0")
- .put("m2", "2.0")
- .put("dim1", "10.1")
- .put("dim2", ImmutableList.of())
- .put("dim3", ImmutableList.of("b", "c"))
- .build()
- ),
- createRow(
- ImmutableMap.<String, Object>builder()
- .put("t", "2000-01-03")
- .put("m1", "3.0")
- .put("m2", "3.0")
- .put("dim1", "2")
- .put("dim2", ImmutableList.of(""))
- .put("dim3", ImmutableList.of("d"))
- .build()
- ),
- createRow(
- ImmutableMap.<String, Object>builder()
- .put("t", "2001-01-01")
- .put("m1", "4.0")
- .put("m2", "4.0")
- .put("dim1", "1")
- .put("dim2", ImmutableList.of("a"))
- .put("dim3", ImmutableList.of(""))
- .build()
- ),
- createRow(
- ImmutableMap.<String, Object>builder()
- .put("t", "2001-01-02")
- .put("m1", "5.0")
- .put("m2", "5.0")
- .put("dim1", "def")
- .put("dim2", ImmutableList.of("abc"))
- .put("dim3", ImmutableList.of())
- .build()
- ),
- createRow(
- ImmutableMap.<String, Object>builder()
- .put("t", "2001-01-03")
- .put("m1", "6.0")
- .put("m2", "6.0")
- .put("dim1", "abc")
- .build()
- )
+ public static final List<ImmutableMap<String, Object>> RAW_ROWS1 =
ImmutableList.of(
+ ImmutableMap.<String, Object>builder()
+ .put("t", "2000-01-01")
+ .put("m1", "1.0")
+ .put("m2", "1.0")
+ .put("dim1", "")
+ .put("dim2", ImmutableList.of("a"))
+ .put("dim3", ImmutableList.of("a", "b"))
+ .build(),
+ ImmutableMap.<String, Object>builder()
+ .put("t", "2000-01-02")
+ .put("m1", "2.0")
+ .put("m2", "2.0")
+ .put("dim1", "10.1")
+ .put("dim2", ImmutableList.of())
+ .put("dim3", ImmutableList.of("b", "c"))
+ .build(),
+ ImmutableMap.<String, Object>builder()
+ .put("t", "2000-01-03")
+ .put("m1", "3.0")
+ .put("m2", "3.0")
+ .put("dim1", "2")
+ .put("dim2", ImmutableList.of(""))
+ .put("dim3", ImmutableList.of("d"))
+ .build(),
+ ImmutableMap.<String, Object>builder()
+ .put("t", "2001-01-01")
+ .put("m1", "4.0")
+ .put("m2", "4.0")
+ .put("dim1", "1")
+ .put("dim2", ImmutableList.of("a"))
+ .put("dim3", ImmutableList.of(""))
+ .build(),
+ ImmutableMap.<String, Object>builder()
+ .put("t", "2001-01-02")
+ .put("m1", "5.0")
+ .put("m2", "5.0")
+ .put("dim1", "def")
+ .put("dim2", ImmutableList.of("abc"))
+ .put("dim3", ImmutableList.of())
+ .build(),
+ ImmutableMap.<String, Object>builder()
+ .put("t", "2001-01-03")
+ .put("m1", "6.0")
+ .put("m2", "6.0")
+ .put("dim1", "abc")
+ .build()
);
-
- public static final List<InputRow> ROWS1_WITH_NUMERIC_DIMS =
ImmutableList.of(
- createRow(
- ImmutableMap.<String, Object>builder()
- .put("t", "2000-01-01")
- .put("m1", "1.0")
- .put("m2", "1.0")
- .put("d1", 1.0)
- .put("f1", 1.0f)
- .put("l1", 7L)
- .put("dim1", "")
- .put("dim2", ImmutableList.of("a"))
- .put("dim3", ImmutableList.of("a", "b"))
- .put("dim4", "a")
- .put("dim5", "aa")
- .build(),
- PARSER_NUMERIC_DIMS
- ),
- createRow(
- ImmutableMap.<String, Object>builder()
- .put("t", "2000-01-02")
- .put("m1", "2.0")
- .put("m2", "2.0")
- .put("d1", 1.7)
- .put("d2", 1.7)
- .put("f1", 0.1f)
- .put("f2", 0.1f)
- .put("l1", 325323L)
- .put("l2", 325323L)
- .put("dim1", "10.1")
- .put("dim2", ImmutableList.of())
- .put("dim3", ImmutableList.of("b", "c"))
- .put("dim4", "a")
- .put("dim5", "ab")
- .build(),
- PARSER_NUMERIC_DIMS
- ),
- createRow(
- ImmutableMap.<String, Object>builder()
- .put("t", "2000-01-03")
- .put("m1", "3.0")
- .put("m2", "3.0")
- .put("d1", 0.0)
- .put("d2", 0.0)
- .put("f1", 0.0)
- .put("f2", 0.0)
- .put("l1", 0)
- .put("l2", 0)
- .put("dim1", "2")
- .put("dim2", ImmutableList.of(""))
- .put("dim3", ImmutableList.of("d"))
- .put("dim4", "a")
- .put("dim5", "ba")
- .build(),
- PARSER_NUMERIC_DIMS
- ),
- createRow(
- ImmutableMap.<String, Object>builder()
- .put("t", "2001-01-01")
- .put("m1", "4.0")
- .put("m2", "4.0")
- .put("dim1", "1")
- .put("dim2", ImmutableList.of("a"))
- .put("dim3", ImmutableList.of(""))
- .put("dim4", "b")
- .put("dim5", "ad")
- .build(),
- PARSER_NUMERIC_DIMS
- ),
- createRow(
- ImmutableMap.<String, Object>builder()
- .put("t", "2001-01-02")
- .put("m1", "5.0")
- .put("m2", "5.0")
- .put("dim1", "def")
- .put("dim2", ImmutableList.of("abc"))
- .put("dim3", ImmutableList.of())
- .put("dim4", "b")
- .put("dim5", "aa")
- .build(),
- PARSER_NUMERIC_DIMS
- ),
- createRow(
- ImmutableMap.<String, Object>builder()
- .put("t", "2001-01-03")
- .put("m1", "6.0")
- .put("m2", "6.0")
- .put("dim1", "abc")
- .put("dim4", "b")
- .put("dim5", "ab")
- .build(),
- PARSER_NUMERIC_DIMS
- )
+ public static final List<InputRow> ROWS1 =
+
RAW_ROWS1.stream().map(CalciteTests::createRow).collect(Collectors.toList());
+
+ public static final List<ImmutableMap<String, Object>>
RAW_ROWS1_WITH_NUMERIC_DIMS = ImmutableList.of(
+ ImmutableMap.<String, Object>builder()
+ .put("t", "2000-01-01")
+ .put("m1", "1.0")
+ .put("m2", "1.0")
+ .put("d1", 1.0)
+ .put("f1", 1.0f)
+ .put("l1", 7L)
+ .put("dim1", "")
+ .put("dim2", ImmutableList.of("a"))
+ .put("dim3", ImmutableList.of("a", "b"))
+ .put("dim4", "a")
+ .put("dim5", "aa")
+ .build(),
+ ImmutableMap.<String, Object>builder()
+ .put("t", "2000-01-02")
+ .put("m1", "2.0")
+ .put("m2", "2.0")
+ .put("d1", 1.7)
+ .put("d2", 1.7)
+ .put("f1", 0.1f)
+ .put("f2", 0.1f)
+ .put("l1", 325323L)
+ .put("l2", 325323L)
+ .put("dim1", "10.1")
+ .put("dim2", ImmutableList.of())
+ .put("dim3", ImmutableList.of("b", "c"))
+ .put("dim4", "a")
+ .put("dim5", "ab")
+ .build(),
+ ImmutableMap.<String, Object>builder()
+ .put("t", "2000-01-03")
+ .put("m1", "3.0")
+ .put("m2", "3.0")
+ .put("d1", 0.0)
+ .put("d2", 0.0)
+ .put("f1", 0.0)
+ .put("f2", 0.0)
+ .put("l1", 0)
+ .put("l2", 0)
+ .put("dim1", "2")
+ .put("dim2", ImmutableList.of(""))
+ .put("dim3", ImmutableList.of("d"))
+ .put("dim4", "a")
+ .put("dim5", "ba")
+ .build(),
+ ImmutableMap.<String, Object>builder()
+ .put("t", "2001-01-01")
+ .put("m1", "4.0")
+ .put("m2", "4.0")
+ .put("dim1", "1")
+ .put("dim2", ImmutableList.of("a"))
+ .put("dim3", ImmutableList.of(""))
+ .put("dim4", "b")
+ .put("dim5", "ad")
+ .build(),
+ ImmutableMap.<String, Object>builder()
+ .put("t", "2001-01-02")
+ .put("m1", "5.0")
+ .put("m2", "5.0")
+ .put("dim1", "def")
+ .put("dim2", ImmutableList.of("abc"))
+ .put("dim3", ImmutableList.of())
+ .put("dim4", "b")
+ .put("dim5", "aa")
+ .build(),
+ ImmutableMap.<String, Object>builder()
+ .put("t", "2001-01-03")
+ .put("m1", "6.0")
+ .put("m2", "6.0")
+ .put("dim1", "abc")
+ .put("dim4", "b")
+ .put("dim5", "ab")
+ .build()
);
-
- public static final List<InputRow> ROWS2 = ImmutableList.of(
- createRow("2000-01-01", "דרואיד", "he", 1.0),
- createRow("2000-01-01", "druid", "en", 1.0),
- createRow("2000-01-01", "друид", "ru", 1.0)
+ public static final List<InputRow> ROWS1_WITH_NUMERIC_DIMS =
+ RAW_ROWS1_WITH_NUMERIC_DIMS.stream().map(raw -> createRow(raw,
PARSER_NUMERIC_DIMS)).collect(Collectors.toList());
+
+ public static final List<ImmutableMap<String, Object>> RAW_ROWS2 =
ImmutableList.of(
+ ImmutableMap.<String, Object>builder()
+ .put("t", "2000-01-01")
+ .put("dim1", "דרואיד")
+ .put("dim2", "he")
+ .put("m1", 1.0)
+ .build(),
+ ImmutableMap.<String, Object>builder()
+ .put("t", "2000-01-01")
+ .put("dim1", "druid")
+ .put("dim2", "en")
+ .put("m1", 1.0)
+ .build(),
+ ImmutableMap.<String, Object>builder()
+ .put("t", "2000-01-01")
+ .put("dim1", "друид")
+ .put("dim2", "ru")
+ .put("m1", 1.0)
+ .build()
);
-
- public static final List<InputRow> ROWS1_WITH_FULL_TIMESTAMP =
ImmutableList.of(
- createRow(
- ImmutableMap.<String, Object>builder()
- .put("t", "2000-01-01T10:51:45.695Z")
- .put("m1", "1.0")
- .put("m2", "1.0")
- .put("dim1", "")
- .put("dim2", ImmutableList.of("a"))
- .put("dim3", ImmutableList.of("a", "b"))
- .build()
- ),
- createRow(
- ImmutableMap.<String, Object>builder()
- .put("t", "2000-01-18T10:51:45.695Z")
- .put("m1", "2.0")
- .put("m2", "2.0")
- .put("dim1", "10.1")
- .put("dim2", ImmutableList.of())
- .put("dim3", ImmutableList.of("b", "c"))
- .build()
- )
+ public static final List<InputRow> ROWS2 =
+
RAW_ROWS2.stream().map(CalciteTests::createRow).collect(Collectors.toList());
+
+ public static final List<ImmutableMap<String, Object>>
RAW_ROWS1_WITH_FULL_TIMESTAMP = ImmutableList.of(
+ ImmutableMap.<String, Object>builder()
+ .put("t", "2000-01-01T10:51:45.695Z")
+ .put("m1", "1.0")
+ .put("m2", "1.0")
+ .put("dim1", "")
+ .put("dim2", ImmutableList.of("a"))
+ .put("dim3", ImmutableList.of("a", "b"))
+ .build(),
+ ImmutableMap.<String, Object>builder()
+ .put("t", "2000-01-18T10:51:45.695Z")
+ .put("m1", "2.0")
+ .put("m2", "2.0")
+ .put("dim1", "10.1")
+ .put("dim2", ImmutableList.of())
+ .put("dim3", ImmutableList.of("b", "c"))
+ .build()
);
+ public static final List<InputRow> ROWS1_WITH_FULL_TIMESTAMP =
+
RAW_ROWS1_WITH_FULL_TIMESTAMP.stream().map(CalciteTests::createRow).collect(Collectors.toList());
public static final List<InputRow> FORBIDDEN_ROWS = ImmutableList.of(
diff --git a/sql/src/test/resources/calcite/tests/README.md
b/sql/src/test/resources/calcite/tests/README.md
new file mode 100644
index 0000000..461679c
--- /dev/null
+++ b/sql/src/test/resources/calcite/tests/README.md
@@ -0,0 +1,7 @@
+This package contains ingestion specs for datasources used by Calcite Tests.
+
+The purpose of these files is to make it easier to look at and manipulate the
data under test so that you can easily
+validate if the results of the SQL query written are as expected.
+
+> NOTE: The provided specs are not guaranteed to be in sync with the
datasources used by the test. The source of truth
+> is org.apache.druid.sql.calcite.util.CalciteTests
diff --git a/sql/src/test/resources/calcite/tests/foo.json
b/sql/src/test/resources/calcite/tests/foo.json
new file mode 100644
index 0000000..4b0d65b
--- /dev/null
+++ b/sql/src/test/resources/calcite/tests/foo.json
@@ -0,0 +1,53 @@
+{
+ "type": "index_parallel",
+ "spec": {
+ "ioConfig": {
+ "type": "index_parallel",
+ "inputSource": {
+ "type": "inline",
+ "data":
"{\"t\":\"2000-01-01\",\"m1\":\"1.0\",\"m2\":\"1.0\",\"dim1\":\"\",\"dim2\":[\"a\"],\"dim3\":[\"a\",\"b\"]},\n{\"t\":\"2000-01-02\",\"m1\":\"2.0\",\"m2\":\"2.0\",\"dim1\":\"10.1\",\"dim2\":[],\"dim3\":[\"b\",\"c\"]},\n{\"t\":\"2000-01-03\",\"m1\":\"3.0\",\"m2\":\"3.0\",\"dim1\":\"2\",\"dim2\":[\"\"],\"dim3\":[\"d\"]},\n{\"t\":\"2001-01-01\",\"m1\":\"4.0\",\"m2\":\"4.0\",\"dim1\":\"1\",\"dim2\":[\"a\"],\"dim3\":[\"\"]},\n{\"t\":\"2001-01-02\",\"m1\":\"5.0\",\"m2\":\"5.0\",
[...]
+ },
+ "inputFormat": {
+ "type": "json"
+ }
+ },
+ "tuningConfig": {
+ "type": "index_parallel",
+ "partitionsSpec": {
+ "type": "dynamic"
+ }
+ },
+ "dataSchema": {
+ "dataSource": "foo",
+ "granularitySpec": {
+ "type": "uniform",
+ "queryGranularity": "NONE",
+ "rollup": false,
+ "segmentGranularity": "YEAR"
+ },
+ "timestampSpec": {
+ "column": "t",
+ "format": "auto"
+ },
+ "dimensionsSpec": {
+ "dimensions": [
+ "dim1",
+ "dim2",
+ "dim3"
+ ]
+ },
+ "metricsSpec": [
+ {
+ "name": "m1",
+ "type": "floatSum",
+ "fieldName": "m1"
+ },
+ {
+ "name": "m2",
+ "type": "doubleSum",
+ "fieldName": "m2"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/sql/src/test/resources/calcite/tests/foo2.json
b/sql/src/test/resources/calcite/tests/foo2.json
new file mode 100644
index 0000000..d865c2c
--- /dev/null
+++ b/sql/src/test/resources/calcite/tests/foo2.json
@@ -0,0 +1,47 @@
+{
+ "type": "index_parallel",
+ "spec": {
+ "ioConfig": {
+ "type": "index_parallel",
+ "inputSource": {
+ "type": "inline",
+ "data":
"{\"t\":\"2000-01-01\",\"dim1\":\"דרואיד\",\"dim2\":\"he\",\"m1\":1.0}\n{\"t\":\"2000-01-01\",\"dim1\":\"druid\",\"dim2\":\"en\",\"m1\":1.0}\n{\"t\":\"2000-01-01\",\"dim1\":\"друид\",\"dim2\":\"ru\",\"m1\":1.0}"
+ },
+ "inputFormat": {
+ "type": "json"
+ }
+ },
+ "tuningConfig": {
+ "type": "index_parallel",
+ "partitionsSpec": {
+ "type": "dynamic"
+ }
+ },
+ "dataSchema": {
+ "dataSource": "foo2",
+ "granularitySpec": {
+ "type": "uniform",
+ "queryGranularity": "NONE",
+ "rollup": false,
+ "segmentGranularity": "YEAR"
+ },
+ "timestampSpec": {
+ "column": "t",
+ "format": "auto"
+ },
+ "dimensionsSpec": {
+ "dimensions": [
+ "dim1",
+ "dim2"
+ ]
+ },
+ "metricsSpec": [
+ {
+ "name": "m1",
+ "type": "longSum",
+ "fieldName": "m1"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/sql/src/test/resources/calcite/tests/foo4.json
b/sql/src/test/resources/calcite/tests/foo4.json
new file mode 100644
index 0000000..ddf275f
--- /dev/null
+++ b/sql/src/test/resources/calcite/tests/foo4.json
@@ -0,0 +1,52 @@
+{
+ "type": "index_parallel",
+ "spec": {
+ "ioConfig": {
+ "type": "index_parallel",
+ "inputSource": {
+ "type": "inline",
+ "data":
"{\"t\":\"2000-01-01T10:51:45.695Z\",\"m1\":\"1.0\",\"m2\":\"1.0\",\"dim1\":\"\",\"dim2\":[\"a\"],\"dim3\":[\"a\",\"b\"]}\n{\"t\":\"2000-01-18T10:51:45.695Z\",\"m1\":\"2.0\",\"m2\":\"2.0\",\"dim1\":\"10.1\",\"dim2\":[],\"dim3\":[\"b\",\"c\"]}"
+ },
+ "inputFormat": {
+ "type": "json"
+ }
+ },
+ "tuningConfig": {
+ "type": "index_parallel",
+ "partitionsSpec": {
+ "type": "dynamic"
+ }
+ },
+ "dataSchema": {
+ "dataSource": "foo4",
+ "granularitySpec": {
+ "type": "uniform",
+ "queryGranularity": "HOUR",
+ "rollup": true,
+ "segmentGranularity": "YEAR"
+ },
+ "timestampSpec": {
+ "column": "t",
+ "format": "iso"
+ },
+ "dimensionsSpec": {
+ "dimensions": [
+ "dim2",
+ "dim3"
+ ]
+ },
+ "metricsSpec": [
+ {
+ "name": "m1",
+ "type": "floatSum",
+ "fieldName": "m1"
+ },
+ {
+ "name": "m2",
+ "type": "doubleSum",
+ "fieldName": "m2"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/sql/src/test/resources/calcite/tests/lookyloo.json
b/sql/src/test/resources/calcite/tests/lookyloo.json
new file mode 100644
index 0000000..8514c3d
--- /dev/null
+++ b/sql/src/test/resources/calcite/tests/lookyloo.json
@@ -0,0 +1,6 @@
+{
+ "a": "xa",
+ "abc": "xabc",
+ "nosuchkey": "mysteryvalue",
+ "6": "x6"
+}
\ No newline at end of file
diff --git a/sql/src/test/resources/calcite/tests/numFoo.json
b/sql/src/test/resources/calcite/tests/numFoo.json
new file mode 100644
index 0000000..f298b1d
--- /dev/null
+++ b/sql/src/test/resources/calcite/tests/numFoo.json
@@ -0,0 +1,79 @@
+{
+ "type": "index_parallel",
+ "spec": {
+ "ioConfig": {
+ "type": "index_parallel",
+ "inputSource": {
+ "type": "inline",
+ "data":
"{\"t\":\"2000-01-01\",\"m1\":\"1.0\",\"m2\":\"1.0\",\"d1\":1.0,\"f1\":1.0,\"l1\":7,\"dim1\":\"\",\"dim2\":[\"a\"],\"dim3\":[\"a\",\"b\"],\"dim4\":\"a\",\"dim5\":\"aa\"}\n{\"t\":\"2000-01-02\",\"m1\":\"2.0\",\"m2\":\"2.0\",\"d1\":1.7,\"d2\":1.7,\"f1\":0.1,\"f2\":0.1,\"l1\":325323,\"l2\":325323,\"dim1\":\"10.1\",\"dim2\":[],\"dim3\":[\"b\",\"c\"],\"dim4\":\"a\",\"dim5\":\"ab\"}\n{\"t\":\"2000-01-03\",\"m1\":\"3.0\",\"m2\":\"3.0\",\"d1\":0.0,\"d2\":0.0,\"f1\":0.0,\"f2\":0.0
[...]
+ },
+ "inputFormat": {
+ "type": "json"
+ }
+ },
+ "tuningConfig": {
+ "type": "index_parallel",
+ "partitionsSpec": {
+ "type": "dynamic"
+ }
+ },
+ "dataSchema": {
+ "dataSource": "numFoo",
+ "granularitySpec": {
+ "type": "uniform",
+ "queryGranularity": "NONE",
+ "rollup": false,
+ "segmentGranularity": "YEAR"
+ },
+ "timestampSpec": {
+ "column": "t",
+ "format": "auto"
+ },
+ "dimensionsSpec": {
+ "dimensions": [
+ {
+ "type": "double",
+ "name": "d1"
+ },
+ {
+ "type": "double",
+ "name": "d2"
+ },
+ "dim1",
+ "dim2",
+ "dim3",
+ "dim4",
+ "dim5",
+ {
+ "type": "float",
+ "name": "f1"
+ },
+ {
+ "type": "float",
+ "name": "f2"
+ },
+ {
+ "type": "long",
+ "name": "l1"
+ },
+ {
+ "type": "long",
+ "name": "l2"
+ }
+ ]
+ },
+ "metricsSpec": [
+ {
+ "name": "m1",
+ "type": "floatSum",
+ "fieldName": "m1"
+ },
+ {
+ "name": "m2",
+ "type": "doubleSum",
+ "fieldName": "m2"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]