|
50 | 50 | import org.elasticsearch.xpack.esql.plan.logical.Eval; |
51 | 51 | import org.elasticsearch.xpack.esql.plan.logical.Explain; |
52 | 52 | import org.elasticsearch.xpack.esql.plan.logical.Filter; |
| 53 | +import org.elasticsearch.xpack.esql.plan.logical.Fork; |
53 | 54 | import org.elasticsearch.xpack.esql.plan.logical.Grok; |
54 | 55 | import org.elasticsearch.xpack.esql.plan.logical.InlineStats; |
55 | 56 | import org.elasticsearch.xpack.esql.plan.logical.Keep; |
@@ -2982,4 +2983,56 @@ public void testInvalidJoinPatterns() { |
2982 | 2983 | ); |
2983 | 2984 | } |
2984 | 2985 | } |
| 2986 | + |
| 2987 | + public void testValidFork() { |
| 2988 | + assumeTrue("FORK requires corresponding capability", EsqlCapabilities.Cap.FORK.isEnabled()); |
| 2989 | + |
| 2990 | + var plan = statement(""" |
| 2991 | + FROM foo* |
| 2992 | + | FORK [WHERE a:"baz" | LIMIT 11] |
| 2993 | + [WHERE b:"bar" | SORT b ] |
| 2994 | + [WHERE c:"bat"] |
| 2995 | + """); |
| 2996 | + var fork = as(plan, Fork.class); |
| 2997 | + var subPlans = fork.subPlans(); |
| 2998 | + |
| 2999 | + // first subplan |
| 3000 | + var limit = as(subPlans.get(0), Limit.class); |
| 3001 | + assertThat(limit.limit(), instanceOf(Literal.class)); |
| 3002 | + assertThat(((Literal) limit.limit()).value(), equalTo(11)); |
| 3003 | + var filter = as(limit.child(), Filter.class); |
| 3004 | + var match = (MatchOperator) filter.condition(); |
| 3005 | + var matchField = (UnresolvedAttribute) match.field(); |
| 3006 | + assertThat(matchField.name(), equalTo("a")); |
| 3007 | + assertThat(match.query().fold(FoldContext.small()), equalTo("baz")); |
| 3008 | + |
| 3009 | + // second subplan |
| 3010 | + var orderBy = as(subPlans.get(1), OrderBy.class); |
| 3011 | + assertThat(orderBy.order().size(), equalTo(1)); |
| 3012 | + Order order = orderBy.order().get(0); |
| 3013 | + assertThat(order.child(), instanceOf(UnresolvedAttribute.class)); |
| 3014 | + assertThat(((UnresolvedAttribute) order.child()).name(), equalTo("b")); |
| 3015 | + filter = as(orderBy.child(), Filter.class); |
| 3016 | + match = (MatchOperator) filter.condition(); |
| 3017 | + matchField = (UnresolvedAttribute) match.field(); |
| 3018 | + assertThat(matchField.name(), equalTo("b")); |
| 3019 | + assertThat(match.query().fold(FoldContext.small()), equalTo("bar")); |
| 3020 | + |
| 3021 | + // third subplan |
| 3022 | + filter = as(subPlans.get(2), Filter.class); |
| 3023 | + match = (MatchOperator) filter.condition(); |
| 3024 | + matchField = (UnresolvedAttribute) match.field(); |
| 3025 | + assertThat(matchField.name(), equalTo("c")); |
| 3026 | + assertThat(match.query().fold(FoldContext.small()), equalTo("bat")); |
| 3027 | + } |
| 3028 | + |
| 3029 | + public void testInvalidFork() { |
| 3030 | + assumeTrue("FORK requires corresponding capability", EsqlCapabilities.Cap.FORK.isEnabled()); |
| 3031 | + |
| 3032 | + expectError("FROM foo* | FORK [WHERE a:\"baz\"]", "line 1:13: Fork requires at least two branches"); |
| 3033 | + expectError("FROM foo* | FORK [LIMIT 10]", "line 1:13: Fork requires at least two branches"); |
| 3034 | + expectError("FROM foo* | FORK [SORT a]", "line 1:13: Fork requires at least two branches"); |
| 3035 | + expectError("FROM foo* | FORK [WHERE x>1 | LIMIT 5]", "line 1:13: Fork requires at least two branches"); |
| 3036 | + expectError("FROM foo* | WHERE x>1 | FORK [WHERE a:\"baz\"]", "Fork requires at least two branches"); |
| 3037 | + } |
2985 | 3038 | } |
0 commit comments