Skip to content

Commit 1c9bcb6

Browse files
committed
top and head: allow limit keywords
Signed-off-by: Simeon Widdis <[email protected]>
1 parent c186686 commit 1c9bcb6

File tree

5 files changed

+60
-26
lines changed

5 files changed

+60
-26
lines changed

ppl/src/main/antlr/OpenSearchPPLParser.g4

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ evalCommand
198198
;
199199

200200
headCommand
201-
: HEAD (number = integerLiteral)? (FROM from = integerLiteral)?
201+
: HEAD ((LIMIT EQUAL)? number = integerLiteral)? (FROM from = integerLiteral)?
202202
;
203203

204204
binCommand
@@ -232,7 +232,7 @@ logSpanValue
232232
;
233233

234234
topCommand
235-
: TOP (number = integerLiteral)? (COUNTFIELD EQUAL countfield = stringLiteral)? (SHOWCOUNT EQUAL showcount = booleanLiteral)? fieldList (byClause)?
235+
: TOP ((LIMIT EQUAL)? number = integerLiteral)? (COUNTFIELD EQUAL countfield = stringLiteral)? (SHOWCOUNT EQUAL showcount = booleanLiteral)? fieldList (byClause)?
236236
;
237237

238238
rareCommand
@@ -1295,6 +1295,7 @@ keywordsCanBeId
12951295
| FREQUENCY_THRESHOLD_PERCENTAGE
12961296
| MAX_SAMPLE_COUNT
12971297
| BUFFER_LIMIT
1298+
| LIMIT
12981299
| WITH
12991300
| REGEX
13001301
| PUNCT
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache 2.0
4+
*/
5+
6+
package org.opensearch.sql.ppl;
7+
8+
import org.mockito.Mockito;
9+
import org.opensearch.sql.ast.Node;
10+
import org.opensearch.sql.common.setting.Settings;
11+
import org.opensearch.sql.ppl.antlr.PPLSyntaxParser;
12+
import org.opensearch.sql.ppl.parser.AstBuilder;
13+
14+
/**
15+
* Base class for tests for the AST query planner.
16+
*/
17+
public class AstPlanningTest {
18+
public final Settings settings = Mockito.mock(Settings.class);
19+
public final PPLSyntaxParser parser = new PPLSyntaxParser();
20+
21+
public Node plan(String query) {
22+
AstBuilder astBuilder = new AstBuilder(query, settings);
23+
return astBuilder.visit(parser.parse(query));
24+
}
25+
}

ppl/src/test/java/org/opensearch/sql/ppl/parser/AstBuilderTest.java

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -76,17 +76,14 @@
7676
import org.opensearch.sql.common.antlr.SyntaxCheckException;
7777
import org.opensearch.sql.common.setting.Settings;
7878
import org.opensearch.sql.common.setting.Settings.Key;
79+
import org.opensearch.sql.ppl.AstPlanningTest;
7980
import org.opensearch.sql.ppl.antlr.PPLSyntaxParser;
8081
import org.opensearch.sql.utils.SystemIndexUtils;
8182

82-
public class AstBuilderTest {
83+
public class AstBuilderTest extends AstPlanningTest {
8384

8485
@Rule public ExpectedException exceptionRule = ExpectedException.none();
8586

86-
private final PPLSyntaxParser parser = new PPLSyntaxParser();
87-
88-
private final Settings settings = Mockito.mock(Settings.class);
89-
9087
@Test
9188
public void testSearchCommand() {
9289
assertEqual(
@@ -1065,11 +1062,6 @@ protected void assertEqual(String query, String expected) {
10651062
assertEqual(query, expectedPlan);
10661063
}
10671064

1068-
private Node plan(String query) {
1069-
AstBuilder astBuilder = new AstBuilder(query, settings);
1070-
return astBuilder.visit(parser.parse(query));
1071-
}
1072-
10731065
private String mappingTable(String indexName) {
10741066
return SystemIndexUtils.mappingTable(indexName, PPL_SPEC);
10751067
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache 2.0
4+
*/
5+
6+
package org.opensearch.sql.ppl.parser;
7+
8+
import org.junit.Test;
9+
import org.opensearch.sql.ppl.AstPlanningTest;
10+
11+
import static org.junit.Assert.assertEquals;
12+
13+
public class AstEquivalenceTest extends AstPlanningTest {
14+
@Test
15+
public void testSpathArgumentDeshuffle() {
16+
assertEquals(plan("source = t | spath path=a input=a"), plan("source = t | spath input=a a"));
17+
}
18+
19+
@Test
20+
public void testHeadLimitEquivalent() {
21+
assertEquals(plan("source = t | head limit=50"), plan("source = t | head 50"));
22+
}
23+
24+
@Test
25+
public void testTopLimitEquivalent() {
26+
assertEquals(plan("source = t | top limit=50 field_name"), plan("source = t | top 50 field_name"));
27+
}
28+
}

ppl/src/test/java/org/opensearch/sql/ppl/utils/SPathRewriteTest.java

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,11 @@
2020
import org.opensearch.sql.ast.tree.Eval;
2121
import org.opensearch.sql.ast.tree.SPath;
2222
import org.opensearch.sql.common.setting.Settings;
23+
import org.opensearch.sql.ppl.AstPlanningTest;
2324
import org.opensearch.sql.ppl.antlr.PPLSyntaxParser;
2425
import org.opensearch.sql.ppl.parser.AstBuilder;
2526

26-
public class SPathRewriteTest {
27-
private final Settings settings = Mockito.mock(Settings.class);
28-
private final PPLSyntaxParser parser = new PPLSyntaxParser();
29-
30-
private Node plan(String query) {
31-
AstBuilder astBuilder = new AstBuilder(query, settings);
32-
return astBuilder.visit(parser.parse(query));
33-
}
34-
27+
public class SPathRewriteTest extends AstPlanningTest {
3528
// Control test to make sure something fundamental hasn't changed about the json_extract parsing
3629
@Test
3730
public void testEvalControl() {
@@ -59,9 +52,4 @@ public void testSpathMissingInputArgumentHandling() {
5952
public void testSpathMissingPathArgumentHandling() {
6053
plan("source = t | spath input=a output=a");
6154
}
62-
63-
@Test
64-
public void testSpathArgumentDeshuffle() {
65-
assertEquals(plan("source = t | spath path=a input=a"), plan("source = t | spath input=a a"));
66-
}
6755
}

0 commit comments

Comments
 (0)