|
@@ -1863,6 +1863,121 @@ public class IndexResolverFieldNamesTests extends ESTestCase {
|
|
|
);
|
|
|
}
|
|
|
|
|
|
+ public void testForkFieldsWithKeepAfterFork() {
|
|
|
+ assumeTrue("FORK available as snapshot only", EsqlCapabilities.Cap.FORK.isEnabled());
|
|
|
+
|
|
|
+ assertFieldNames("""
|
|
|
+ FROM test
|
|
|
+ | WHERE a > 2000
|
|
|
+ | EVAL b = a + 100
|
|
|
+ | FORK (WHERE c > 1 AND a < 10000 | EVAL d = a + 500)
|
|
|
+ (WHERE d > 1000 AND e == "aaa" | EVAL c = a + 200)
|
|
|
+ | WHERE x > y
|
|
|
+ | KEEP a, b, c, d, x
|
|
|
+ """, Set.of("a", "a.*", "c", "c.*", "d", "d.*", "e", "e.*", "x", "x.*", "y", "y.*"));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testForkFieldsWithKeepBeforeFork() {
|
|
|
+ assumeTrue("FORK available as snapshot only", EsqlCapabilities.Cap.FORK.isEnabled());
|
|
|
+
|
|
|
+ assertFieldNames("""
|
|
|
+ FROM test
|
|
|
+ | KEEP a, b, c, d, x
|
|
|
+ | WHERE a > 2000
|
|
|
+ | EVAL b = a + 100
|
|
|
+ | FORK (WHERE c > 1 AND a < 10000 | EVAL d = a + 500)
|
|
|
+ (WHERE d > 1000 AND e == "aaa" | EVAL c = a + 200)
|
|
|
+ | WHERE x > y
|
|
|
+ """, Set.of("a", "a.*", "b", "b.*", "c", "c.*", "d", "d.*", "e", "e.*", "x", "x.*", "y", "y.*"));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testForkFieldsWithNoProjection() {
|
|
|
+ assumeTrue("FORK available as snapshot only", EsqlCapabilities.Cap.FORK.isEnabled());
|
|
|
+
|
|
|
+ assertFieldNames("""
|
|
|
+ FROM test
|
|
|
+ | WHERE a > 2000
|
|
|
+ | EVAL b = a + 100
|
|
|
+ | FORK (WHERE c > 1 AND a < 10000 | EVAL d = a + 500)
|
|
|
+ (WHERE d > 1000 AND e == "aaa" | EVAL c = a + 200)
|
|
|
+ | WHERE x > y
|
|
|
+ """, ALL_FIELDS);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testForkFieldsWithStatsInOneBranch() {
|
|
|
+ assumeTrue("FORK available as snapshot only", EsqlCapabilities.Cap.FORK.isEnabled());
|
|
|
+
|
|
|
+ assertFieldNames("""
|
|
|
+ FROM test
|
|
|
+ | WHERE a > 2000
|
|
|
+ | EVAL b = a + 100
|
|
|
+ | FORK (WHERE c > 1 AND a < 10000 | EVAL d = a + 500)
|
|
|
+ (STATS x = count(*), y=min(z))
|
|
|
+ | WHERE x > y
|
|
|
+ """, ALL_FIELDS);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testForkFieldsWithEnrichAndLookupJoins() {
|
|
|
+ assumeTrue("FORK available as snapshot only", EsqlCapabilities.Cap.FORK.isEnabled());
|
|
|
+ assumeTrue("LOOKUP JOIN available as snapshot only", EsqlCapabilities.Cap.JOIN_LOOKUP_V12.isEnabled());
|
|
|
+
|
|
|
+ assertFieldNames(
|
|
|
+ """
|
|
|
+ FROM test
|
|
|
+ | KEEP a, b, abc, def, z, xyz
|
|
|
+ | ENRICH enrich_policy ON abc
|
|
|
+ | EVAL b = a + 100
|
|
|
+ | LOOKUP JOIN my_lookup_index ON def
|
|
|
+ | FORK (WHERE c > 1 AND a < 10000 | EVAL d = a + 500)
|
|
|
+ (STATS x = count(*), y=min(z))
|
|
|
+ | LOOKUP JOIN my_lookup_index ON xyz
|
|
|
+ | WHERE x > y OR _fork == "fork1"
|
|
|
+ """,
|
|
|
+ Set.of(
|
|
|
+ "x",
|
|
|
+ "y",
|
|
|
+ "_fork",
|
|
|
+ "a",
|
|
|
+ "c",
|
|
|
+ "abc",
|
|
|
+ "b",
|
|
|
+ "def",
|
|
|
+ "z",
|
|
|
+ "xyz",
|
|
|
+ "def.*",
|
|
|
+ "_fork.*",
|
|
|
+ "y.*",
|
|
|
+ "x.*",
|
|
|
+ "xyz.*",
|
|
|
+ "z.*",
|
|
|
+ "abc.*",
|
|
|
+ "a.*",
|
|
|
+ "c.*",
|
|
|
+ "b.*"
|
|
|
+ )
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testForkWithStatsInAllBranches() {
|
|
|
+ assumeTrue("FORK available as snapshot only", EsqlCapabilities.Cap.FORK.isEnabled());
|
|
|
+
|
|
|
+ assertFieldNames("""
|
|
|
+ FROM test
|
|
|
+ | WHERE a > 2000
|
|
|
+ | EVAL b = a + 100
|
|
|
+ | FORK (WHERE c > 1 AND a < 10000 | STATS m = count(*))
|
|
|
+ (EVAL z = a * b | STATS m = max(z))
|
|
|
+ (STATS x = count(*), y=min(z))
|
|
|
+ | WHERE x > y
|
|
|
+ """, Set.of("a", "a.*", "b", "b.*", "c", "c.*", "z", "z.*"));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testForkWithStatsAndWhere() {
|
|
|
+ assumeTrue("FORK available as snapshot only", EsqlCapabilities.Cap.FORK.isEnabled());
|
|
|
+
|
|
|
+ assertFieldNames(" FROM employees | FORK ( WHERE true | stats min(salary) by gender) ( WHERE true | LIMIT 3 )", ALL_FIELDS);
|
|
|
+ }
|
|
|
+
|
|
|
private Set<String> fieldNames(String query, Set<String> enrichPolicyMatchFields) {
|
|
|
var preAnalysisResult = new EsqlSession.PreAnalysisResult(null);
|
|
|
return EsqlSession.fieldNames(parser.createStatement(query), enrichPolicyMatchFields, preAnalysisResult).fieldNames();
|