|
@@ -9,19 +9,25 @@ package org.elasticsearch.xpack.esql.stats;
|
|
|
|
|
|
import org.elasticsearch.test.ESTestCase;
|
|
|
import org.elasticsearch.xpack.core.watcher.common.stats.Counters;
|
|
|
-import org.elasticsearch.xpack.esql.analysis.AnalyzerTestUtils;
|
|
|
import org.elasticsearch.xpack.esql.analysis.Verifier;
|
|
|
import org.elasticsearch.xpack.esql.parser.EsqlParser;
|
|
|
-import org.elasticsearch.xpack.ql.index.IndexResolution;
|
|
|
|
|
|
import java.util.List;
|
|
|
|
|
|
import static org.elasticsearch.xpack.esql.EsqlTestUtils.withDefaultLimitWarning;
|
|
|
import static org.elasticsearch.xpack.esql.analysis.AnalyzerTestUtils.analyzer;
|
|
|
import static org.elasticsearch.xpack.esql.stats.FeatureMetric.DISSECT;
|
|
|
+import static org.elasticsearch.xpack.esql.stats.FeatureMetric.DROP;
|
|
|
+import static org.elasticsearch.xpack.esql.stats.FeatureMetric.ENRICH;
|
|
|
import static org.elasticsearch.xpack.esql.stats.FeatureMetric.EVAL;
|
|
|
+import static org.elasticsearch.xpack.esql.stats.FeatureMetric.FROM;
|
|
|
import static org.elasticsearch.xpack.esql.stats.FeatureMetric.GROK;
|
|
|
+import static org.elasticsearch.xpack.esql.stats.FeatureMetric.KEEP;
|
|
|
import static org.elasticsearch.xpack.esql.stats.FeatureMetric.LIMIT;
|
|
|
+import static org.elasticsearch.xpack.esql.stats.FeatureMetric.MV_EXPAND;
|
|
|
+import static org.elasticsearch.xpack.esql.stats.FeatureMetric.RENAME;
|
|
|
+import static org.elasticsearch.xpack.esql.stats.FeatureMetric.ROW;
|
|
|
+import static org.elasticsearch.xpack.esql.stats.FeatureMetric.SHOW;
|
|
|
import static org.elasticsearch.xpack.esql.stats.FeatureMetric.SORT;
|
|
|
import static org.elasticsearch.xpack.esql.stats.FeatureMetric.STATS;
|
|
|
import static org.elasticsearch.xpack.esql.stats.FeatureMetric.WHERE;
|
|
@@ -36,10 +42,18 @@ public class VerifierMetricsTests extends ESTestCase {
|
|
|
assertEquals(1L, dissect(c));
|
|
|
assertEquals(0, eval(c));
|
|
|
assertEquals(0, grok(c));
|
|
|
- assertEquals(1L, limit(c));
|
|
|
+ assertEquals(0, limit(c));
|
|
|
assertEquals(0, sort(c));
|
|
|
assertEquals(0, stats(c));
|
|
|
assertEquals(0, where(c));
|
|
|
+ assertEquals(0, enrich(c));
|
|
|
+ assertEquals(0, mvExpand(c));
|
|
|
+ assertEquals(0, show(c));
|
|
|
+ assertEquals(0, row(c));
|
|
|
+ assertEquals(1L, from(c));
|
|
|
+ assertEquals(0, drop(c));
|
|
|
+ assertEquals(0, keep(c));
|
|
|
+ assertEquals(0, rename(c));
|
|
|
}
|
|
|
|
|
|
public void testEvalQuery() {
|
|
@@ -47,10 +61,18 @@ public class VerifierMetricsTests extends ESTestCase {
|
|
|
assertEquals(0, dissect(c));
|
|
|
assertEquals(1L, eval(c));
|
|
|
assertEquals(0, grok(c));
|
|
|
- assertEquals(1L, limit(c));
|
|
|
+ assertEquals(0, limit(c));
|
|
|
assertEquals(0, sort(c));
|
|
|
assertEquals(0, stats(c));
|
|
|
assertEquals(0, where(c));
|
|
|
+ assertEquals(0, enrich(c));
|
|
|
+ assertEquals(0, mvExpand(c));
|
|
|
+ assertEquals(0, show(c));
|
|
|
+ assertEquals(0, row(c));
|
|
|
+ assertEquals(1L, from(c));
|
|
|
+ assertEquals(0, drop(c));
|
|
|
+ assertEquals(0, keep(c));
|
|
|
+ assertEquals(0, rename(c));
|
|
|
}
|
|
|
|
|
|
public void testGrokQuery() {
|
|
@@ -58,10 +80,18 @@ public class VerifierMetricsTests extends ESTestCase {
|
|
|
assertEquals(0, dissect(c));
|
|
|
assertEquals(0, eval(c));
|
|
|
assertEquals(1L, grok(c));
|
|
|
- assertEquals(1L, limit(c));
|
|
|
+ assertEquals(0, limit(c));
|
|
|
assertEquals(0, sort(c));
|
|
|
assertEquals(0, stats(c));
|
|
|
assertEquals(0, where(c));
|
|
|
+ assertEquals(0, enrich(c));
|
|
|
+ assertEquals(0, mvExpand(c));
|
|
|
+ assertEquals(0, show(c));
|
|
|
+ assertEquals(0, row(c));
|
|
|
+ assertEquals(1L, from(c));
|
|
|
+ assertEquals(0, drop(c));
|
|
|
+ assertEquals(0, keep(c));
|
|
|
+ assertEquals(0, rename(c));
|
|
|
}
|
|
|
|
|
|
public void testLimitQuery() {
|
|
@@ -73,6 +103,14 @@ public class VerifierMetricsTests extends ESTestCase {
|
|
|
assertEquals(0, sort(c));
|
|
|
assertEquals(0, stats(c));
|
|
|
assertEquals(0, where(c));
|
|
|
+ assertEquals(0, enrich(c));
|
|
|
+ assertEquals(0, mvExpand(c));
|
|
|
+ assertEquals(0, show(c));
|
|
|
+ assertEquals(0, row(c));
|
|
|
+ assertEquals(1L, from(c));
|
|
|
+ assertEquals(0, drop(c));
|
|
|
+ assertEquals(0, keep(c));
|
|
|
+ assertEquals(0, rename(c));
|
|
|
}
|
|
|
|
|
|
public void testSortQuery() {
|
|
@@ -80,10 +118,18 @@ public class VerifierMetricsTests extends ESTestCase {
|
|
|
assertEquals(0, dissect(c));
|
|
|
assertEquals(0, eval(c));
|
|
|
assertEquals(0, grok(c));
|
|
|
- assertEquals(1L, limit(c));
|
|
|
+ assertEquals(0, limit(c));
|
|
|
assertEquals(1L, sort(c));
|
|
|
assertEquals(0, stats(c));
|
|
|
assertEquals(0, where(c));
|
|
|
+ assertEquals(0, enrich(c));
|
|
|
+ assertEquals(0, mvExpand(c));
|
|
|
+ assertEquals(0, show(c));
|
|
|
+ assertEquals(0, row(c));
|
|
|
+ assertEquals(1L, from(c));
|
|
|
+ assertEquals(0, drop(c));
|
|
|
+ assertEquals(0, keep(c));
|
|
|
+ assertEquals(0, rename(c));
|
|
|
}
|
|
|
|
|
|
public void testStatsQuery() {
|
|
@@ -91,10 +137,18 @@ public class VerifierMetricsTests extends ESTestCase {
|
|
|
assertEquals(0, dissect(c));
|
|
|
assertEquals(0, eval(c));
|
|
|
assertEquals(0, grok(c));
|
|
|
- assertEquals(1L, limit(c));
|
|
|
+ assertEquals(0, limit(c));
|
|
|
assertEquals(0, sort(c));
|
|
|
assertEquals(1L, stats(c));
|
|
|
assertEquals(0, where(c));
|
|
|
+ assertEquals(0, enrich(c));
|
|
|
+ assertEquals(0, mvExpand(c));
|
|
|
+ assertEquals(0, show(c));
|
|
|
+ assertEquals(0, row(c));
|
|
|
+ assertEquals(1L, from(c));
|
|
|
+ assertEquals(0, drop(c));
|
|
|
+ assertEquals(0, keep(c));
|
|
|
+ assertEquals(0, rename(c));
|
|
|
}
|
|
|
|
|
|
public void testWhereQuery() {
|
|
@@ -102,10 +156,18 @@ public class VerifierMetricsTests extends ESTestCase {
|
|
|
assertEquals(0, dissect(c));
|
|
|
assertEquals(0, eval(c));
|
|
|
assertEquals(0, grok(c));
|
|
|
- assertEquals(1L, limit(c));
|
|
|
+ assertEquals(0, limit(c));
|
|
|
assertEquals(0, sort(c));
|
|
|
assertEquals(0, stats(c));
|
|
|
assertEquals(1L, where(c));
|
|
|
+ assertEquals(0, enrich(c));
|
|
|
+ assertEquals(0, mvExpand(c));
|
|
|
+ assertEquals(0, show(c));
|
|
|
+ assertEquals(0, row(c));
|
|
|
+ assertEquals(1L, from(c));
|
|
|
+ assertEquals(0, drop(c));
|
|
|
+ assertEquals(0, keep(c));
|
|
|
+ assertEquals(0, rename(c));
|
|
|
}
|
|
|
|
|
|
public void testTwoWhereQuery() {
|
|
@@ -117,6 +179,14 @@ public class VerifierMetricsTests extends ESTestCase {
|
|
|
assertEquals(1L, sort(c));
|
|
|
assertEquals(0, stats(c));
|
|
|
assertEquals(1L, where(c));
|
|
|
+ assertEquals(0, enrich(c));
|
|
|
+ assertEquals(0, mvExpand(c));
|
|
|
+ assertEquals(0, show(c));
|
|
|
+ assertEquals(0, row(c));
|
|
|
+ assertEquals(1L, from(c));
|
|
|
+ assertEquals(0, drop(c));
|
|
|
+ assertEquals(0, keep(c));
|
|
|
+ assertEquals(0, rename(c));
|
|
|
}
|
|
|
|
|
|
public void testTwoQueriesExecuted() {
|
|
@@ -144,10 +214,153 @@ public class VerifierMetricsTests extends ESTestCase {
|
|
|
assertEquals(1L, dissect(c));
|
|
|
assertEquals(1L, eval(c));
|
|
|
assertEquals(1L, grok(c));
|
|
|
- assertEquals(2L, limit(c));
|
|
|
+ assertEquals(1L, limit(c));
|
|
|
assertEquals(2L, sort(c));
|
|
|
assertEquals(1L, stats(c));
|
|
|
assertEquals(2L, where(c));
|
|
|
+ assertEquals(0, enrich(c));
|
|
|
+ assertEquals(0, mvExpand(c));
|
|
|
+ assertEquals(0, show(c));
|
|
|
+ assertEquals(0, row(c));
|
|
|
+ assertEquals(2L, from(c));
|
|
|
+ assertEquals(0, drop(c));
|
|
|
+ assertEquals(0, keep(c));
|
|
|
+ assertEquals(0, rename(c));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testEnrich() {
|
|
|
+ Counters c = esql("""
|
|
|
+ from employees
|
|
|
+ | sort emp_no
|
|
|
+ | limit 1
|
|
|
+ | eval x = to_string(languages)
|
|
|
+ | enrich languages on x
|
|
|
+ | keep emp_no, language_name""");
|
|
|
+ assertEquals(0, dissect(c));
|
|
|
+ assertEquals(1L, eval(c));
|
|
|
+ assertEquals(0, grok(c));
|
|
|
+ assertEquals(1L, limit(c));
|
|
|
+ assertEquals(1L, sort(c));
|
|
|
+ assertEquals(0, stats(c));
|
|
|
+ assertEquals(0, where(c));
|
|
|
+ assertEquals(1L, enrich(c));
|
|
|
+ assertEquals(0, mvExpand(c));
|
|
|
+ assertEquals(0, show(c));
|
|
|
+ assertEquals(0, row(c));
|
|
|
+ assertEquals(1L, from(c));
|
|
|
+ assertEquals(0, drop(c));
|
|
|
+ assertEquals(1L, keep(c));
|
|
|
+ assertEquals(0, rename(c));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testMvExpand() {
|
|
|
+ Counters c = esql("""
|
|
|
+ from employees
|
|
|
+ | where emp_no == 10004
|
|
|
+ | limit 1
|
|
|
+ | keep emp_no, job
|
|
|
+ | mv_expand job
|
|
|
+ | where job LIKE \"*a*\"
|
|
|
+ | limit 2
|
|
|
+ | where job LIKE \"*a*\"
|
|
|
+ | limit 3""");
|
|
|
+ assertEquals(0, dissect(c));
|
|
|
+ assertEquals(0, eval(c));
|
|
|
+ assertEquals(0, grok(c));
|
|
|
+ assertEquals(1L, limit(c));
|
|
|
+ assertEquals(0, sort(c));
|
|
|
+ assertEquals(0, stats(c));
|
|
|
+ assertEquals(1L, where(c));
|
|
|
+ assertEquals(0, enrich(c));
|
|
|
+ assertEquals(1L, mvExpand(c));
|
|
|
+ assertEquals(0, show(c));
|
|
|
+ assertEquals(0, row(c));
|
|
|
+ assertEquals(1L, from(c));
|
|
|
+ assertEquals(0, drop(c));
|
|
|
+ assertEquals(1L, keep(c));
|
|
|
+ assertEquals(0, rename(c));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testShowFunctionsOrInfo() {
|
|
|
+ String showCommand = randomFrom("show functions", "show info");
|
|
|
+ Counters c = esql(showCommand + " | stats a = count(*), b = count(*), c = count(*) | mv_expand c");
|
|
|
+ assertEquals(0, dissect(c));
|
|
|
+ assertEquals(0, eval(c));
|
|
|
+ assertEquals(0, grok(c));
|
|
|
+ assertEquals(0, limit(c));
|
|
|
+ assertEquals(0, sort(c));
|
|
|
+ assertEquals(1L, stats(c));
|
|
|
+ assertEquals(0, where(c));
|
|
|
+ assertEquals(0, enrich(c));
|
|
|
+ assertEquals(1L, mvExpand(c));
|
|
|
+ assertEquals(1L, show(c));
|
|
|
+ assertEquals(0, row(c));
|
|
|
+ assertEquals(0, from(c));
|
|
|
+ assertEquals(0, drop(c));
|
|
|
+ assertEquals(0, keep(c));
|
|
|
+ assertEquals(0, rename(c));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testRow() {
|
|
|
+ Counters c = esql("row a = [\"1\", \"2\"] | enrich languages on a with a_lang = language_name");
|
|
|
+ assertEquals(0, dissect(c));
|
|
|
+ assertEquals(0, eval(c));
|
|
|
+ assertEquals(0, grok(c));
|
|
|
+ assertEquals(0, limit(c));
|
|
|
+ assertEquals(0, sort(c));
|
|
|
+ assertEquals(0, stats(c));
|
|
|
+ assertEquals(0, where(c));
|
|
|
+ assertEquals(1L, enrich(c));
|
|
|
+ assertEquals(0, mvExpand(c));
|
|
|
+ assertEquals(0, show(c));
|
|
|
+ assertEquals(1L, row(c));
|
|
|
+ assertEquals(0, from(c));
|
|
|
+ assertEquals(0, drop(c));
|
|
|
+ assertEquals(0, keep(c));
|
|
|
+ assertEquals(0, rename(c));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testDropAndRename() {
|
|
|
+ Counters c = esql("from employees | rename gender AS foo | stats bar = count(*) by foo | drop foo | sort bar | drop bar");
|
|
|
+ assertEquals(0, dissect(c));
|
|
|
+ assertEquals(0, eval(c));
|
|
|
+ assertEquals(0, grok(c));
|
|
|
+ assertEquals(0, limit(c));
|
|
|
+ assertEquals(1L, sort(c));
|
|
|
+ assertEquals(1L, stats(c));
|
|
|
+ assertEquals(0, where(c));
|
|
|
+ assertEquals(0, enrich(c));
|
|
|
+ assertEquals(0, mvExpand(c));
|
|
|
+ assertEquals(0, show(c));
|
|
|
+ assertEquals(0, row(c));
|
|
|
+ assertEquals(1L, from(c));
|
|
|
+ assertEquals(1L, drop(c));
|
|
|
+ assertEquals(0, keep(c));
|
|
|
+ assertEquals(1L, rename(c));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testKeep() {
|
|
|
+ Counters c = esql("""
|
|
|
+ from employees
|
|
|
+ | keep emp_no, languages
|
|
|
+ | where languages is null or emp_no <= 10030
|
|
|
+ | where languages in (2, 3, emp_no)
|
|
|
+ | keep languages""");
|
|
|
+ assertEquals(0, dissect(c));
|
|
|
+ assertEquals(0, eval(c));
|
|
|
+ assertEquals(0, grok(c));
|
|
|
+ assertEquals(0, limit(c));
|
|
|
+ assertEquals(0, sort(c));
|
|
|
+ assertEquals(0, stats(c));
|
|
|
+ assertEquals(1L, where(c));
|
|
|
+ assertEquals(0, enrich(c));
|
|
|
+ assertEquals(0, mvExpand(c));
|
|
|
+ assertEquals(0, show(c));
|
|
|
+ assertEquals(0, row(c));
|
|
|
+ assertEquals(1L, from(c));
|
|
|
+ assertEquals(0, drop(c));
|
|
|
+ assertEquals(1L, keep(c));
|
|
|
+ assertEquals(0, rename(c));
|
|
|
}
|
|
|
|
|
|
private long dissect(Counters c) {
|
|
@@ -178,8 +391,40 @@ public class VerifierMetricsTests extends ESTestCase {
|
|
|
return c.get(FPREFIX + WHERE);
|
|
|
}
|
|
|
|
|
|
- private Counters esql(String sql) {
|
|
|
- return esql(sql, null);
|
|
|
+ private long enrich(Counters c) {
|
|
|
+ return c.get(FPREFIX + ENRICH);
|
|
|
+ }
|
|
|
+
|
|
|
+ private long mvExpand(Counters c) {
|
|
|
+ return c.get(FPREFIX + MV_EXPAND);
|
|
|
+ }
|
|
|
+
|
|
|
+ private long show(Counters c) {
|
|
|
+ return c.get(FPREFIX + SHOW);
|
|
|
+ }
|
|
|
+
|
|
|
+ private long row(Counters c) {
|
|
|
+ return c.get(FPREFIX + ROW);
|
|
|
+ }
|
|
|
+
|
|
|
+ private long from(Counters c) {
|
|
|
+ return c.get(FPREFIX + FROM);
|
|
|
+ }
|
|
|
+
|
|
|
+ private long drop(Counters c) {
|
|
|
+ return c.get(FPREFIX + DROP);
|
|
|
+ }
|
|
|
+
|
|
|
+ private long keep(Counters c) {
|
|
|
+ return c.get(FPREFIX + KEEP);
|
|
|
+ }
|
|
|
+
|
|
|
+ private long rename(Counters c) {
|
|
|
+ return c.get(FPREFIX + RENAME);
|
|
|
+ }
|
|
|
+
|
|
|
+ private Counters esql(String esql) {
|
|
|
+ return esql(esql, null);
|
|
|
}
|
|
|
|
|
|
private void esqlWithVerifier(String esql, Verifier verifier) {
|
|
@@ -187,15 +432,13 @@ public class VerifierMetricsTests extends ESTestCase {
|
|
|
}
|
|
|
|
|
|
private Counters esql(String esql, Verifier v) {
|
|
|
- IndexResolution mapping = AnalyzerTestUtils.analyzerDefaultMapping();
|
|
|
-
|
|
|
Verifier verifier = v;
|
|
|
Metrics metrics = null;
|
|
|
if (v == null) {
|
|
|
metrics = new Metrics();
|
|
|
verifier = new Verifier(metrics);
|
|
|
}
|
|
|
- analyzer(mapping, verifier).analyze(parser.createStatement(esql));
|
|
|
+ analyzer(verifier).analyze(parser.createStatement(esql));
|
|
|
|
|
|
return metrics == null ? null : metrics.stats();
|
|
|
}
|