Skip to content

Commit e90692c

Browse files
authored
top and head: allow limit keywords (#4249)
* top and head: allow limit keywords Signed-off-by: Simeon Widdis <sawiddis@amazon.com> * Add docs Signed-off-by: Simeon Widdis <sawiddis@amazon.com> * Fix style + Ryan's comments Signed-off-by: Simeon Widdis <sawiddis@amazon.com> * Update docs Signed-off-by: Simeon Widdis <sawiddis@amazon.com> * Fix version header type Signed-off-by: Simeon Widdis <sawiddis@amazon.com> * Maybe with no version header it's better? Signed-off-by: Simeon Widdis <sawiddis@amazon.com> * Move some stuff around Signed-off-by: Simeon Widdis <sawiddis@amazon.com> * Fmt Signed-off-by: Simeon Widdis <sawiddis@amazon.com> * Fix doctest Signed-off-by: Simeon Widdis <sawiddis@amazon.com> --------- Signed-off-by: Simeon Widdis <sawiddis@amazon.com> Signed-off-by: Simeon Widdis <sawiddis@gmail.com>
1 parent 06d7db3 commit e90692c

7 files changed

Lines changed: 62 additions & 32 deletions

File tree

docs/user/ppl/cmd/head.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ The `head` command returns the first N lines from a search result.
1010
The `head` command has the following syntax:
1111

1212
```syntax
13-
head [<size>] [from <offset>]
13+
head [limit=][<size>] [from <offset>]
1414
```
1515

1616
## Parameters

docs/user/ppl/cmd/top.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ The `top` command finds the most common combination of values across all fields
1010
The `top` command has the following syntax:
1111

1212
```syntax
13-
top [N] [top-options] <field-list> [by-clause]
13+
top [limit=][N] [top-options] <field-list> [by-clause]
1414
```
1515

1616
## Parameters

ppl/src/main/antlr/OpenSearchPPLParser.g4

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ fieldformatCommand
380380
;
381381

382382
headCommand
383-
: HEAD (number = integerLiteral)? (FROM from = integerLiteral)?
383+
: HEAD ((LIMIT EQUAL)? number = integerLiteral)? (FROM from = integerLiteral)?
384384
;
385385

386386
binCommand
@@ -412,7 +412,7 @@ logSpanValue
412412
;
413413

414414
rareTopCommand
415-
: (TOP | RARE) (number = integerLiteral)? rareTopOption* fieldList (byClause)?
415+
: (TOP | RARE) ((LIMIT EQUAL)? number = integerLiteral)? rareTopOption* fieldList (byClause)?
416416
;
417417

418418
rareTopOption
@@ -1656,6 +1656,7 @@ searchableKeyWord
16561656
| FREQUENCY_THRESHOLD_PERCENTAGE
16571657
| MAX_SAMPLE_COUNT
16581658
| BUFFER_LIMIT
1659+
| LIMIT
16591660
| SHOW_NUMBERED_TOKEN
16601661
| WITH
16611662
| REGEX
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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+
/** Base class for tests for the AST query planner. */
15+
public class AstPlanningTestBase {
16+
protected final Settings settings = Mockito.mock(Settings.class);
17+
protected final PPLSyntaxParser parser = new PPLSyntaxParser();
18+
19+
protected Node plan(String query) {
20+
AstBuilder astBuilder = new AstBuilder(query, settings);
21+
return astBuilder.visit(parser.parse(query));
22+
}
23+
}

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

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@
6565
import org.junit.Rule;
6666
import org.junit.Test;
6767
import org.junit.rules.ExpectedException;
68-
import org.mockito.Mockito;
6968
import org.opensearch.sql.ast.Node;
7069
import org.opensearch.sql.ast.dsl.AstDSL;
7170
import org.opensearch.sql.ast.expression.AllFields;
@@ -82,20 +81,15 @@
8281
import org.opensearch.sql.ast.tree.ML;
8382
import org.opensearch.sql.ast.tree.RareTopN.CommandType;
8483
import org.opensearch.sql.common.antlr.SyntaxCheckException;
85-
import org.opensearch.sql.common.setting.Settings;
8684
import org.opensearch.sql.common.setting.Settings.Key;
8785
import org.opensearch.sql.exception.SemanticCheckException;
88-
import org.opensearch.sql.ppl.antlr.PPLSyntaxParser;
86+
import org.opensearch.sql.ppl.AstPlanningTestBase;
8987
import org.opensearch.sql.utils.SystemIndexUtils;
9088

91-
public class AstBuilderTest {
89+
public class AstBuilderTest extends AstPlanningTestBase {
9290

9391
@Rule public ExpectedException exceptionRule = ExpectedException.none();
9492

95-
private final Settings settings = Mockito.mock(Settings.class);
96-
97-
private final PPLSyntaxParser parser = new PPLSyntaxParser();
98-
9993
@Test
10094
public void testDynamicSourceClauseThrowsUnsupportedException() {
10195
String query = "source=[myindex, logs, fieldIndex=\"test\"]";
@@ -1405,11 +1399,6 @@ protected void assertEqual(String query, String expected) {
14051399
assertEqual(query, expectedPlan);
14061400
}
14071401

1408-
private Node plan(String query) {
1409-
AstBuilder astBuilder = new AstBuilder(query, settings);
1410-
return astBuilder.visit(parser.parse(query));
1411-
}
1412-
14131402
private String mappingTable(String indexName) {
14141403
return SystemIndexUtils.mappingTable(indexName, PPL_SPEC);
14151404
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package org.opensearch.sql.ppl.parser;
7+
8+
import static org.junit.Assert.assertEquals;
9+
10+
import org.junit.Test;
11+
import org.opensearch.sql.ppl.AstPlanningTestBase;
12+
13+
public class AstEquivalenceTest extends AstPlanningTestBase {
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(
27+
plan("source = t | top limit=50 field_name"), plan("source = t | top 50 field_name"));
28+
}
29+
}

ppl/src/test/java/org/opensearch/sql/ppl/utils/SPathRewriteTest.java renamed to ppl/src/test/java/org/opensearch/sql/ppl/rewrite/SpathRewriteTest.java

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package org.opensearch.sql.ppl.utils;
6+
package org.opensearch.sql.ppl.rewrite;
77

88
import static org.junit.Assert.assertEquals;
99
import static org.opensearch.sql.ast.dsl.AstDSL.eval;
@@ -15,23 +15,11 @@
1515
import static org.opensearch.sql.ast.dsl.AstDSL.stringLiteral;
1616

1717
import org.junit.Test;
18-
import org.mockito.Mockito;
19-
import org.opensearch.sql.ast.Node;
2018
import org.opensearch.sql.ast.tree.Eval;
2119
import org.opensearch.sql.ast.tree.SPath;
22-
import org.opensearch.sql.common.setting.Settings;
23-
import org.opensearch.sql.ppl.antlr.PPLSyntaxParser;
24-
import org.opensearch.sql.ppl.parser.AstBuilder;
25-
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-
}
20+
import org.opensearch.sql.ppl.AstPlanningTestBase;
3421

22+
public class SpathRewriteTest extends AstPlanningTestBase {
3523
// Control test to make sure something fundamental hasn't changed about the json_extract parsing
3624
@Test
3725
public void testEvalControl() {

0 commit comments

Comments
 (0)