From 491a73bce2024347d8cfb492829aae88d54f9db4 Mon Sep 17 00:00:00 2001 From: Mitchell Gale Date: Wed, 16 Aug 2023 14:00:41 -0700 Subject: [PATCH 1/2] [Spotless] Applying Google Code Format for integ-tests #10 (#1967) * [Spotless] Applying Google Code Format for integ-tests #10 (#329) * Add spotless apply 33 files. Signed-off-by: Mitchell Gale * Addressed PR comments. Signed-off-by: Mitchell Gale * Address PR comments. Signed-off-by: Mitchell Gale * fixing integ test failure. Signed-off-by: Mitchell Gale --------- Signed-off-by: Mitchell Gale * Update integ-test/src/test/java/org/opensearch/sql/correctness/tests/TestConfigTest.java Co-authored-by: Yury-Fridlyand Signed-off-by: Mitchell Gale * Apply suggestions from code review Co-authored-by: Guian Gumpac Signed-off-by: Mitchell Gale * Apply suggestions from code review Co-authored-by: Guian Gumpac Signed-off-by: Mitchell Gale --------- Signed-off-by: Mitchell Gale Signed-off-by: Mitchell Gale Co-authored-by: Yury-Fridlyand Co-authored-by: Guian Gumpac --- .../sql/correctness/TestConfig.java | 51 +- .../correctness/report/SuccessTestCase.java | 5 +- .../correctness/report/TestCaseReport.java | 15 +- .../sql/correctness/report/TestReport.java | 6 +- .../sql/correctness/report/TestSummary.java | 6 +- .../correctness/runner/resultset/Type.java | 14 +- .../sql/correctness/tests/TestConfigTest.java | 21 +- .../correctness/tests/TestDataSetTest.java | 32 +- .../correctness/tests/TestQuerySetTest.java | 14 +- .../sql/correctness/tests/TestReportTest.java | 175 +-- .../sql/correctness/tests/UnitTests.java | 22 +- .../sql/correctness/testset/TestDataSet.java | 31 +- .../sql/correctness/testset/TestQuerySet.java | 14 +- .../org/opensearch/sql/legacy/SubqueryIT.java | 310 ++--- .../sql/legacy/TermQueryExplainIT.java | 302 ++--- .../org/opensearch/sql/legacy/TestUtils.java | 79 +- .../opensearch/sql/legacy/TestsConstants.java | 101 +- .../sql/legacy/TypeInformationIT.java | 83 +- .../org/opensearch/sql/ppl/StandaloneIT.java | 48 +- .../opensearch/sql/ppl/StatsCommandIT.java | 96 +- .../opensearch/sql/ppl/SystemFunctionIT.java | 88 +- .../opensearch/sql/ppl/TextFunctionIT.java | 59 +- .../org/opensearch/sql/ppl/TopCommandIT.java | 25 +- .../sql/ppl/VisualizationFormatIT.java | 11 +- .../opensearch/sql/ppl/WhereCommandIT.java | 1 - .../sql/sql/StandalonePaginationIT.java | 64 +- .../opensearch/sql/sql/StringLiteralIT.java | 3 - .../opensearch/sql/sql/SystemFunctionIT.java | 66 +- .../opensearch/sql/sql/TextFunctionIT.java | 4 +- .../opensearch/sql/sql/WildcardQueryIT.java | 124 +- .../opensearch/sql/sql/WindowFunctionIT.java | 67 +- .../opensearch/sql/util/StandaloneModule.java | 11 +- .../org/opensearch/sql/util/TestUtils.java | 1105 +++++++++-------- 33 files changed, 1569 insertions(+), 1484 deletions(-) diff --git a/integ-test/src/test/java/org/opensearch/sql/correctness/TestConfig.java b/integ-test/src/test/java/org/opensearch/sql/correctness/TestConfig.java index d344c29e20..a498f15d63 100644 --- a/integ-test/src/test/java/org/opensearch/sql/correctness/TestConfig.java +++ b/integ-test/src/test/java/org/opensearch/sql/correctness/TestConfig.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.correctness; import static java.util.stream.Collectors.joining; @@ -19,11 +18,13 @@ import org.opensearch.sql.legacy.utils.StringUtils; /** + *
  * Test configuration parse the following information from command line arguments:
  * 1) Test schema and data
  * 2) Test queries
  * 3) OpenSearch connection URL
  * 4) Other database connection URLs
+ * 
*/ public class TestConfig { @@ -37,9 +38,7 @@ public class TestConfig { private final String openSearchHostUrl; - /** - * Test against some database rather than OpenSearch via our JDBC driver - */ + /** Test against some database rather than OpenSearch via our JDBC driver */ private final String dbConnectionUrl; private final Map otherDbConnectionNameAndUrls = new HashMap<>(); @@ -75,12 +74,14 @@ public Map getOtherDbConnectionNameAndUrls() { private TestDataSet[] buildDefaultTestDataSet() { return new TestDataSet[] { - new TestDataSet("opensearch_dashboards_sample_data_flights", - readFile("opensearch_dashboards_sample_data_flights.json"), - readFile("opensearch_dashboards_sample_data_flights.csv")), - new TestDataSet("opensearch_dashboards_sample_data_ecommerce", - readFile("opensearch_dashboards_sample_data_ecommerce.json"), - readFile("opensearch_dashboards_sample_data_ecommerce.csv")), + new TestDataSet( + "opensearch_dashboards_sample_data_flights", + readFile("opensearch_dashboards_sample_data_flights.json"), + readFile("opensearch_dashboards_sample_data_flights.csv")), + new TestDataSet( + "opensearch_dashboards_sample_data_ecommerce", + readFile("opensearch_dashboards_sample_data_ecommerce.json"), + readFile("opensearch_dashboards_sample_data_ecommerce.csv")), }; } @@ -118,31 +119,33 @@ private static String readFile(String relativePath) { @Override public String toString() { return "\n=================================\n" - + "Tested Database : " + openSearchHostUrlToString() + '\n' - + "Other Databases :\n" + otherDbConnectionInfoToString() + '\n' - + "Test data set(s) :\n" + testDataSetsToString() + '\n' - + "Test query set : " + testQuerySet + '\n' - + "=================================\n"; + + "Tested Database : " + + openSearchHostUrlToString() + + "\nOther Databases :\n" + + otherDbConnectionInfoToString() + + "\nTest data set(s) :\n" + + testDataSetsToString() + + "\nTest query set : " + + testQuerySet + + "\n=================================\n"; } private String testDataSetsToString() { - return Arrays.stream(testDataSets). - map(TestDataSet::toString). - collect(joining("\n")); + return Arrays.stream(testDataSets).map(TestDataSet::toString).collect(joining("\n")); } private String openSearchHostUrlToString() { if (!dbConnectionUrl.isEmpty()) { return dbConnectionUrl; } - return openSearchHostUrl.isEmpty() ? "(Use internal OpenSearch in workspace)" : - openSearchHostUrl; + return openSearchHostUrl.isEmpty() + ? "(Use internal OpenSearch in workspace)" + : openSearchHostUrl; } private String otherDbConnectionInfoToString() { - return otherDbConnectionNameAndUrls.entrySet().stream(). - map(e -> StringUtils.format(" %s = %s", e.getKey(), e.getValue())). - collect(joining("\n")); + return otherDbConnectionNameAndUrls.entrySet().stream() + .map(e -> StringUtils.format(" %s = %s", e.getKey(), e.getValue())) + .collect(joining("\n")); } - } diff --git a/integ-test/src/test/java/org/opensearch/sql/correctness/report/SuccessTestCase.java b/integ-test/src/test/java/org/opensearch/sql/correctness/report/SuccessTestCase.java index 62cd9b3fbe..8ec996e660 100644 --- a/integ-test/src/test/java/org/opensearch/sql/correctness/report/SuccessTestCase.java +++ b/integ-test/src/test/java/org/opensearch/sql/correctness/report/SuccessTestCase.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.correctness.report; import static org.opensearch.sql.correctness.report.TestCaseReport.TestResult.SUCCESS; @@ -12,9 +11,7 @@ import lombok.Getter; import lombok.ToString; -/** - * Report for successful test case result. - */ +/** Report for successful test case result. */ @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @Getter diff --git a/integ-test/src/test/java/org/opensearch/sql/correctness/report/TestCaseReport.java b/integ-test/src/test/java/org/opensearch/sql/correctness/report/TestCaseReport.java index 1a6285c52e..7567e9cd6a 100644 --- a/integ-test/src/test/java/org/opensearch/sql/correctness/report/TestCaseReport.java +++ b/integ-test/src/test/java/org/opensearch/sql/correctness/report/TestCaseReport.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.correctness.report; import static org.opensearch.sql.correctness.report.TestCaseReport.TestResult.SUCCESS; @@ -12,22 +11,19 @@ import lombok.Getter; import lombok.ToString; -/** - * Base class for different test result. - */ +/** Base class for different test result. */ @EqualsAndHashCode @ToString public abstract class TestCaseReport { public enum TestResult { - SUCCESS, FAILURE; + SUCCESS, + FAILURE; } - @Getter - private final int id; + @Getter private final int id; - @Getter - private final String sql; + @Getter private final String sql; private final TestResult result; @@ -40,5 +36,4 @@ public TestCaseReport(int id, String sql, TestResult result) { public String getResult() { return result == SUCCESS ? "Success" : "Failed"; } - } diff --git a/integ-test/src/test/java/org/opensearch/sql/correctness/report/TestReport.java b/integ-test/src/test/java/org/opensearch/sql/correctness/report/TestReport.java index 88b23ccd5b..9b9b3b7a23 100644 --- a/integ-test/src/test/java/org/opensearch/sql/correctness/report/TestReport.java +++ b/integ-test/src/test/java/org/opensearch/sql/correctness/report/TestReport.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.correctness.report; import java.util.ArrayList; @@ -12,9 +11,7 @@ import lombok.Getter; import lombok.ToString; -/** - * Test report class to generate JSON report. - */ +/** Test report class to generate JSON report. */ @EqualsAndHashCode @ToString @Getter @@ -37,5 +34,4 @@ public void addTestCase(TestCaseReport testCase) { summary.addFailure(); } } - } diff --git a/integ-test/src/test/java/org/opensearch/sql/correctness/report/TestSummary.java b/integ-test/src/test/java/org/opensearch/sql/correctness/report/TestSummary.java index 90767582b5..bbd4385460 100644 --- a/integ-test/src/test/java/org/opensearch/sql/correctness/report/TestSummary.java +++ b/integ-test/src/test/java/org/opensearch/sql/correctness/report/TestSummary.java @@ -3,16 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.correctness.report; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.ToString; -/** - * Test summary section. - */ +/** Test summary section. */ @EqualsAndHashCode @ToString @Getter @@ -33,5 +30,4 @@ public void addFailure() { failure++; total++; } - } diff --git a/integ-test/src/test/java/org/opensearch/sql/correctness/runner/resultset/Type.java b/integ-test/src/test/java/org/opensearch/sql/correctness/runner/resultset/Type.java index 23cc0e3347..d626f75ccb 100644 --- a/integ-test/src/test/java/org/opensearch/sql/correctness/runner/resultset/Type.java +++ b/integ-test/src/test/java/org/opensearch/sql/correctness/runner/resultset/Type.java @@ -3,25 +3,17 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.correctness.runner.resultset; import lombok.Data; -/** - * Column type in schema - */ +/** Column type in schema */ @Data public class Type { - /** - * Column name - */ + /** Column name */ private final String name; - /** - * Column type - */ + /** Column type */ private final String type; - } diff --git a/integ-test/src/test/java/org/opensearch/sql/correctness/tests/TestConfigTest.java b/integ-test/src/test/java/org/opensearch/sql/correctness/tests/TestConfigTest.java index 1abe6ea109..daf084d371 100644 --- a/integ-test/src/test/java/org/opensearch/sql/correctness/tests/TestConfigTest.java +++ b/integ-test/src/test/java/org/opensearch/sql/correctness/tests/TestConfigTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.correctness.tests; import static java.util.Collections.emptyMap; @@ -18,9 +17,7 @@ import org.junit.Test; import org.opensearch.sql.correctness.TestConfig; -/** - * Tests for {@link TestConfig} - */ +/** Tests for {@link TestConfig} */ public class TestConfigTest { @Test @@ -31,9 +28,7 @@ public void testDefaultConfig() { config.getOtherDbConnectionNameAndUrls(), allOf( hasEntry("H2", "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"), - hasEntry("SQLite", "jdbc:sqlite::memory:") - ) - ); + hasEntry("SQLite", "jdbc:sqlite::memory:"))); } @Test @@ -45,18 +40,16 @@ public void testCustomESUrls() { @Test public void testCustomDbUrls() { - Map args = ImmutableMap.of("otherDbUrls", - "H2=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1," - + "Derby=jdbc:derby:memory:myDb;create=true"); + Map args = + ImmutableMap.of( + "otherDbUrls", + "H2=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1,Derby=jdbc:derby:memory:myDb;create=true"); TestConfig config = new TestConfig(args); assertThat( config.getOtherDbConnectionNameAndUrls(), allOf( hasEntry("H2", "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"), - hasEntry("Derby", "jdbc:derby:memory:myDb;create=true") - ) - ); + hasEntry("Derby", "jdbc:derby:memory:myDb;create=true"))); } - } diff --git a/integ-test/src/test/java/org/opensearch/sql/correctness/tests/TestDataSetTest.java b/integ-test/src/test/java/org/opensearch/sql/correctness/tests/TestDataSetTest.java index 3967d96658..7411df6a54 100644 --- a/integ-test/src/test/java/org/opensearch/sql/correctness/tests/TestDataSetTest.java +++ b/integ-test/src/test/java/org/opensearch/sql/correctness/tests/TestDataSetTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.correctness.tests; import static org.hamcrest.MatcherAssert.assertThat; @@ -13,9 +12,7 @@ import org.junit.Test; import org.opensearch.sql.correctness.testset.TestDataSet; -/** - * Tests for {@link TestDataSet} - */ +/** Tests for {@link TestDataSet} */ public class TestDataSetTest { @Test @@ -40,9 +37,7 @@ public void testDataSetWithSingleColumnData() { new Object[] {"field"}, new Object[] {"hello"}, new Object[] {"world"}, - new Object[] {"123"} - ) - ); + new Object[] {"123"})); } @Test @@ -61,16 +56,13 @@ public void testDataSetWithMultiColumnsData() { + " }\n" + "}"; - TestDataSet dataSet = new TestDataSet("test", mappings, - "field1,field2\nhello,123\nworld,456"); + TestDataSet dataSet = new TestDataSet("test", mappings, "field1,field2\nhello,123\nworld,456"); assertThat( dataSet.getDataRows(), contains( new Object[] {"field1", "field2"}, new Object[] {"hello", 123}, - new Object[] {"world", 456} - ) - ); + new Object[] {"world", 456})); } @Test @@ -86,17 +78,15 @@ public void testDataSetWithEscapedComma() { + " }\n" + "}"; - TestDataSet dataSet = new TestDataSet("test", mappings, - "field\n\"hello,world,123\"\n123\n\"[abc,def,ghi]\""); + TestDataSet dataSet = + new TestDataSet("test", mappings, "field\n\"hello,world,123\"\n123\n\"[abc,def,ghi]\""); assertThat( dataSet.getDataRows(), contains( new Object[] {"field"}, new Object[] {"hello,world,123"}, new Object[] {"123"}, - new Object[] {"[abc,def,ghi]"} - ) - ); + new Object[] {"[abc,def,ghi]"})); } @Test @@ -115,17 +105,13 @@ public void testDataSetWithNullData() { + " }\n" + "}"; - TestDataSet dataSet = new TestDataSet("test", mappings, - "field1,field2\n,123\nworld,\n,"); + TestDataSet dataSet = new TestDataSet("test", mappings, "field1,field2\n,123\nworld,\n,"); assertThat( dataSet.getDataRows(), contains( new Object[] {"field1", "field2"}, new Object[] {null, 123}, new Object[] {"world", null}, - new Object[] {null, null} - ) - ); + new Object[] {null, null})); } - } diff --git a/integ-test/src/test/java/org/opensearch/sql/correctness/tests/TestQuerySetTest.java b/integ-test/src/test/java/org/opensearch/sql/correctness/tests/TestQuerySetTest.java index 1c97f743f4..08d360dfc7 100644 --- a/integ-test/src/test/java/org/opensearch/sql/correctness/tests/TestQuerySetTest.java +++ b/integ-test/src/test/java/org/opensearch/sql/correctness/tests/TestQuerySetTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.correctness.tests; import static org.hamcrest.MatcherAssert.assertThat; @@ -12,22 +11,13 @@ import org.junit.Test; import org.opensearch.sql.correctness.testset.TestQuerySet; -/** - * Tests for {@link TestQuerySet} - */ +/** Tests for {@link TestQuerySet} */ public class TestQuerySetTest { @Test public void testQuerySet() { TestQuerySet querySet = new TestQuerySet("SELECT * FROM accounts\nSELECT * FROM accounts LIMIT 5"); - assertThat( - querySet, - contains( - "SELECT * FROM accounts", - "SELECT * FROM accounts LIMIT 5" - ) - ); + assertThat(querySet, contains("SELECT * FROM accounts", "SELECT * FROM accounts LIMIT 5")); } - } diff --git a/integ-test/src/test/java/org/opensearch/sql/correctness/tests/TestReportTest.java b/integ-test/src/test/java/org/opensearch/sql/correctness/tests/TestReportTest.java index 35b64fd5d6..9ac5151b21 100644 --- a/integ-test/src/test/java/org/opensearch/sql/correctness/tests/TestReportTest.java +++ b/integ-test/src/test/java/org/opensearch/sql/correctness/tests/TestReportTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.correctness.tests; import static java.util.Arrays.asList; @@ -20,9 +19,7 @@ import org.opensearch.sql.correctness.runner.resultset.Row; import org.opensearch.sql.correctness.runner.resultset.Type; -/** - * Test for {@link TestReport} - */ +/** Test for {@link TestReport} */ public class TestReportTest { private TestReport report = new TestReport(); @@ -31,22 +28,22 @@ public class TestReportTest { public void testSuccessReport() { report.addTestCase(new SuccessTestCase(1, "SELECT * FROM accounts")); JSONObject actual = new JSONObject(report); - JSONObject expected = new JSONObject( - "{" + - " \"summary\": {" + - " \"total\": 1," + - " \"success\": 1," + - " \"failure\": 0" + - " }," + - " \"tests\": [" + - " {" + - " \"id\": 1," + - " \"result\": 'Success'," + - " \"sql\": \"SELECT * FROM accounts\"," + - " }" + - " ]" + - "}" - ); + JSONObject expected = + new JSONObject( + "{" + + " \"summary\": {" + + " \"total\": 1," + + " \"success\": 1," + + " \"failure\": 0" + + " }," + + " \"tests\": [" + + " {" + + " \"id\": 1," + + " \"result\": 'Success'," + + " \"sql\": \"SELECT * FROM accounts\"," + + " }" + + " ]" + + "}"); if (!actual.similar(expected)) { fail("Actual JSON is different from expected: " + actual.toString(2)); @@ -55,54 +52,63 @@ public void testSuccessReport() { @Test public void testFailedReport() { - report.addTestCase(new FailedTestCase(1, "SELECT * FROM accounts", asList( - new DBResult("OpenSearch", singleton(new Type("firstName", "text")), - singleton(new Row(asList("hello")))), - new DBResult("H2", singleton(new Type("firstName", "text")), - singleton(new Row(asList("world"))))), - "[SQLITE_ERROR] SQL error or missing database;" - )); + report.addTestCase( + new FailedTestCase( + 1, + "SELECT * FROM accounts", + asList( + new DBResult( + "OpenSearch", + singleton(new Type("firstName", "text")), + singleton(new Row(asList("hello")))), + new DBResult( + "H2", + singleton(new Type("firstName", "text")), + singleton(new Row(asList("world"))))), + "[SQLITE_ERROR] SQL error or missing database;")); JSONObject actual = new JSONObject(report); - JSONObject expected = new JSONObject( - "{" + - " \"summary\": {" + - " \"total\": 1," + - " \"success\": 0," + - " \"failure\": 1" + - " }," + - " \"tests\": [" + - " {" + - " \"id\": 1," + - " \"result\": 'Failed'," + - " \"sql\": \"SELECT * FROM accounts\"," + - " \"explain\": \"Data row at [0] is different: this=[Row(values=[world])], other=[Row(values=[hello])]\"," + - " \"errors\": \"[SQLITE_ERROR] SQL error or missing database;\"," + - " \"resultSets\": [" + - " {" + - " \"database\": \"H2\"," + - " \"schema\": [" + - " {" + - " \"name\": \"firstName\"," + - " \"type\": \"text\"" + - " }" + - " ]," + - " \"dataRows\": [[\"world\"]]" + - " }," + - " {" + - " \"database\": \"OpenSearch\"," + - " \"schema\": [" + - " {" + - " \"name\": \"firstName\"," + - " \"type\": \"text\"" + - " }" + - " ]," + - " \"dataRows\": [[\"hello\"]]" + - " }" + - " ]" + - " }" + - " ]" + - "}" - ); + JSONObject expected = + new JSONObject( + "{" + + " \"summary\": {" + + " \"total\": 1," + + " \"success\": 0," + + " \"failure\": 1" + + " }," + + " \"tests\": [" + + " {" + + " \"id\": 1," + + " \"result\": 'Failed'," + + " \"sql\": \"SELECT * FROM accounts\"," + + " \"explain\": \"Data row at [0] is different: " + + "this=[Row(values=[world])], " + + "other=[Row(values=[hello])]\"," + + " \"errors\": \"[SQLITE_ERROR] SQL error or missing database;\"," + + " \"resultSets\": [" + + " {" + + " \"database\": \"H2\"," + + " \"schema\": [" + + " {" + + " \"name\": \"firstName\"," + + " \"type\": \"text\"" + + " }" + + " ]," + + " \"dataRows\": [[\"world\"]]" + + " }," + + " {" + + " \"database\": \"OpenSearch\"," + + " \"schema\": [" + + " {" + + " \"name\": \"firstName\"," + + " \"type\": \"text\"" + + " }" + + " ]," + + " \"dataRows\": [[\"hello\"]]" + + " }" + + " ]" + + " }" + + " ]" + + "}"); if (!actual.similar(expected)) { fail("Actual JSON is different from expected: " + actual.toString(2)); @@ -113,27 +119,26 @@ public void testFailedReport() { public void testErrorReport() { report.addTestCase(new ErrorTestCase(1, "SELECT * FROM", "Missing table name in query")); JSONObject actual = new JSONObject(report); - JSONObject expected = new JSONObject( - "{" + - " \"summary\": {" + - " \"total\": 1," + - " \"success\": 0," + - " \"failure\": 1" + - " }," + - " \"tests\": [" + - " {" + - " \"id\": 1," + - " \"result\": 'Failed'," + - " \"sql\": \"SELECT * FROM\"," + - " \"reason\": \"Missing table name in query\"," + - " }" + - " ]" + - "}" - ); + JSONObject expected = + new JSONObject( + "{" + + " \"summary\": {" + + " \"total\": 1," + + " \"success\": 0," + + " \"failure\": 1" + + " }," + + " \"tests\": [" + + " {" + + " \"id\": 1," + + " \"result\": 'Failed'," + + " \"sql\": \"SELECT * FROM\"," + + " \"reason\": \"Missing table name in query\"," + + " }" + + " ]" + + "}"); if (!actual.similar(expected)) { fail("Actual JSON is different from expected: " + actual.toString(2)); } } - } diff --git a/integ-test/src/test/java/org/opensearch/sql/correctness/tests/UnitTests.java b/integ-test/src/test/java/org/opensearch/sql/correctness/tests/UnitTests.java index 0bc5456069..367e2e10bf 100644 --- a/integ-test/src/test/java/org/opensearch/sql/correctness/tests/UnitTests.java +++ b/integ-test/src/test/java/org/opensearch/sql/correctness/tests/UnitTests.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.correctness.tests; import org.junit.runner.RunWith; @@ -11,15 +10,14 @@ @RunWith(Suite.class) @Suite.SuiteClasses({ - ComparisonTestTest.class, - TestConfigTest.class, - TestDataSetTest.class, - TestQuerySetTest.class, - TestReportTest.class, - OpenSearchConnectionTest.class, - JDBCConnectionTest.class, - DBResultTest.class, - RowTest.class, + ComparisonTestTest.class, + TestConfigTest.class, + TestDataSetTest.class, + TestQuerySetTest.class, + TestReportTest.class, + OpenSearchConnectionTest.class, + JDBCConnectionTest.class, + DBResultTest.class, + RowTest.class, }) -public class UnitTests { -} +public class UnitTests {} diff --git a/integ-test/src/test/java/org/opensearch/sql/correctness/testset/TestDataSet.java b/integ-test/src/test/java/org/opensearch/sql/correctness/testset/TestDataSet.java index 66fc7c88af..25a3f907cf 100644 --- a/integ-test/src/test/java/org/opensearch/sql/correctness/testset/TestDataSet.java +++ b/integ-test/src/test/java/org/opensearch/sql/correctness/testset/TestDataSet.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.correctness.testset; import static java.util.stream.Collectors.joining; @@ -15,9 +14,7 @@ import org.json.JSONObject; import org.opensearch.sql.legacy.utils.StringUtils; -/** - * Test data set - */ +/** Test data set */ public class TestDataSet { private final String tableName; @@ -42,9 +39,7 @@ public List getDataRows() { return dataRows; } - /** - * Split columns in each line by separator and ignore escaped separator(s) in quoted string. - */ + /** Split columns in each line by separator and ignore escaped separator(s) in quoted string. */ private List splitColumns(String content, char separator) { List result = new ArrayList<>(); for (String line : content.split("\\r?\\n")) { @@ -76,8 +71,8 @@ private List splitColumns(String content, char separator) { } /** - * Convert column string values (read from CSV file) to objects of its real type - * based on the type information in index mapping file. + * Convert column string values (read from CSV file) to objects of its real type based on the type + * information in index mapping file. */ private List convertStringDataToActualType(List rows) { JSONObject types = new JSONObject(schema); @@ -93,7 +88,8 @@ private List convertStringDataToActualType(List rows) { return result; } - private Object[] convertStringArrayToObjectArray(JSONObject types, String[] columnNames, String[] row) { + private Object[] convertStringArrayToObjectArray( + JSONObject types, String[] columnNames, String[] row) { Object[] result = new Object[row.length]; for (int i = 0; i < row.length; i++) { String colName = columnNames[i]; @@ -126,22 +122,15 @@ private Object convertStringToObject(String type, String str) { case "boolean": return Boolean.valueOf(str); default: - throw new IllegalStateException(StringUtils.format( - "Data type %s is not supported yet for value: %s", type, str)); + throw new IllegalStateException( + StringUtils.format("Data type %s is not supported yet for value: %s", type, str)); } } @Override public String toString() { int total = dataRows.size(); - return "Test data set :\n" - + " Table name: " + tableName + '\n' - + " Schema: " + schema + '\n' - + " Data rows (first 5 in " + total + "):" - + dataRows.stream(). - limit(5). - map(Arrays::toString). - collect(joining("\n ", "\n ", "\n")); + return String.format("Test data set:\n Table name: %s\n Schema: %s\n Data rows (first 5 in %d):", tableName, schema, total) + + dataRows.stream().limit(5).map(Arrays::toString).collect(joining("\n ", "\n ", "\n")); } - } diff --git a/integ-test/src/test/java/org/opensearch/sql/correctness/testset/TestQuerySet.java b/integ-test/src/test/java/org/opensearch/sql/correctness/testset/TestQuerySet.java index 7eee2cde9f..161d314c1d 100644 --- a/integ-test/src/test/java/org/opensearch/sql/correctness/testset/TestQuerySet.java +++ b/integ-test/src/test/java/org/opensearch/sql/correctness/testset/TestQuerySet.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.correctness.testset; import static java.util.stream.Collectors.joining; @@ -12,9 +11,7 @@ import java.util.Iterator; import java.util.List; -/** - * Test query set including SQL queries for comparison testing. - */ +/** Test query set including SQL queries for comparison testing. */ public class TestQuerySet implements Iterable { private List queries; @@ -49,10 +46,9 @@ private List lines(String content) { @Override public String toString() { int total = queries.size(); - return "SQL queries (first 5 in " + total + "):" - + queries.stream(). - limit(5). - collect(joining("\n ", "\n ", "\n")); + return "SQL queries (first 5 in " + + total + + "):" + + queries.stream().limit(5).collect(joining("\n ", "\n ", "\n")); } - } diff --git a/integ-test/src/test/java/org/opensearch/sql/legacy/SubqueryIT.java b/integ-test/src/test/java/org/opensearch/sql/legacy/SubqueryIT.java index 0fd0fea7f7..c1d656628f 100644 --- a/integ-test/src/test/java/org/opensearch/sql/legacy/SubqueryIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/legacy/SubqueryIT.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.legacy; import static org.hamcrest.Matchers.both; @@ -38,9 +37,7 @@ public class SubqueryIT extends SQLIntegTestCase { - @Rule - public ExpectedException exceptionRule = ExpectedException.none(); - + @Rule public ExpectedException exceptionRule = ExpectedException.none(); @Override protected void init() throws Exception { @@ -51,50 +48,55 @@ protected void init() throws Exception { @Test public void testIN() throws IOException { - String query = String.format(Locale.ROOT, - "SELECT dog_name " + - "FROM %s A " + - "WHERE holdersName IN (SELECT firstname FROM %s B) " + - "AND dog_name <> 'babala'", - TEST_INDEX_DOGSUBQUERY, TEST_INDEX_ACCOUNT); + String query = + String.format( + Locale.ROOT, + "SELECT dog_name " + + "FROM %s A " + + "WHERE holdersName IN (SELECT firstname FROM %s B) " + + "AND dog_name <> 'babala'", + TEST_INDEX_DOGSUBQUERY, + TEST_INDEX_ACCOUNT); JSONObject response = executeQuery(query); assertThat( response, hitAll( kvString("/_source/A.dog_name", is("snoopy")), - kvString("/_source/A.dog_name", is("gogo")) - ) - ); + kvString("/_source/A.dog_name", is("gogo")))); } @Test public void testINWithAlias() throws IOException { - String query = String.format(Locale.ROOT, - "SELECT A.dog_name " + - "FROM %s A " + - "WHERE A.holdersName IN (SELECT B.firstname FROM %s B) " + - "AND A.dog_name <> 'babala'", - TEST_INDEX_DOGSUBQUERY, TEST_INDEX_ACCOUNT); + String query = + String.format( + Locale.ROOT, + "SELECT A.dog_name " + + "FROM %s A " + + "WHERE A.holdersName IN (SELECT B.firstname FROM %s B) " + + "AND A.dog_name <> 'babala'", + TEST_INDEX_DOGSUBQUERY, + TEST_INDEX_ACCOUNT); JSONObject response = executeQuery(query); assertThat( response, hitAll( kvString("/_source/A.dog_name", is("snoopy")), - kvString("/_source/A.dog_name", is("gogo")) - ) - ); + kvString("/_source/A.dog_name", is("gogo")))); } @Test public void testINSelectAll() throws IOException { - String query = String.format(Locale.ROOT, - "SELECT * " + - "FROM %s A " + - "WHERE holdersName IN (SELECT firstname FROM %s B) " + - "AND dog_name <> 'babala'", - TEST_INDEX_DOGSUBQUERY, TEST_INDEX_ACCOUNT); + String query = + String.format( + Locale.ROOT, + "SELECT * " + + "FROM %s A " + + "WHERE holdersName IN (SELECT firstname FROM %s B) " + + "AND dog_name <> 'babala'", + TEST_INDEX_DOGSUBQUERY, + TEST_INDEX_ACCOUNT); JSONObject response = executeQuery(query); assertThat( @@ -105,39 +107,38 @@ public void testINSelectAll() throws IOException { .and(kvInt("/_source/A.age", is(4))), both(kvString("/_source/A.dog_name", is("gogo"))) .and(kvString("/_source/A.holdersName", is("Gabrielle"))) - .and(kvInt("/_source/A.age", is(6))) - ) - ); + .and(kvInt("/_source/A.age", is(6))))); } @Test public void testINWithInnerWhere() throws IOException { - String query = String.format(Locale.ROOT, - "SELECT dog_name " + - "FROM %s A " + - "WHERE holdersName IN (SELECT firstname FROM %s B WHERE age <> 36) " + - "AND dog_name <> 'babala'", - TEST_INDEX_DOGSUBQUERY, TEST_INDEX_ACCOUNT); + String query = + String.format( + Locale.ROOT, + "SELECT dog_name " + + "FROM %s A " + + "WHERE holdersName IN (SELECT firstname FROM %s B WHERE age <> 36) " + + "AND dog_name <> 'babala'", + TEST_INDEX_DOGSUBQUERY, + TEST_INDEX_ACCOUNT); JSONObject response = executeQuery(query); - assertThat( - response, - hitAll( - kvString("/_source/A.dog_name", is("gogo")) - ) - ); + assertThat(response, hitAll(kvString("/_source/A.dog_name", is("gogo")))); } @Test public void testNotSupportedQuery() throws IOException { exceptionRule.expect(ResponseException.class); exceptionRule.expectMessage("Unsupported subquery"); - String query = String.format(Locale.ROOT, - "SELECT dog_name " + - "FROM %s A " + - "WHERE holdersName NOT IN (SELECT firstname FROM %s B WHERE age <> 36) " + - "AND dog_name <> 'babala'", - TEST_INDEX_DOGSUBQUERY, TEST_INDEX_ACCOUNT); + String query = + String.format( + Locale.ROOT, + "SELECT dog_name " + + "FROM %s A " + + "WHERE holdersName NOT IN (SELECT firstname FROM %s B WHERE age <> 36) " + + "AND dog_name <> 'babala'", + TEST_INDEX_DOGSUBQUERY, + TEST_INDEX_ACCOUNT); executeQuery(query); } @@ -145,100 +146,91 @@ public void testNotSupportedQuery() throws IOException { @Ignore @Test public void testINWithDuplicate() throws IOException { - String query = String.format(Locale.ROOT, - "SELECT dog_name " + - "FROM %s A " + - "WHERE holdersName IN (SELECT firstname FROM %s B)", - TEST_INDEX_DOGSUBQUERY, TEST_INDEX_ACCOUNT); + String query = + String.format( + Locale.ROOT, + "SELECT dog_name FROM %s A WHERE holdersName IN (SELECT firstname FROM %s B)", + TEST_INDEX_DOGSUBQUERY, + TEST_INDEX_ACCOUNT); JSONObject response = executeQuery(query); assertThat( response, hitAll( kvString("/_source/A.dog_name", is("snoopy")), - kvString("/_source/A.dog_name", is("babala")) - ) - ); + kvString("/_source/A.dog_name", is("babala")))); } @Test public void nonCorrelatedExists() throws IOException { - String query = String.format(Locale.ROOT, - "SELECT e.name " + - "FROM %s as e " + - "WHERE EXISTS (SELECT * FROM e.projects as p)", - TEST_INDEX_EMPLOYEE_NESTED); + String query = + String.format( + Locale.ROOT, + "SELECT e.name FROM %s as e WHERE EXISTS (SELECT * FROM e.projects as p)", + TEST_INDEX_EMPLOYEE_NESTED); JSONObject response = executeQuery(query); assertThat( response, hitAll( kvString("/_source/name", is("Bob Smith")), - kvString("/_source/name", is("Jane Smith")) - ) - ); + kvString("/_source/name", is("Jane Smith")))); } @Test public void nonCorrelatedExistsWhere() throws IOException { - String query = String.format(Locale.ROOT, - "SELECT e.name " + - "FROM %s as e " + - "WHERE EXISTS (SELECT * FROM e.projects as p WHERE p.name LIKE 'aurora')", - TEST_INDEX_EMPLOYEE_NESTED); + String query = + String.format( + Locale.ROOT, + "SELECT e.name " + + "FROM %s as e " + + "WHERE EXISTS (SELECT * FROM e.projects as p WHERE p.name LIKE 'aurora')", + TEST_INDEX_EMPLOYEE_NESTED); JSONObject response = executeQuery(query); - assertThat( - response, - hitAll( - kvString("/_source/name", is("Bob Smith")) - ) - ); + assertThat(response, hitAll(kvString("/_source/name", is("Bob Smith")))); } @Test public void nonCorrelatedExistsParentWhere() throws IOException { - String query = String.format(Locale.ROOT, - "SELECT e.name " + - "FROM %s as e " + - "WHERE EXISTS (SELECT * FROM e.projects as p WHERE p.name LIKE 'security') " + - "AND e.name LIKE 'jane'", - TEST_INDEX_EMPLOYEE_NESTED); + String query = + String.format( + Locale.ROOT, + "SELECT e.name " + + "FROM %s as e " + + "WHERE EXISTS (SELECT * FROM e.projects as p WHERE p.name LIKE 'security') " + + "AND e.name LIKE 'jane'", + TEST_INDEX_EMPLOYEE_NESTED); JSONObject response = executeQuery(query); - assertThat( - response, - hitAll( - kvString("/_source/name", is("Jane Smith")) - ) - ); + assertThat(response, hitAll(kvString("/_source/name", is("Jane Smith")))); } @Test public void nonCorrelatedNotExists() throws IOException { - String query = String.format(Locale.ROOT, - "SELECT e.name " + - "FROM %s as e " + - "WHERE NOT EXISTS (SELECT * FROM e.projects as p)", - TEST_INDEX_EMPLOYEE_NESTED); + String query = + String.format( + Locale.ROOT, + "SELECT e.name FROM %s as e WHERE NOT EXISTS (SELECT * FROM e.projects as p)", + TEST_INDEX_EMPLOYEE_NESTED); JSONObject response = executeQuery(query); assertThat( response, hitAll( kvString("/_source/name", is("Susan Smith")), - kvString("/_source/name", is("John Doe")) - ) - ); + kvString("/_source/name", is("John Doe")))); } @Test public void nonCorrelatedNotExistsWhere() throws IOException { - String query = String.format(Locale.ROOT, - "SELECT e.name " + - "FROM %s as e " + - "WHERE NOT EXISTS (SELECT * FROM e.projects as p WHERE p.name LIKE 'aurora')", - TEST_INDEX_EMPLOYEE_NESTED); + String query = + String.format( + Locale.ROOT, + "SELECT e.name " + + "FROM %s as e " + + "WHERE NOT EXISTS (SELECT * FROM e.projects as p WHERE p.name LIKE 'aurora')", + TEST_INDEX_EMPLOYEE_NESTED); JSONObject response = executeQuery(query); assertThat( @@ -246,52 +238,55 @@ public void nonCorrelatedNotExistsWhere() throws IOException { hitAll( kvString("/_source/name", is("Susan Smith")), kvString("/_source/name", is("Jane Smith")), - kvString("/_source/name", is("John Doe")) - ) - ); + kvString("/_source/name", is("John Doe")))); } @Test public void nonCorrelatedNotExistsParentWhere() throws IOException { - String query = String.format(Locale.ROOT, - "SELECT e.name " + - "FROM %s as e " + - "WHERE NOT EXISTS (SELECT * FROM e.projects as p WHERE p.name LIKE 'security') " + - "AND e.name LIKE 'smith'", - TEST_INDEX_EMPLOYEE_NESTED); + String query = + String.format( + Locale.ROOT, + "SELECT e.name " + + "FROM %s as e " + + "WHERE NOT EXISTS (SELECT * FROM e.projects as p WHERE p.name LIKE 'security') " + + "AND e.name LIKE 'smith'", + TEST_INDEX_EMPLOYEE_NESTED); JSONObject response = executeQuery(query); - assertThat( - response, - hitAll( - kvString("/_source/name", is("Susan Smith")) - ) - ); + assertThat(response, hitAll(kvString("/_source/name", is("Susan Smith")))); } @Test public void selectFromSubqueryWithCountShouldPass() throws IOException { - JSONObject result = executeQuery( - StringUtils.format("SELECT t.TEMP as count " + - "FROM (SELECT COUNT(*) as TEMP FROM %s) t", TEST_INDEX_ACCOUNT)); + JSONObject result = + executeQuery( + StringUtils.format( + "SELECT t.TEMP as count FROM (SELECT COUNT(*) as TEMP FROM %s) t", + TEST_INDEX_ACCOUNT)); assertThat(result.query("/aggregations/count/value"), equalTo(1000)); } @Test public void selectFromSubqueryWithWhereAndCountShouldPass() throws IOException { - JSONObject result = executeQuery( - StringUtils.format("SELECT t.TEMP as count " + - "FROM (SELECT COUNT(*) as TEMP FROM %s WHERE age > 30) t", TEST_INDEX_ACCOUNT)); + JSONObject result = + executeQuery( + StringUtils.format( + "SELECT t.TEMP as count " + + "FROM (SELECT COUNT(*) as TEMP FROM %s WHERE age > 30) t", + TEST_INDEX_ACCOUNT)); assertThat(result.query("/aggregations/count/value"), equalTo(502)); } @Test public void selectFromSubqueryWithCountAndGroupByShouldPass() throws Exception { - JSONObject result = executeQuery( - StringUtils.format("SELECT t.TEMP as count " + - "FROM (SELECT COUNT(*) as TEMP FROM %s GROUP BY gender) t", TEST_INDEX_ACCOUNT)); + JSONObject result = + executeQuery( + StringUtils.format( + "SELECT t.TEMP as count " + + "FROM (SELECT COUNT(*) as TEMP FROM %s GROUP BY gender) t", + TEST_INDEX_ACCOUNT)); assertThat(getTotalHits(result), equalTo(1000)); JSONObject gender = (JSONObject) result.query("/aggregations/gender"); @@ -312,11 +307,12 @@ public void selectFromSubqueryWithCountAndGroupByShouldPass() throws Exception { @Test public void selectFromSubqueryWithCountAndGroupByAndOrderByShouldPass() throws IOException { - JSONObject result = executeQuery( - StringUtils.format( - "SELECT t.TEMP as count " + - "FROM (SELECT COUNT(*) as TEMP FROM %s GROUP BY age ORDER BY TEMP) t", - TEST_INDEX_ACCOUNT)); + JSONObject result = + executeQuery( + StringUtils.format( + "SELECT t.TEMP as count " + + "FROM (SELECT COUNT(*) as TEMP FROM %s GROUP BY age ORDER BY TEMP) t", + TEST_INDEX_ACCOUNT)); JSONArray buckets = (JSONArray) result.query("/aggregations/age/buckets"); List countList = new ArrayList<>(); for (int i = 0; i < buckets.length(); ++i) { @@ -328,44 +324,50 @@ public void selectFromSubqueryWithCountAndGroupByAndOrderByShouldPass() throws I @Test public void selectFromSubqueryWithCountAndGroupByAndHavingShouldPass() throws Exception { - JSONObject result = executeQuery( - StringUtils.format("SELECT t.T1 as g, t.T2 as c " + - "FROM (SELECT gender as T1, COUNT(*) as T2 " + - " FROM %s " + - " GROUP BY gender " + - " HAVING T2 > 500) t", TEST_INDEX_ACCOUNT)); + JSONObject result = + executeQuery( + StringUtils.format( + "SELECT t.T1 as g, t.T2 as c " + + "FROM (SELECT gender as T1, COUNT(*) as T2 " + + " FROM %s " + + " GROUP BY gender " + + " HAVING T2 > 500) t", + TEST_INDEX_ACCOUNT)); assertThat(result.query("/aggregations/g/buckets/0/c/value"), equalTo(507)); } @Test public void selectFromSubqueryCountAndSum() throws IOException { - JSONObject result = executeQuery( - StringUtils.format( - "SELECT t.TEMP1 as count, t.TEMP2 as balance " + - "FROM (SELECT COUNT(*) as TEMP1, SUM(balance) as TEMP2 " + - " FROM %s) t", - TEST_INDEX_ACCOUNT)); + JSONObject result = + executeQuery( + StringUtils.format( + "SELECT t.TEMP1 as count, t.TEMP2 as balance " + + "FROM (SELECT COUNT(*) as TEMP1, SUM(balance) as TEMP2 " + + " FROM %s) t", + TEST_INDEX_ACCOUNT)); assertThat(result.query("/aggregations/count/value"), equalTo(1000)); - assertThat(((BigDecimal) result.query("/aggregations/balance/value")).doubleValue(), + assertThat( + ((BigDecimal) result.query("/aggregations/balance/value")).doubleValue(), closeTo(25714837.0, 0.01)); } @Test public void selectFromSubqueryWithoutAliasShouldPass() throws IOException { - JSONObject response = executeJdbcRequest( - StringUtils.format( - "SELECT a.firstname AS my_first, a.lastname AS my_last, a.age AS my_age " + - "FROM (SELECT firstname, lastname, age " + - "FROM %s " + - "WHERE age = 40 and account_number = 291) AS a", - TEST_INDEX_ACCOUNT)); - - verifySchema(response, + JSONObject response = + executeJdbcRequest( + StringUtils.format( + "SELECT a.firstname AS my_first, a.lastname AS my_last, a.age AS my_age " + + "FROM (SELECT firstname, lastname, age " + + "FROM %s " + + "WHERE age = 40 and account_number = 291) AS a", + TEST_INDEX_ACCOUNT)); + + verifySchema( + response, schema("firstname", "my_first", "text"), schema("lastname", "my_last", "text"), schema("age", "my_age", "long")); - verifyDataRows(response, - rows("Lynn", "Pollard", 40)); + verifyDataRows(response, rows("Lynn", "Pollard", 40)); } } diff --git a/integ-test/src/test/java/org/opensearch/sql/legacy/TermQueryExplainIT.java b/integ-test/src/test/java/org/opensearch/sql/legacy/TermQueryExplainIT.java index fcc9b048c9..6c33b2b242 100644 --- a/integ-test/src/test/java/org/opensearch/sql/legacy/TermQueryExplainIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/legacy/TermQueryExplainIT.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.legacy; import static org.hamcrest.Matchers.containsString; @@ -17,7 +16,6 @@ import org.opensearch.client.ResponseException; import org.opensearch.core.rest.RestStatus; - public class TermQueryExplainIT extends SQLIntegTestCase { @Override @@ -35,13 +33,15 @@ protected void init() throws Exception { @Test public void testNonExistingIndex() throws IOException { try { - explainQuery("SELECT firstname, lastname " + - "FROM opensearch_sql_test_fake_index " + - "WHERE firstname = 'Leo'"); + explainQuery( + "SELECT firstname, lastname " + + "FROM opensearch_sql_test_fake_index " + + "WHERE firstname = 'Leo'"); Assert.fail("Expected ResponseException, but none was thrown"); } catch (ResponseException e) { - assertThat(e.getResponse().getStatusLine().getStatusCode(), + assertThat( + e.getResponse().getStatusLine().getStatusCode(), equalTo(RestStatus.BAD_REQUEST.getStatus())); final String entity = TestUtils.getResponseBody(e.getResponse()); assertThat(entity, containsString("no such index")); @@ -52,13 +52,13 @@ public void testNonExistingIndex() throws IOException { @Test public void testNonResolvingIndexPattern() throws IOException { try { - explainQuery("SELECT * " + - "FROM opensearch_sql_test_blah_blah* " + - "WHERE firstname = 'Leo'"); + explainQuery( + "SELECT * FROM opensearch_sql_test_blah_blah* WHERE firstname = 'Leo'"); Assert.fail("Expected ResponseException, but none was thrown"); } catch (ResponseException e) { - assertThat(e.getResponse().getStatusLine().getStatusCode(), + assertThat( + e.getResponse().getStatusLine().getStatusCode(), equalTo(RestStatus.BAD_REQUEST.getStatus())); final String entity = TestUtils.getResponseBody(e.getResponse()); assertThat(entity, containsString("Field [firstname] cannot be found or used here.")); @@ -68,10 +68,11 @@ public void testNonResolvingIndexPattern() throws IOException { @Test public void testNonResolvingIndexPatternWithExistingIndex() throws IOException { - String result = explainQuery( - "SELECT * " + - "FROM opensearch_sql_test_blah_blah*, opensearch-sql_test_index_bank " + - "WHERE state = 'DC'"); + String result = + explainQuery( + "SELECT * " + + "FROM opensearch_sql_test_blah_blah*, opensearch-sql_test_index_bank " + + "WHERE state = 'DC'"); assertThat(result, containsString("\"term\":{\"state.keyword\"")); } @@ -79,12 +80,13 @@ public void testNonResolvingIndexPatternWithExistingIndex() throws IOException { public void testNonResolvingIndexPatternWithNonExistingIndex() throws IOException { try { explainQuery( - "SELECT firstname, lastname " + - "FROM opensearch_sql_test_blah_blah*, another_fake_index " + - "WHERE firstname = 'Leo'"); + "SELECT firstname, lastname " + + "FROM opensearch_sql_test_blah_blah*, another_fake_index " + + "WHERE firstname = 'Leo'"); Assert.fail("Expected ResponseException, but none was thrown"); } catch (ResponseException e) { - assertThat(e.getResponse().getStatusLine().getStatusCode(), + assertThat( + e.getResponse().getStatusLine().getStatusCode(), equalTo(RestStatus.BAD_REQUEST.getStatus())); final String entity = TestUtils.getResponseBody(e.getResponse()); assertThat(entity, containsString("no such index")); @@ -95,11 +97,11 @@ public void testNonResolvingIndexPatternWithNonExistingIndex() throws IOExceptio @Test public void testNonCompatibleMappings() throws IOException { try { - explainQuery( - "SELECT * FROM opensearch-sql_test_index_dog, opensearch-sql_test_index_dog2"); + explainQuery("SELECT * FROM opensearch-sql_test_index_dog, opensearch-sql_test_index_dog2"); Assert.fail("Expected ResponseException, but none was thrown"); } catch (ResponseException e) { - assertThat(e.getResponse().getStatusLine().getStatusCode(), + assertThat( + e.getResponse().getStatusLine().getStatusCode(), equalTo(RestStatus.BAD_REQUEST.getStatus())); final String entity = TestUtils.getResponseBody(e.getResponse()); assertThat(entity, containsString("Field [holdersName] have conflict type")); @@ -108,14 +110,15 @@ public void testNonCompatibleMappings() throws IOException { } /** - * The dog_name field has same type in dog and dog2 index. - * But, the holdersName field has different type. + * The dog_name field has same type in dog and dog2 index. But, the holdersName field has + * different type. */ @Test public void testNonCompatibleMappingsButTheFieldIsNotUsed() throws IOException { - String result = explainQuery( - "SELECT dog_name " + - "FROM opensearch-sql_test_index_dog, opensearch-sql_test_index_dog2 WHERE dog_name = 'dog'"); + String result = + explainQuery( + "SELECT dog_name FROM opensearch-sql_test_index_dog, opensearch-sql_test_index_dog2" + + " WHERE dog_name = 'dog'"); System.out.println(result); assertThat(result, containsString("dog_name")); assertThat(result, containsString("_source")); @@ -123,20 +126,21 @@ public void testNonCompatibleMappingsButTheFieldIsNotUsed() throws IOException { @Test public void testEqualFieldMappings() throws IOException { - String result = explainQuery( - "SELECT color " + - "FROM opensearch-sql_test_index_dog2, opensearch-sql_test_index_dog3"); + String result = + explainQuery( + "SELECT color " + + "FROM opensearch-sql_test_index_dog2, opensearch-sql_test_index_dog3"); assertThat(result, containsString("color")); assertThat(result, containsString("_source")); } @Test public void testIdenticalMappings() throws IOException { - String result = explainQuery( - "SELECT firstname, birthdate, state " + - "FROM opensearch-sql_test_index_bank, opensearch-sql_test_index_bank_two " + - "WHERE state = 'WA' OR male = true" - ); + String result = + explainQuery( + "SELECT firstname, birthdate, state " + + "FROM opensearch-sql_test_index_bank, opensearch-sql_test_index_bank_two " + + "WHERE state = 'WA' OR male = true"); assertThat(result, containsString("term")); assertThat(result, containsString("state.keyword")); assertThat(result, containsString("_source")); @@ -144,24 +148,23 @@ public void testIdenticalMappings() throws IOException { @Test public void testIdenticalMappingsWithTypes() throws IOException { - String result = explainQuery( - "SELECT firstname, birthdate, state " + - "FROM opensearch-sql_test_index_bank/account, opensearch-sql_test_index_bank_two/account_two " + - "WHERE state = 'WA' OR male = true" - ); + String result = + explainQuery( + "SELECT firstname, birthdate, state FROM opensearch-sql_test_index_bank/account," + + " opensearch-sql_test_index_bank_two/account_two WHERE state = 'WA' OR male =" + + " true"); assertThat(result, containsString("term")); assertThat(result, containsString("state.keyword")); assertThat(result, containsString("_source")); } - @Test public void testIdenticalMappingsWithPartialType() throws IOException { - String result = explainQuery( - "SELECT firstname, birthdate, state " + - "FROM opensearch-sql_test_index_bank/account, opensearch-sql_test_index_bank_two " + - "WHERE state = 'WA' OR male = true" - ); + String result = + explainQuery( + "SELECT firstname, birthdate, state " + + "FROM opensearch-sql_test_index_bank/account, opensearch-sql_test_index_bank_two " + + "WHERE state = 'WA' OR male = true"); assertThat(result, containsString("term")); assertThat(result, containsString("state.keyword")); assertThat(result, containsString("_source")); @@ -170,22 +173,22 @@ public void testIdenticalMappingsWithPartialType() throws IOException { @Test public void testTextFieldOnly() throws IOException { - String result = explainQuery( - "SELECT firstname, birthdate, state " + - "FROM opensearch-sql_test_index_bank " + - "WHERE firstname = 'Abbas'" - ); + String result = + explainQuery( + "SELECT firstname, birthdate, state " + + "FROM opensearch-sql_test_index_bank " + + "WHERE firstname = 'Abbas'"); assertThat(result, containsString("term")); assertThat(result, not(containsString("firstname."))); } @Test public void testTextAndKeywordAppendsKeywordAlias() throws IOException { - String result = explainQuery( - "SELECT firstname, birthdate, state " + - "FROM opensearch-sql_test_index_bank " + - "WHERE state = 'WA' OR lastname = 'Chen'" - ); + String result = + explainQuery( + "SELECT firstname, birthdate, state " + + "FROM opensearch-sql_test_index_bank " + + "WHERE state = 'WA' OR lastname = 'Chen'"); assertThat(result, containsString("term")); assertThat(result, containsString("state.keyword")); assertThat(result, not(containsString("lastname."))); @@ -194,8 +197,7 @@ public void testTextAndKeywordAppendsKeywordAlias() throws IOException { @Test public void testBooleanFieldNoKeywordAlias() throws IOException { - String result = - explainQuery("SELECT * FROM opensearch-sql_test_index_bank WHERE male = false"); + String result = explainQuery("SELECT * FROM opensearch-sql_test_index_bank WHERE male = false"); assertThat(result, containsString("term")); assertThat(result, not(containsString("male."))); } @@ -203,8 +205,8 @@ public void testBooleanFieldNoKeywordAlias() throws IOException { @Test public void testDateFieldNoKeywordAlias() throws IOException { - String result = explainQuery( - "SELECT * FROM opensearch-sql_test_index_bank WHERE birthdate = '2018-08-19'"); + String result = + explainQuery("SELECT * FROM opensearch-sql_test_index_bank WHERE birthdate = '2018-08-19'"); assertThat(result, containsString("term")); assertThat(result, not(containsString("birthdate."))); } @@ -218,11 +220,11 @@ public void testNumberNoKeywordAlias() throws IOException { @Test public void inTestInWhere() throws IOException { - String result = explainQuery( - "SELECT * " + - "FROM opensearch-sql_test_index_bank " + - "WHERE state IN ('WA' , 'PA' , 'TN')" - ); + String result = + explainQuery( + "SELECT * " + + "FROM opensearch-sql_test_index_bank " + + "WHERE state IN ('WA' , 'PA' , 'TN')"); assertThat(result, containsString("term")); assertThat(result, containsString("state.keyword")); } @@ -230,53 +232,52 @@ public void inTestInWhere() throws IOException { @Test @Ignore // TODO: enable when subqueries are fixed public void inTestInWhereSubquery() throws IOException { - String result = explainQuery( - "SELECT * " + - "FROM opensearch-sql_test_index_bank/account WHERE " + - "state IN (SELECT state FROM opensearch-sql_test_index_bank WHERE city = 'Nicholson')" - ); + String result = + explainQuery( + "SELECT * FROM opensearch-sql_test_index_bank/account WHERE state IN (SELECT state FROM" + + " opensearch-sql_test_index_bank WHERE city = 'Nicholson')"); assertThat(result, containsString("term")); assertThat(result, containsString("state.keyword")); } @Test public void testKeywordAliasGroupBy() throws IOException { - String result = explainQuery( - "SELECT firstname, state " + - "FROM opensearch-sql_test_index_bank/account " + - "GROUP BY firstname, state"); + String result = + explainQuery( + "SELECT firstname, state " + + "FROM opensearch-sql_test_index_bank/account " + + "GROUP BY firstname, state"); assertThat(result, containsString("term")); assertThat(result, containsString("state.keyword")); } @Test public void testKeywordAliasGroupByUsingTableAlias() throws IOException { - String result = explainQuery( - "SELECT a.firstname, a.state " + - "FROM opensearch-sql_test_index_bank/account a " + - "GROUP BY a.firstname, a.state"); + String result = + explainQuery( + "SELECT a.firstname, a.state " + + "FROM opensearch-sql_test_index_bank/account a " + + "GROUP BY a.firstname, a.state"); assertThat(result, containsString("term")); assertThat(result, containsString("state.keyword")); } @Test public void testKeywordAliasOrderBy() throws IOException { - String result = explainQuery( - "SELECT * " + - "FROM opensearch-sql_test_index_bank " + - "ORDER BY state, lastname " - ); + String result = + explainQuery( + "SELECT * FROM opensearch-sql_test_index_bank ORDER BY state, lastname "); assertThat(result, containsString("\"state.keyword\":{\"order\":\"asc\"")); assertThat(result, containsString("\"lastname\":{\"order\":\"asc\"}")); } @Test public void testKeywordAliasOrderByUsingTableAlias() throws IOException { - String result = explainQuery( - "SELECT * " + - "FROM opensearch-sql_test_index_bank b " + - "ORDER BY b.state, b.lastname " - ); + String result = + explainQuery( + "SELECT * " + + "FROM opensearch-sql_test_index_bank b " + + "ORDER BY b.state, b.lastname "); assertThat(result, containsString("\"state.keyword\":{\"order\":\"asc\"")); assertThat(result, containsString("\"lastname\":{\"order\":\"asc\"}")); } @@ -286,13 +287,13 @@ public void testKeywordAliasOrderByUsingTableAlias() throws IOException { public void testJoinWhere() throws IOException { String expectedOutput = TestUtils.fileToString("src/test/resources/expectedOutput/term_join_where", true); - String result = explainQuery( - "SELECT a.firstname, a.lastname , b.city " + - "FROM opensearch-sql_test_index_account a " + - "JOIN opensearch-sql_test_index_account b " + - "ON a.city = b.city " + - "WHERE a.city IN ('Nicholson', 'Yardville')" - ); + String result = + explainQuery( + "SELECT a.firstname, a.lastname , b.city " + + "FROM opensearch-sql_test_index_account a " + + "JOIN opensearch-sql_test_index_account b " + + "ON a.city = b.city " + + "WHERE a.city IN ('Nicholson', 'Yardville')"); assertThat(result.replaceAll("\\s+", ""), equalTo(expectedOutput.replaceAll("\\s+", ""))); } @@ -301,57 +302,56 @@ public void testJoinWhere() throws IOException { public void testJoinAliasMissing() throws IOException { try { explainQuery( - "SELECT a.firstname, a.lastname , b.city " + - "FROM opensearch-sql_test_index_account a " + - "JOIN opensearch-sql_test_index_account b " + - "ON a.city = b.city " + - "WHERE city IN ('Nicholson', 'Yardville')" - ); + "SELECT a.firstname, a.lastname , b.city " + + "FROM opensearch-sql_test_index_account a " + + "JOIN opensearch-sql_test_index_account b " + + "ON a.city = b.city " + + "WHERE city IN ('Nicholson', 'Yardville')"); Assert.fail("Expected ResponseException, but none was thrown"); } catch (ResponseException e) { - assertThat(e.getResponse().getStatusLine().getStatusCode(), + assertThat( + e.getResponse().getStatusLine().getStatusCode(), equalTo(RestStatus.BAD_REQUEST.getStatus())); final String entity = TestUtils.getResponseBody(e.getResponse()); assertThat(entity, containsString("Field name [city] is ambiguous")); assertThat(entity, containsString("\"type\": \"VerificationException\"")); } - } @Test public void testNestedSingleConditionAllFields() throws IOException { - String result = explainQuery( - "SELECT * " + - "FROM opensearch-sql_test_index_employee_nested e, e.projects p " + - "WHERE p.name = 'something' " - ); - assertThat(result, - containsString("\"term\":{\"projects.name.keyword\":{\"value\":\"something\"")); + String result = + explainQuery( + "SELECT * " + + "FROM opensearch-sql_test_index_employee_nested e, e.projects p " + + "WHERE p.name = 'something' "); + assertThat( + result, containsString("\"term\":{\"projects.name.keyword\":{\"value\":\"something\"")); assertThat(result, containsString("\"path\":\"projects\"")); } @Test public void testNestedMultipleCondition() throws IOException { - String result = explainQuery( - "SELECT e.id, p.name " + - "FROM opensearch-sql_test_index_employee_nested e, e.projects p " + - "WHERE p.name = 'something' and p.started_year = 1990 " - ); - assertThat(result, - containsString("\"term\":{\"projects.name.keyword\":{\"value\":\"something\"")); + String result = + explainQuery( + "SELECT e.id, p.name " + + "FROM opensearch-sql_test_index_employee_nested e, e.projects p " + + "WHERE p.name = 'something' and p.started_year = 1990 "); + assertThat( + result, containsString("\"term\":{\"projects.name.keyword\":{\"value\":\"something\"")); assertThat(result, containsString("\"term\":{\"projects.started_year\":{\"value\":1990")); assertThat(result, containsString("\"path\":\"projects\"")); } @Test public void testConditionsOnDifferentNestedDocs() throws IOException { - String result = explainQuery( - "SELECT p.name, c.likes " + - "FROM opensearch-sql_test_index_employee_nested e, e.projects p, e.comments c " + - "WHERE p.name = 'something' or c.likes = 56 " - ); - assertThat(result, - containsString("\"term\":{\"projects.name.keyword\":{\"value\":\"something\"")); + String result = + explainQuery( + "SELECT p.name, c.likes " + + "FROM opensearch-sql_test_index_employee_nested e, e.projects p, e.comments c " + + "WHERE p.name = 'something' or c.likes = 56 "); + assertThat( + result, containsString("\"term\":{\"projects.name.keyword\":{\"value\":\"something\"")); assertThat(result, containsString("\"term\":{\"comments.likes\":{\"value\":56")); assertThat(result, containsString("\"path\":\"projects\"")); assertThat(result, containsString("\"path\":\"comments\"")); @@ -359,11 +359,11 @@ public void testConditionsOnDifferentNestedDocs() throws IOException { @Test public void testNestedSingleConditionSpecificFields() throws IOException { - String result = explainQuery( - "SELECT e.id, p.name " + - "FROM opensearch-sql_test_index_employee_nested e, e.projects p " + - "WHERE p.name = 'hello' or p.name = 'world' " - ); + String result = + explainQuery( + "SELECT e.id, p.name " + + "FROM opensearch-sql_test_index_employee_nested e, e.projects p " + + "WHERE p.name = 'hello' or p.name = 'world' "); assertThat(result, containsString("\"term\":{\"projects.name.keyword\":{\"value\":\"hello\"")); assertThat(result, containsString("\"term\":{\"projects.name.keyword\":{\"value\":\"world\"")); assertThat(result, containsString("\"path\":\"projects\"")); @@ -371,32 +371,33 @@ public void testNestedSingleConditionSpecificFields() throws IOException { @Test public void testNestedSingleGroupBy() throws IOException { - String result = explainQuery( - "SELECT e.id, p.name " + - "FROM opensearch-sql_test_index_employee_nested e, e.projects p " + - "GROUP BY p.name "); + String result = + explainQuery( + "SELECT e.id, p.name " + + "FROM opensearch-sql_test_index_employee_nested e, e.projects p " + + "GROUP BY p.name "); assertThat(result, containsString("\"terms\":{\"field\":\"projects.name.keyword\"")); assertThat(result, containsString("\"nested\":{\"path\":\"projects\"")); } @Test public void testNestedSingleOrderBy() throws IOException { - String result = explainQuery( - "SELECT e.id, p.name " + - "FROM opensearch-sql_test_index_employee_nested e, e.projects p " + - "ORDER BY p.name " - ); + String result = + explainQuery( + "SELECT e.id, p.name " + + "FROM opensearch-sql_test_index_employee_nested e, e.projects p " + + "ORDER BY p.name "); assertThat(result, containsString("\"sort\":[{\"projects.name.keyword\"")); assertThat(result, containsString("\"nested\":{\"path\":\"projects\"")); } @Test public void testNestedIsNotNullExplain() throws IOException { - String explain = explainQuery( - "SELECT e.name " + - "FROM opensearch-sql_test_index_employee_nested as e, e.projects as p " + - "WHERE p IS NOT NULL" - ); + String explain = + explainQuery( + "SELECT e.name " + + "FROM opensearch-sql_test_index_employee_nested as e, e.projects as p " + + "WHERE p IS NOT NULL"); assertThat(explain, containsString("\"exists\":{\"field\":\"projects\"")); assertThat(explain, containsString("\"path\":\"projects\"")); @@ -407,14 +408,15 @@ public void testNestedIsNotNullExplain() throws IOException { public void testMultiQuery() throws IOException { String expectedOutput = TestUtils.fileToString("src/test/resources/expectedOutput/term_union_where", true); - String result = explainQuery( - "SELECT firstname " + - "FROM opensearch-sql_test_index_account/account " + - "WHERE firstname = 'Amber' " + - "UNION ALL " + - "SELECT dog_name as firstname " + - "FROM opensearch-sql_test_index_dog/dog " + - "WHERE holdersName = 'Hattie' OR dog_name = 'rex'"); + String result = + explainQuery( + "SELECT firstname " + + "FROM opensearch-sql_test_index_account/account " + + "WHERE firstname = 'Amber' " + + "UNION ALL " + + "SELECT dog_name as firstname " + + "FROM opensearch-sql_test_index_dog/dog " + + "WHERE holdersName = 'Hattie' OR dog_name = 'rex'"); assertThat(result.replaceAll("\\s+", ""), equalTo(expectedOutput.replaceAll("\\s+", ""))); } } diff --git a/integ-test/src/test/java/org/opensearch/sql/legacy/TestUtils.java b/integ-test/src/test/java/org/opensearch/sql/legacy/TestUtils.java index 30cee86e15..1abc1d6183 100644 --- a/integ-test/src/test/java/org/opensearch/sql/legacy/TestUtils.java +++ b/integ-test/src/test/java/org/opensearch/sql/legacy/TestUtils.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.legacy; import static com.google.common.base.Strings.isNullOrEmpty; @@ -36,14 +35,14 @@ public class TestUtils { - private final static String MAPPING_FILE_PATH = "src/test/resources/indexDefinitions/"; + private static final String MAPPING_FILE_PATH = "src/test/resources/indexDefinitions/"; /** * Create test index by REST client. * - * @param client client connection + * @param client client connection * @param indexName test index name - * @param mapping test index mapping or null if no predefined mapping + * @param mapping test index mapping or null if no predefined mapping */ public static void createIndexByRestClient(RestClient client, String indexName, String mapping) { Request request = new Request("PUT", "/" + indexName); @@ -54,16 +53,16 @@ public static void createIndexByRestClient(RestClient client, String indexName, } /** - * https://github.com/elastic/elasticsearch/pull/49959 - * Deprecate creation of dot-prefixed index names except for hidden and system indices. - * Create hidden index by REST client. + * https://github.com/elastic/elasticsearch/pull/49959
+ * Deprecate creation of dot-prefixed index + * names except for hidden and system indices. Create hidden index by REST client. * - * @param client client connection + * @param client client connection * @param indexName test index name - * @param mapping test index mapping or null if no predefined mapping + * @param mapping test index mapping or null if no predefined mapping */ - public static void createHiddenIndexByRestClient(RestClient client, String indexName, - String mapping) { + public static void createHiddenIndexByRestClient( + RestClient client, String indexName, String mapping) { Request request = new Request("PUT", "/" + indexName); JSONObject jsonObject = isNullOrEmpty(mapping) ? new JSONObject() : new JSONObject(mapping); jsonObject.put("settings", new JSONObject("{\"index\":{\"hidden\":true}}")); @@ -73,11 +72,10 @@ public static void createHiddenIndexByRestClient(RestClient client, String index } /** - * Check if index already exists by OpenSearch index exists API which returns: - * 200 - specified indices or aliases exist - * 404 - one or more indices specified or aliases do not exist + * Check if index already exists by OpenSearch index exists API which returns: 200 - specified + * indices or aliases exist 404 - one or more indices specified or aliases do not exist * - * @param client client connection + * @param client client connection * @param indexName index name * @return true for index exist */ @@ -93,13 +91,13 @@ public static boolean isIndexExist(RestClient client, String indexName) { /** * Load test data set by REST client. * - * @param client client connection - * @param indexName index name + * @param client client connection + * @param indexName index name * @param dataSetFilePath file path of test data set * @throws IOException */ - public static void loadDataByRestClient(RestClient client, String indexName, - String dataSetFilePath) throws IOException { + public static void loadDataByRestClient( + RestClient client, String indexName, String dataSetFilePath) throws IOException { Path path = Paths.get(getResourceFilePath(dataSetFilePath)); Request request = new Request("POST", "/" + indexName + "/_bulk?refresh=true"); request.setJsonEntity(new String(Files.readAllBytes(path))); @@ -109,7 +107,7 @@ public static void loadDataByRestClient(RestClient client, String indexName, /** * Perform a request by REST client. * - * @param client client connection + * @param client client connection * @param request request object */ public static Response performRequest(RestClient client, Request request) { @@ -177,7 +175,6 @@ public static String getEmployeeNestedTypeIndexMapping() { return getMappingFile(mappingFile); } - public static String getNestedTypeIndexMapping() { String mappingFile = "nested_type_index_mapping.json"; return getMappingFile(mappingFile); @@ -255,8 +252,8 @@ public static void loadBulk(Client client, String jsonPath, String defaultIndex) BulkRequest bulkRequest = new BulkRequest(); try (final InputStream stream = new FileInputStream(absJsonPath); - final Reader streamReader = new InputStreamReader(stream, StandardCharsets.UTF_8); - final BufferedReader br = new BufferedReader(streamReader)) { + final Reader streamReader = new InputStreamReader(stream, StandardCharsets.UTF_8); + final BufferedReader br = new BufferedReader(streamReader)) { while (true) { @@ -285,8 +282,11 @@ public static void loadBulk(Client client, String jsonPath, String defaultIndex) BulkResponse bulkResponse = client.bulk(bulkRequest).actionGet(); if (bulkResponse.hasFailures()) { - throw new Exception("Failed to load test data into index " + defaultIndex + ", " + - bulkResponse.buildFailureMessage()); + throw new Exception( + "Failed to load test data into index " + + defaultIndex + + ", " + + bulkResponse.buildFailureMessage()); } System.out.println(bulkResponse.getItems().length + " documents loaded."); // ensure the documents are searchable @@ -312,8 +312,8 @@ public static String getResponseBody(Response response, boolean retainNewLines) final StringBuilder sb = new StringBuilder(); try (final InputStream is = response.getEntity().getContent(); - final BufferedReader br = new BufferedReader( - new InputStreamReader(is, StandardCharsets.UTF_8))) { + final BufferedReader br = + new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { String line; while ((line = br.readLine()) != null) { @@ -326,15 +326,14 @@ public static String getResponseBody(Response response, boolean retainNewLines) return sb.toString(); } - public static String fileToString(final String filePathFromProjectRoot, - final boolean removeNewLines) - throws IOException { + public static String fileToString( + final String filePathFromProjectRoot, final boolean removeNewLines) throws IOException { final String absolutePath = getResourceFilePath(filePathFromProjectRoot); try (final InputStream stream = new FileInputStream(absolutePath); - final Reader streamReader = new InputStreamReader(stream, StandardCharsets.UTF_8); - final BufferedReader br = new BufferedReader(streamReader)) { + final Reader streamReader = new InputStreamReader(stream, StandardCharsets.UTF_8); + final BufferedReader br = new BufferedReader(streamReader)) { final StringBuilder stringBuilder = new StringBuilder(); String line = br.readLine(); @@ -388,12 +387,16 @@ public static List> getPermutations(final List items) { } final String currentItem = items.get(i); - result.addAll(getPermutations(smallerSet).stream().map(smallerSetPermutation -> { - final List permutation = new ArrayList<>(); - permutation.add(currentItem); - permutation.addAll(smallerSetPermutation); - return permutation; - }).collect(Collectors.toCollection(LinkedList::new))); + result.addAll( + getPermutations(smallerSet).stream() + .map( + smallerSetPermutation -> { + final List permutation = new ArrayList<>(); + permutation.add(currentItem); + permutation.addAll(smallerSetPermutation); + return permutation; + }) + .collect(Collectors.toCollection(LinkedList::new))); } return result; diff --git a/integ-test/src/test/java/org/opensearch/sql/legacy/TestsConstants.java b/integ-test/src/test/java/org/opensearch/sql/legacy/TestsConstants.java index 338be25a0c..29bc9813fa 100644 --- a/integ-test/src/test/java/org/opensearch/sql/legacy/TestsConstants.java +++ b/integ-test/src/test/java/org/opensearch/sql/legacy/TestsConstants.java @@ -3,66 +3,63 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.legacy; -/** - * Created by omershelef on 18/12/14. - */ +/** Created by omershelef on 18/12/14. */ public class TestsConstants { - public final static String PERSISTENT = "persistent"; - public final static String TRANSIENT = "transient"; + public static final String PERSISTENT = "persistent"; + public static final String TRANSIENT = "transient"; - public final static String TEST_INDEX = "opensearch-sql_test_index"; + public static final String TEST_INDEX = "opensearch-sql_test_index"; - public final static String TEST_INDEX_ONLINE = TEST_INDEX + "_online"; - public final static String TEST_INDEX_ACCOUNT = TEST_INDEX + "_account"; - public final static String TEST_INDEX_PHRASE = TEST_INDEX + "_phrase"; - public final static String TEST_INDEX_DOG = TEST_INDEX + "_dog"; - public final static String TEST_INDEX_DOG2 = TEST_INDEX + "_dog2"; - public final static String TEST_INDEX_DOG3 = TEST_INDEX + "_dog3"; - public final static String TEST_INDEX_DOGSUBQUERY = TEST_INDEX + "_subquery"; - public final static String TEST_INDEX_PEOPLE = TEST_INDEX + "_people"; - public final static String TEST_INDEX_PEOPLE2 = TEST_INDEX + "_people2"; - public final static String TEST_INDEX_GAME_OF_THRONES = TEST_INDEX + "_game_of_thrones"; - public final static String TEST_INDEX_SYSTEM = TEST_INDEX + "_system"; - public final static String TEST_INDEX_ODBC = TEST_INDEX + "_odbc"; - public final static String TEST_INDEX_LOCATION = TEST_INDEX + "_location"; - public final static String TEST_INDEX_LOCATION2 = TEST_INDEX + "_location2"; - public final static String TEST_INDEX_NESTED_TYPE = TEST_INDEX + "_nested_type"; - public final static String TEST_INDEX_NESTED_TYPE_WITHOUT_ARRAYS = + public static final String TEST_INDEX_ONLINE = TEST_INDEX + "_online"; + public static final String TEST_INDEX_ACCOUNT = TEST_INDEX + "_account"; + public static final String TEST_INDEX_PHRASE = TEST_INDEX + "_phrase"; + public static final String TEST_INDEX_DOG = TEST_INDEX + "_dog"; + public static final String TEST_INDEX_DOG2 = TEST_INDEX + "_dog2"; + public static final String TEST_INDEX_DOG3 = TEST_INDEX + "_dog3"; + public static final String TEST_INDEX_DOGSUBQUERY = TEST_INDEX + "_subquery"; + public static final String TEST_INDEX_PEOPLE = TEST_INDEX + "_people"; + public static final String TEST_INDEX_PEOPLE2 = TEST_INDEX + "_people2"; + public static final String TEST_INDEX_GAME_OF_THRONES = TEST_INDEX + "_game_of_thrones"; + public static final String TEST_INDEX_SYSTEM = TEST_INDEX + "_system"; + public static final String TEST_INDEX_ODBC = TEST_INDEX + "_odbc"; + public static final String TEST_INDEX_LOCATION = TEST_INDEX + "_location"; + public static final String TEST_INDEX_LOCATION2 = TEST_INDEX + "_location2"; + public static final String TEST_INDEX_NESTED_TYPE = TEST_INDEX + "_nested_type"; + public static final String TEST_INDEX_NESTED_TYPE_WITHOUT_ARRAYS = TEST_INDEX + "_nested_type_without_arrays"; - public final static String TEST_INDEX_NESTED_SIMPLE = TEST_INDEX + "_nested_simple"; - public final static String TEST_INDEX_NESTED_WITH_QUOTES = + public static final String TEST_INDEX_NESTED_SIMPLE = TEST_INDEX + "_nested_simple"; + public static final String TEST_INDEX_NESTED_WITH_QUOTES = TEST_INDEX + "_nested_type_with_quotes"; - public final static String TEST_INDEX_EMPLOYEE_NESTED = TEST_INDEX + "_employee_nested"; - public final static String TEST_INDEX_JOIN_TYPE = TEST_INDEX + "_join_type"; - public final static String TEST_INDEX_UNEXPANDED_OBJECT = TEST_INDEX + "_unexpanded_object"; - public final static String TEST_INDEX_BANK = TEST_INDEX + "_bank"; - public final static String TEST_INDEX_BANK_TWO = TEST_INDEX_BANK + "_two"; - public final static String TEST_INDEX_BANK_WITH_NULL_VALUES = + public static final String TEST_INDEX_EMPLOYEE_NESTED = TEST_INDEX + "_employee_nested"; + public static final String TEST_INDEX_JOIN_TYPE = TEST_INDEX + "_join_type"; + public static final String TEST_INDEX_UNEXPANDED_OBJECT = TEST_INDEX + "_unexpanded_object"; + public static final String TEST_INDEX_BANK = TEST_INDEX + "_bank"; + public static final String TEST_INDEX_BANK_TWO = TEST_INDEX_BANK + "_two"; + public static final String TEST_INDEX_BANK_WITH_NULL_VALUES = TEST_INDEX_BANK + "_with_null_values"; - public final static String TEST_INDEX_BANK_CSV_SANITIZE = TEST_INDEX_BANK + "_csv_sanitize"; - public final static String TEST_INDEX_BANK_RAW_SANITIZE = TEST_INDEX_BANK + "_raw_sanitize"; - public final static String TEST_INDEX_ORDER = TEST_INDEX + "_order"; - public final static String TEST_INDEX_WEBLOG = TEST_INDEX + "_weblog"; - public final static String TEST_INDEX_DATE = TEST_INDEX + "_date"; - public final static String TEST_INDEX_DATE_TIME = TEST_INDEX + "_datetime"; - public final static String TEST_INDEX_DEEP_NESTED = TEST_INDEX + "_deep_nested"; - public final static String TEST_INDEX_STRINGS = TEST_INDEX + "_strings"; - public final static String TEST_INDEX_DATATYPE_NUMERIC = TEST_INDEX + "_datatypes_numeric"; - public final static String TEST_INDEX_DATATYPE_NONNUMERIC = TEST_INDEX + "_datatypes_nonnumeric"; - public final static String TEST_INDEX_BEER = TEST_INDEX + "_beer"; - public final static String TEST_INDEX_NULL_MISSING = TEST_INDEX + "_null_missing"; - public final static String TEST_INDEX_CALCS = TEST_INDEX + "_calcs"; - public final static String TEST_INDEX_DATE_FORMATS = TEST_INDEX + "_date_formats"; - public final static String TEST_INDEX_WILDCARD = TEST_INDEX + "_wildcard"; - public final static String TEST_INDEX_MULTI_NESTED_TYPE = TEST_INDEX + "_multi_nested"; - public final static String TEST_INDEX_NESTED_WITH_NULLS = TEST_INDEX + "_nested_with_nulls"; - public final static String DATASOURCES = ".ql-datasources"; + public static final String TEST_INDEX_BANK_CSV_SANITIZE = TEST_INDEX_BANK + "_csv_sanitize"; + public static final String TEST_INDEX_BANK_RAW_SANITIZE = TEST_INDEX_BANK + "_raw_sanitize"; + public static final String TEST_INDEX_ORDER = TEST_INDEX + "_order"; + public static final String TEST_INDEX_WEBLOG = TEST_INDEX + "_weblog"; + public static final String TEST_INDEX_DATE = TEST_INDEX + "_date"; + public static final String TEST_INDEX_DATE_TIME = TEST_INDEX + "_datetime"; + public static final String TEST_INDEX_DEEP_NESTED = TEST_INDEX + "_deep_nested"; + public static final String TEST_INDEX_STRINGS = TEST_INDEX + "_strings"; + public static final String TEST_INDEX_DATATYPE_NUMERIC = TEST_INDEX + "_datatypes_numeric"; + public static final String TEST_INDEX_DATATYPE_NONNUMERIC = TEST_INDEX + "_datatypes_nonnumeric"; + public static final String TEST_INDEX_BEER = TEST_INDEX + "_beer"; + public static final String TEST_INDEX_NULL_MISSING = TEST_INDEX + "_null_missing"; + public static final String TEST_INDEX_CALCS = TEST_INDEX + "_calcs"; + public static final String TEST_INDEX_DATE_FORMATS = TEST_INDEX + "_date_formats"; + public static final String TEST_INDEX_WILDCARD = TEST_INDEX + "_wildcard"; + public static final String TEST_INDEX_MULTI_NESTED_TYPE = TEST_INDEX + "_multi_nested"; + public static final String TEST_INDEX_NESTED_WITH_NULLS = TEST_INDEX + "_nested_with_nulls"; + public static final String DATASOURCES = ".ql-datasources"; - public final static String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; - public final static String TS_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS"; - public final static String SIMPLE_DATE_FORMAT = "yyyy-MM-dd"; + public static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; + public static final String TS_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS"; + public static final String SIMPLE_DATE_FORMAT = "yyyy-MM-dd"; } diff --git a/integ-test/src/test/java/org/opensearch/sql/legacy/TypeInformationIT.java b/integ-test/src/test/java/org/opensearch/sql/legacy/TypeInformationIT.java index 646a38b011..421aae9622 100644 --- a/integ-test/src/test/java/org/opensearch/sql/legacy/TypeInformationIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/legacy/TypeInformationIT.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.legacy; import static org.opensearch.sql.util.MatcherUtils.schema; @@ -26,8 +25,8 @@ protected void init() throws Exception { @Test public void testAbsWithIntFieldReturnsInt() { JSONObject response = - executeJdbcRequest("SELECT ABS(age) FROM " + TestsConstants.TEST_INDEX_ACCOUNT + - " ORDER BY age LIMIT 5"); + executeJdbcRequest( + "SELECT ABS(age) FROM " + TestsConstants.TEST_INDEX_ACCOUNT + " ORDER BY age LIMIT 5"); verifySchema(response, schema("ABS(age)", null, "long")); } @@ -35,8 +34,10 @@ public void testAbsWithIntFieldReturnsInt() { @Test public void testCeilWithLongFieldReturnsLong() { JSONObject response = - executeJdbcRequest("SELECT CEIL(balance) FROM " + TestsConstants.TEST_INDEX_ACCOUNT + - " ORDER BY balance LIMIT 5"); + executeJdbcRequest( + "SELECT CEIL(balance) FROM " + + TestsConstants.TEST_INDEX_ACCOUNT + + " ORDER BY balance LIMIT 5"); verifySchema(response, schema("CEIL(balance)", null, "long")); } @@ -46,8 +47,8 @@ public void testCeilWithLongFieldReturnsLong() { */ @Test public void testPiReturnsDouble() { - JSONObject response = executeJdbcRequest("SELECT PI() FROM " + TestsConstants.TEST_INDEX_ACCOUNT - + " LIMIT 1"); + JSONObject response = + executeJdbcRequest("SELECT PI() FROM " + TestsConstants.TEST_INDEX_ACCOUNT + " LIMIT 1"); verifySchema(response, schema("PI()", null, "double")); } @@ -57,16 +58,22 @@ public void testPiReturnsDouble() { */ @Test public void testUpperWithStringFieldReturnsString() { - JSONObject response = executeJdbcRequest("SELECT UPPER(firstname) AS firstname_alias FROM " + - TestsConstants.TEST_INDEX_ACCOUNT + " ORDER BY firstname_alias LIMIT 2"); + JSONObject response = + executeJdbcRequest( + "SELECT UPPER(firstname) AS firstname_alias FROM " + + TestsConstants.TEST_INDEX_ACCOUNT + + " ORDER BY firstname_alias LIMIT 2"); verifySchema(response, schema("UPPER(firstname)", "firstname_alias", "keyword")); } @Test public void testLowerWithTextFieldReturnsText() { - JSONObject response = executeJdbcRequest("SELECT LOWER(firstname) FROM " + - TestsConstants.TEST_INDEX_ACCOUNT + " ORDER BY firstname LIMIT 2"); + JSONObject response = + executeJdbcRequest( + "SELECT LOWER(firstname) FROM " + + TestsConstants.TEST_INDEX_ACCOUNT + + " ORDER BY firstname LIMIT 2"); verifySchema(response, schema("LOWER(firstname)", null, "keyword")); } @@ -76,8 +83,11 @@ public void testLowerWithTextFieldReturnsText() { */ @Test public void testLengthWithTextFieldReturnsInt() { - JSONObject response = executeJdbcRequest("SELECT length(firstname) FROM " + - TestsConstants.TEST_INDEX_ACCOUNT + " ORDER BY firstname LIMIT 2"); + JSONObject response = + executeJdbcRequest( + "SELECT length(firstname) FROM " + + TestsConstants.TEST_INDEX_ACCOUNT + + " ORDER BY firstname LIMIT 2"); verifySchema(response, schema("length(firstname)", null, "integer")); } @@ -85,8 +95,10 @@ public void testLengthWithTextFieldReturnsInt() { @Test public void testLengthWithGroupByExpr() { JSONObject response = - executeJdbcRequest("SELECT Length(firstname) FROM " + TestsConstants.TEST_INDEX_ACCOUNT + - " GROUP BY LENGTH(firstname) LIMIT 5"); + executeJdbcRequest( + "SELECT Length(firstname) FROM " + + TestsConstants.TEST_INDEX_ACCOUNT + + " GROUP BY LENGTH(firstname) LIMIT 5"); verifySchema(response, schema("Length(firstname)", null, "integer")); } @@ -96,16 +108,22 @@ public void testLengthWithGroupByExpr() { */ @Test public void testSinWithLongFieldReturnsDouble() { - JSONObject response = executeJdbcRequest("SELECT sin(balance) FROM " + - TestsConstants.TEST_INDEX_ACCOUNT + " ORDER BY firstname LIMIT 2"); + JSONObject response = + executeJdbcRequest( + "SELECT sin(balance) FROM " + + TestsConstants.TEST_INDEX_ACCOUNT + + " ORDER BY firstname LIMIT 2"); verifySchema(response, schema("sin(balance)", null, "double")); } @Test public void testRadiansWithLongFieldReturnsDouble() { - JSONObject response = executeJdbcRequest("SELECT radians(balance) FROM " + - TestsConstants.TEST_INDEX_ACCOUNT + " ORDER BY firstname LIMIT 2"); + JSONObject response = + executeJdbcRequest( + "SELECT radians(balance) FROM " + + TestsConstants.TEST_INDEX_ACCOUNT + + " ORDER BY firstname LIMIT 2"); verifySchema(response, schema("radians(balance)", null, "double")); } @@ -115,16 +133,22 @@ public void testRadiansWithLongFieldReturnsDouble() { */ @Test public void testAddWithIntReturnsInt() { - JSONObject response = executeJdbcRequest("SELECT (balance + 5) AS balance_add_five FROM " + - TestsConstants.TEST_INDEX_ACCOUNT + " ORDER BY firstname LIMIT 2"); + JSONObject response = + executeJdbcRequest( + "SELECT (balance + 5) AS balance_add_five FROM " + + TestsConstants.TEST_INDEX_ACCOUNT + + " ORDER BY firstname LIMIT 2"); verifySchema(response, schema("(balance + 5)", "balance_add_five", "long")); } @Test public void testSubtractLongWithLongReturnsLong() { - JSONObject response = executeJdbcRequest("SELECT (balance - balance) FROM " + - TestsConstants.TEST_INDEX_ACCOUNT + " ORDER BY firstname LIMIT 2"); + JSONObject response = + executeJdbcRequest( + "SELECT (balance - balance) FROM " + + TestsConstants.TEST_INDEX_ACCOUNT + + " ORDER BY firstname LIMIT 2"); verifySchema(response, schema("(balance - balance)", null, "long")); } @@ -134,17 +158,18 @@ public void testSubtractLongWithLongReturnsLong() { */ @Test public void testDayOfWeekWithKeywordReturnsText() { - JSONObject response = executeJdbcRequest("SELECT DAYOFWEEK(insert_time) FROM " - + TestsConstants.TEST_INDEX_ONLINE + " LIMIT 2"); + JSONObject response = + executeJdbcRequest( + "SELECT DAYOFWEEK(insert_time) FROM " + TestsConstants.TEST_INDEX_ONLINE + " LIMIT 2"); - verifySchema(response, - schema("DAYOFWEEK(insert_time)", null, "integer")); + verifySchema(response, schema("DAYOFWEEK(insert_time)", null, "integer")); } @Test public void testYearWithKeywordReturnsText() { - JSONObject response = executeJdbcRequest("SELECT YEAR(insert_time) FROM " - + TestsConstants.TEST_INDEX_ONLINE + " LIMIT 2"); + JSONObject response = + executeJdbcRequest( + "SELECT YEAR(insert_time) FROM " + TestsConstants.TEST_INDEX_ONLINE + " LIMIT 2"); verifySchema(response, schema("YEAR(insert_time)", null, "integer")); } diff --git a/integ-test/src/test/java/org/opensearch/sql/ppl/StandaloneIT.java b/integ-test/src/test/java/org/opensearch/sql/ppl/StandaloneIT.java index 8ef8787597..f81e1b6615 100644 --- a/integ-test/src/test/java/org/opensearch/sql/ppl/StandaloneIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/ppl/StandaloneIT.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.ppl; import static org.opensearch.sql.datasource.model.DataSourceMetadata.defaultOpenSearchDataSourceMetadata; @@ -78,17 +77,21 @@ public class StandaloneIT extends PPLIntegTestCase { public void init() { RestHighLevelClient restClient = new InternalRestHighLevelClient(client()); OpenSearchClient client = new OpenSearchRestClient(restClient); - DataSourceService dataSourceService = new DataSourceServiceImpl( - new ImmutableSet.Builder() - .add(new OpenSearchDataSourceFactory(client, defaultSettings())) - .build(), getDataSourceMetadataStorage(), getDataSourceUserRoleHelper()); + DataSourceService dataSourceService = + new DataSourceServiceImpl( + new ImmutableSet.Builder() + .add(new OpenSearchDataSourceFactory(client, defaultSettings())) + .build(), + getDataSourceMetadataStorage(), + getDataSourceUserRoleHelper()); dataSourceService.createDataSource(defaultOpenSearchDataSourceMetadata()); ModulesBuilder modules = new ModulesBuilder(); - modules.add(new StandaloneModule(new InternalRestHighLevelClient(client()), defaultSettings(), dataSourceService)); + modules.add( + new StandaloneModule( + new InternalRestHighLevelClient(client()), defaultSettings(), dataSourceService)); Injector injector = modules.createInjector(); - pplService = - SecurityAccess.doPrivileged(() -> injector.getInstance(PPLService.class)); + pplService = SecurityAccess.doPrivileged(() -> injector.getInstance(PPLService.class)); } @Test @@ -146,9 +149,8 @@ public void onFailure(Exception e) { private Settings defaultSettings() { return new Settings() { - private final Map defaultSettings = new ImmutableMap.Builder() - .put(Key.QUERY_SIZE_LIMIT, 200) - .build(); + private final Map defaultSettings = + new ImmutableMap.Builder().put(Key.QUERY_SIZE_LIMIT, 200).build(); @Override public T getSettingValue(Key key) { @@ -162,9 +164,7 @@ public List getSettings() { }; } - /** - * Internal RestHighLevelClient only for testing purpose. - */ + /** Internal RestHighLevelClient only for testing purpose. */ static class InternalRestHighLevelClient extends RestHighLevelClient { public InternalRestHighLevelClient(RestClient restClient) { super(restClient, RestClient::close, Collections.emptyList()); @@ -197,8 +197,8 @@ public StorageEngine storageEngine(OpenSearchClient client) { } @Provides - public ExecutionEngine executionEngine(OpenSearchClient client, ExecutionProtector protector, - PlanSerializer planSerializer) { + public ExecutionEngine executionEngine( + OpenSearchClient client, ExecutionProtector protector, PlanSerializer planSerializer) { return new OpenSearchExecutionEngine(client, protector, planSerializer); } @@ -257,28 +257,20 @@ public Optional getDataSourceMetadata(String datasourceName) } @Override - public void createDataSourceMetadata(DataSourceMetadata dataSourceMetadata) { - - } + public void createDataSourceMetadata(DataSourceMetadata dataSourceMetadata) {} @Override - public void updateDataSourceMetadata(DataSourceMetadata dataSourceMetadata) { - - } + public void updateDataSourceMetadata(DataSourceMetadata dataSourceMetadata) {} @Override - public void deleteDataSourceMetadata(String datasourceName) { - - } + public void deleteDataSourceMetadata(String datasourceName) {} }; } public static DataSourceUserAuthorizationHelper getDataSourceUserRoleHelper() { return new DataSourceUserAuthorizationHelper() { @Override - public void authorizeDataSource(DataSourceMetadata dataSourceMetadata) { - - } + public void authorizeDataSource(DataSourceMetadata dataSourceMetadata) {} }; } } diff --git a/integ-test/src/test/java/org/opensearch/sql/ppl/StatsCommandIT.java b/integ-test/src/test/java/org/opensearch/sql/ppl/StatsCommandIT.java index 5389f245a4..92b9e309b8 100644 --- a/integ-test/src/test/java/org/opensearch/sql/ppl/StatsCommandIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/ppl/StatsCommandIT.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.ppl; import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_ACCOUNT; @@ -66,26 +65,23 @@ public void testStatsDistinctCount() throws IOException { verifySchema(response, schema("distinct_count(gender)", null, "integer")); verifyDataRows(response, rows(2)); - response = - executeQuery(String.format("source=%s | stats dc(age)", TEST_INDEX_ACCOUNT)); + response = executeQuery(String.format("source=%s | stats dc(age)", TEST_INDEX_ACCOUNT)); verifySchema(response, schema("dc(age)", null, "integer")); verifyDataRows(response, rows(21)); } @Test public void testStatsMin() throws IOException { - JSONObject response = executeQuery(String.format( - "source=%s | stats min(age)", - TEST_INDEX_ACCOUNT)); + JSONObject response = + executeQuery(String.format("source=%s | stats min(age)", TEST_INDEX_ACCOUNT)); verifySchema(response, schema("min(age)", null, "long")); verifyDataRows(response, rows(20)); } @Test public void testStatsMax() throws IOException { - JSONObject response = executeQuery(String.format( - "source=%s | stats max(age)", - TEST_INDEX_ACCOUNT)); + JSONObject response = + executeQuery(String.format("source=%s | stats max(age)", TEST_INDEX_ACCOUNT)); verifySchema(response, schema("max(age)", null, "long")); verifyDataRows(response, rows(40)); } @@ -93,8 +89,8 @@ public void testStatsMax() throws IOException { @Test public void testStatsNested() throws IOException { JSONObject response = - executeQuery(String.format("source=%s | stats avg(abs(age) * 2) as AGE", - TEST_INDEX_ACCOUNT)); + executeQuery( + String.format("source=%s | stats avg(abs(age) * 2) as AGE", TEST_INDEX_ACCOUNT)); verifySchema(response, schema("AGE", null, "double")); verifyDataRows(response, rows(60.342)); } @@ -102,8 +98,7 @@ public void testStatsNested() throws IOException { @Test public void testStatsNestedDoubleValue() throws IOException { JSONObject response = - executeQuery(String.format("source=%s | stats avg(abs(age) * 2.0)", - TEST_INDEX_ACCOUNT)); + executeQuery(String.format("source=%s | stats avg(abs(age) * 2.0)", TEST_INDEX_ACCOUNT)); verifySchema(response, schema("avg(abs(age) * 2.0)", null, "double")); verifyDataRows(response, rows(60.342)); } @@ -111,88 +106,87 @@ public void testStatsNestedDoubleValue() throws IOException { @Test public void testStatsWhere() throws IOException { JSONObject response = - executeQuery(String.format( - "source=%s | stats sum(balance) as a by state | where a > 780000", - TEST_INDEX_ACCOUNT)); - verifySchema(response, schema("a", null, "long"), - schema("state", null, "string")); + executeQuery( + String.format( + "source=%s | stats sum(balance) as a by state | where a > 780000", + TEST_INDEX_ACCOUNT)); + verifySchema(response, schema("a", null, "long"), schema("state", null, "string")); verifyDataRows(response, rows(782199, "TX")); } @Test public void testGroupByNullValue() throws IOException { JSONObject response = - executeQuery(String.format( - "source=%s | stats avg(balance) as a by age", - TEST_INDEX_BANK_WITH_NULL_VALUES)); - verifySchema(response, schema("a", null, "double"), - schema("age", null, "integer")); - verifyDataRows(response, + executeQuery( + String.format( + "source=%s | stats avg(balance) as a by age", TEST_INDEX_BANK_WITH_NULL_VALUES)); + verifySchema(response, schema("a", null, "double"), schema("age", null, "integer")); + verifyDataRows( + response, rows(null, null), rows(32838D, 28), rows(39225D, 32), rows(4180D, 33), rows(48086D, 34), - rows(null, 36) - ); + rows(null, 36)); } - //Todo. The column of agg function is in random order. This is because we create the project + // Todo. The column of agg function is in random order. This is because we create the project // all operator from the symbol table which can't maintain the original column order. @Test public void testMultipleAggregationFunction() throws IOException { - JSONObject response = executeQuery(String.format( - "source=%s | stats min(age), max(age)", - TEST_INDEX_ACCOUNT)); - verifySchema(response, schema("min(age)", null, "long"), - schema("max(age)", null, "long")); + JSONObject response = + executeQuery(String.format("source=%s | stats min(age), max(age)", TEST_INDEX_ACCOUNT)); + verifySchema(response, schema("min(age)", null, "long"), schema("max(age)", null, "long")); verifyDataRows(response, rows(20, 40)); } @Test public void testStatsWithNull() throws IOException { JSONObject response = - executeQuery(String.format( - "source=%s | stats avg(age)", - TEST_INDEX_BANK_WITH_NULL_VALUES)); + executeQuery(String.format("source=%s | stats avg(age)", TEST_INDEX_BANK_WITH_NULL_VALUES)); verifySchema(response, schema("avg(age)", null, "double")); verifyDataRows(response, rows(33.166666666666664)); } @Test public void testStatsWithMissing() throws IOException { - JSONObject response = executeQuery(String.format( - "source=%s | stats avg(balance)", - TEST_INDEX_BANK_WITH_NULL_VALUES)); + JSONObject response = + executeQuery( + String.format("source=%s | stats avg(balance)", TEST_INDEX_BANK_WITH_NULL_VALUES)); verifySchema(response, schema("avg(balance)", null, "double")); verifyDataRows(response, rows(31082.25)); } @Test public void testStatsBySpan() throws IOException { - JSONObject response = executeQuery(String.format( - "source=%s | stats count() by span(age,10)", - TEST_INDEX_BANK)); - verifySchema(response, schema("count()", null, "integer"), schema("span(age,10)", null, "integer")); + JSONObject response = + executeQuery(String.format("source=%s | stats count() by span(age,10)", TEST_INDEX_BANK)); + verifySchema( + response, schema("count()", null, "integer"), schema("span(age,10)", null, "integer")); verifyDataRows(response, rows(1, 20), rows(6, 30)); } @Test public void testStatsTimeSpan() throws IOException { - JSONObject response = executeQuery(String.format( - "source=%s | stats count() by span(birthdate,1y)", - TEST_INDEX_BANK)); - verifySchema(response, schema("count()", null, "integer"), schema( - "span(birthdate,1y)", null, "timestamp")); + JSONObject response = + executeQuery( + String.format("source=%s | stats count() by span(birthdate,1y)", TEST_INDEX_BANK)); + verifySchema( + response, + schema("count()", null, "integer"), + schema("span(birthdate,1y)", null, "timestamp")); verifyDataRows(response, rows(2, "2017-01-01 00:00:00"), rows(5, "2018-01-01 00:00:00")); } @Test public void testStatsAliasedSpan() throws IOException { - JSONObject response = executeQuery(String.format( - "source=%s | stats count() by span(age,10) as age_bucket", - TEST_INDEX_BANK)); - verifySchema(response, schema("count()", null, "integer"), schema("age_bucket", null, "integer")); + JSONObject response = + executeQuery( + String.format( + "source=%s | stats count() by span(age,10) as age_bucket", TEST_INDEX_BANK)); + verifySchema( + response, schema("count()", null, "integer"), schema("age_bucket", null, "integer")); verifyDataRows(response, rows(1, 20), rows(6, 30)); } } diff --git a/integ-test/src/test/java/org/opensearch/sql/ppl/SystemFunctionIT.java b/integ-test/src/test/java/org/opensearch/sql/ppl/SystemFunctionIT.java index de13aa5488..d2cd140e99 100644 --- a/integ-test/src/test/java/org/opensearch/sql/ppl/SystemFunctionIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/ppl/SystemFunctionIT.java @@ -26,49 +26,63 @@ public void init() throws IOException { @Test public void typeof_sql_types() throws IOException { - JSONObject response = executeQuery(String.format("source=%s | eval " - + "`str` = typeof('pewpew'), `double` = typeof(1.0)," - + "`int` = typeof(12345), `long` = typeof(1234567891011), `interval` = typeof(INTERVAL 2 DAY)" - + " | fields `str`, `double`, `int`, `long`, `interval`", - TEST_INDEX_DATATYPE_NUMERIC)); + JSONObject response = + executeQuery( + String.format( + "source=%s | eval `str` = typeof('pewpew')," + + " `double` = typeof(1.0)," + + "`int` = typeof(12345)," + + " `long` = typeof(1234567891011)," + + " `interval` = typeof(INTERVAL 2 DAY)" + + " | fields `str`, `double`, `int`, `long`, `interval`", + TEST_INDEX_DATATYPE_NUMERIC)); // TODO: test null in PPL - verifyDataRows(response, - rows("KEYWORD", "DOUBLE", "INTEGER", "LONG", "INTERVAL")); + verifyDataRows(response, rows("KEYWORD", "DOUBLE", "INTEGER", "LONG", "INTERVAL")); - response = executeQuery(String.format("source=%s | eval " - + "`timestamp` = typeof(CAST('1961-04-12 09:07:00' AS TIMESTAMP))," - + "`time` = typeof(CAST('09:07:00' AS TIME))," - + "`date` = typeof(CAST('1961-04-12' AS DATE))," - + "`datetime` = typeof(DATETIME('1961-04-12 09:07:00'))" - + " | fields `timestamp`, `time`, `date`, `datetime`", - TEST_INDEX_DATATYPE_NUMERIC)); - verifyDataRows(response, - rows("TIMESTAMP", "TIME", "DATE", "DATETIME")); + response = + executeQuery( + String.format( + "source=%s | eval " + + "`timestamp` = typeof(CAST('1961-04-12 09:07:00' AS TIMESTAMP))," + + "`time` = typeof(CAST('09:07:00' AS TIME))," + + "`date` = typeof(CAST('1961-04-12' AS DATE))," + + "`datetime` = typeof(DATETIME('1961-04-12 09:07:00'))" + + " | fields `timestamp`, `time`, `date`, `datetime`", + TEST_INDEX_DATATYPE_NUMERIC)); + verifyDataRows(response, rows("TIMESTAMP", "TIME", "DATE", "DATETIME")); } @Test public void typeof_opensearch_types() throws IOException { - JSONObject response = executeQuery(String.format("source=%s | eval " - + "`double` = typeof(double_number), `long` = typeof(long_number)," - + "`integer` = typeof(integer_number), `byte` = typeof(byte_number)," - + "`short` = typeof(short_number), `float` = typeof(float_number)," - + "`half_float` = typeof(half_float_number), `scaled_float` = typeof(scaled_float_number)" - + " | fields `double`, `long`, `integer`, `byte`, `short`, `float`, `half_float`, `scaled_float`", - TEST_INDEX_DATATYPE_NUMERIC)); - verifyDataRows(response, - rows("DOUBLE", "LONG", "INTEGER", "BYTE", "SHORT", "FLOAT", "FLOAT", "DOUBLE")); + JSONObject response = + executeQuery( + String.format( + "source=%s | eval `double` = typeof(double_number), `long` =" + + " typeof(long_number),`integer` = typeof(integer_number), `byte` =" + + " typeof(byte_number),`short` = typeof(short_number), `float` =" + + " typeof(float_number),`half_float` = typeof(half_float_number)," + + " `scaled_float` = typeof(scaled_float_number) | fields `double`, `long`," + + " `integer`, `byte`, `short`, `float`, `half_float`, `scaled_float`", + TEST_INDEX_DATATYPE_NUMERIC)); + verifyDataRows( + response, rows("DOUBLE", "LONG", "INTEGER", "BYTE", "SHORT", "FLOAT", "FLOAT", "DOUBLE")); - response = executeQuery(String.format("source=%s | eval " - + "`text` = typeof(text_value), `date` = typeof(date_value)," - + "`boolean` = typeof(boolean_value), `object` = typeof(object_value)," - + "`keyword` = typeof(keyword_value), `ip` = typeof(ip_value)," - + "`binary` = typeof(binary_value), `geo_point` = typeof(geo_point_value)" - // TODO activate this test once `ARRAY` type supported, see ExpressionAnalyzer::isTypeNotSupported - //+ ", `nested` = typeof(nested_value)" - + " | fields `text`, `date`, `boolean`, `object`, `keyword`, `ip`, `binary`, `geo_point`", - TEST_INDEX_DATATYPE_NONNUMERIC)); - verifyDataRows(response, - rows("TEXT", "TIMESTAMP", "BOOLEAN", "OBJECT", "KEYWORD", - "IP", "BINARY", "GEO_POINT")); + response = + executeQuery( + String.format( + "source=%s | eval " + + "`text` = typeof(text_value), `date` = typeof(date_value)," + + "`boolean` = typeof(boolean_value), `object` = typeof(object_value)," + + "`keyword` = typeof(keyword_value), `ip` = typeof(ip_value)," + + "`binary` = typeof(binary_value), `geo_point` = typeof(geo_point_value)" + // TODO activate this test once `ARRAY` type supported, see + // ExpressionAnalyzer::isTypeNotSupported + // + ", `nested` = typeof(nested_value)" + + " | fields `text`, `date`, `boolean`, `object`, `keyword`, `ip`, `binary`," + + " `geo_point`", + TEST_INDEX_DATATYPE_NONNUMERIC)); + verifyDataRows( + response, + rows("TEXT", "TIMESTAMP", "BOOLEAN", "OBJECT", "KEYWORD", "IP", "BINARY", "GEO_POINT")); } } diff --git a/integ-test/src/test/java/org/opensearch/sql/ppl/TextFunctionIT.java b/integ-test/src/test/java/org/opensearch/sql/ppl/TextFunctionIT.java index 024f190bee..dc9f1d98d2 100644 --- a/integ-test/src/test/java/org/opensearch/sql/ppl/TextFunctionIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/ppl/TextFunctionIT.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.ppl; import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_STRINGS; @@ -23,27 +22,45 @@ public void init() throws IOException { loadIndex(Index.BANK_WITH_STRING_VALUES); } - void verifyQuery(String command, String initialArgs, String additionalArgs, - String outputRow1, String outputRow2, String outputRow3) throws IOException { - String query = String.format( - "source=%s | eval f=%s(%sname%s) | fields f", TEST_INDEX_STRINGS, command, initialArgs, additionalArgs); + void verifyQuery( + String command, + String initialArgs, + String additionalArgs, + String outputRow1, + String outputRow2, + String outputRow3) + throws IOException { + String query = + String.format( + "source=%s | eval f=%s(%sname%s) | fields f", + TEST_INDEX_STRINGS, command, initialArgs, additionalArgs); JSONObject result = executeQuery(query); verifySchema(result, schema("f", null, "string")); verifyDataRows(result, rows(outputRow1), rows(outputRow2), rows(outputRow3)); } - void verifyQuery(String command, String initialArgs, String additionalArgs, - Integer outputRow1, Integer outputRow2, Integer outputRow3) throws IOException { - String query = String.format( - "source=%s | eval f=%s(%sname%s) | fields f", TEST_INDEX_STRINGS, command, initialArgs, additionalArgs); + void verifyQuery( + String command, + String initialArgs, + String additionalArgs, + Integer outputRow1, + Integer outputRow2, + Integer outputRow3) + throws IOException { + String query = + String.format( + "source=%s | eval f=%s(%sname%s) | fields f", + TEST_INDEX_STRINGS, command, initialArgs, additionalArgs); JSONObject result = executeQuery(query); verifySchema(result, schema("f", null, "integer")); verifyDataRows(result, rows(outputRow1), rows(outputRow2), rows(outputRow3)); } - void verifyRegexQuery(String pattern, Integer outputRow1, Integer outputRow2, Integer outputRow3) throws IOException { - String query = String.format( - "source=%s | eval f=name regexp '%s' | fields f", TEST_INDEX_STRINGS, pattern); + void verifyRegexQuery(String pattern, Integer outputRow1, Integer outputRow2, Integer outputRow3) + throws IOException { + String query = + String.format( + "source=%s | eval f=name regexp '%s' | fields f", TEST_INDEX_STRINGS, pattern); JSONObject result = executeQuery(query); verifySchema(result, schema("f", null, "integer")); verifyDataRows(result, rows(outputRow1), rows(outputRow2), rows(outputRow3)); @@ -55,7 +72,7 @@ public void testRegexp() throws IOException { verifyRegexQuery(".*", 1, 1, 1); } - @Test + @Test public void testSubstr() throws IOException { verifyQuery("substr", "", ", 2", "ello", "orld", "elloworld"); verifyQuery("substr", "", ", 2, 2", "el", "or", "el"); @@ -99,14 +116,19 @@ public void testLtrim() throws IOException { @Test public void testConcat() throws IOException { - verifyQuery("concat", "", ", 'there', 'all', '!'", - "hellothereall!", "worldthereall!", "helloworldthereall!"); + verifyQuery( + "concat", + "", + ", 'there', 'all', '!'", + "hellothereall!", + "worldthereall!", + "helloworldthereall!"); } @Test public void testConcat_ws() throws IOException { - verifyQuery("concat_ws", "',', ", ", 'there'", - "hello,there", "world,there", "helloworld,there"); + verifyQuery( + "concat_ws", "',', ", ", 'there'", "hello,there", "world,there", "helloworld,there"); } @Test @@ -137,7 +159,8 @@ public void testLocate() throws IOException { @Test public void testReplace() throws IOException { - verifyQuery("replace", "", ", 'world', ' opensearch'", "hello", " opensearch", "hello opensearch"); + verifyQuery( + "replace", "", ", 'world', ' opensearch'", "hello", " opensearch", "hello opensearch"); } @Test diff --git a/integ-test/src/test/java/org/opensearch/sql/ppl/TopCommandIT.java b/integ-test/src/test/java/org/opensearch/sql/ppl/TopCommandIT.java index 054ff303a1..f9587e4b63 100644 --- a/integ-test/src/test/java/org/opensearch/sql/ppl/TopCommandIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/ppl/TopCommandIT.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.ppl; import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_ACCOUNT; @@ -14,7 +13,7 @@ import org.json.JSONObject; import org.junit.jupiter.api.Test; -public class TopCommandIT extends PPLIntegTestCase{ +public class TopCommandIT extends PPLIntegTestCase { @Override public void init() throws IOException { @@ -24,30 +23,20 @@ public void init() throws IOException { @Test public void testTopWithoutGroup() throws IOException { - JSONObject result = - executeQuery(String.format("source=%s | top gender", TEST_INDEX_ACCOUNT)); - verifyDataRows( - result, - rows("M"), - rows("F")); + JSONObject result = executeQuery(String.format("source=%s | top gender", TEST_INDEX_ACCOUNT)); + verifyDataRows(result, rows("M"), rows("F")); } @Test - public void testTopNWithoutGroup() throws IOException{ - JSONObject result = - executeQuery(String.format("source=%s | top 1 gender", TEST_INDEX_ACCOUNT)); - verifyDataRows( - result, - rows("M")); + public void testTopNWithoutGroup() throws IOException { + JSONObject result = executeQuery(String.format("source=%s | top 1 gender", TEST_INDEX_ACCOUNT)); + verifyDataRows(result, rows("M")); } @Test public void testTopNWithGroup() throws IOException { JSONObject result = executeQuery(String.format("source=%s | top 1 state by gender", TEST_INDEX_ACCOUNT)); - verifyDataRows( - result, - rows("F", "TX"), - rows("M", "MD")); + verifyDataRows(result, rows("F", "TX"), rows("M", "MD")); } } diff --git a/integ-test/src/test/java/org/opensearch/sql/ppl/VisualizationFormatIT.java b/integ-test/src/test/java/org/opensearch/sql/ppl/VisualizationFormatIT.java index d530b4140d..263ed502ed 100644 --- a/integ-test/src/test/java/org/opensearch/sql/ppl/VisualizationFormatIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/ppl/VisualizationFormatIT.java @@ -24,8 +24,9 @@ public void init() throws IOException { @Test void format() throws IOException { - String result = executeVizQuery( - String.format(Locale.ROOT, "source=%s | fields firstname, age", TEST_INDEX_BANK), true); + String result = + executeVizQuery( + String.format(Locale.ROOT, "source=%s | fields firstname, age", TEST_INDEX_BANK), true); assertEquals( "{\n" + " \"data\": {\n" @@ -67,8 +68,10 @@ void format() throws IOException { } private String executeVizQuery(String query, boolean pretty) throws IOException { - Request request = buildRequest(query, - QUERY_API_ENDPOINT + String.format(Locale.ROOT, "?format=csv&pretty=%b", pretty)); + Request request = + buildRequest( + query, + QUERY_API_ENDPOINT + String.format(Locale.ROOT, "?format=csv&pretty=%b", pretty)); Response response = client().performRequest(request); Assert.assertEquals(200, response.getStatusLine().getStatusCode()); return getResponseBody(response, true); diff --git a/integ-test/src/test/java/org/opensearch/sql/ppl/WhereCommandIT.java b/integ-test/src/test/java/org/opensearch/sql/ppl/WhereCommandIT.java index ba870732fd..d56f9ffe32 100644 --- a/integ-test/src/test/java/org/opensearch/sql/ppl/WhereCommandIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/ppl/WhereCommandIT.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.ppl; import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_ACCOUNT; diff --git a/integ-test/src/test/java/org/opensearch/sql/sql/StandalonePaginationIT.java b/integ-test/src/test/java/org/opensearch/sql/sql/StandalonePaginationIT.java index 4738d233bf..e884734c96 100644 --- a/integ-test/src/test/java/org/opensearch/sql/sql/StandalonePaginationIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/sql/StandalonePaginationIT.java @@ -66,17 +66,19 @@ public class StandalonePaginationIT extends SQLIntegTestCase { public void init() { RestHighLevelClient restClient = new InternalRestHighLevelClient(client()); client = new OpenSearchRestClient(restClient); - DataSourceService dataSourceService = new DataSourceServiceImpl( - new ImmutableSet.Builder() - .add(new OpenSearchDataSourceFactory(client, defaultSettings())) - .build(), - getDataSourceMetadataStorage(), - getDataSourceUserRoleHelper() - ); + DataSourceService dataSourceService = + new DataSourceServiceImpl( + new ImmutableSet.Builder() + .add(new OpenSearchDataSourceFactory(client, defaultSettings())) + .build(), + getDataSourceMetadataStorage(), + getDataSourceUserRoleHelper()); dataSourceService.createDataSource(defaultOpenSearchDataSourceMetadata()); ModulesBuilder modules = new ModulesBuilder(); - modules.add(new StandaloneModule(new InternalRestHighLevelClient(client()), defaultSettings(), dataSourceService)); + modules.add( + new StandaloneModule( + new InternalRestHighLevelClient(client()), defaultSettings(), dataSourceService)); Injector injector = modules.createInjector(); queryService = injector.getInstance(QueryService.class); @@ -85,10 +87,9 @@ public void init() { @Test public void test_pagination_whitebox() throws IOException { - class TestResponder - implements ResponseListener { - @Getter - Cursor cursor = Cursor.None; + class TestResponder implements ResponseListener { + @Getter Cursor cursor = Cursor.None; + @Override public void onResponse(ExecutionEngine.QueryResponse response) { cursor = response.getCursor(); @@ -113,13 +114,16 @@ public void onFailure(Exception e) { // act 1, asserts in firstResponder var t = new OpenSearchIndex(client, defaultSettings(), "test"); - LogicalPlan p = new LogicalPaginate(1, List.of( - new LogicalProject( - new LogicalRelation("test", t), List.of( - DSL.named("name", DSL.ref("name", ExprCoreType.STRING)), - DSL.named("age", DSL.ref("age", ExprCoreType.LONG))), - List.of() - ))); + LogicalPlan p = + new LogicalPaginate( + 1, + List.of( + new LogicalProject( + new LogicalRelation("test", t), + List.of( + DSL.named("name", DSL.ref("name", ExprCoreType.STRING)), + DSL.named("age", DSL.ref("age", ExprCoreType.LONG))), + List.of()))); var firstResponder = new TestResponder(); queryService.executePlan(p, PlanContext.emptyPlanContext(), firstResponder); @@ -139,24 +143,30 @@ public void test_explain_not_supported() { // Request should be rejected before index names are resolved request.setJsonEntity("{ \"query\": \"select * from something\", \"fetch_size\": 10 }"); var exception = assertThrows(ResponseException.class, () -> client().performRequest(request)); - var response = new JSONObject(new String(exception.getResponse().getEntity().getContent().readAllBytes())); - assertEquals("`explain` feature for paginated requests is not implemented yet.", + var response = + new JSONObject(new String(exception.getResponse().getEntity().getContent().readAllBytes())); + assertEquals( + "`explain` feature for paginated requests is not implemented yet.", response.getJSONObject("error").getString("details")); // Request should be rejected before cursor parsed request.setJsonEntity("{ \"cursor\" : \"n:0000\" }"); exception = assertThrows(ResponseException.class, () -> client().performRequest(request)); - response = new JSONObject(new String(exception.getResponse().getEntity().getContent().readAllBytes())); - assertEquals("Explain of a paged query continuation is not supported. Use `explain` for the initial query request.", + response = + new JSONObject(new String(exception.getResponse().getEntity().getContent().readAllBytes())); + assertEquals( + "Explain of a paged query continuation is not supported. Use `explain` for the initial" + + " query request.", response.getJSONObject("error").getString("details")); } private Settings defaultSettings() { return new Settings() { - private final Map defaultSettings = new ImmutableMap.Builder() - .put(Key.QUERY_SIZE_LIMIT, 200) - .put(Key.SQL_CURSOR_KEEP_ALIVE, TimeValue.timeValueMinutes(1)) - .build(); + private final Map defaultSettings = + new ImmutableMap.Builder() + .put(Key.QUERY_SIZE_LIMIT, 200) + .put(Key.SQL_CURSOR_KEEP_ALIVE, TimeValue.timeValueMinutes(1)) + .build(); @Override public T getSettingValue(Key key) { diff --git a/integ-test/src/test/java/org/opensearch/sql/sql/StringLiteralIT.java b/integ-test/src/test/java/org/opensearch/sql/sql/StringLiteralIT.java index e54000f80d..d98016d62b 100644 --- a/integ-test/src/test/java/org/opensearch/sql/sql/StringLiteralIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/sql/StringLiteralIT.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql; import static org.opensearch.sql.util.MatcherUtils.rows; @@ -16,8 +15,6 @@ import org.junit.Test; import org.opensearch.sql.legacy.SQLIntegTestCase; - - public class StringLiteralIT extends SQLIntegTestCase { @Test public void testStringHelloSingleQuote() throws IOException { diff --git a/integ-test/src/test/java/org/opensearch/sql/sql/SystemFunctionIT.java b/integ-test/src/test/java/org/opensearch/sql/sql/SystemFunctionIT.java index 584cdd05dd..4b39e2925c 100644 --- a/integ-test/src/test/java/org/opensearch/sql/sql/SystemFunctionIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/sql/SystemFunctionIT.java @@ -24,37 +24,47 @@ protected void init() throws Exception { @Test public void typeof_sql_types() { - JSONObject response = executeJdbcRequest("SELECT typeof('pewpew'), typeof(NULL), typeof(1.0)," - + "typeof(12345), typeof(1234567891011), typeof(INTERVAL 2 DAY);"); - verifyDataRows(response, - rows("KEYWORD", "UNDEFINED", "DOUBLE", "INTEGER", "LONG", "INTERVAL")); - - response = executeJdbcRequest("SELECT" - + " typeof(CAST('1961-04-12 09:07:00' AS TIMESTAMP))," - + " typeof(CAST('09:07:00' AS TIME))," - + " typeof(CAST('1961-04-12' AS DATE))," - + " typeof(DATETIME('1961-04-12 09:07:00'))"); - verifyDataRows(response, - rows("TIMESTAMP", "TIME", "DATE", "DATETIME")); + JSONObject response = + executeJdbcRequest( + "SELECT typeof('pewpew'), typeof(NULL), typeof(1.0)," + + "typeof(12345), typeof(1234567891011), typeof(INTERVAL 2 DAY);"); + verifyDataRows(response, rows("KEYWORD", "UNDEFINED", "DOUBLE", "INTEGER", "LONG", "INTERVAL")); + + response = + executeJdbcRequest( + "SELECT" + + " typeof(CAST('1961-04-12 09:07:00' AS TIMESTAMP))," + + " typeof(CAST('09:07:00' AS TIME))," + + " typeof(CAST('1961-04-12' AS DATE))," + + " typeof(DATETIME('1961-04-12 09:07:00'))"); + verifyDataRows(response, rows("TIMESTAMP", "TIME", "DATE", "DATETIME")); } @Test public void typeof_opensearch_types() { - JSONObject response = executeJdbcRequest(String.format("SELECT typeof(double_number)," - + "typeof(long_number), typeof(integer_number), typeof(byte_number), typeof(short_number)," - + "typeof(float_number), typeof(half_float_number), typeof(scaled_float_number)" - + " from %s;", TEST_INDEX_DATATYPE_NUMERIC)); - verifyDataRows(response, - rows("DOUBLE", "LONG", "INTEGER", "BYTE", "SHORT", "FLOAT", "FLOAT", "DOUBLE")); - - response = executeJdbcRequest(String.format("SELECT typeof(text_value)," - + "typeof(date_value), typeof(boolean_value), typeof(object_value), typeof(keyword_value)," - + "typeof(ip_value), typeof(binary_value), typeof(geo_point_value)" - // TODO activate this test once `ARRAY` type supported, see ExpressionAnalyzer::isTypeNotSupported - //+ ", typeof(nested_value)" - + " from %s;", TEST_INDEX_DATATYPE_NONNUMERIC)); - verifyDataRows(response, - rows("TEXT", "TIMESTAMP", "BOOLEAN", "OBJECT", "KEYWORD", - "IP", "BINARY", "GEO_POINT")); + JSONObject response = + executeJdbcRequest( + String.format( + "SELECT typeof(double_number),typeof(long_number), typeof(integer_number)," + + " typeof(byte_number), typeof(short_number),typeof(float_number)," + + " typeof(half_float_number), typeof(scaled_float_number) from %s;", + TEST_INDEX_DATATYPE_NUMERIC)); + verifyDataRows( + response, rows("DOUBLE", "LONG", "INTEGER", "BYTE", "SHORT", "FLOAT", "FLOAT", "DOUBLE")); + + response = + executeJdbcRequest( + String.format( + "SELECT typeof(text_value),typeof(date_value), typeof(boolean_value)," + + " typeof(object_value), typeof(keyword_value),typeof(ip_value)," + + " typeof(binary_value), typeof(geo_point_value)" + // TODO activate this test once `ARRAY` type supported, see + // ExpressionAnalyzer::isTypeNotSupported + // + ", typeof(nested_value)" + + " from %s;", + TEST_INDEX_DATATYPE_NONNUMERIC)); + verifyDataRows( + response, + rows("TEXT", "TIMESTAMP", "BOOLEAN", "OBJECT", "KEYWORD", "IP", "BINARY", "GEO_POINT")); } } diff --git a/integ-test/src/test/java/org/opensearch/sql/sql/TextFunctionIT.java b/integ-test/src/test/java/org/opensearch/sql/sql/TextFunctionIT.java index 94677354e4..314132fed0 100644 --- a/integ-test/src/test/java/org/opensearch/sql/sql/TextFunctionIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/sql/TextFunctionIT.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql; import static org.opensearch.sql.legacy.plugin.RestSqlAction.QUERY_API_ENDPOINT; @@ -43,8 +42,7 @@ void verifyQuery(String query, String type, Integer output) throws IOException { void verifyQueryWithNullOutput(String query, String type) throws IOException { JSONObject result = executeQuery("select 'test null'," + query); - verifySchema(result, schema(query, null, type), - schema("'test null'", null, type)); + verifySchema(result, schema(query, null, type), schema("'test null'", null, type)); verifyDataRows(result, rows("test null", null)); } diff --git a/integ-test/src/test/java/org/opensearch/sql/sql/WildcardQueryIT.java b/integ-test/src/test/java/org/opensearch/sql/sql/WildcardQueryIT.java index 030c07c5fa..8123f887f2 100644 --- a/integ-test/src/test/java/org/opensearch/sql/sql/WildcardQueryIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/sql/WildcardQueryIT.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql; import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_WILDCARD; @@ -25,11 +24,17 @@ protected void init() throws Exception { public void test_wildcard_query_asterisk_function() throws IOException { String expected = "test wildcard"; - String query1 = "SELECT KeywordBody FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(KeywordBody, 't*') LIMIT 1"; + String query1 = + "SELECT KeywordBody FROM " + + TEST_INDEX_WILDCARD + + " WHERE wildcard_query(KeywordBody, 't*') LIMIT 1"; JSONObject result1 = executeJdbcRequest(query1); verifyDataRows(result1, rows(expected)); - String query2 = "SELECT KeywordBody FROM " + TEST_INDEX_WILDCARD + " WHERE wildcardquery(KeywordBody, 't*') LIMIT 1"; + String query2 = + "SELECT KeywordBody FROM " + + TEST_INDEX_WILDCARD + + " WHERE wildcardquery(KeywordBody, 't*') LIMIT 1"; JSONObject result2 = executeJdbcRequest(query2); verifyDataRows(result2, rows(expected)); } @@ -38,11 +43,17 @@ public void test_wildcard_query_asterisk_function() throws IOException { public void test_wildcard_query_question_mark_function() throws IOException { String expected = "test wildcard"; - String query1 = "SELECT KeywordBody FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(KeywordBody, 'test wild??rd')"; + String query1 = + "SELECT KeywordBody FROM " + + TEST_INDEX_WILDCARD + + " WHERE wildcard_query(KeywordBody, 'test wild??rd')"; JSONObject result1 = executeJdbcRequest(query1); verifyDataRows(result1, rows(expected)); - String query2 = "SELECT KeywordBody FROM " + TEST_INDEX_WILDCARD + " WHERE wildcardquery(KeywordBody, 'test wild??rd')"; + String query2 = + "SELECT KeywordBody FROM " + + TEST_INDEX_WILDCARD + + " WHERE wildcardquery(KeywordBody, 'test wild??rd')"; JSONObject result2 = executeJdbcRequest(query2); verifyDataRows(result2, rows(expected)); } @@ -50,11 +61,17 @@ public void test_wildcard_query_question_mark_function() throws IOException { // SQL uses ? as a wildcard which is converted to * in WildcardQuery.java @Test public void test_wildcard_query_sql_wildcard_percent_conversion() throws IOException { - String query1 = "SELECT KeywordBody FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(KeywordBody, 'test%')"; + String query1 = + "SELECT KeywordBody FROM " + + TEST_INDEX_WILDCARD + + " WHERE wildcard_query(KeywordBody, 'test%')"; JSONObject result1 = executeJdbcRequest(query1); assertEquals(8, result1.getInt("total")); - String query2 = "SELECT KeywordBody FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(KeywordBody, 'test*')"; + String query2 = + "SELECT KeywordBody FROM " + + TEST_INDEX_WILDCARD + + " WHERE wildcard_query(KeywordBody, 'test*')"; JSONObject result2 = executeJdbcRequest(query2); assertEquals(result1.getInt("total"), result2.getInt("total")); } @@ -62,27 +79,41 @@ public void test_wildcard_query_sql_wildcard_percent_conversion() throws IOExcep // SQL uses _ as a wildcard which is converted to ? in WildcardQuery.java @Test public void test_wildcard_query_sql_wildcard_underscore_conversion() throws IOException { - String query1 = "SELECT KeywordBody FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(KeywordBody, 'test wild_ard*')"; + String query1 = + "SELECT KeywordBody FROM " + + TEST_INDEX_WILDCARD + + " WHERE wildcard_query(KeywordBody, 'test wild_ard*')"; JSONObject result1 = executeJdbcRequest(query1); assertEquals(7, result1.getInt("total")); - String query2 = "SELECT KeywordBody FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(KeywordBody, 'test wild?ard*')"; + String query2 = + "SELECT KeywordBody FROM " + + TEST_INDEX_WILDCARD + + " WHERE wildcard_query(KeywordBody, 'test wild?ard*')"; JSONObject result2 = executeJdbcRequest(query2); assertEquals(result1.getInt("total"), result2.getInt("total")); } @Test public void test_escaping_wildcard_percent_in_the_beginning_of_text() throws IOException { - String query = "SELECT KeywordBody FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(KeywordBody, '\\\\%*')"; + String query = + "SELECT KeywordBody FROM " + + TEST_INDEX_WILDCARD + + " WHERE wildcard_query(KeywordBody, '\\\\%*')"; JSONObject result = executeJdbcRequest(query); verifyDataRows(result, rows("%test wildcard in the beginning of the text")); } @Test public void test_escaping_wildcard_percent_in_text() throws IOException { - String query = "SELECT KeywordBody FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(KeywordBody, '*\\\\%%')"; + String query = + "SELECT KeywordBody FROM " + + TEST_INDEX_WILDCARD + + " WHERE wildcard_query(KeywordBody, '*\\\\%%')"; JSONObject result = executeJdbcRequest(query); - verifyDataRows(result, rows("test wildcard in % the middle of the text"), + verifyDataRows( + result, + rows("test wildcard in % the middle of the text"), rows("test wildcard %% beside each other"), rows("test wildcard in the end of the text%"), rows("%test wildcard in the beginning of the text")); @@ -90,30 +121,44 @@ public void test_escaping_wildcard_percent_in_text() throws IOException { @Test public void test_escaping_wildcard_percent_in_the_end_of_text() throws IOException { - String query = "SELECT KeywordBody FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(KeywordBody, '*\\\\%')"; + String query = + "SELECT KeywordBody FROM " + + TEST_INDEX_WILDCARD + + " WHERE wildcard_query(KeywordBody, '*\\\\%')"; JSONObject result = executeJdbcRequest(query); verifyDataRows(result, rows("test wildcard in the end of the text%")); } @Test public void test_double_escaped_wildcard_percent() throws IOException { - String query = "SELECT KeywordBody FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(KeywordBody, '*\\\\%\\\\%*')"; + String query = + "SELECT KeywordBody FROM " + + TEST_INDEX_WILDCARD + + " WHERE wildcard_query(KeywordBody, '*\\\\%\\\\%*')"; JSONObject result = executeJdbcRequest(query); verifyDataRows(result, rows("test wildcard %% beside each other")); } @Test public void test_escaping_wildcard_underscore_in_the_beginning_of_text() throws IOException { - String query = "SELECT KeywordBody FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(KeywordBody, '\\\\_*')"; + String query = + "SELECT KeywordBody FROM " + + TEST_INDEX_WILDCARD + + " WHERE wildcard_query(KeywordBody, '\\\\_*')"; JSONObject result = executeJdbcRequest(query); verifyDataRows(result, rows("_test wildcard in the beginning of the text")); } @Test public void test_escaping_wildcard_underscore_in_text() throws IOException { - String query = "SELECT KeywordBody FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(KeywordBody, '*\\\\_*')"; + String query = + "SELECT KeywordBody FROM " + + TEST_INDEX_WILDCARD + + " WHERE wildcard_query(KeywordBody, '*\\\\_*')"; JSONObject result = executeJdbcRequest(query); - verifyDataRows(result, rows("test wildcard in _ the middle of the text"), + verifyDataRows( + result, + rows("test wildcard in _ the middle of the text"), rows("test wildcard __ beside each other"), rows("test wildcard in the end of the text_"), rows("_test wildcard in the beginning of the text"), @@ -122,60 +167,77 @@ public void test_escaping_wildcard_underscore_in_text() throws IOException { @Test public void test_escaping_wildcard_underscore_in_the_end_of_text() throws IOException { - String query = "SELECT KeywordBody FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(KeywordBody, '*\\\\_')"; + String query = + "SELECT KeywordBody FROM " + + TEST_INDEX_WILDCARD + + " WHERE wildcard_query(KeywordBody, '*\\\\_')"; JSONObject result = executeJdbcRequest(query); - verifyDataRows(result, - rows("test wildcard in the end of the text_"), - rows("test backslash wildcard \\_")); + verifyDataRows( + result, rows("test wildcard in the end of the text_"), rows("test backslash wildcard \\_")); } @Test public void test_double_escaped_wildcard_underscore() throws IOException { - String query = "SELECT KeywordBody FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(KeywordBody, '*\\\\_\\\\_*')"; + String query = + "SELECT KeywordBody FROM " + + TEST_INDEX_WILDCARD + + " WHERE wildcard_query(KeywordBody, '*\\\\_\\\\_*')"; JSONObject result = executeJdbcRequest(query); verifyDataRows(result, rows("test wildcard __ beside each other")); } @Test public void test_backslash_wildcard() throws IOException { - String query = "SELECT KeywordBody FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(KeywordBody, '*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\_')"; + String query = + "SELECT KeywordBody FROM " + + TEST_INDEX_WILDCARD + + " WHERE wildcard_query(KeywordBody, '*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\_')"; JSONObject result = executeJdbcRequest(query); verifyDataRows(result, rows("test backslash wildcard \\_")); } @Test public void all_params_test() throws IOException { - String query = "SELECT KeywordBody FROM " + TEST_INDEX_WILDCARD - + " WHERE wildcard_query(KeywordBody, 'test*', boost = 0.9," - + " case_insensitive=true, rewrite='constant_score')"; + String query = + "SELECT KeywordBody FROM " + + TEST_INDEX_WILDCARD + + " WHERE wildcard_query(KeywordBody, 'test*', boost = 0.9," + + " case_insensitive=true, rewrite='constant_score')"; JSONObject result = executeJdbcRequest(query); assertEquals(8, result.getInt("total")); } @Test public void test_wildcard_query_on_text_field_with_one_word() throws IOException { - String query = "SELECT * FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(TextBody, 'test*')"; + String query = + "SELECT * FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(TextBody, 'test*')"; JSONObject result = executeJdbcRequest(query); assertEquals(9, result.getInt("total")); } @Test public void test_wildcard_query_on_text_keyword_field_with_one_word() throws IOException { - String query = "SELECT * FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(TextKeywordBody, 'test*')"; + String query = + "SELECT * FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(TextKeywordBody, 'test*')"; JSONObject result = executeJdbcRequest(query); assertEquals(9, result.getInt("total")); } @Test public void test_wildcard_query_on_text_field_with_greater_than_one_word() throws IOException { - String query = "SELECT * FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(TextBody, 'test wild*')"; + String query = + "SELECT * FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(TextBody, 'test wild*')"; JSONObject result = executeJdbcRequest(query); assertEquals(0, result.getInt("total")); } @Test - public void test_wildcard_query_on_text_keyword_field_with_greater_than_one_word() throws IOException { - String query = "SELECT * FROM " + TEST_INDEX_WILDCARD + " WHERE wildcard_query(TextKeywordBody, 'test wild*')"; + public void test_wildcard_query_on_text_keyword_field_with_greater_than_one_word() + throws IOException { + String query = + "SELECT * FROM " + + TEST_INDEX_WILDCARD + + " WHERE wildcard_query(TextKeywordBody, 'test wild*')"; JSONObject result = executeJdbcRequest(query); assertEquals(0, result.getInt("total")); } diff --git a/integ-test/src/test/java/org/opensearch/sql/sql/WindowFunctionIT.java b/integ-test/src/test/java/org/opensearch/sql/sql/WindowFunctionIT.java index b586125af3..86257e6a22 100644 --- a/integ-test/src/test/java/org/opensearch/sql/sql/WindowFunctionIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/sql/WindowFunctionIT.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql; import static org.opensearch.sql.util.MatcherUtils.rows; @@ -25,11 +24,16 @@ protected void init() throws Exception { @Test public void testOrderByNullFirst() { - JSONObject response = new JSONObject( - executeQuery("SELECT age, ROW_NUMBER() OVER(ORDER BY age DESC NULLS FIRST) " - + "FROM " + TestsConstants.TEST_INDEX_BANK_WITH_NULL_VALUES, "jdbc")); + JSONObject response = + new JSONObject( + executeQuery( + "SELECT age, ROW_NUMBER() OVER(ORDER BY age DESC NULLS FIRST) " + + "FROM " + + TestsConstants.TEST_INDEX_BANK_WITH_NULL_VALUES, + "jdbc")); - verifyDataRows(response, + verifyDataRows( + response, rows(null, 1), rows(36, 2), rows(36, 3), @@ -41,11 +45,16 @@ public void testOrderByNullFirst() { @Test public void testOrderByNullLast() { - JSONObject response = new JSONObject( - executeQuery("SELECT age, ROW_NUMBER() OVER(ORDER BY age NULLS LAST) " - + "FROM " + TestsConstants.TEST_INDEX_BANK_WITH_NULL_VALUES, "jdbc")); + JSONObject response = + new JSONObject( + executeQuery( + "SELECT age, ROW_NUMBER() OVER(ORDER BY age NULLS LAST) " + + "FROM " + + TestsConstants.TEST_INDEX_BANK_WITH_NULL_VALUES, + "jdbc")); - verifyDataRows(response, + verifyDataRows( + response, rows(28, 1), rows(32, 2), rows(33, 3), @@ -57,10 +66,15 @@ public void testOrderByNullLast() { @Test public void testDistinctCountOverNull() { - JSONObject response = new JSONObject(executeQuery( - "SELECT lastname, COUNT(DISTINCT gender) OVER() " - + "FROM " + TestsConstants.TEST_INDEX_BANK, "jdbc")); - verifyDataRows(response, + JSONObject response = + new JSONObject( + executeQuery( + "SELECT lastname, COUNT(DISTINCT gender) OVER() " + + "FROM " + + TestsConstants.TEST_INDEX_BANK, + "jdbc")); + verifyDataRows( + response, rows("Duke Willmington", 2), rows("Bond", 2), rows("Bates", 2), @@ -72,10 +86,15 @@ public void testDistinctCountOverNull() { @Test public void testDistinctCountOver() { - JSONObject response = new JSONObject(executeQuery( - "SELECT lastname, COUNT(DISTINCT gender) OVER(ORDER BY lastname) " - + "FROM " + TestsConstants.TEST_INDEX_BANK, "jdbc")); - verifyDataRowsInOrder(response, + JSONObject response = + new JSONObject( + executeQuery( + "SELECT lastname, COUNT(DISTINCT gender) OVER(ORDER BY lastname) " + + "FROM " + + TestsConstants.TEST_INDEX_BANK, + "jdbc")); + verifyDataRowsInOrder( + response, rows("Adams", 1), rows("Ayala", 2), rows("Bates", 2), @@ -87,10 +106,15 @@ public void testDistinctCountOver() { @Test public void testDistinctCountPartition() { - JSONObject response = new JSONObject(executeQuery( - "SELECT lastname, COUNT(DISTINCT gender) OVER(PARTITION BY gender ORDER BY lastname) " - + "FROM " + TestsConstants.TEST_INDEX_BANK, "jdbc")); - verifyDataRowsInOrder(response, + JSONObject response = + new JSONObject( + executeQuery( + "SELECT lastname, COUNT(DISTINCT gender) OVER(PARTITION BY gender ORDER BY" + + " lastname) FROM " + + TestsConstants.TEST_INDEX_BANK, + "jdbc")); + verifyDataRowsInOrder( + response, rows("Ayala", 1), rows("Bates", 1), rows("Mcpherson", 1), @@ -99,5 +123,4 @@ public void testDistinctCountPartition() { rows("Duke Willmington", 1), rows("Ratliff", 1)); } - } diff --git a/integ-test/src/test/java/org/opensearch/sql/util/StandaloneModule.java b/integ-test/src/test/java/org/opensearch/sql/util/StandaloneModule.java index ad8afc47ca..5d6f0b5a55 100644 --- a/integ-test/src/test/java/org/opensearch/sql/util/StandaloneModule.java +++ b/integ-test/src/test/java/org/opensearch/sql/util/StandaloneModule.java @@ -37,8 +37,8 @@ import org.opensearch.sql.storage.StorageEngine; /** - * A utility class which registers SQL engine singletons as `OpenSearchPluginModule` does. - * It is needed to get access to those instances in test and validate their behavior. + * A utility class which registers SQL engine singletons as `OpenSearchPluginModule` does. It is + * needed to get access to those instances in test and validate their behavior. */ @RequiredArgsConstructor public class StandaloneModule extends AbstractModule { @@ -53,8 +53,7 @@ public class StandaloneModule extends AbstractModule { BuiltinFunctionRepository.getInstance(); @Override - protected void configure() { - } + protected void configure() {} @Provides public OpenSearchClient openSearchClient() { @@ -67,8 +66,8 @@ public StorageEngine storageEngine(OpenSearchClient client) { } @Provides - public ExecutionEngine executionEngine(OpenSearchClient client, ExecutionProtector protector, - PlanSerializer planSerializer) { + public ExecutionEngine executionEngine( + OpenSearchClient client, ExecutionProtector protector, PlanSerializer planSerializer) { return new OpenSearchExecutionEngine(client, protector, planSerializer); } diff --git a/integ-test/src/test/java/org/opensearch/sql/util/TestUtils.java b/integ-test/src/test/java/org/opensearch/sql/util/TestUtils.java index 3281c172cb..ac5cee118c 100644 --- a/integ-test/src/test/java/org/opensearch/sql/util/TestUtils.java +++ b/integ-test/src/test/java/org/opensearch/sql/util/TestUtils.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.util; import static com.google.common.base.Strings.isNullOrEmpty; @@ -44,9 +43,9 @@ public class TestUtils { /** * Create test index by REST client. * - * @param client client connection + * @param client client connection * @param indexName test index name - * @param mapping test index mapping or null if no predefined mapping + * @param mapping test index mapping or null if no predefined mapping */ public static void createIndexByRestClient(RestClient client, String indexName, String mapping) { Request request = new Request("PUT", "/" + indexName); @@ -57,16 +56,16 @@ public static void createIndexByRestClient(RestClient client, String indexName, } /** - * https://github.com/elastic/elasticsearch/pull/49959 - * Deprecate creation of dot-prefixed index names except for hidden and system indices. - * Create hidden index by REST client. + * https://github.com/elastic/elasticsearch/pull/49959
+ * Deprecate creation of dot-prefixed index + * names except for hidden and system indices. Create hidden index by REST client. * - * @param client client connection + * @param client client connection * @param indexName test index name - * @param mapping test index mapping or null if no predefined mapping + * @param mapping test index mapping or null if no predefined mapping */ - public static void createHiddenIndexByRestClient(RestClient client, String indexName, - String mapping) { + public static void createHiddenIndexByRestClient( + RestClient client, String indexName, String mapping) { Request request = new Request("PUT", "/" + indexName); JSONObject jsonObject = isNullOrEmpty(mapping) ? new JSONObject() : new JSONObject(mapping); jsonObject.put("settings", new JSONObject("{\"index\":{\"hidden\":true}}")); @@ -76,11 +75,11 @@ public static void createHiddenIndexByRestClient(RestClient client, String index } /** - * Check if index already exists by OpenSearch index exists API which returns: - * 200 - specified indices or aliases exist + * Check if index already exists by OpenSearch index exists API which returns:
+ * 200 - specified indices or aliases exist
* 404 - one or more indices specified or aliases do not exist * - * @param client client connection + * @param client client connection * @param indexName index name * @return true for index exist */ @@ -96,13 +95,13 @@ public static boolean isIndexExist(RestClient client, String indexName) { /** * Load test data set by REST client. * - * @param client client connection - * @param indexName index name + * @param client client connection + * @param indexName index name * @param dataSetFilePath file path of test data set * @throws IOException */ - public static void loadDataByRestClient(RestClient client, String indexName, - String dataSetFilePath) throws IOException { + public static void loadDataByRestClient( + RestClient client, String indexName, String dataSetFilePath) throws IOException { Path path = Paths.get(getResourceFilePath(dataSetFilePath)); Request request = new Request("POST", "/" + indexName + "/_bulk?refresh=true"); request.setJsonEntity(new String(Files.readAllBytes(path))); @@ -112,7 +111,7 @@ public static void loadDataByRestClient(RestClient client, String indexName, /** * Perform a request by REST client. * - * @param client client connection + * @param client client connection * @param request request object */ public static Response performRequest(RestClient client, Request request) { @@ -129,566 +128,567 @@ public static Response performRequest(RestClient client, Request request) { } public static String getAccountIndexMapping() { - return "{ \"mappings\": {" + - " \"properties\": {\n" + - " \"gender\": {\n" + - " \"type\": \"text\",\n" + - " \"fielddata\": true\n" + - " }," + - " \"address\": {\n" + - " \"type\": \"text\",\n" + - " \"fielddata\": true\n" + - " }," + - " \"firstname\": {\n" + - " \"type\": \"text\",\n" + - " \"fielddata\": true,\n" + - " \"fields\": {\n" + - " \"keyword\": {\n" + - " \"type\": \"keyword\",\n" + - " \"ignore_above\": 256\n" + - " }" + - " }" + - " }," + - " \"lastname\": {\n" + - " \"type\": \"text\",\n" + - " \"fielddata\": true,\n" + - " \"fields\": {\n" + - " \"keyword\": {\n" + - " \"type\": \"keyword\",\n" + - " \"ignore_above\": 256\n" + - " }" + - " }" + - " }," + - " \"state\": {\n" + - " \"type\": \"text\",\n" + - " \"fielddata\": true,\n" + - " \"fields\": {\n" + - " \"keyword\": {\n" + - " \"type\": \"keyword\",\n" + - " \"ignore_above\": 256\n" + - " }" + - " }" + - " }" + - " }" + - " }" + - "}"; + return "{ \"mappings\": {" + + " \"properties\": {\n" + + " \"gender\": {\n" + + " \"type\": \"text\",\n" + + " \"fielddata\": true\n" + + " }," + + " \"address\": {\n" + + " \"type\": \"text\",\n" + + " \"fielddata\": true\n" + + " }," + + " \"firstname\": {\n" + + " \"type\": \"text\",\n" + + " \"fielddata\": true,\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }" + + " }" + + " }," + + " \"lastname\": {\n" + + " \"type\": \"text\",\n" + + " \"fielddata\": true,\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }" + + " }" + + " }," + + " \"state\": {\n" + + " \"type\": \"text\",\n" + + " \"fielddata\": true,\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }" + + " }" + + " }" + + " }" + + " }" + + "}"; } public static String getPhraseIndexMapping() { - return "{ \"mappings\": {" + - " \"properties\": {\n" + - " \"phrase\": {\n" + - " \"type\": \"text\",\n" + - " \"store\": true\n" + - " }" + - " }" + - " }" + - "}"; + return "{ \"mappings\": {" + + " \"properties\": {\n" + + " \"phrase\": {\n" + + " \"type\": \"text\",\n" + + " \"store\": true\n" + + " }" + + " }" + + " }" + + "}"; } public static String getDogIndexMapping() { - return "{ \"mappings\": {" + - " \"properties\": {\n" + - " \"dog_name\": {\n" + - " \"type\": \"text\",\n" + - " \"fielddata\": true\n" + - " }" + - " }" + - " }" + - "}"; + return "{ \"mappings\": {" + + " \"properties\": {\n" + + " \"dog_name\": {\n" + + " \"type\": \"text\",\n" + + " \"fielddata\": true\n" + + " }" + + " }" + + " }" + + "}"; } public static String getDogs2IndexMapping() { - return "{ \"mappings\": {" + - " \"properties\": {\n" + - " \"dog_name\": {\n" + - " \"type\": \"text\",\n" + - " \"fielddata\": true\n" + - " },\n" + - " \"holdersName\": {\n" + - " \"type\": \"keyword\"\n" + - " }" + - " }" + - " }" + - "}"; + return "{ \"mappings\": {" + + " \"properties\": {\n" + + " \"dog_name\": {\n" + + " \"type\": \"text\",\n" + + " \"fielddata\": true\n" + + " },\n" + + " \"holdersName\": {\n" + + " \"type\": \"keyword\"\n" + + " }" + + " }" + + " }" + + "}"; } public static String getDogs3IndexMapping() { - return "{ \"mappings\": {" + - " \"properties\": {\n" + - " \"holdersName\": {\n" + - " \"type\": \"keyword\"\n" + - " },\n" + - " \"color\": {\n" + - " \"type\": \"text\"\n" + - " }" + - " }" + - " }" + - "}"; + return "{ \"mappings\": {" + + " \"properties\": {\n" + + " \"holdersName\": {\n" + + " \"type\": \"keyword\"\n" + + " },\n" + + " \"color\": {\n" + + " \"type\": \"text\"\n" + + " }" + + " }" + + " }" + + "}"; } public static String getPeople2IndexMapping() { - return "{ \"mappings\": {" + - " \"properties\": {\n" + - " \"firstname\": {\n" + - " \"type\": \"keyword\"\n" + - " }" + - " }" + - " }" + - "}"; + return "{ \"mappings\": {" + + " \"properties\": {\n" + + " \"firstname\": {\n" + + " \"type\": \"keyword\"\n" + + " }" + + " }" + + " }" + + "}"; } public static String getGameOfThronesIndexMapping() { - return "{ \"mappings\": { " + - " \"properties\": {\n" + - " \"nickname\": {\n" + - " \"type\":\"text\", " + - " \"fielddata\":true" + - " },\n" + - " \"name\": {\n" + - " \"properties\": {\n" + - " \"firstname\": {\n" + - " \"type\": \"text\",\n" + - " \"fielddata\": true\n" + - " },\n" + - " \"lastname\": {\n" + - " \"type\": \"text\",\n" + - " \"fielddata\": true\n" + - " },\n" + - " \"ofHerName\": {\n" + - " \"type\": \"integer\"\n" + - " },\n" + - " \"ofHisName\": {\n" + - " \"type\": \"integer\"\n" + - " }\n" + - " }\n" + - " },\n" + - " \"house\": {\n" + - " \"type\": \"text\",\n" + - " \"fields\": {\n" + - " \"keyword\": {\n" + - " \"type\": \"keyword\"\n" + - " }\n" + - " }\n" + - " },\n" + - " \"gender\": {\n" + - " \"type\": \"text\",\n" + - " \"fields\": {\n" + - " \"keyword\": {\n" + - " \"type\": \"keyword\"\n" + - " }\n" + - " }\n" + - " }" + - "} } }"; + return "{ \"mappings\": { " + + " \"properties\": {\n" + + " \"nickname\": {\n" + + " \"type\":\"text\", " + + " \"fielddata\":true" + + " },\n" + + " \"name\": {\n" + + " \"properties\": {\n" + + " \"firstname\": {\n" + + " \"type\": \"text\",\n" + + " \"fielddata\": true\n" + + " },\n" + + " \"lastname\": {\n" + + " \"type\": \"text\",\n" + + " \"fielddata\": true\n" + + " },\n" + + " \"ofHerName\": {\n" + + " \"type\": \"integer\"\n" + + " },\n" + + " \"ofHisName\": {\n" + + " \"type\": \"integer\"\n" + + " }\n" + + " }\n" + + " },\n" + + " \"house\": {\n" + + " \"type\": \"text\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\"\n" + + " }\n" + + " }\n" + + " },\n" + + " \"gender\": {\n" + + " \"type\": \"text\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\"\n" + + " }\n" + + " }\n" + + " }" + + "} } }"; } // System public static String getOdbcIndexMapping() { - return "{\n" + - "\t\"mappings\" :{\n" + - "\t\t\"properties\":{\n" + - "\t\t\t\"odbc_time\":{\n" + - "\t\t\t\t\"type\":\"date\",\n" + - "\t\t\t\t\"format\": \"'{ts' ''yyyy-MM-dd HH:mm:ss.SSS'''}'\"\n" + - "\t\t\t},\n" + - "\t\t\t\"docCount\":{\n" + - "\t\t\t\t\"type\":\"text\"\n" + - "\t\t\t}\n" + - "\t\t}\n" + - "\t}\n" + - "}"; + return "{\n" + + "\t\"mappings\" :{\n" + + "\t\t\"properties\":{\n" + + "\t\t\t\"odbc_time\":{\n" + + "\t\t\t\t\"type\":\"date\",\n" + + "\t\t\t\t\"format\": \"'{ts' ''yyyy-MM-dd HH:mm:ss.SSS'''}'\"\n" + + "\t\t\t},\n" + + "\t\t\t\"docCount\":{\n" + + "\t\t\t\t\"type\":\"text\"\n" + + "\t\t\t}\n" + + "\t\t}\n" + + "\t}\n" + + "}"; } public static String getLocationIndexMapping() { - return "{\n" + - "\t\"mappings\" :{\n" + - "\t\t\"properties\":{\n" + - "\t\t\t\"place\":{\n" + - "\t\t\t\t\"type\":\"geo_shape\"\n" + - //"\t\t\t\t\"tree\": \"quadtree\",\n" + // Field tree and precision are deprecated in OpenSearch - //"\t\t\t\t\"precision\": \"10km\"\n" + - "\t\t\t},\n" + - "\t\t\t\"center\":{\n" + - "\t\t\t\t\"type\":\"geo_point\"\n" + - "\t\t\t},\n" + - "\t\t\t\"description\":{\n" + - "\t\t\t\t\"type\":\"text\"\n" + - "\t\t\t}\n" + - "\t\t}\n" + - "\t}\n" + - "}"; + return "{\n" + + "\t\"mappings\" :{\n" + + "\t\t\"properties\":{\n" + + "\t\t\t\"place\":{\n" + + "\t\t\t\t\"type\":\"geo_shape\"\n" + + + // "\t\t\t\t\"tree\": \"quadtree\",\n" + // Field tree and precision are deprecated in + // OpenSearch + // "\t\t\t\t\"precision\": \"10km\"\n" + + "\t\t\t},\n" + + "\t\t\t\"center\":{\n" + + "\t\t\t\t\"type\":\"geo_point\"\n" + + "\t\t\t},\n" + + "\t\t\t\"description\":{\n" + + "\t\t\t\t\"type\":\"text\"\n" + + "\t\t\t}\n" + + "\t\t}\n" + + "\t}\n" + + "}"; } public static String getEmployeeNestedTypeIndexMapping() { - return "{\n" + - " \"mappings\": {\n" + - " \"properties\": {\n" + - " \"comments\": {\n" + - " \"type\": \"nested\",\n" + - " \"properties\": {\n" + - " \"date\": {\n" + - " \"type\": \"date\"\n" + - " },\n" + - " \"likes\": {\n" + - " \"type\": \"long\"\n" + - " },\n" + - " \"message\": {\n" + - " \"type\": \"text\",\n" + - " \"fields\": {\n" + - " \"keyword\": {\n" + - " \"type\": \"keyword\",\n" + - " \"ignore_above\": 256\n" + - " }\n" + - " }\n" + - " }\n" + - " }\n" + - " },\n" + - " \"id\": {\n" + - " \"type\": \"long\"\n" + - " },\n" + - " \"name\": {\n" + - " \"type\": \"text\",\n" + - " \"fields\": {\n" + - " \"keyword\": {\n" + - " \"type\": \"keyword\",\n" + - " \"ignore_above\": 256\n" + - " }\n" + - " }\n" + - " },\n" + - " \"projects\": {\n" + - " \"type\": \"nested\",\n" + - " \"properties\": {\n" + - " \"address\": {\n" + - " \"type\": \"nested\",\n" + - " \"properties\": {\n" + - " \"city\": {\n" + - " \"type\": \"text\",\n" + - " \"fields\": {\n" + - " \"keyword\": {\n" + - " \"type\": \"keyword\",\n" + - " \"ignore_above\": 256\n" + - " }\n" + - " }\n" + - " },\n" + - " \"state\": {\n" + - " \"type\": \"text\",\n" + - " \"fields\": {\n" + - " \"keyword\": {\n" + - " \"type\": \"keyword\",\n" + - " \"ignore_above\": 256\n" + - " }\n" + - " }\n" + - " }\n" + - " }\n" + - " },\n" + - " \"name\": {\n" + - " \"type\": \"text\",\n" + - " \"fields\": {\n" + - " \"keyword\": {\n" + - " \"type\": \"keyword\"\n" + - " }\n" + - " },\n" + - " \"fielddata\": true\n" + - " },\n" + - " \"started_year\": {\n" + - " \"type\": \"long\"\n" + - " }\n" + - " }\n" + - " },\n" + - " \"title\": {\n" + - " \"type\": \"text\",\n" + - " \"fields\": {\n" + - " \"keyword\": {\n" + - " \"type\": \"keyword\",\n" + - " \"ignore_above\": 256\n" + - " }\n" + - " }\n" + - " }\n" + - " }\n" + - " }\n" + - "}\n"; + return "{\n" + + " \"mappings\": {\n" + + " \"properties\": {\n" + + " \"comments\": {\n" + + " \"type\": \"nested\",\n" + + " \"properties\": {\n" + + " \"date\": {\n" + + " \"type\": \"date\"\n" + + " },\n" + + " \"likes\": {\n" + + " \"type\": \"long\"\n" + + " },\n" + + " \"message\": {\n" + + " \"type\": \"text\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " }\n" + + " }\n" + + " },\n" + + " \"id\": {\n" + + " \"type\": \"long\"\n" + + " },\n" + + " \"name\": {\n" + + " \"type\": \"text\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " },\n" + + " \"projects\": {\n" + + " \"type\": \"nested\",\n" + + " \"properties\": {\n" + + " \"address\": {\n" + + " \"type\": \"nested\",\n" + + " \"properties\": {\n" + + " \"city\": {\n" + + " \"type\": \"text\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " },\n" + + " \"state\": {\n" + + " \"type\": \"text\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " }\n" + + " }\n" + + " },\n" + + " \"name\": {\n" + + " \"type\": \"text\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\"\n" + + " }\n" + + " },\n" + + " \"fielddata\": true\n" + + " },\n" + + " \"started_year\": {\n" + + " \"type\": \"long\"\n" + + " }\n" + + " }\n" + + " },\n" + + " \"title\": {\n" + + " \"type\": \"text\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " }\n" + + " }\n" + + " }\n" + + "}\n"; } - public static String getNestedTypeIndexMapping() { - return "{ \"mappings\": {\n" + - " \"properties\": {\n" + - " \"message\": {\n" + - " \"type\": \"nested\",\n" + - " \"properties\": {\n" + - " \"info\": {\n" + - " \"type\": \"keyword\",\n" + - " \"index\": \"true\"\n" + - " },\n" + - " \"author\": {\n" + - " \"type\": \"keyword\",\n" + - " \"fields\": {\n" + - " \"keyword\": {\n" + - " \"type\": \"keyword\",\n" + - " \"ignore_above\" : 256\n" + - " }\n" + - " },\n" + - " \"index\": \"true\"\n" + - " },\n" + - " \"dayOfWeek\": {\n" + - " \"type\": \"long\"\n" + - " }\n" + - " }\n" + - " },\n" + - " \"comment\": {\n" + - " \"type\": \"nested\",\n" + - " \"properties\": {\n" + - " \"data\": {\n" + - " \"type\": \"keyword\",\n" + - " \"index\": \"true\"\n" + - " },\n" + - " \"likes\": {\n" + - " \"type\": \"long\"\n" + - " }\n" + - " }\n" + - " },\n" + - " \"myNum\": {\n" + - " \"type\": \"long\"\n" + - " },\n" + - " \"someField\": {\n" + - " \"type\": \"keyword\",\n" + - " \"index\": \"true\"\n" + - " }\n" + - " }\n" + - " }\n" + - " }}"; + return "{ \"mappings\": {\n" + + " \"properties\": {\n" + + " \"message\": {\n" + + " \"type\": \"nested\",\n" + + " \"properties\": {\n" + + " \"info\": {\n" + + " \"type\": \"keyword\",\n" + + " \"index\": \"true\"\n" + + " },\n" + + " \"author\": {\n" + + " \"type\": \"keyword\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\" : 256\n" + + " }\n" + + " },\n" + + " \"index\": \"true\"\n" + + " },\n" + + " \"dayOfWeek\": {\n" + + " \"type\": \"long\"\n" + + " }\n" + + " }\n" + + " },\n" + + " \"comment\": {\n" + + " \"type\": \"nested\",\n" + + " \"properties\": {\n" + + " \"data\": {\n" + + " \"type\": \"keyword\",\n" + + " \"index\": \"true\"\n" + + " },\n" + + " \"likes\": {\n" + + " \"type\": \"long\"\n" + + " }\n" + + " }\n" + + " },\n" + + " \"myNum\": {\n" + + " \"type\": \"long\"\n" + + " },\n" + + " \"someField\": {\n" + + " \"type\": \"keyword\",\n" + + " \"index\": \"true\"\n" + + " }\n" + + " }\n" + + " }\n" + + " }}"; } public static String getJoinTypeIndexMapping() { - return "{\n" + - " \"mappings\": {\n" + - " \"properties\": {\n" + - " \"join_field\": {\n" + - " \"type\": \"join\",\n" + - " \"relations\": {\n" + - " \"parentType\": \"childrenType\"\n" + - " }\n" + - " },\n" + - " \"parentTile\": {\n" + - " \"index\": \"true\",\n" + - " \"type\": \"keyword\"\n" + - " },\n" + - " \"dayOfWeek\": {\n" + - " \"type\": \"long\"\n" + - " },\n" + - " \"author\": {\n" + - " \"index\": \"true\",\n" + - " \"type\": \"keyword\"\n" + - " },\n" + - " \"info\": {\n" + - " \"index\": \"true\",\n" + - " \"type\": \"keyword\"\n" + - " }\n" + - " }\n" + - " }\n" + - "}"; + return "{\n" + + " \"mappings\": {\n" + + " \"properties\": {\n" + + " \"join_field\": {\n" + + " \"type\": \"join\",\n" + + " \"relations\": {\n" + + " \"parentType\": \"childrenType\"\n" + + " }\n" + + " },\n" + + " \"parentTile\": {\n" + + " \"index\": \"true\",\n" + + " \"type\": \"keyword\"\n" + + " },\n" + + " \"dayOfWeek\": {\n" + + " \"type\": \"long\"\n" + + " },\n" + + " \"author\": {\n" + + " \"index\": \"true\",\n" + + " \"type\": \"keyword\"\n" + + " },\n" + + " \"info\": {\n" + + " \"index\": \"true\",\n" + + " \"type\": \"keyword\"\n" + + " }\n" + + " }\n" + + " }\n" + + "}"; } public static String getBankIndexMapping() { - return "{\n" + - " \"mappings\": {\n" + - " \"properties\": {\n" + - " \"account_number\": {\n" + - " \"type\": \"long\"\n" + - " },\n" + - " \"address\": {\n" + - " \"type\": \"text\"\n" + - " },\n" + - " \"age\": {\n" + - " \"type\": \"integer\"\n" + - " },\n" + - " \"balance\": {\n" + - " \"type\": \"long\"\n" + - " },\n" + - " \"birthdate\": {\n" + - " \"type\": \"date\"\n" + - " },\n" + - " \"city\": {\n" + - " \"type\": \"keyword\"\n" + - " },\n" + - " \"email\": {\n" + - " \"type\": \"text\"\n" + - " },\n" + - " \"employer\": {\n" + - " \"type\": \"text\"\n" + - " },\n" + - " \"firstname\": {\n" + - " \"type\": \"text\"\n" + - " },\n" + - " \"gender\": {\n" + - " \"type\": \"text\",\n" + - " \"fielddata\": true\n" + - " }," + - " \"lastname\": {\n" + - " \"type\": \"keyword\"\n" + - " },\n" + - " \"male\": {\n" + - " \"type\": \"boolean\"\n" + - " },\n" + - " \"state\": {\n" + - " \"type\": \"text\",\n" + - " \"fields\": {\n" + - " \"keyword\": {\n" + - " \"type\": \"keyword\",\n" + - " \"ignore_above\": 256\n" + - " }\n" + - " }\n" + - " }\n" + - " }\n" + - " }\n" + - "}"; + return "{\n" + + " \"mappings\": {\n" + + " \"properties\": {\n" + + " \"account_number\": {\n" + + " \"type\": \"long\"\n" + + " },\n" + + " \"address\": {\n" + + " \"type\": \"text\"\n" + + " },\n" + + " \"age\": {\n" + + " \"type\": \"integer\"\n" + + " },\n" + + " \"balance\": {\n" + + " \"type\": \"long\"\n" + + " },\n" + + " \"birthdate\": {\n" + + " \"type\": \"date\"\n" + + " },\n" + + " \"city\": {\n" + + " \"type\": \"keyword\"\n" + + " },\n" + + " \"email\": {\n" + + " \"type\": \"text\"\n" + + " },\n" + + " \"employer\": {\n" + + " \"type\": \"text\"\n" + + " },\n" + + " \"firstname\": {\n" + + " \"type\": \"text\"\n" + + " },\n" + + " \"gender\": {\n" + + " \"type\": \"text\",\n" + + " \"fielddata\": true\n" + + " }," + + " \"lastname\": {\n" + + " \"type\": \"keyword\"\n" + + " },\n" + + " \"male\": {\n" + + " \"type\": \"boolean\"\n" + + " },\n" + + " \"state\": {\n" + + " \"type\": \"text\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " }\n" + + " }\n" + + " }\n" + + "}"; } public static String getBankWithNullValuesIndexMapping() { - return "{\n" + - " \"mappings\": {\n" + - " \"properties\": {\n" + - " \"account_number\": {\n" + - " \"type\": \"long\"\n" + - " },\n" + - " \"address\": {\n" + - " \"type\": \"text\"\n" + - " },\n" + - " \"age\": {\n" + - " \"type\": \"integer\"\n" + - " },\n" + - " \"balance\": {\n" + - " \"type\": \"long\"\n" + - " },\n" + - " \"gender\": {\n" + - " \"type\": \"text\"\n" + - " },\n" + - " \"firstname\": {\n" + - " \"type\": \"text\"\n" + - " },\n" + - " \"lastname\": {\n" + - " \"type\": \"keyword\"\n" + - " }\n" + - " }\n" + - " }\n" + - "}"; + return "{\n" + + " \"mappings\": {\n" + + " \"properties\": {\n" + + " \"account_number\": {\n" + + " \"type\": \"long\"\n" + + " },\n" + + " \"address\": {\n" + + " \"type\": \"text\"\n" + + " },\n" + + " \"age\": {\n" + + " \"type\": \"integer\"\n" + + " },\n" + + " \"balance\": {\n" + + " \"type\": \"long\"\n" + + " },\n" + + " \"gender\": {\n" + + " \"type\": \"text\"\n" + + " },\n" + + " \"firstname\": {\n" + + " \"type\": \"text\"\n" + + " },\n" + + " \"lastname\": {\n" + + " \"type\": \"keyword\"\n" + + " }\n" + + " }\n" + + " }\n" + + "}"; } public static String getOrderIndexMapping() { - return "{\n" + - " \"mappings\": {\n" + - " \"properties\": {\n" + - " \"id\": {\n" + - " \"type\": \"long\"\n" + - " },\n" + - " \"name\": {\n" + - " \"type\": \"text\",\n" + - " \"fields\": {\n" + - " \"keyword\": {\n" + - " \"type\": \"keyword\",\n" + - " \"ignore_above\": 256\n" + - " }\n" + - " }\n" + - " }\n" + - " }\n" + - " }\n" + - "}"; + return "{\n" + + " \"mappings\": {\n" + + " \"properties\": {\n" + + " \"id\": {\n" + + " \"type\": \"long\"\n" + + " },\n" + + " \"name\": {\n" + + " \"type\": \"text\",\n" + + " \"fields\": {\n" + + " \"keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }\n" + + " }\n" + + " }\n" + + " }\n" + + " }\n" + + "}"; } public static String getWeblogsIndexMapping() { - return "{\n" + - " \"mappings\": {\n" + - " \"properties\": {\n" + - " \"host\": {\n" + - " \"type\": \"ip\"\n" + - " },\n" + - " \"method\": {\n" + - " \"type\": \"text\"\n" + - " },\n" + - " \"url\": {\n" + - " \"type\": \"text\"\n" + - " },\n" + - " \"response\": {\n" + - " \"type\": \"text\"\n" + - " },\n" + - " \"bytes\": {\n" + - " \"type\": \"text\"\n" + - " }\n" + - " }\n" + - " }\n" + - "}"; + return "{\n" + + " \"mappings\": {\n" + + " \"properties\": {\n" + + " \"host\": {\n" + + " \"type\": \"ip\"\n" + + " },\n" + + " \"method\": {\n" + + " \"type\": \"text\"\n" + + " },\n" + + " \"url\": {\n" + + " \"type\": \"text\"\n" + + " },\n" + + " \"response\": {\n" + + " \"type\": \"text\"\n" + + " },\n" + + " \"bytes\": {\n" + + " \"type\": \"text\"\n" + + " }\n" + + " }\n" + + " }\n" + + "}"; } public static String getDateIndexMapping() { - return "{ \"mappings\": {" + - " \"properties\": {\n" + - " \"date_keyword\": {\n" + - " \"type\": \"keyword\",\n" + - " \"ignore_above\": 256\n" + - " }" + - " }" + - " }" + - "}"; + return "{ \"mappings\": {" + + " \"properties\": {\n" + + " \"date_keyword\": {\n" + + " \"type\": \"keyword\",\n" + + " \"ignore_above\": 256\n" + + " }" + + " }" + + " }" + + "}"; } public static String getDateTimeIndexMapping() { - return "{" + - " \"mappings\": {" + - " \"properties\": {" + - " \"birthday\": {" + - " \"type\": \"date\"" + - " }" + - " }" + - " }" + - "}"; + return "{" + + " \"mappings\": {" + + " \"properties\": {" + + " \"birthday\": {" + + " \"type\": \"date\"" + + " }" + + " }" + + " }" + + "}"; } public static String getNestedSimpleIndexMapping() { - return "{" + - " \"mappings\": {" + - " \"properties\": {" + - " \"address\": {" + - " \"type\": \"nested\"," + - " \"properties\": {" + - " \"city\": {" + - " \"type\": \"text\"," + - " \"fields\": {" + - " \"keyword\": {" + - " \"type\": \"keyword\"," + - " \"ignore_above\": 256" + - " }" + - " }" + - " }," + - " \"state\": {" + - " \"type\": \"text\"," + - " \"fields\": {" + - " \"keyword\": {" + - " \"type\": \"keyword\"," + - " \"ignore_above\": 256" + - " }" + - " }" + - " }" + - " }" + - " }," + - " \"age\": {" + - " \"type\": \"long\"" + - " }," + - " \"id\": {" + - " \"type\": \"long\"" + - " }," + - " \"name\": {" + - " \"type\": \"text\"," + - " \"fields\": {" + - " \"keyword\": {" + - " \"type\": \"keyword\"," + - " \"ignore_above\": 256" + - " }" + - " }" + - " }" + - " }" + - " }" + - "}"; + return "{" + + " \"mappings\": {" + + " \"properties\": {" + + " \"address\": {" + + " \"type\": \"nested\"," + + " \"properties\": {" + + " \"city\": {" + + " \"type\": \"text\"," + + " \"fields\": {" + + " \"keyword\": {" + + " \"type\": \"keyword\"," + + " \"ignore_above\": 256" + + " }" + + " }" + + " }," + + " \"state\": {" + + " \"type\": \"text\"," + + " \"fields\": {" + + " \"keyword\": {" + + " \"type\": \"keyword\"," + + " \"ignore_above\": 256" + + " }" + + " }" + + " }" + + " }" + + " }," + + " \"age\": {" + + " \"type\": \"long\"" + + " }," + + " \"id\": {" + + " \"type\": \"long\"" + + " }," + + " \"name\": {" + + " \"type\": \"text\"," + + " \"fields\": {" + + " \"keyword\": {" + + " \"type\": \"keyword\"," + + " \"ignore_above\": 256" + + " }" + + " }" + + " }" + + " }" + + " }" + + "}"; } public static void loadBulk(Client client, String jsonPath, String defaultIndex) @@ -698,8 +698,8 @@ public static void loadBulk(Client client, String jsonPath, String defaultIndex) BulkRequest bulkRequest = new BulkRequest(); try (final InputStream stream = new FileInputStream(absJsonPath); - final Reader streamReader = new InputStreamReader(stream, StandardCharsets.UTF_8); - final BufferedReader br = new BufferedReader(streamReader)) { + final Reader streamReader = new InputStreamReader(stream, StandardCharsets.UTF_8); + final BufferedReader br = new BufferedReader(streamReader)) { while (true) { @@ -728,8 +728,11 @@ public static void loadBulk(Client client, String jsonPath, String defaultIndex) BulkResponse bulkResponse = client.bulk(bulkRequest).actionGet(); if (bulkResponse.hasFailures()) { - throw new Exception("Failed to load test data into index " + defaultIndex + ", " + - bulkResponse.buildFailureMessage()); + throw new Exception( + "Failed to load test data into index " + + defaultIndex + + ", " + + bulkResponse.buildFailureMessage()); } System.out.println(bulkResponse.getItems().length + " documents loaded."); // ensure the documents are searchable @@ -755,8 +758,8 @@ public static String getResponseBody(Response response, boolean retainNewLines) final StringBuilder sb = new StringBuilder(); try (final InputStream is = response.getEntity().getContent(); - final BufferedReader br = new BufferedReader( - new InputStreamReader(is, StandardCharsets.UTF_8))) { + final BufferedReader br = + new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { String line; while ((line = br.readLine()) != null) { @@ -769,15 +772,14 @@ public static String getResponseBody(Response response, boolean retainNewLines) return sb.toString(); } - public static String fileToString(final String filePathFromProjectRoot, - final boolean removeNewLines) - throws IOException { + public static String fileToString( + final String filePathFromProjectRoot, final boolean removeNewLines) throws IOException { final String absolutePath = getResourceFilePath(filePathFromProjectRoot); try (final InputStream stream = new FileInputStream(absolutePath); - final Reader streamReader = new InputStreamReader(stream, StandardCharsets.UTF_8); - final BufferedReader br = new BufferedReader(streamReader)) { + final Reader streamReader = new InputStreamReader(stream, StandardCharsets.UTF_8); + final BufferedReader br = new BufferedReader(streamReader)) { final StringBuilder stringBuilder = new StringBuilder(); String line = br.readLine(); @@ -831,36 +833,41 @@ public static List> getPermutations(final List items) { } final String currentItem = items.get(i); - result.addAll(getPermutations(smallerSet).stream().map(smallerSetPermutation -> { - final List permutation = new ArrayList<>(); - permutation.add(currentItem); - permutation.addAll(smallerSetPermutation); - return permutation; - }).collect(Collectors.toCollection(LinkedList::new))); + result.addAll( + getPermutations(smallerSet).stream() + .map( + smallerSetPermutation -> { + final List permutation = new ArrayList<>(); + permutation.add(currentItem); + permutation.addAll(smallerSetPermutation); + return permutation; + }) + .collect(Collectors.toCollection(LinkedList::new))); } return result; } public static void verifyIsV1Cursor(JSONObject response) { - var legacyCursorPrefixes = Arrays.stream(CursorType.values()) - .map(c -> c.getId() + ":").collect(Collectors.toList()); + var legacyCursorPrefixes = + Arrays.stream(CursorType.values()).map(c -> c.getId() + ":").collect(Collectors.toList()); verifyCursor(response, legacyCursorPrefixes, "v1"); } - public static void verifyIsV2Cursor(JSONObject response) { verifyCursor(response, List.of(CURSOR_PREFIX), "v2"); } - private static void verifyCursor(JSONObject response, List validCursorPrefix, String engineName) { - assertTrue("'cursor' property does not exist", response.has("cursor")); + private static void verifyCursor( + JSONObject response, List validCursorPrefix, String engineName) { + assertTrue("'cursor' property does not exist", response.has("cursor")); - var cursor = response.getString("cursor"); - assertFalse("'cursor' property is empty", cursor.isEmpty()); - assertTrue("The cursor '" + cursor.substring(0, 50) + "...' is not from " + engineName + " engine.", - validCursorPrefix.stream().anyMatch(cursor::startsWith)); - } + var cursor = response.getString("cursor"); + assertFalse("'cursor' property is empty", cursor.isEmpty()); + assertTrue( + "The cursor '" + cursor.substring(0, 50) + "...' is not from " + engineName + " engine.", + validCursorPrefix.stream().anyMatch(cursor::startsWith)); + } public static void verifyNoCursor(JSONObject response) { assertTrue(!response.has("cursor")); From b035b13111af3a87d7d70018068582e12f45f541 Mon Sep 17 00:00:00 2001 From: Mitchell Gale Date: Wed, 16 Aug 2023 14:47:00 -0700 Subject: [PATCH 2/2] [Spotless] Applying Google Code Format for sql files #11 (#1968) * [Spotless] Applying Google Code Format for sql files #11 (#330) * Spotless apply, ignore checkstyle, manual java doc fixes. Signed-off-by: Mitchell Gale * Spotless apply Signed-off-by: Mitchell Gale --------- Signed-off-by: Mitchell Gale * Apply suggestions from code review Co-authored-by: Guian Gumpac Signed-off-by: Mitchell Gale --------- Signed-off-by: Mitchell Gale Signed-off-by: Mitchell Gale Co-authored-by: Guian Gumpac --- build.gradle | 5 +- sql/build.gradle | 5 + .../org/opensearch/sql/sql/SQLService.java | 24 +- .../sql/sql/antlr/AnonymizerListener.java | 22 +- .../sql/sql/antlr/SQLSyntaxParser.java | 10 +- .../sql/sql/domain/SQLQueryRequest.java | 72 +- .../sql/sql/parser/AstAggregationBuilder.java | 46 +- .../opensearch/sql/sql/parser/AstBuilder.java | 46 +- .../sql/sql/parser/AstExpressionBuilder.java | 316 ++++---- .../sql/parser/AstHavingFilterBuilder.java | 9 +- .../sql/sql/parser/AstSortBuilder.java | 14 +- .../sql/sql/parser/ParserUtils.java | 25 +- .../sql/parser/context/ParsingContext.java | 13 +- .../parser/context/QuerySpecification.java | 45 +- .../common/antlr/SyntaxParserTestBase.java | 9 +- .../opensearch/sql/sql/SQLServiceTest.java | 38 +- .../sql/sql/antlr/BracketedTimestampTest.java | 1 - .../sql/sql/antlr/HighlightTest.java | 15 +- .../sql/antlr/MatchBoolPrefixParserTest.java | 5 +- .../sql/sql/antlr/SQLParserTest.java | 1 - .../sql/sql/antlr/SQLSyntaxParserTest.java | 606 +++++++-------- .../sql/sql/domain/SQLQueryRequestTest.java | 156 ++-- .../sql/parser/AnonymizerListenerTest.java | 47 +- .../sql/parser/AstAggregationBuilderTest.java | 122 ++-- .../sql/sql/parser/AstBuilderTest.java | 327 +++------ .../sql/sql/parser/AstBuilderTestBase.java | 4 +- .../sql/parser/AstExpressionBuilderTest.java | 690 ++++++++---------- .../parser/AstHavingFilterBuilderTest.java | 4 +- .../sql/parser/AstNowLikeFunctionTest.java | 65 +- .../parser/AstQualifiedNameBuilderTest.java | 9 +- .../sql/sql/parser/AstSortBuilderTest.java | 47 +- .../context/QuerySpecificationTest.java | 61 +- 32 files changed, 1221 insertions(+), 1638 deletions(-) diff --git a/build.gradle b/build.gradle index c0f82c502b..a256fd1d22 100644 --- a/build.gradle +++ b/build.gradle @@ -84,9 +84,10 @@ repositories { spotless { java { target fileTree('.') { - include 'common/**/*.java', - 'datasources/**/*.java', + include 'datasources/**/*.java', 'core/**/*.java', + 'sql/**/*.java', + 'common/**/*.java', 'ppl/**/*.java' exclude '**/build/**', '**/build-*/**' } diff --git a/sql/build.gradle b/sql/build.gradle index 44dc37cf0f..d85cc4ca74 100644 --- a/sql/build.gradle +++ b/sql/build.gradle @@ -58,6 +58,11 @@ dependencies { testImplementation(testFixtures(project(":core"))) } +// Being ignored as a temporary measure before being removed in favour of +// spotless https://github.com/opensearch-project/sql/issues/1101 +checkstyleTest.ignoreFailures = true +checkstyleMain.ignoreFailures = true + test { useJUnitPlatform() testLogging { diff --git a/sql/src/main/java/org/opensearch/sql/sql/SQLService.java b/sql/src/main/java/org/opensearch/sql/sql/SQLService.java index 91ec00cdd5..e1ca778453 100644 --- a/sql/src/main/java/org/opensearch/sql/sql/SQLService.java +++ b/sql/src/main/java/org/opensearch/sql/sql/SQLService.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql; import java.util.Optional; @@ -21,9 +20,7 @@ import org.opensearch.sql.sql.parser.AstBuilder; import org.opensearch.sql.sql.parser.AstStatementBuilder; -/** - * SQL service. - */ +/** SQL service. */ @RequiredArgsConstructor public class SQLService { @@ -69,15 +66,19 @@ private AbstractPlan plan( if (request.getCursor().isPresent()) { // Handle v2 cursor here -- legacy cursor was handled earlier. if (isExplainRequest) { - throw new UnsupportedOperationException("Explain of a paged query continuation " - + "is not supported. Use `explain` for the initial query request."); + throw new UnsupportedOperationException( + "Explain of a paged query continuation " + + "is not supported. Use `explain` for the initial query request."); } if (request.isCursorCloseRequest()) { - return queryExecutionFactory.createCloseCursor(request.getCursor().get(), - queryListener.orElse(null)); + return queryExecutionFactory.createCloseCursor( + request.getCursor().get(), queryListener.orElse(null)); } - return queryExecutionFactory.create(request.getCursor().get(), - isExplainRequest, queryListener.orElse(null), explainListener.orElse(null)); + return queryExecutionFactory.create( + request.getCursor().get(), + isExplainRequest, + queryListener.orElse(null), + explainListener.orElse(null)); } else { // 1.Parse query and convert parse tree (CST) to abstract syntax tree (AST) ParseTree cst = parser.parse(request.getQuery()); @@ -90,8 +91,7 @@ private AbstractPlan plan( .fetchSize(request.getFetchSize()) .build())); - return queryExecutionFactory.create( - statement, queryListener, explainListener); + return queryExecutionFactory.create(statement, queryListener, explainListener); } } } diff --git a/sql/src/main/java/org/opensearch/sql/sql/antlr/AnonymizerListener.java b/sql/src/main/java/org/opensearch/sql/sql/antlr/AnonymizerListener.java index bd7b5cbedf..0d1b89f7a9 100644 --- a/sql/src/main/java/org/opensearch/sql/sql/antlr/AnonymizerListener.java +++ b/sql/src/main/java/org/opensearch/sql/sql/antlr/AnonymizerListener.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.antlr; import static org.opensearch.sql.sql.antlr.parser.OpenSearchSQLLexer.BACKTICK_QUOTE_ID; @@ -31,21 +30,17 @@ import org.antlr.v4.runtime.tree.ParseTreeListener; import org.antlr.v4.runtime.tree.TerminalNode; -/** - * Parse tree listener for anonymizing SQL requests. - */ +/** Parse tree listener for anonymizing SQL requests. */ public class AnonymizerListener implements ParseTreeListener { private String anonymizedQueryString = ""; private static final int NO_TYPE = -1; private int previousType = NO_TYPE; @Override - public void enterEveryRule(ParserRuleContext ctx) { - } + public void enterEveryRule(ParserRuleContext ctx) {} @Override - public void exitEveryRule(ParserRuleContext ctx) { - } + public void exitEveryRule(ParserRuleContext ctx) {} @Override public void visitTerminal(TerminalNode node) { @@ -57,10 +52,11 @@ public void visitTerminal(TerminalNode node) { int token = node.getSymbol().getType(); boolean isDotIdentifiers = token == DOT || previousType == DOT; boolean isComma = token == COMMA; - boolean isEqualComparison = ((token == EQUAL_SYMBOL) + boolean isEqualComparison = + ((token == EQUAL_SYMBOL) && (previousType == LESS_SYMBOL - || previousType == GREATER_SYMBOL - || previousType == EXCLAMATION_SYMBOL)); + || previousType == GREATER_SYMBOL + || previousType == EXCLAMATION_SYMBOL)); boolean isNotEqualComparisonAlternative = previousType == LESS_SYMBOL && token == GREATER_SYMBOL; if (!isDotIdentifiers && !isComma && !isEqualComparison && !isNotEqualComparisonAlternative) { @@ -103,9 +99,7 @@ public void visitTerminal(TerminalNode node) { } @Override - public void visitErrorNode(ErrorNode node) { - - } + public void visitErrorNode(ErrorNode node) {} public String getAnonymizedQueryString() { return "(" + anonymizedQueryString + ")"; diff --git a/sql/src/main/java/org/opensearch/sql/sql/antlr/SQLSyntaxParser.java b/sql/src/main/java/org/opensearch/sql/sql/antlr/SQLSyntaxParser.java index 4f7b925718..d1a6adc236 100644 --- a/sql/src/main/java/org/opensearch/sql/sql/antlr/SQLSyntaxParser.java +++ b/sql/src/main/java/org/opensearch/sql/sql/antlr/SQLSyntaxParser.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.antlr; import org.antlr.v4.runtime.CommonTokenStream; @@ -16,16 +15,15 @@ import org.opensearch.sql.sql.antlr.parser.OpenSearchSQLLexer; import org.opensearch.sql.sql.antlr.parser.OpenSearchSQLParser; -/** - * SQL syntax parser which encapsulates an ANTLR parser. - */ +/** SQL syntax parser which encapsulates an ANTLR parser. */ public class SQLSyntaxParser implements Parser { private static final Logger LOG = LogManager.getLogger(SQLSyntaxParser.class); /** * Parse a SQL query by ANTLR parser. - * @param query a SQL query - * @return parse tree root + * + * @param query a SQL query + * @return parse tree root */ @Override public ParseTree parse(String query) { diff --git a/sql/src/main/java/org/opensearch/sql/sql/domain/SQLQueryRequest.java b/sql/src/main/java/org/opensearch/sql/sql/domain/SQLQueryRequest.java index c9321f5775..4e902cb67d 100644 --- a/sql/src/main/java/org/opensearch/sql/sql/domain/SQLQueryRequest.java +++ b/sql/src/main/java/org/opensearch/sql/sql/domain/SQLQueryRequest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.domain; import java.util.Collections; @@ -20,43 +19,30 @@ import org.json.JSONObject; import org.opensearch.sql.protocol.response.format.Format; -/** - * SQL query request. - */ +/** SQL query request. */ @ToString @EqualsAndHashCode @RequiredArgsConstructor public class SQLQueryRequest { private static final String QUERY_FIELD_CURSOR = "cursor"; - private static final Set SUPPORTED_FIELDS = Set.of( - "query", "fetch_size", "parameters", QUERY_FIELD_CURSOR); + private static final Set SUPPORTED_FIELDS = + Set.of("query", "fetch_size", "parameters", QUERY_FIELD_CURSOR); private static final String QUERY_PARAMS_FORMAT = "format"; private static final String QUERY_PARAMS_SANITIZE = "sanitize"; - /** - * JSON payload in REST request. - */ + /** JSON payload in REST request. */ private final JSONObject jsonContent; - /** - * SQL query. - */ - @Getter - private final String query; + /** SQL query. */ + @Getter private final String query; - /** - * Request path. - */ + /** Request path. */ private final String path; - /** - * Request format. - */ + /** Request format. */ private final String format; - /** - * Request params. - */ + /** Request params. */ private Map params = Collections.emptyMap(); @Getter @@ -65,11 +51,13 @@ public class SQLQueryRequest { private String cursor; - /** - * Constructor of SQLQueryRequest that passes request params. - */ - public SQLQueryRequest(JSONObject jsonContent, String query, String path, - Map params, String cursor) { + /** Constructor of SQLQueryRequest that passes request params. */ + public SQLQueryRequest( + JSONObject jsonContent, + String query, + String path, + Map params, + String cursor) { this.jsonContent = jsonContent; this.query = query; this.path = path; @@ -80,24 +68,30 @@ public SQLQueryRequest(JSONObject jsonContent, String query, String path, } /** + * + * + *
    * Pre-check if the request can be supported by meeting ALL the following criteria:
    *  1.Only supported fields present in request body, ex. "filter" and "cursor" are not supported
    *  2.Response format is default or can be supported.
+   * 
* * @return true if supported. */ public boolean isSupported() { var noCursor = !isCursor(); var noQuery = query == null; - var noUnsupportedParams = params.isEmpty() - || (params.size() == 1 && params.containsKey(QUERY_PARAMS_FORMAT)); + var noUnsupportedParams = + params.isEmpty() || (params.size() == 1 && params.containsKey(QUERY_PARAMS_FORMAT)); var noContent = jsonContent == null || jsonContent.isEmpty(); - return ((!noCursor && noQuery - && noUnsupportedParams && noContent) // if cursor is given, but other things - || (noCursor && !noQuery)) // or if cursor is not given, but query - && isOnlySupportedFieldInPayload() // and request has supported fields only - && isSupportedFormat(); // and request is in supported format + return ((!noCursor + && noQuery + && noUnsupportedParams + && noContent) // if cursor is given, but other things + || (noCursor && !noQuery)) // or if cursor is not given, but query + && isOnlySupportedFieldInPayload() // and request has supported fields only + && isSupportedFormat(); // and request is in supported format } private boolean isCursor() { @@ -106,6 +100,7 @@ private boolean isCursor() { /** * Check if request is to explain rather than execute the query. + * * @return true if it is an explain request */ public boolean isExplainRequest() { @@ -116,16 +111,14 @@ public boolean isCursorCloseRequest() { return path.endsWith("/close"); } - /** - * Decide on the formatter by the requested format. - */ + /** Decide on the formatter by the requested format. */ public Format format() { Optional optionalFormat = Format.of(format); if (optionalFormat.isPresent()) { return optionalFormat.get(); } else { throw new IllegalArgumentException( - String.format(Locale.ROOT,"response in %s format is not supported.", format)); + String.format(Locale.ROOT, "response in %s format is not supported.", format)); } } @@ -155,5 +148,4 @@ private boolean shouldSanitize(Map params) { } return true; } - } diff --git a/sql/src/main/java/org/opensearch/sql/sql/parser/AstAggregationBuilder.java b/sql/src/main/java/org/opensearch/sql/sql/parser/AstAggregationBuilder.java index bd4464d00e..e46147b7a3 100644 --- a/sql/src/main/java/org/opensearch/sql/sql/parser/AstAggregationBuilder.java +++ b/sql/src/main/java/org/opensearch/sql/sql/parser/AstAggregationBuilder.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.parser; import static java.util.Collections.emptyList; @@ -27,6 +26,8 @@ import org.opensearch.sql.sql.parser.context.QuerySpecification; /** + * + * *
SelectExpressionAnalyzerTest
  * AST aggregation builder that builds AST aggregation node for the following scenarios:
  *
@@ -59,9 +60,7 @@
 @RequiredArgsConstructor
 public class AstAggregationBuilder extends OpenSearchSQLParserBaseVisitor {
 
-  /**
-   * Query specification that contains info collected beforehand.
-   */
+  /** Query specification that contains info collected beforehand. */
   private final QuerySpecification querySpec;
 
   @Override
@@ -78,10 +77,7 @@ public UnresolvedPlan visit(ParseTree groupByClause) {
 
   private UnresolvedPlan buildExplicitAggregation() {
     List groupByItems = replaceGroupByItemIfAliasOrOrdinal();
-    return new Aggregation(
-        new ArrayList<>(querySpec.getAggregators()),
-        emptyList(),
-        groupByItems);
+    return new Aggregation(new ArrayList<>(querySpec.getAggregators()), emptyList(), groupByItems);
   }
 
   private UnresolvedPlan buildImplicitAggregation() {
@@ -89,33 +85,32 @@ private UnresolvedPlan buildImplicitAggregation() {
 
     if (invalidSelectItem.isPresent()) {
       // Report semantic error to avoid fall back to old engine again
-      throw new SemanticCheckException(StringUtils.format(
-          "Explicit GROUP BY clause is required because expression [%s] "
-              + "contains non-aggregated column", invalidSelectItem.get()));
+      throw new SemanticCheckException(
+          StringUtils.format(
+              "Explicit GROUP BY clause is required because expression [%s] "
+                  + "contains non-aggregated column",
+              invalidSelectItem.get()));
     }
 
     return new Aggregation(
-        new ArrayList<>(querySpec.getAggregators()),
-        emptyList(),
-        querySpec.getGroupByItems());
+        new ArrayList<>(querySpec.getAggregators()), emptyList(), querySpec.getGroupByItems());
   }
 
   private List replaceGroupByItemIfAliasOrOrdinal() {
-    return querySpec.getGroupByItems()
-                    .stream()
-                    .map(querySpec::replaceIfAliasOrOrdinal)
-                    .map(expr -> new Alias(expr.toString(), expr))
-                    .collect(Collectors.toList());
+    return querySpec.getGroupByItems().stream()
+        .map(querySpec::replaceIfAliasOrOrdinal)
+        .map(expr -> new Alias(expr.toString(), expr))
+        .collect(Collectors.toList());
   }
 
   /**
-   * Find non-aggregate item in SELECT clause. Note that literal is special which is not required
-   * to be applied by aggregate function.
+   * Find non-aggregate item in SELECT clause. Note that literal is special which is not required to
+   * be applied by aggregate function.
    */
   private Optional findNonAggregatedItemInSelect() {
     return querySpec.getSelectItems().stream()
-                                     .filter(this::isNonAggregateOrLiteralExpression)
-                                     .findFirst();
+        .filter(this::isNonAggregateOrLiteralExpression)
+        .findFirst();
   }
 
   private boolean isAggregatorNotFoundAnywhere() {
@@ -132,8 +127,7 @@ private boolean isNonAggregateOrLiteralExpression(UnresolvedExpression expr) {
     }
 
     List children = expr.getChild();
-    return children.stream().anyMatch(child ->
-        isNonAggregateOrLiteralExpression((UnresolvedExpression) child));
+    return children.stream()
+        .anyMatch(child -> isNonAggregateOrLiteralExpression((UnresolvedExpression) child));
   }
-
 }
diff --git a/sql/src/main/java/org/opensearch/sql/sql/parser/AstBuilder.java b/sql/src/main/java/org/opensearch/sql/sql/parser/AstBuilder.java
index 020889c082..ab96f16263 100644
--- a/sql/src/main/java/org/opensearch/sql/sql/parser/AstBuilder.java
+++ b/sql/src/main/java/org/opensearch/sql/sql/parser/AstBuilder.java
@@ -3,7 +3,6 @@
  * SPDX-License-Identifier: Apache-2.0
  */
 
-
 package org.opensearch.sql.sql.parser;
 
 import static java.util.Collections.emptyList;
@@ -43,22 +42,18 @@
 import org.opensearch.sql.sql.antlr.parser.OpenSearchSQLParserBaseVisitor;
 import org.opensearch.sql.sql.parser.context.ParsingContext;
 
-/**
- * Abstract syntax tree (AST) builder.
- */
+/** Abstract syntax tree (AST) builder. */
 @RequiredArgsConstructor
 public class AstBuilder extends OpenSearchSQLParserBaseVisitor {
 
   private final AstExpressionBuilder expressionBuilder = new AstExpressionBuilder();
 
-  /**
-   * Parsing context stack that contains context for current query parsing.
-   */
+  /** Parsing context stack that contains context for current query parsing. */
   private final ParsingContext context = new ParsingContext();
 
   /**
-   * SQL query to get original token text. This is necessary because token.getText() returns
-   * text without whitespaces or other characters discarded by lexer.
+   * SQL query to get original token text. This is necessary because token.getText() returns text
+   * without whitespaces or other characters discarded by lexer.
    */
   private final String query;
 
@@ -91,8 +86,7 @@ public UnresolvedPlan visitQuerySpecification(QuerySpecificationContext queryCon
 
     if (queryContext.fromClause() == null) {
       Optional allFields =
-          project.getProjectList().stream().filter(node -> node instanceof AllFields)
-              .findFirst();
+          project.getProjectList().stream().filter(node -> node instanceof AllFields).findFirst();
       if (allFields.isPresent()) {
         throw new SyntaxCheckException("No FROM clause found for select all");
       }
@@ -119,9 +113,8 @@ public UnresolvedPlan visitQuerySpecification(QuerySpecificationContext queryCon
 
   @Override
   public UnresolvedPlan visitSelectClause(SelectClauseContext ctx) {
-    ImmutableList.Builder builder =
-        new ImmutableList.Builder<>();
-    if (ctx.selectElements().star != null) { //TODO: project operator should be required?
+    ImmutableList.Builder builder = new ImmutableList.Builder<>();
+    if (ctx.selectElements().star != null) { // TODO: project operator should be required?
       builder.add(AllFields.of());
     }
     ctx.selectElements().selectElement().forEach(field -> builder.add(visitSelectItem(field)));
@@ -132,8 +125,7 @@ public UnresolvedPlan visitSelectClause(SelectClauseContext ctx) {
   public UnresolvedPlan visitLimitClause(OpenSearchSQLParser.LimitClauseContext ctx) {
     return new Limit(
         Integer.parseInt(ctx.limit.getText()),
-        ctx.offset == null ? 0 : Integer.parseInt(ctx.offset.getText())
-    );
+        ctx.offset == null ? 0 : Integer.parseInt(ctx.offset.getText()));
   }
 
   @Override
@@ -165,29 +157,26 @@ public UnresolvedPlan visitFromClause(FromClauseContext ctx) {
   }
 
   /**
-   * Ensure NESTED function is not used in HAVING clause and fallback to legacy engine.
-   * Can remove when support is added for NESTED function in HAVING clause.
+   * Ensure NESTED function is not used in HAVING clause and fallback to legacy engine. Can remove
+   * when support is added for NESTED function in HAVING clause.
+   *
    * @param func : Function in HAVING clause
    */
   private void verifySupportsCondition(UnresolvedExpression func) {
     if (func instanceof Function) {
-      if (((Function) func).getFuncName().equalsIgnoreCase(
-          BuiltinFunctionName.NESTED.name()
-      )) {
+      if (((Function) func).getFuncName().equalsIgnoreCase(BuiltinFunctionName.NESTED.name())) {
         throw new SyntaxCheckException(
-            "Falling back to legacy engine. Nested function is not supported in the HAVING clause."
-        );
+            "Falling back to legacy engine. Nested function is not supported in the HAVING"
+                + " clause.");
       }
-      ((Function)func).getFuncArgs().stream()
-          .forEach(e -> verifySupportsCondition(e)
-      );
+      ((Function) func).getFuncArgs().stream().forEach(e -> verifySupportsCondition(e));
     }
   }
 
   @Override
   public UnresolvedPlan visitTableAsRelation(TableAsRelationContext ctx) {
-    String tableAlias = (ctx.alias() == null) ? null
-        : StringUtils.unquoteIdentifier(ctx.alias().getText());
+    String tableAlias =
+        (ctx.alias() == null) ? null : StringUtils.unquoteIdentifier(ctx.alias().getText());
     return new Relation(visitAstExpression(ctx.tableName()), tableAlias);
   }
 
@@ -228,5 +217,4 @@ private UnresolvedExpression visitSelectItem(SelectElementContext ctx) {
       return new Alias(name, expr, alias);
     }
   }
-
 }
diff --git a/sql/src/main/java/org/opensearch/sql/sql/parser/AstExpressionBuilder.java b/sql/src/main/java/org/opensearch/sql/sql/parser/AstExpressionBuilder.java
index 192514250b..6dd1e02a1d 100644
--- a/sql/src/main/java/org/opensearch/sql/sql/parser/AstExpressionBuilder.java
+++ b/sql/src/main/java/org/opensearch/sql/sql/parser/AstExpressionBuilder.java
@@ -3,7 +3,6 @@
  * SPDX-License-Identifier: Apache-2.0
  */
 
-
 package org.opensearch.sql.sql.parser;
 
 import static org.opensearch.sql.ast.dsl.AstDSL.between;
@@ -113,9 +112,7 @@
 import org.opensearch.sql.sql.antlr.parser.OpenSearchSQLParser.TableNameContext;
 import org.opensearch.sql.sql.antlr.parser.OpenSearchSQLParserBaseVisitor;
 
-/**
- * Expression builder to parse text to expression in AST.
- */
+/** Expression builder to parse text to expression in AST. */
 public class AstExpressionBuilder extends OpenSearchSQLParserBaseVisitor {
 
   @Override
@@ -141,9 +138,7 @@ public UnresolvedExpression visitQualifiedName(QualifiedNameContext ctx) {
   @Override
   public UnresolvedExpression visitMathExpressionAtom(MathExpressionAtomContext ctx) {
     return new Function(
-        ctx.mathOperator.getText(),
-        Arrays.asList(visit(ctx.left), visit(ctx.right))
-    );
+        ctx.mathOperator.getText(), Arrays.asList(visit(ctx.left), visit(ctx.right)));
   }
 
   @Override
@@ -152,11 +147,8 @@ public UnresolvedExpression visitNestedExpressionAtom(NestedExpressionAtomContex
   }
 
   @Override
-  public UnresolvedExpression visitNestedAllFunctionCall(
-      NestedAllFunctionCallContext ctx) {
-    return new NestedAllTupleFields(
-        visitQualifiedName(ctx.allTupleFields().path).toString()
-    );
+  public UnresolvedExpression visitNestedAllFunctionCall(NestedAllFunctionCallContext ctx) {
+    return new NestedAllTupleFields(visitQualifiedName(ctx.allTupleFields().path).toString());
   }
 
   @Override
@@ -167,39 +159,36 @@ public UnresolvedExpression visitScalarFunctionCall(ScalarFunctionCallContext ct
   @Override
   public UnresolvedExpression visitGetFormatFunctionCall(GetFormatFunctionCallContext ctx) {
     return new Function(
-        ctx.getFormatFunction().GET_FORMAT().toString(),
-        getFormatFunctionArguments(ctx));
+        ctx.getFormatFunction().GET_FORMAT().toString(), getFormatFunctionArguments(ctx));
   }
 
   @Override
-  public UnresolvedExpression visitHighlightFunctionCall(
-      HighlightFunctionCallContext ctx) {
+  public UnresolvedExpression visitHighlightFunctionCall(HighlightFunctionCallContext ctx) {
     ImmutableMap.Builder builder = ImmutableMap.builder();
-    ctx.highlightFunction().highlightArg().forEach(v -> builder.put(
-        v.highlightArgName().getText().toLowerCase(),
-        new Literal(StringUtils.unquoteText(v.highlightArgValue().getText()),
-            DataType.STRING))
-    );
+    ctx.highlightFunction()
+        .highlightArg()
+        .forEach(
+            v ->
+                builder.put(
+                    v.highlightArgName().getText().toLowerCase(),
+                    new Literal(
+                        StringUtils.unquoteText(v.highlightArgValue().getText()),
+                        DataType.STRING)));
 
-    return new HighlightFunction(visit(ctx.highlightFunction().relevanceField()),
-        builder.build());
+    return new HighlightFunction(visit(ctx.highlightFunction().relevanceField()), builder.build());
   }
 
-
   @Override
   public UnresolvedExpression visitTimestampFunctionCall(TimestampFunctionCallContext ctx) {
     return new Function(
-        ctx.timestampFunction().timestampFunctionName().getText(),
-        timestampFunctionArguments(ctx));
+        ctx.timestampFunction().timestampFunctionName().getText(), timestampFunctionArguments(ctx));
   }
 
   @Override
-  public UnresolvedExpression visitPositionFunction(
-          PositionFunctionContext ctx) {
+  public UnresolvedExpression visitPositionFunction(PositionFunctionContext ctx) {
     return new Function(
-            POSITION.getName().getFunctionName(),
-            Arrays.asList(visitFunctionArg(ctx.functionArg(0)),
-                visitFunctionArg(ctx.functionArg(1))));
+        POSITION.getName().getFunctionName(),
+        Arrays.asList(visitFunctionArg(ctx.functionArg(0)), visitFunctionArg(ctx.functionArg(1))));
   }
 
   @Override
@@ -217,8 +206,7 @@ public UnresolvedExpression visitColumnFilter(ColumnFilterContext ctx) {
   }
 
   @Override
-  public UnresolvedExpression visitShowDescribePattern(
-      ShowDescribePatternContext ctx) {
+  public UnresolvedExpression visitShowDescribePattern(ShowDescribePatternContext ctx) {
     return visit(ctx.stringLiteral());
   }
 
@@ -235,21 +223,18 @@ public UnresolvedExpression visitWindowFunctionClause(WindowFunctionClauseContex
 
     List partitionByList = Collections.emptyList();
     if (overClause.partitionByClause() != null) {
-      partitionByList = overClause.partitionByClause()
-                                  .expression()
-                                  .stream()
-                                  .map(this::visit)
-                                  .collect(Collectors.toList());
+      partitionByList =
+          overClause.partitionByClause().expression().stream()
+              .map(this::visit)
+              .collect(Collectors.toList());
     }
 
     List> sortList = Collections.emptyList();
     if (overClause.orderByClause() != null) {
-      sortList = overClause.orderByClause()
-                           .orderByElement()
-                           .stream()
-                           .map(item -> ImmutablePair.of(
-                               createSortOption(item), visit(item.expression())))
-                           .collect(Collectors.toList());
+      sortList =
+          overClause.orderByClause().orderByElement().stream()
+              .map(item -> ImmutablePair.of(createSortOption(item), visit(item.expression())))
+              .collect(Collectors.toList());
     }
     return new WindowFunction(visit(ctx.function), partitionByList, sortList);
   }
@@ -262,17 +247,12 @@ public UnresolvedExpression visitScalarWindowFunction(ScalarWindowFunctionContex
   @Override
   public UnresolvedExpression visitRegularAggregateFunctionCall(
       RegularAggregateFunctionCallContext ctx) {
-    return new AggregateFunction(
-        ctx.functionName.getText(),
-        visitFunctionArg(ctx.functionArg()));
+    return new AggregateFunction(ctx.functionName.getText(), visitFunctionArg(ctx.functionArg()));
   }
 
   @Override
   public UnresolvedExpression visitDistinctCountFunctionCall(DistinctCountFunctionCallContext ctx) {
-    return new AggregateFunction(
-        ctx.COUNT().getText(),
-        visitFunctionArg(ctx.functionArg()),
-        true);
+    return new AggregateFunction(ctx.COUNT().getText(), visitFunctionArg(ctx.functionArg()), true);
   }
 
   @Override
@@ -288,18 +268,16 @@ public UnresolvedExpression visitFilterClause(FilterClauseContext ctx) {
   @Override
   public UnresolvedExpression visitIsNullPredicate(IsNullPredicateContext ctx) {
     return new Function(
-        ctx.nullNotnull().NOT() == null ? IS_NULL.getName().getFunctionName() :
-            IS_NOT_NULL.getName().getFunctionName(),
+        ctx.nullNotnull().NOT() == null
+            ? IS_NULL.getName().getFunctionName()
+            : IS_NOT_NULL.getName().getFunctionName(),
         Arrays.asList(visit(ctx.predicate())));
   }
 
   @Override
   public UnresolvedExpression visitBetweenPredicate(BetweenPredicateContext ctx) {
     UnresolvedExpression func =
-        between(
-            visit(ctx.predicate(0)),
-            visit(ctx.predicate(1)),
-            visit(ctx.predicate(2)));
+        between(visit(ctx.predicate(0)), visit(ctx.predicate(1)), visit(ctx.predicate(2)));
 
     if (ctx.NOT() != null) {
       func = not(func);
@@ -310,26 +288,21 @@ public UnresolvedExpression visitBetweenPredicate(BetweenPredicateContext ctx) {
   @Override
   public UnresolvedExpression visitLikePredicate(LikePredicateContext ctx) {
     return new Function(
-        ctx.NOT() == null ? LIKE.getName().getFunctionName() :
-            NOT_LIKE.getName().getFunctionName(),
+        ctx.NOT() == null ? LIKE.getName().getFunctionName() : NOT_LIKE.getName().getFunctionName(),
         Arrays.asList(visit(ctx.left), visit(ctx.right)));
   }
 
   @Override
   public UnresolvedExpression visitRegexpPredicate(RegexpPredicateContext ctx) {
-    return new Function(REGEXP.getName().getFunctionName(),
-            Arrays.asList(visit(ctx.left), visit(ctx.right)));
+    return new Function(
+        REGEXP.getName().getFunctionName(), Arrays.asList(visit(ctx.left), visit(ctx.right)));
   }
 
   @Override
   public UnresolvedExpression visitInPredicate(InPredicateContext ctx) {
     UnresolvedExpression field = visit(ctx.predicate());
-    List inLists = ctx
-        .expressions()
-        .expression()
-        .stream()
-        .map(this::visit)
-        .collect(Collectors.toList());
+    List inLists =
+        ctx.expressions().expression().stream().map(this::visit).collect(Collectors.toList());
     UnresolvedExpression in = AstDSL.in(field, inLists);
     return ctx.NOT() != null ? AstDSL.not(in) : in;
   }
@@ -394,34 +367,30 @@ public UnresolvedExpression visitTimeLiteral(TimeLiteralContext ctx) {
   }
 
   @Override
-  public UnresolvedExpression visitTimestampLiteral(
-      TimestampLiteralContext ctx) {
+  public UnresolvedExpression visitTimestampLiteral(TimestampLiteralContext ctx) {
     return AstDSL.timestampLiteral(StringUtils.unquoteText(ctx.timestamp.getText()));
   }
 
   @Override
   public UnresolvedExpression visitIntervalLiteral(IntervalLiteralContext ctx) {
-    return new Interval(
-        visit(ctx.expression()), IntervalUnit.of(ctx.intervalUnit().getText()));
+    return new Interval(visit(ctx.expression()), IntervalUnit.of(ctx.intervalUnit().getText()));
   }
 
   @Override
-  public UnresolvedExpression visitBinaryComparisonPredicate(
-      BinaryComparisonPredicateContext ctx) {
+  public UnresolvedExpression visitBinaryComparisonPredicate(BinaryComparisonPredicateContext ctx) {
     String functionName = ctx.comparisonOperator().getText();
     return new Function(
         functionName.equals("<>") ? "!=" : functionName,
-        Arrays.asList(visit(ctx.left), visit(ctx.right))
-    );
+        Arrays.asList(visit(ctx.left), visit(ctx.right)));
   }
 
   @Override
   public UnresolvedExpression visitCaseFunctionCall(CaseFunctionCallContext ctx) {
     UnresolvedExpression caseValue = (ctx.expression() == null) ? null : visit(ctx.expression());
-    List whenStatements = ctx.caseFuncAlternative()
-                                   .stream()
-                                   .map(when -> (When) visit(when))
-                                   .collect(Collectors.toList());
+    List whenStatements =
+        ctx.caseFuncAlternative().stream()
+            .map(when -> (When) visit(when))
+            .collect(Collectors.toList());
     UnresolvedExpression elseStatement = (ctx.elseArg == null) ? null : visit(ctx.elseArg);
 
     return new Case(caseValue, whenStatements, elseStatement);
@@ -433,23 +402,19 @@ public UnresolvedExpression visitCaseFuncAlternative(CaseFuncAlternativeContext
   }
 
   @Override
-  public UnresolvedExpression visitDataTypeFunctionCall(
-      DataTypeFunctionCallContext ctx) {
+  public UnresolvedExpression visitDataTypeFunctionCall(DataTypeFunctionCallContext ctx) {
     return new Cast(visit(ctx.expression()), visit(ctx.convertedDataType()));
   }
 
   @Override
-  public UnresolvedExpression visitConvertedDataType(
-      ConvertedDataTypeContext ctx) {
+  public UnresolvedExpression visitConvertedDataType(ConvertedDataTypeContext ctx) {
     return AstDSL.stringLiteral(ctx.getText());
   }
 
   @Override
-  public UnresolvedExpression visitNoFieldRelevanceFunction(
-          NoFieldRelevanceFunctionContext ctx) {
+  public UnresolvedExpression visitNoFieldRelevanceFunction(NoFieldRelevanceFunctionContext ctx) {
     return new Function(
-            ctx.noFieldRelevanceFunctionName().getText().toLowerCase(),
-            noFieldRelevanceArguments(ctx));
+        ctx.noFieldRelevanceFunctionName().getText().toLowerCase(), noFieldRelevanceArguments(ctx));
   }
 
   @Override
@@ -475,10 +440,9 @@ public UnresolvedExpression visitMultiFieldRelevanceFunction(
     // 'MULTI_MATCH('query'='query_val', 'fields'='*fields_val')'
     String funcName = StringUtils.unquoteText(ctx.multiFieldRelevanceFunctionName().getText());
     if ((funcName.equalsIgnoreCase(BuiltinFunctionName.MULTI_MATCH.toString())
-        || funcName.equalsIgnoreCase(BuiltinFunctionName.MULTIMATCH.toString())
-        || funcName.equalsIgnoreCase(BuiltinFunctionName.MULTIMATCHQUERY.toString()))
-        && !ctx.getRuleContexts(AlternateMultiMatchQueryContext.class)
-        .isEmpty()) {
+            || funcName.equalsIgnoreCase(BuiltinFunctionName.MULTIMATCH.toString())
+            || funcName.equalsIgnoreCase(BuiltinFunctionName.MULTIMATCHQUERY.toString()))
+        && !ctx.getRuleContexts(AlternateMultiMatchQueryContext.class).isEmpty()) {
       return new Function(
           ctx.multiFieldRelevanceFunctionName().getText().toLowerCase(),
           alternateMultiMatchArguments(ctx));
@@ -511,78 +475,81 @@ public UnresolvedExpression visitScoreRelevanceFunction(ScoreRelevanceFunctionCo
     return new ScoreFunction(visit(ctx.relevanceFunction()), weight);
   }
 
-  private Function buildFunction(String functionName,
-                                 List arg) {
+  private Function buildFunction(String functionName, List arg) {
     return new Function(
-        functionName,
-        arg
-            .stream()
-            .map(this::visitFunctionArg)
-            .collect(Collectors.toList())
-    );
+        functionName, arg.stream().map(this::visitFunctionArg).collect(Collectors.toList()));
   }
 
   @Override
   public UnresolvedExpression visitExtractFunctionCall(ExtractFunctionCallContext ctx) {
     return new Function(
-        ctx.extractFunction().EXTRACT().toString(),
-        getExtractFunctionArguments(ctx));
+        ctx.extractFunction().EXTRACT().toString(), getExtractFunctionArguments(ctx));
   }
 
-
   private QualifiedName visitIdentifiers(List identifiers) {
     return new QualifiedName(
         identifiers.stream()
-                   .map(RuleContext::getText)
-                   .map(StringUtils::unquoteIdentifier)
-                   .collect(Collectors.toList()));
+            .map(RuleContext::getText)
+            .map(StringUtils::unquoteIdentifier)
+            .collect(Collectors.toList()));
   }
 
-  private void fillRelevanceArgs(List args,
-                                 ImmutableList.Builder builder) {
+  private void fillRelevanceArgs(
+      List args, ImmutableList.Builder builder) {
     // To support old syntax we must support argument keys as quoted strings.
-    args.forEach(v -> builder.add(v.argName == null
-        ? new UnresolvedArgument(v.relevanceArgName().getText().toLowerCase(),
-            new Literal(StringUtils.unquoteText(v.relevanceArgValue().getText()),
-            DataType.STRING))
-        : new UnresolvedArgument(StringUtils.unquoteText(v.argName.getText()).toLowerCase(),
-            new Literal(StringUtils.unquoteText(v.argVal.getText()), DataType.STRING))));
+    args.forEach(
+        v ->
+            builder.add(
+                v.argName == null
+                    ? new UnresolvedArgument(
+                        v.relevanceArgName().getText().toLowerCase(),
+                        new Literal(
+                            StringUtils.unquoteText(v.relevanceArgValue().getText()),
+                            DataType.STRING))
+                    : new UnresolvedArgument(
+                        StringUtils.unquoteText(v.argName.getText()).toLowerCase(),
+                        new Literal(
+                            StringUtils.unquoteText(v.argVal.getText()), DataType.STRING))));
   }
 
   private List noFieldRelevanceArguments(
-          NoFieldRelevanceFunctionContext ctx) {
+      NoFieldRelevanceFunctionContext ctx) {
     // all the arguments are defaulted to string values
     // to skip environment resolving and function signature resolving
     ImmutableList.Builder builder = ImmutableList.builder();
-    builder.add(new UnresolvedArgument("query",
-            new Literal(StringUtils.unquoteText(ctx.query.getText()), DataType.STRING)));
+    builder.add(
+        new UnresolvedArgument(
+            "query", new Literal(StringUtils.unquoteText(ctx.query.getText()), DataType.STRING)));
     fillRelevanceArgs(ctx.relevanceArg(), builder);
     return builder.build();
   }
 
   private List singleFieldRelevanceArguments(
-        SingleFieldRelevanceFunctionContext ctx) {
+      SingleFieldRelevanceFunctionContext ctx) {
     // all the arguments are defaulted to string values
     // to skip environment resolving and function signature resolving
     ImmutableList.Builder builder = ImmutableList.builder();
-    builder.add(new UnresolvedArgument("field",
-        new QualifiedName(StringUtils.unquoteText(ctx.field.getText()))));
-    builder.add(new UnresolvedArgument("query",
-        new Literal(StringUtils.unquoteText(ctx.query.getText()), DataType.STRING)));
+    builder.add(
+        new UnresolvedArgument(
+            "field", new QualifiedName(StringUtils.unquoteText(ctx.field.getText()))));
+    builder.add(
+        new UnresolvedArgument(
+            "query", new Literal(StringUtils.unquoteText(ctx.query.getText()), DataType.STRING)));
     fillRelevanceArgs(ctx.relevanceArg(), builder);
     return builder.build();
   }
 
-
   private List altSingleFieldRelevanceFunctionArguments(
       AltSingleFieldRelevanceFunctionContext ctx) {
     // all the arguments are defaulted to string values
     // to skip environment resolving and function signature resolving
     ImmutableList.Builder builder = ImmutableList.builder();
-    builder.add(new UnresolvedArgument("field",
-        new QualifiedName(StringUtils.unquoteText(ctx.field.getText()))));
-    builder.add(new UnresolvedArgument("query",
-        new Literal(StringUtils.unquoteText(ctx.query.getText()), DataType.STRING)));
+    builder.add(
+        new UnresolvedArgument(
+            "field", new QualifiedName(StringUtils.unquoteText(ctx.field.getText()))));
+    builder.add(
+        new UnresolvedArgument(
+            "query", new Literal(StringUtils.unquoteText(ctx.query.getText()), DataType.STRING)));
     fillRelevanceArgs(ctx.relevanceArg(), builder);
     return builder.build();
   }
@@ -592,43 +559,45 @@ private List multiFieldRelevanceArguments(
     // all the arguments are defaulted to string values
     // to skip environment resolving and function signature resolving
     ImmutableList.Builder builder = ImmutableList.builder();
-    var fields = new RelevanceFieldList(ctx
-        .getRuleContexts(RelevanceFieldAndWeightContext.class)
-        .stream()
-        .collect(Collectors.toMap(
-            f -> StringUtils.unquoteText(f.field.getText()),
-            f -> (f.weight == null) ? 1F : Float.parseFloat(f.weight.getText()))));
+    var fields =
+        new RelevanceFieldList(
+            ctx.getRuleContexts(RelevanceFieldAndWeightContext.class).stream()
+                .collect(
+                    Collectors.toMap(
+                        f -> StringUtils.unquoteText(f.field.getText()),
+                        f -> (f.weight == null) ? 1F : Float.parseFloat(f.weight.getText()))));
     builder.add(new UnresolvedArgument("fields", fields));
-    builder.add(new UnresolvedArgument("query",
-        new Literal(StringUtils.unquoteText(ctx.query.getText()), DataType.STRING)));
+    builder.add(
+        new UnresolvedArgument(
+            "query", new Literal(StringUtils.unquoteText(ctx.query.getText()), DataType.STRING)));
     fillRelevanceArgs(ctx.relevanceArg(), builder);
     return builder.build();
   }
 
-  private List getFormatFunctionArguments(
-      GetFormatFunctionCallContext ctx) {
-    List args = Arrays.asList(
-        new Literal(ctx.getFormatFunction().getFormatType().getText(), DataType.STRING),
-        visitFunctionArg(ctx.getFormatFunction().functionArg())
-    );
+  private List getFormatFunctionArguments(GetFormatFunctionCallContext ctx) {
+    List args =
+        Arrays.asList(
+            new Literal(ctx.getFormatFunction().getFormatType().getText(), DataType.STRING),
+            visitFunctionArg(ctx.getFormatFunction().functionArg()));
     return args;
   }
 
-  private List timestampFunctionArguments(
-      TimestampFunctionCallContext ctx) {
-    List args = Arrays.asList(
-        new Literal(
-            ctx.timestampFunction().simpleDateTimePart().getText(),
-            DataType.STRING),
-        visitFunctionArg(ctx.timestampFunction().firstArg),
-        visitFunctionArg(ctx.timestampFunction().secondArg)
-    );
+  private List timestampFunctionArguments(TimestampFunctionCallContext ctx) {
+    List args =
+        Arrays.asList(
+            new Literal(ctx.timestampFunction().simpleDateTimePart().getText(), DataType.STRING),
+            visitFunctionArg(ctx.timestampFunction().firstArg),
+            visitFunctionArg(ctx.timestampFunction().secondArg));
     return args;
   }
 
   /**
+   *
+   *
+   * 
    * Adds support for multi_match alternate syntax like
    * MULTI_MATCH('query'='Dale', 'fields'='*name').
+   * 
* * @param ctx : Context for multi field relevance function. * @return : Returns list of all arguments for relevance function. @@ -640,25 +609,32 @@ private List alternateMultiMatchArguments( ImmutableList.Builder builder = ImmutableList.builder(); Map fieldAndWeightMap = new HashMap<>(); - String[] fieldAndWeights = StringUtils.unquoteText( - ctx.getRuleContexts(AlternateMultiMatchFieldContext.class) - .stream().findFirst().get().argVal.getText()).split(","); + String[] fieldAndWeights = + StringUtils.unquoteText( + ctx.getRuleContexts(AlternateMultiMatchFieldContext.class).stream() + .findFirst() + .get() + .argVal + .getText()) + .split(","); for (var fieldAndWeight : fieldAndWeights) { String[] splitFieldAndWeights = fieldAndWeight.split("\\^"); - fieldAndWeightMap.put(splitFieldAndWeights[0], + fieldAndWeightMap.put( + splitFieldAndWeights[0], splitFieldAndWeights.length > 1 ? Float.parseFloat(splitFieldAndWeights[1]) : 1F); } - builder.add(new UnresolvedArgument("fields", - new RelevanceFieldList(fieldAndWeightMap))); - - ctx.getRuleContexts(AlternateMultiMatchQueryContext.class) - .stream().findFirst().ifPresent( - arg -> - builder.add(new UnresolvedArgument("query", + builder.add(new UnresolvedArgument("fields", new RelevanceFieldList(fieldAndWeightMap))); + + ctx.getRuleContexts(AlternateMultiMatchQueryContext.class).stream() + .findFirst() + .ifPresent( + arg -> + builder.add( + new UnresolvedArgument( + "query", new Literal( - StringUtils.unquoteText(arg.argVal.getText()), DataType.STRING))) - ); + StringUtils.unquoteText(arg.argVal.getText()), DataType.STRING)))); fillRelevanceArgs(ctx.relevanceArg(), builder); @@ -674,18 +650,18 @@ private List altMultiFieldRelevanceFunctionArguments( ImmutableList.Builder builder = ImmutableList.builder(); var fields = new RelevanceFieldList(map); builder.add(new UnresolvedArgument("fields", fields)); - builder.add(new UnresolvedArgument("query", - new Literal(StringUtils.unquoteText(ctx.query.getText()), DataType.STRING))); + builder.add( + new UnresolvedArgument( + "query", new Literal(StringUtils.unquoteText(ctx.query.getText()), DataType.STRING))); fillRelevanceArgs(ctx.relevanceArg(), builder); return builder.build(); } - private List getExtractFunctionArguments( - ExtractFunctionCallContext ctx) { - List args = Arrays.asList( - new Literal(ctx.extractFunction().datetimePart().getText(), DataType.STRING), - visitFunctionArg(ctx.extractFunction().functionArg()) - ); + private List getExtractFunctionArguments(ExtractFunctionCallContext ctx) { + List args = + Arrays.asList( + new Literal(ctx.extractFunction().datetimePart().getText(), DataType.STRING), + visitFunctionArg(ctx.extractFunction().functionArg())); return args; } } diff --git a/sql/src/main/java/org/opensearch/sql/sql/parser/AstHavingFilterBuilder.java b/sql/src/main/java/org/opensearch/sql/sql/parser/AstHavingFilterBuilder.java index f90ea2f991..94c11d05af 100644 --- a/sql/src/main/java/org/opensearch/sql/sql/parser/AstHavingFilterBuilder.java +++ b/sql/src/main/java/org/opensearch/sql/sql/parser/AstHavingFilterBuilder.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.parser; import static org.opensearch.sql.sql.antlr.parser.OpenSearchSQLParser.QualifiedNameContext; @@ -13,10 +12,9 @@ import org.opensearch.sql.sql.parser.context.QuerySpecification; /** - * AST Having filter builder that builds HAVING clause condition expressions - * and replace alias by original expression in SELECT clause. - * The reason for this is it's hard to replace afterwards since UnresolvedExpression - * is immutable. + * AST Having filter builder that builds HAVING clause condition expressions and replace alias by + * original expression in SELECT clause. The reason for this is it's hard to replace afterwards + * since UnresolvedExpression is immutable. */ @RequiredArgsConstructor public class AstHavingFilterBuilder extends AstExpressionBuilder { @@ -34,5 +32,4 @@ private UnresolvedExpression replaceAlias(UnresolvedExpression expr) { } return expr; } - } diff --git a/sql/src/main/java/org/opensearch/sql/sql/parser/AstSortBuilder.java b/sql/src/main/java/org/opensearch/sql/sql/parser/AstSortBuilder.java index 1b872dce54..2594709f4f 100644 --- a/sql/src/main/java/org/opensearch/sql/sql/parser/AstSortBuilder.java +++ b/sql/src/main/java/org/opensearch/sql/sql/parser/AstSortBuilder.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.parser; import static org.opensearch.sql.ast.dsl.AstDSL.booleanLiteral; @@ -27,8 +26,8 @@ import org.opensearch.sql.sql.parser.context.QuerySpecification; /** - * AST sort builder that builds Sort AST node from ORDER BY clause. During this process, the item - * in order by may be replaced by item in project list if it's an alias or ordinal. This is same as + * AST sort builder that builds Sort AST node from ORDER BY clause. During this process, the item in + * order by may be replaced by item in project list if it's an alias or ordinal. This is same as * GROUP BY building process. */ @RequiredArgsConstructor @@ -38,9 +37,7 @@ public class AstSortBuilder extends OpenSearchSQLParserBaseVisitor createSortFields() { @@ -57,8 +54,8 @@ private List createSortFields() { } /** - * Argument "asc" is required. - * Argument "nullFirst" is optional and determined by Analyzer later if absent. + * Argument "asc" is required. Argument "nullFirst" is optional and determined by Analyzer later + * if absent. */ private List createSortArguments(SortOption option) { SortOrder sortOrder = option.getSortOrder(); @@ -71,5 +68,4 @@ private List createSortArguments(SortOption option) { } return args.build(); } - } diff --git a/sql/src/main/java/org/opensearch/sql/sql/parser/ParserUtils.java b/sql/src/main/java/org/opensearch/sql/sql/parser/ParserUtils.java index 947dca51b9..3c60d43733 100644 --- a/sql/src/main/java/org/opensearch/sql/sql/parser/ParserUtils.java +++ b/sql/src/main/java/org/opensearch/sql/sql/parser/ParserUtils.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.parser; import static org.opensearch.sql.ast.tree.Sort.NullOrder; @@ -16,33 +15,24 @@ import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.tree.TerminalNode; -/** - * Parser Utils Class. - */ +/** Parser Utils Class. */ @UtilityClass public class ParserUtils { - /** - * Get original text in query. - */ + /** Get original text in query. */ public static String getTextInQuery(ParserRuleContext ctx, String queryString) { Token start = ctx.getStart(); Token stop = ctx.getStop(); return queryString.substring(start.getStartIndex(), stop.getStopIndex() + 1); } - /** - * Create sort option from syntax tree node. - */ + /** Create sort option from syntax tree node. */ public static SortOption createSortOption(OrderByElementContext orderBy) { return new SortOption( - createSortOrder(orderBy.order), - createNullOrder(orderBy.FIRST(), orderBy.LAST())); + createSortOrder(orderBy.order), createNullOrder(orderBy.FIRST(), orderBy.LAST())); } - /** - * Create sort order for sort option use from ASC/DESC token. - */ + /** Create sort order for sort option use from ASC/DESC token. */ public static SortOrder createSortOrder(Token ctx) { if (ctx == null) { return null; @@ -50,9 +40,7 @@ public static SortOrder createSortOrder(Token ctx) { return SortOrder.valueOf(ctx.getText().toUpperCase()); } - /** - * Create null order for sort option use from FIRST/LAST token. - */ + /** Create null order for sort option use from FIRST/LAST token. */ public static NullOrder createNullOrder(TerminalNode first, TerminalNode last) { if (first != null) { return NullOrder.NULL_FIRST; @@ -62,5 +50,4 @@ public static NullOrder createNullOrder(TerminalNode first, TerminalNode last) { return null; } } - } diff --git a/sql/src/main/java/org/opensearch/sql/sql/parser/context/ParsingContext.java b/sql/src/main/java/org/opensearch/sql/sql/parser/context/ParsingContext.java index 33b313367d..297fdfd749 100644 --- a/sql/src/main/java/org/opensearch/sql/sql/parser/context/ParsingContext.java +++ b/sql/src/main/java/org/opensearch/sql/sql/parser/context/ParsingContext.java @@ -3,21 +3,20 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.parser.context; import java.util.ArrayDeque; import java.util.Deque; /** - * SQL parsing context that maintains stack of query specifications for nested queries. - * Currently this is just a thin wrapper by a stack. + * SQL parsing context that maintains stack of query specifications for nested queries. Currently + * this is just a thin wrapper by a stack. */ public class ParsingContext { /** - * Use stack rather than linked query specification because there is no need - * to look up through the stack. + * Use stack rather than linked query specification because there is no need to look up through + * the stack. */ private final Deque contexts = new ArrayDeque<>(); @@ -31,10 +30,10 @@ public QuerySpecification peek() { /** * Pop up query context. - * @return query context after popup. + * + * @return query context after popup. */ public QuerySpecification pop() { return contexts.pop(); } - } diff --git a/sql/src/main/java/org/opensearch/sql/sql/parser/context/QuerySpecification.java b/sql/src/main/java/org/opensearch/sql/sql/parser/context/QuerySpecification.java index 21dddde2b9..5625371f05 100644 --- a/sql/src/main/java/org/opensearch/sql/sql/parser/context/QuerySpecification.java +++ b/sql/src/main/java/org/opensearch/sql/sql/parser/context/QuerySpecification.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.parser.context; import static org.opensearch.sql.sql.antlr.parser.OpenSearchSQLParser.FilteredAggregationFunctionCallContext; @@ -42,6 +41,7 @@ /** * Query specification domain that collects basic info for a simple query. + * *
  * (I) What is the impact of this new abstraction?
  *  This abstraction and collecting process turns AST building process into two phases:
@@ -61,10 +61,9 @@
 @ToString
 public class QuerySpecification {
 
-  /**
-   * Items in SELECT clause and mapping from alias to select item.
-   */
+  /** Items in SELECT clause and mapping from alias to select item. */
   private final List selectItems = new ArrayList<>();
+
   private final Map selectItemsByAlias = new HashMap<>();
 
   /**
@@ -74,31 +73,36 @@ public class QuerySpecification {
   private final Set aggregators = new LinkedHashSet<>();
 
   /**
+   *
+   *
+   * 
    * Items in GROUP BY clause that may be:
    *  1) Simple field name
    *  2) Field nested in scalar function call
    *  3) Ordinal that points to expression in SELECT
    *  4) Alias that points to expression in SELECT.
+   *  
*/ private final List groupByItems = new ArrayList<>(); - /** - * Items in ORDER BY clause that may be different forms as above and its options. - */ + /** Items in ORDER BY clause that may be different forms as above and its options. */ private final List orderByItems = new ArrayList<>(); + private final List orderByOptions = new ArrayList<>(); /** * Collect all query information in the parse tree excluding info in sub-query). - * @param query query spec node in parse tree + * + * @param query query spec node in parse tree */ public void collect(QuerySpecificationContext query, String queryString) { query.accept(new QuerySpecificationCollector(queryString)); } /** - * Replace unresolved expression if it's an alias or ordinal that represents - * an actual expression in SELECT list. + * Replace unresolved expression if it's an alias or ordinal that represents an actual expression + * in SELECT list. + * * @param expr item to be replaced * @return select item that the given expr represents */ @@ -118,8 +122,8 @@ private boolean isIntegerLiteral(UnresolvedExpression expr) { } if (((Literal) expr).getType() != DataType.INTEGER) { - throw new SemanticCheckException(StringUtils.format( - "Non-integer constant [%s] found in ordinal", expr)); + throw new SemanticCheckException( + StringUtils.format("Non-integer constant [%s] found in ordinal", expr)); } return true; } @@ -127,25 +131,26 @@ private boolean isIntegerLiteral(UnresolvedExpression expr) { private UnresolvedExpression getSelectItemByOrdinal(UnresolvedExpression expr) { int ordinal = (Integer) ((Literal) expr).getValue(); if (ordinal <= 0 || ordinal > selectItems.size()) { - throw new SemanticCheckException(StringUtils.format( - "Ordinal [%d] is out of bound of select item list", ordinal)); + throw new SemanticCheckException( + StringUtils.format("Ordinal [%d] is out of bound of select item list", ordinal)); } return selectItems.get(ordinal - 1); } /** * Check if an expression is a select alias. - * @param expr expression + * + * @param expr expression * @return true if it's an alias */ public boolean isSelectAlias(UnresolvedExpression expr) { - return (expr instanceof QualifiedName) - && (selectItemsByAlias.containsKey(expr.toString())); + return (expr instanceof QualifiedName) && (selectItemsByAlias.containsKey(expr.toString())); } /** * Get original expression aliased in SELECT clause. - * @param expr alias + * + * @param expr alias * @return expression in SELECT */ public UnresolvedExpression getSelectItemByAlias(UnresolvedExpression expr) { @@ -223,8 +228,7 @@ public Void visitAggregateFunctionCall(AggregateFunctionCallContext ctx) { @Override public Void visitFilteredAggregationFunctionCall(FilteredAggregationFunctionCallContext ctx) { UnresolvedExpression aggregateFunction = visitAstExpression(ctx); - aggregators.add( - AstDSL.alias(getTextInQuery(ctx, queryString), aggregateFunction)); + aggregators.add(AstDSL.alias(getTextInQuery(ctx, queryString), aggregateFunction)); return super.visitFilteredAggregationFunctionCall(ctx); } @@ -236,5 +240,4 @@ private UnresolvedExpression visitAstExpression(ParseTree tree) { return expressionBuilder.visit(tree); } } - } diff --git a/sql/src/test/java/org/opensearch/sql/common/antlr/SyntaxParserTestBase.java b/sql/src/test/java/org/opensearch/sql/common/antlr/SyntaxParserTestBase.java index 63d7666c62..87f2083774 100644 --- a/sql/src/test/java/org/opensearch/sql/common/antlr/SyntaxParserTestBase.java +++ b/sql/src/test/java/org/opensearch/sql/common/antlr/SyntaxParserTestBase.java @@ -7,16 +7,14 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; -/** - * A base class for tests for SQL or PPL parser. - */ +/** A base class for tests for SQL or PPL parser. */ @RequiredArgsConstructor(access = AccessLevel.PROTECTED) public abstract class SyntaxParserTestBase { - @Getter - private final Parser parser; + @Getter private final Parser parser; /** * A helper function that fails a test if the parser rejects a given query. + * * @param query Query to test. */ protected void acceptQuery(String query) { @@ -25,6 +23,7 @@ protected void acceptQuery(String query) { /** * A helper function that fails a test if the parser accepts a given query. + * * @param query Query to test. */ protected void rejectQuery(String query) { diff --git a/sql/src/test/java/org/opensearch/sql/sql/SQLServiceTest.java b/sql/src/test/java/org/opensearch/sql/sql/SQLServiceTest.java index f4342d877d..8cb2994dc3 100644 --- a/sql/src/test/java/org/opensearch/sql/sql/SQLServiceTest.java +++ b/sql/src/test/java/org/opensearch/sql/sql/SQLServiceTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -45,14 +44,13 @@ class SQLServiceTest { private DefaultQueryManager queryManager; - @Mock - private QueryService queryService; + @Mock private QueryService queryService; @BeforeEach public void setUp() { queryManager = DefaultQueryManager.defaultQueryManager(); - sqlService = new SQLService(new SQLSyntaxParser(), queryManager, - new QueryPlanFactory(queryService)); + sqlService = + new SQLService(new SQLSyntaxParser(), queryManager, new QueryPlanFactory(queryService)); } @AfterEach @@ -97,8 +95,8 @@ public void onFailure(Exception e) { @Test public void can_execute_close_cursor_query() { sqlService.execute( - new SQLQueryRequest(new JSONObject(), null, QUERY + "/close", - Map.of("format", "jdbc"), "n:cursor"), + new SQLQueryRequest( + new JSONObject(), null, QUERY + "/close", Map.of("format", "jdbc"), "n:cursor"), new ResponseListener<>() { @Override public void onResponse(QueryResponse response) { @@ -131,13 +129,17 @@ public void onFailure(Exception e) { @Test public void can_explain_sql_query() { - doAnswer(invocation -> { - ResponseListener listener = invocation.getArgument(1); - listener.onResponse(new ExplainResponse(new ExplainResponseNode("Test"))); - return null; - }).when(queryService).explain(any(), any()); + doAnswer( + invocation -> { + ResponseListener listener = invocation.getArgument(1); + listener.onResponse(new ExplainResponse(new ExplainResponseNode("Test"))); + return null; + }) + .when(queryService) + .explain(any(), any()); - sqlService.explain(new SQLQueryRequest(new JSONObject(), "SELECT 123", EXPLAIN, "csv"), + sqlService.explain( + new SQLQueryRequest(new JSONObject(), "SELECT 123", EXPLAIN, "csv"), new ResponseListener() { @Override public void onResponse(ExplainResponse response) { @@ -153,8 +155,8 @@ public void onFailure(Exception e) { @Test public void cannot_explain_cursor_query() { - sqlService.explain(new SQLQueryRequest(new JSONObject(), null, EXPLAIN, - Map.of("format", "jdbc"), "n:cursor"), + sqlService.explain( + new SQLQueryRequest(new JSONObject(), null, EXPLAIN, Map.of("format", "jdbc"), "n:cursor"), new ResponseListener() { @Override public void onResponse(ExplainResponse response) { @@ -163,8 +165,10 @@ public void onResponse(ExplainResponse response) { @Override public void onFailure(Exception e) { - assertEquals("Explain of a paged query continuation is not supported." - + " Use `explain` for the initial query request.", e.getMessage()); + assertEquals( + "Explain of a paged query continuation is not supported." + + " Use `explain` for the initial query request.", + e.getMessage()); } }); } diff --git a/sql/src/test/java/org/opensearch/sql/sql/antlr/BracketedTimestampTest.java b/sql/src/test/java/org/opensearch/sql/sql/antlr/BracketedTimestampTest.java index 0f7a284aa7..120cd233fc 100644 --- a/sql/src/test/java/org/opensearch/sql/sql/antlr/BracketedTimestampTest.java +++ b/sql/src/test/java/org/opensearch/sql/sql/antlr/BracketedTimestampTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.antlr; import org.junit.jupiter.api.Test; diff --git a/sql/src/test/java/org/opensearch/sql/sql/antlr/HighlightTest.java b/sql/src/test/java/org/opensearch/sql/sql/antlr/HighlightTest.java index 6826a37c0b..a0dbc2fc02 100644 --- a/sql/src/test/java/org/opensearch/sql/sql/antlr/HighlightTest.java +++ b/sql/src/test/java/org/opensearch/sql/sql/antlr/HighlightTest.java @@ -15,14 +15,14 @@ void single_field_test() { @Test void multiple_highlights_test() { - acceptQuery("SELECT HIGHLIGHT(Tags), HIGHLIGHT(Body) FROM Index " - + "WHERE MULTI_MATCH([Tags, Body], 'Time')"); + acceptQuery( + "SELECT HIGHLIGHT(Tags), HIGHLIGHT(Body) FROM Index " + + "WHERE MULTI_MATCH([Tags, Body], 'Time')"); } @Test void wildcard_test() { - acceptQuery("SELECT HIGHLIGHT('T*') FROM Index " - + "WHERE MULTI_MATCH([Tags, Body], 'Time')"); + acceptQuery("SELECT HIGHLIGHT('T*') FROM Index WHERE MULTI_MATCH([Tags, Body], 'Time')"); } @Test @@ -33,13 +33,12 @@ void highlight_all_test() { @Test void multiple_parameters_failure_test() { - rejectQuery("SELECT HIGHLIGHT(Tags1, Tags2) FROM Index " - + "WHERE MULTI_MATCH([Tags, Body], 'Time')"); + rejectQuery( + "SELECT HIGHLIGHT(Tags1, Tags2) FROM Index WHERE MULTI_MATCH([Tags, Body], 'Time')"); } @Test void no_parameters_failure_test() { - rejectQuery("SELECT HIGHLIGHT() FROM Index " - + "WHERE MULTI_MATCH([Tags, Body], 'Time')"); + rejectQuery("SELECT HIGHLIGHT() FROM Index WHERE MULTI_MATCH([Tags, Body], 'Time')"); } } diff --git a/sql/src/test/java/org/opensearch/sql/sql/antlr/MatchBoolPrefixParserTest.java b/sql/src/test/java/org/opensearch/sql/sql/antlr/MatchBoolPrefixParserTest.java index 66c4d5be9d..db5ce18edb 100644 --- a/sql/src/test/java/org/opensearch/sql/sql/antlr/MatchBoolPrefixParserTest.java +++ b/sql/src/test/java/org/opensearch/sql/sql/antlr/MatchBoolPrefixParserTest.java @@ -25,14 +25,13 @@ static Stream generateValidArguments() { new String("max_expansions=50"), new String("fuzzy_transpositions=true"), new String("fuzzy_rewrite=constant_score"), - new String("boost=1") - ); + new String("boost=1")); } @ParameterizedTest @MethodSource("generateValidArguments") public void testValidArguments(String arg) { - acceptQuery("SELECT * FROM T WHERE MATCH_BOOL_PREFIX(message, 'query', " + arg + ")"); + acceptQuery("SELECT * FROM T WHERE MATCH_BOOL_PREFIX(message, 'query', " + arg + ")"); } @Test diff --git a/sql/src/test/java/org/opensearch/sql/sql/antlr/SQLParserTest.java b/sql/src/test/java/org/opensearch/sql/sql/antlr/SQLParserTest.java index 3f323725ab..db091a4932 100644 --- a/sql/src/test/java/org/opensearch/sql/sql/antlr/SQLParserTest.java +++ b/sql/src/test/java/org/opensearch/sql/sql/antlr/SQLParserTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.antlr; import org.opensearch.sql.common.antlr.SyntaxParserTestBase; diff --git a/sql/src/test/java/org/opensearch/sql/sql/antlr/SQLSyntaxParserTest.java b/sql/src/test/java/org/opensearch/sql/sql/antlr/SQLSyntaxParserTest.java index ade4983f58..f68c27deea 100644 --- a/sql/src/test/java/org/opensearch/sql/sql/antlr/SQLSyntaxParserTest.java +++ b/sql/src/test/java/org/opensearch/sql/sql/antlr/SQLSyntaxParserTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.antlr; import static org.junit.jupiter.api.Assertions.assertAll; @@ -73,8 +72,7 @@ public void canParseHiddenIndexName() { @Test public void canNotParseIndexNameWithSpecialChar() { - assertThrows(SyntaxCheckException.class, - () -> parser.parse("SELECT * FROM hello+world")); + assertThrows(SyntaxCheckException.class, () -> parser.parse("SELECT * FROM hello+world")); } @Test @@ -84,14 +82,12 @@ public void canParseIndexNameWithSpecialCharQuoted() { @Test public void canNotParseIndexNameStartingWithNumber() { - assertThrows(SyntaxCheckException.class, - () -> parser.parse("SELECT * FROM 123test")); + assertThrows(SyntaxCheckException.class, () -> parser.parse("SELECT * FROM 123test")); } @Test public void canNotParseIndexNameSingleQuoted() { - assertThrows(SyntaxCheckException.class, - () -> parser.parse("SELECT * FROM 'test'")); + assertThrows(SyntaxCheckException.class, () -> parser.parse("SELECT * FROM 'test'")); } @Test @@ -101,14 +97,15 @@ public void canParseWhereClause() { @Test public void canParseSelectClauseWithLogicalOperator() { - assertNotNull(parser.parse( - "SELECT age = 10 AND name = 'John' OR NOT (balance > 1000) FROM test")); + assertNotNull( + parser.parse("SELECT age = 10 AND name = 'John' OR NOT (balance > 1000) FROM test")); } @Test public void canParseWhereClauseWithLogicalOperator() { - assertNotNull(parser.parse("SELECT name FROM test " - + "WHERE age = 10 AND name = 'John' OR NOT (balance > 1000)")); + assertNotNull( + parser.parse( + "SELECT name FROM test WHERE age = 10 AND name = 'John' OR NOT (balance > 1000)")); } @Test @@ -128,9 +125,11 @@ public void canParseDistinctClause() { @Test public void canParseCaseStatement() { assertNotNull(parser.parse("SELECT CASE WHEN age > 30 THEN 'age1' ELSE 'age2' END FROM test")); - assertNotNull(parser.parse("SELECT CASE WHEN age > 30 THEN 'age1' " - + " WHEN age < 50 THEN 'age2' " - + " ELSE 'age3' END FROM test")); + assertNotNull( + parser.parse( + "SELECT CASE WHEN age > 30 THEN 'age1' " + + " WHEN age < 50 THEN 'age2' " + + " ELSE 'age3' END FROM test")); assertNotNull(parser.parse("SELECT CASE age WHEN 30 THEN 'age1' ELSE 'age2' END FROM test")); assertNotNull(parser.parse("SELECT CASE age WHEN 30 THEN 'age1' END FROM test")); } @@ -147,10 +146,11 @@ public void canNotParseAggregateFunctionWithWrongArgument() { public void canParseOrderByClause() { assertNotNull(parser.parse("SELECT name, age FROM test ORDER BY name, age")); assertNotNull(parser.parse("SELECT name, age FROM test ORDER BY name ASC, age DESC")); - assertNotNull(parser.parse( - "SELECT name, age FROM test ORDER BY name NULLS LAST, age NULLS FIRST")); - assertNotNull(parser.parse( - "SELECT name, age FROM test ORDER BY name ASC NULLS FIRST, age DESC NULLS LAST")); + assertNotNull( + parser.parse("SELECT name, age FROM test ORDER BY name NULLS LAST, age NULLS FIRST")); + assertNotNull( + parser.parse( + "SELECT name, age FROM test ORDER BY name ASC NULLS FIRST, age DESC NULLS LAST")); } @Test @@ -171,8 +171,7 @@ private static Stream nowLikeFunctionsData() { Arguments.of("current_date", false, true), Arguments.of("utc_date", false, true), Arguments.of("utc_time", false, true), - Arguments.of("utc_timestamp", false, true) - ); + Arguments.of("utc_timestamp", false, true)); } private static Stream getPartForExtractFunction() { @@ -196,8 +195,7 @@ private static Stream getPartForExtractFunction() { Arguments.of("DAY_SECOND"), Arguments.of("DAY_MINUTE"), Arguments.of("DAY_HOUR"), - Arguments.of("YEAR_MONTH") - ); + Arguments.of("YEAR_MONTH")); } @ParameterizedTest(name = "{0}") @@ -207,11 +205,7 @@ public void can_parse_extract_function(String part) { } private static Stream getInvalidPartForExtractFunction() { - return Stream.of( - Arguments.of("INVALID"), - Arguments.of("\"SECOND\""), - Arguments.of("123") - ); + return Stream.of(Arguments.of("INVALID"), Arguments.of("\"SECOND\""), Arguments.of("123")); } @ParameterizedTest(name = "{0}") @@ -231,9 +225,12 @@ public void can_parse_weekday_function() { @ParameterizedTest(name = "{0}") @MethodSource("nowLikeFunctionsData") public void can_parse_now_like_functions(String name, Boolean hasFsp, Boolean hasShortcut) { - var calls = new ArrayList() {{ - add(name + "()"); - }}; + var calls = + new ArrayList() { + { + add(name + "()"); + } + }; if (hasShortcut) { calls.add(name); } @@ -270,8 +267,7 @@ public void can_parse_get_format_function(String type, String format) { @Test public void cannot_parse_get_format_function_with_bad_arg() { assertThrows( - SyntaxCheckException.class, - () -> parser.parse("GET_FORMAT(NONSENSE_ARG,'INTERNAL')")); + SyntaxCheckException.class, () -> parser.parse("GET_FORMAT(NONSENSE_ARG,'INTERNAL')")); } @Test @@ -326,53 +322,55 @@ public void can_parse_month_of_year_function() { assertNotNull(parser.parse("SELECT month(timestamp('2022-11-18 00:00:00'))")); assertNotNull(parser.parse("SELECT month_of_year(timestamp('2022-11-18 00:00:00'))")); - } @Test public void can_parse_multi_match_relevance_function() { - assertNotNull(parser.parse( - "SELECT id FROM test WHERE multimatch(\"fields\"=\"field\", query=\"query\")")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE multimatchquery(fields=\"field\", \"query\"=\"query\")")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE multi_match(\"fields\"=\"field\", \"query\"=\"query\")")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE multi_match(\'fields\'=\'field\', \'query\'=\'query\')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE multi_match(fields=\'field\', query=\'query\')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE multi_match(['address'], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE multi_match(['address', 'notes'], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE multi_match([\"*\"], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE multi_match([\"address\"], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE multi_match([`address`], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE multi_match([address], 'query')")); - - assertNotNull(parser.parse( - "SELECT id FROM test WHERE" - + " multi_match(['address' ^ 1.0, 'notes' ^ 2.2], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE multi_match(['address' ^ 1.1, 'notes'], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE multi_match(['address', 'notes' ^ 1.5], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE multi_match(['address', 'notes' 3], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE multi_match(['address' ^ .3, 'notes' 3], 'query')")); - - assertNotNull(parser.parse( - "SELECT id FROM test WHERE" - + " multi_match([\"Tags\" ^ 1.5, Title, `Body` 4.2], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE" - + " multi_match([\"Tags\" ^ 1.5, Title, `Body` 4.2], 'query', analyzer=keyword," - + "operator='AND', tie_breaker=0.3, type = \"most_fields\", fuzziness = \"AUTO\")")); + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE multimatch(\"fields\"=\"field\", query=\"query\")")); + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE multimatchquery(fields=\"field\", \"query\"=\"query\")")); + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE multi_match(\"fields\"=\"field\", \"query\"=\"query\")")); + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE multi_match(\'fields\'=\'field\', \'query\'=\'query\')")); + assertNotNull( + parser.parse("SELECT id FROM test WHERE multi_match(fields=\'field\', query=\'query\')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE multi_match(['address'], 'query')")); + assertNotNull( + parser.parse("SELECT id FROM test WHERE multi_match(['address', 'notes'], 'query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE multi_match([\"*\"], 'query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE multi_match([\"address\"], 'query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE multi_match([`address`], 'query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE multi_match([address], 'query')")); + + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE" + + " multi_match(['address' ^ 1.0, 'notes' ^ 2.2], 'query')")); + assertNotNull( + parser.parse("SELECT id FROM test WHERE multi_match(['address' ^ 1.1, 'notes'], 'query')")); + assertNotNull( + parser.parse("SELECT id FROM test WHERE multi_match(['address', 'notes' ^ 1.5], 'query')")); + assertNotNull( + parser.parse("SELECT id FROM test WHERE multi_match(['address', 'notes' 3], 'query')")); + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE multi_match(['address' ^ .3, 'notes' 3], 'query')")); + + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE" + + " multi_match([\"Tags\" ^ 1.5, Title, `Body` 4.2], 'query')")); + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE multi_match([\"Tags\" ^ 1.5, Title, `Body` 4.2], 'query'," + + " analyzer=keyword,operator='AND', tie_breaker=0.3, type = \"most_fields\"," + + " fuzziness = \"AUTO\")")); } @Test @@ -385,160 +383,137 @@ public void can_parse_second_functions() { @Test public void can_parse_simple_query_string_relevance_function() { - assertNotNull(parser.parse( - "SELECT id FROM test WHERE simple_query_string(['address'], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE simple_query_string(['address', 'notes'], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE simple_query_string([\"*\"], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE simple_query_string([\"address\"], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE simple_query_string([`address`], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE simple_query_string([address], 'query')")); - - assertNotNull(parser.parse( - "SELECT id FROM test WHERE" - + " simple_query_string(['address' ^ 1.0, 'notes' ^ 2.2], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE simple_query_string(['address' ^ 1.1, 'notes'], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE simple_query_string(['address', 'notes' ^ 1.5], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE simple_query_string(['address', 'notes' 3], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE simple_query_string(['address' ^ .3, 'notes' 3], 'query')")); - - assertNotNull(parser.parse( - "SELECT id FROM test WHERE" - + " simple_query_string([\"Tags\" ^ 1.5, Title, `Body` 4.2], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE" - + " simple_query_string([\"Tags\" ^ 1.5, Title, `Body` 4.2], 'query', analyzer=keyword," - + "flags='AND', quote_field_suffix=\".exact\", fuzzy_prefix_length = 4)")); + assertNotNull( + parser.parse("SELECT id FROM test WHERE simple_query_string(['address'], 'query')")); + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE simple_query_string(['address', 'notes'], 'query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE simple_query_string([\"*\"], 'query')")); + assertNotNull( + parser.parse("SELECT id FROM test WHERE simple_query_string([\"address\"], 'query')")); + assertNotNull( + parser.parse("SELECT id FROM test WHERE simple_query_string([`address`], 'query')")); + assertNotNull( + parser.parse("SELECT id FROM test WHERE simple_query_string([address], 'query')")); + + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE" + + " simple_query_string(['address' ^ 1.0, 'notes' ^ 2.2], 'query')")); + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE simple_query_string(['address' ^ 1.1, 'notes'], 'query')")); + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE simple_query_string(['address', 'notes' ^ 1.5], 'query')")); + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE simple_query_string(['address', 'notes' 3], 'query')")); + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE simple_query_string(['address' ^ .3, 'notes' 3], 'query')")); + + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE" + + " simple_query_string([\"Tags\" ^ 1.5, Title, `Body` 4.2], 'query')")); + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE simple_query_string([\"Tags\" ^ 1.5, Title, `Body` 4.2]," + + " 'query', analyzer=keyword,flags='AND', quote_field_suffix=\".exact\"," + + " fuzzy_prefix_length = 4)")); } @Test public void can_parse_str_to_date() { - assertNotNull(parser.parse( - "SELECT STR_TO_DATE('01,5,2013','%d,%m,%Y')" - )); + assertNotNull(parser.parse("SELECT STR_TO_DATE('01,5,2013','%d,%m,%Y')")); - assertNotNull(parser.parse( - "SELECT STR_TO_DATE('a09:30:17','a%h:%i:%s')" - )); + assertNotNull(parser.parse("SELECT STR_TO_DATE('a09:30:17','a%h:%i:%s')")); - assertNotNull(parser.parse( - "SELECT STR_TO_DATE('abc','abc');" - )); + assertNotNull(parser.parse("SELECT STR_TO_DATE('abc','abc');")); } @Test public void can_parse_query_string_relevance_function() { - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string(['*'], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string(['address'], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string(['add*'], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string(['*ess'], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string(['address', 'notes'], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string([\"*\"], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string([\"address\"], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string([\"ad*\"], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string([\"*s\"], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string([\"address\", \"notes\"], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string([`*`], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string([`address`], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string([`ad*`], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string([`*ss`], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string([`address`, `notes`], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string([address], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string([addr*], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string([*ss], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string([address, notes], 'query')")); - - assertNotNull(parser.parse( - "SELECT id FROM test WHERE" - + " query_string(['address' ^ 1.0, 'notes' ^ 2.2], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string(['address' ^ 1.1, 'notes'], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string(['address', 'notes' ^ 1.5], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string(['address', 'notes' 3], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query_string(['address' ^ .3, 'notes' 3], 'query')")); - - assertNotNull(parser.parse( - "SELECT id FROM test WHERE" - + " query_string([\"Tags\" ^ 1.5, Title, `Body` 4.2], 'query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE" - + " query_string([\"Tags\" ^ 1.5, Title, `Body` 4.2], 'query', analyzer=keyword," - + "operator='AND', tie_breaker=0.3, type = \"most_fields\", fuzziness = 4)")); - } + assertNotNull(parser.parse("SELECT id FROM test WHERE query_string(['*'], 'query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query_string(['address'], 'query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query_string(['add*'], 'query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query_string(['*ess'], 'query')")); + assertNotNull( + parser.parse("SELECT id FROM test WHERE query_string(['address', 'notes'], 'query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query_string([\"*\"], 'query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query_string([\"address\"], 'query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query_string([\"ad*\"], 'query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query_string([\"*s\"], 'query')")); + assertNotNull( + parser.parse("SELECT id FROM test WHERE query_string([\"address\", \"notes\"], 'query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query_string([`*`], 'query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query_string([`address`], 'query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query_string([`ad*`], 'query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query_string([`*ss`], 'query')")); + assertNotNull( + parser.parse("SELECT id FROM test WHERE query_string([`address`, `notes`], 'query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query_string([address], 'query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query_string([addr*], 'query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query_string([*ss], 'query')")); + assertNotNull( + parser.parse("SELECT id FROM test WHERE query_string([address, notes], 'query')")); + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE" + + " query_string(['address' ^ 1.0, 'notes' ^ 2.2], 'query')")); + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE query_string(['address' ^ 1.1, 'notes'], 'query')")); + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE query_string(['address', 'notes' ^ 1.5], 'query')")); + assertNotNull( + parser.parse("SELECT id FROM test WHERE query_string(['address', 'notes' 3], 'query')")); + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE query_string(['address' ^ .3, 'notes' 3], 'query')")); + + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE" + + " query_string([\"Tags\" ^ 1.5, Title, `Body` 4.2], 'query')")); + assertNotNull( + parser.parse( + "SELECT id FROM test WHERE" + + " query_string([\"Tags\" ^ 1.5, Title, `Body` 4.2], 'query', analyzer=keyword," + + "operator='AND', tie_breaker=0.3, type = \"most_fields\", fuzziness = 4)")); + } @Test public void can_parse_query_relevance_function() { - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query('address:query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query('address:query OR notes:query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query(\"address:query\")")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query(\"address:query OR notes:query\")")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query(`address:query`)")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query(`address:query OR notes:query`)")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query('*:query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query(\"*:query\")")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query(`*:query`)")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query('address:*uery OR notes:?uery')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query(\"address:*uery OR notes:?uery\")")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query(`address:*uery OR notes:?uery`)")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query('address:qu*ry OR notes:qu?ry')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query(\"address:qu*ry OR notes:qu?ry\")")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query(`address:qu*ry OR notes:qu?ry`)")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query('address:query notes:query')")); - assertNotNull(parser.parse( - "SELECT id FROM test WHERE query(\"address:query notes:query\")")); - assertNotNull(parser.parse( + assertNotNull(parser.parse("SELECT id FROM test WHERE query('address:query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query('address:query OR notes:query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query(\"address:query\")")); + assertNotNull( + parser.parse("SELECT id FROM test WHERE query(\"address:query OR notes:query\")")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query(`address:query`)")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query(`address:query OR notes:query`)")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query('*:query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query(\"*:query\")")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query(`*:query`)")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query('address:*uery OR notes:?uery')")); + assertNotNull( + parser.parse("SELECT id FROM test WHERE query(\"address:*uery OR notes:?uery\")")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query(`address:*uery OR notes:?uery`)")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query('address:qu*ry OR notes:qu?ry')")); + assertNotNull( + parser.parse("SELECT id FROM test WHERE query(\"address:qu*ry OR notes:qu?ry\")")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query(`address:qu*ry OR notes:qu?ry`)")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query('address:query notes:query')")); + assertNotNull(parser.parse("SELECT id FROM test WHERE query(\"address:query notes:query\")")); + assertNotNull( + parser.parse( "SELECT id FROM test WHERE " - + "query(\"Body:\'taste beer\' Tags:\'taste beer\' Title:\'taste beer\'\")")); + + "query(\"Body:\'taste beer\' Tags:\'taste beer\' Title:\'taste beer\'\")")); } - @Test public void can_parse_match_relevance_function() { assertNotNull(parser.parse("SELECT * FROM test WHERE match(column, \"this is a test\")")); @@ -552,19 +527,18 @@ public void can_parse_match_relevance_function() { public void can_parse_matchquery_relevance_function() { assertNotNull(parser.parse("SELECT * FROM test WHERE matchquery(column, \"this is a test\")")); assertNotNull(parser.parse("SELECT * FROM test WHERE matchquery(column, 'this is a test')")); - assertNotNull(parser.parse( - "SELECT * FROM test WHERE matchquery(`column`, \"this is a test\")")); + assertNotNull( + parser.parse("SELECT * FROM test WHERE matchquery(`column`, \"this is a test\")")); assertNotNull(parser.parse("SELECT * FROM test WHERE matchquery(`column`, 'this is a test')")); assertNotNull(parser.parse("SELECT * FROM test WHERE matchquery(column, 100500)")); } @Test public void can_parse_match_query_relevance_function() { - assertNotNull(parser.parse( - "SELECT * FROM test WHERE match_query(column, \"this is a test\")")); + assertNotNull(parser.parse("SELECT * FROM test WHERE match_query(column, \"this is a test\")")); assertNotNull(parser.parse("SELECT * FROM test WHERE match_query(column, 'this is a test')")); - assertNotNull(parser.parse( - "SELECT * FROM test WHERE match_query(`column`, \"this is a test\")")); + assertNotNull( + parser.parse("SELECT * FROM test WHERE match_query(`column`, \"this is a test\")")); assertNotNull(parser.parse("SELECT * FROM test WHERE match_query(`column`, 'this is a test')")); assertNotNull(parser.parse("SELECT * FROM test WHERE match_query(column, 100500)")); } @@ -572,21 +546,21 @@ public void can_parse_match_query_relevance_function() { @Test public void can_parse_match_phrase_relevance_function() { assertNotNull( - parser.parse("SELECT * FROM test WHERE match_phrase(column, \"this is a test\")")); + parser.parse("SELECT * FROM test WHERE match_phrase(column, \"this is a test\")")); assertNotNull(parser.parse("SELECT * FROM test WHERE match_phrase(column, 'this is a test')")); assertNotNull( - parser.parse("SELECT * FROM test WHERE match_phrase(`column`, \"this is a test\")")); + parser.parse("SELECT * FROM test WHERE match_phrase(`column`, \"this is a test\")")); assertNotNull( - parser.parse("SELECT * FROM test WHERE match_phrase(`column`, 'this is a test')")); + parser.parse("SELECT * FROM test WHERE match_phrase(`column`, 'this is a test')")); assertNotNull(parser.parse("SELECT * FROM test WHERE match_phrase(column, 100500)")); } @Test public void can_parse_minute_of_day_function() { assertNotNull(parser.parse("SELECT minute_of_day(\"12:23:34\");")); - assertNotNull(parser.parse("SELECT minute_of_day('12:23:34');"));; - assertNotNull(parser.parse("SELECT minute_of_day(\"2022-12-14 12:23:34\");"));; - assertNotNull(parser.parse("SELECT minute_of_day('2022-12-14 12:23:34');"));; + assertNotNull(parser.parse("SELECT minute_of_day('12:23:34');")); + assertNotNull(parser.parse("SELECT minute_of_day(\"2022-12-14 12:23:34\");")); + assertNotNull(parser.parse("SELECT minute_of_day('2022-12-14 12:23:34');")); } @Test @@ -631,35 +605,20 @@ public void can_parse_wildcard_query_relevance_function() { assertNotNull( parser.parse("SELECT * FROM test WHERE wildcard_query(`column`, 'this is a test*')")); assertNotNull( - parser.parse("SELECT * FROM test WHERE wildcard_query(`column`, 'this is a test*', " - + "boost=1.5, case_insensitive=true, rewrite=\"scoring_boolean\")")); + parser.parse( + "SELECT * FROM test WHERE wildcard_query(`column`, 'this is a test*', " + + "boost=1.5, case_insensitive=true, rewrite=\"scoring_boolean\")")); } @Test public void can_parse_nested_function() { - assertNotNull( - parser.parse("SELECT NESTED(PATH.INNER_FIELD) FROM TEST")); - assertNotNull( - parser.parse("SELECT NESTED('PATH.INNER_FIELD') FROM TEST")); - assertNotNull( - parser.parse("SELECT SUM(NESTED(PATH.INNER_FIELD)) FROM TEST")); - assertNotNull( - parser.parse("SELECT NESTED(PATH.INNER_FIELD, PATH) FROM TEST")); - assertNotNull( - parser.parse( - "SELECT * FROM TEST WHERE NESTED(PATH.INNER_FIELDS) = 'A'" - ) - ); - assertNotNull( - parser.parse( - "SELECT * FROM TEST WHERE NESTED(PATH.INNER_FIELDS, PATH) = 'A'" - ) - ); - assertNotNull( - parser.parse( - "SELECT FIELD FROM TEST ORDER BY nested(PATH.INNER_FIELD, PATH)" - ) - ); + assertNotNull(parser.parse("SELECT NESTED(PATH.INNER_FIELD) FROM TEST")); + assertNotNull(parser.parse("SELECT NESTED('PATH.INNER_FIELD') FROM TEST")); + assertNotNull(parser.parse("SELECT SUM(NESTED(PATH.INNER_FIELD)) FROM TEST")); + assertNotNull(parser.parse("SELECT NESTED(PATH.INNER_FIELD, PATH) FROM TEST")); + assertNotNull(parser.parse("SELECT * FROM TEST WHERE NESTED(PATH.INNER_FIELDS) = 'A'")); + assertNotNull(parser.parse("SELECT * FROM TEST WHERE NESTED(PATH.INNER_FIELDS, PATH) = 'A'")); + assertNotNull(parser.parse("SELECT FIELD FROM TEST ORDER BY nested(PATH.INNER_FIELD, PATH)")); } @Test @@ -671,68 +630,69 @@ public void can_parse_yearweek_function() { @Test public void describe_request_accepts_only_quoted_string_literals() { assertAll( - () -> assertThrows(SyntaxCheckException.class, - () -> parser.parse("DESCRIBE TABLES LIKE bank")), - () -> assertThrows(SyntaxCheckException.class, - () -> parser.parse("DESCRIBE TABLES LIKE %bank%")), - () -> assertThrows(SyntaxCheckException.class, - () -> parser.parse("DESCRIBE TABLES LIKE `bank`")), - () -> assertThrows(SyntaxCheckException.class, - () -> parser.parse("DESCRIBE TABLES LIKE %bank% COLUMNS LIKE %status%")), - () -> assertThrows(SyntaxCheckException.class, - () -> parser.parse("DESCRIBE TABLES LIKE 'bank' COLUMNS LIKE status")), + () -> + assertThrows( + SyntaxCheckException.class, () -> parser.parse("DESCRIBE TABLES LIKE bank")), + () -> + assertThrows( + SyntaxCheckException.class, () -> parser.parse("DESCRIBE TABLES LIKE %bank%")), + () -> + assertThrows( + SyntaxCheckException.class, () -> parser.parse("DESCRIBE TABLES LIKE `bank`")), + () -> + assertThrows( + SyntaxCheckException.class, + () -> parser.parse("DESCRIBE TABLES LIKE %bank% COLUMNS LIKE %status%")), + () -> + assertThrows( + SyntaxCheckException.class, + () -> parser.parse("DESCRIBE TABLES LIKE 'bank' COLUMNS LIKE status")), () -> assertNotNull(parser.parse("DESCRIBE TABLES LIKE 'bank' COLUMNS LIKE \"status\"")), - () -> assertNotNull(parser.parse("DESCRIBE TABLES LIKE \"bank\" COLUMNS LIKE 'status'")) - ); + () -> assertNotNull(parser.parse("DESCRIBE TABLES LIKE \"bank\" COLUMNS LIKE 'status'"))); } @Test public void show_request_accepts_only_quoted_string_literals() { assertAll( - () -> assertThrows(SyntaxCheckException.class, - () -> parser.parse("SHOW TABLES LIKE bank")), - () -> assertThrows(SyntaxCheckException.class, - () -> parser.parse("SHOW TABLES LIKE %bank%")), - () -> assertThrows(SyntaxCheckException.class, - () -> parser.parse("SHOW TABLES LIKE `bank`")), + () -> assertThrows(SyntaxCheckException.class, () -> parser.parse("SHOW TABLES LIKE bank")), + () -> + assertThrows(SyntaxCheckException.class, () -> parser.parse("SHOW TABLES LIKE %bank%")), + () -> + assertThrows(SyntaxCheckException.class, () -> parser.parse("SHOW TABLES LIKE `bank`")), () -> assertNotNull(parser.parse("SHOW TABLES LIKE 'bank'")), - () -> assertNotNull(parser.parse("SHOW TABLES LIKE \"bank\"")) - ); + () -> assertNotNull(parser.parse("SHOW TABLES LIKE \"bank\""))); } @ParameterizedTest @MethodSource({ - "matchPhraseComplexQueries", - "matchPhraseGeneratedQueries", - "generateMatchPhraseQueries", - "matchPhraseQueryComplexQueries" + "matchPhraseComplexQueries", + "matchPhraseGeneratedQueries", + "generateMatchPhraseQueries", + "matchPhraseQueryComplexQueries" }) public void canParseComplexMatchPhraseArgsTest(String query) { assertNotNull(parser.parse(query)); } @ParameterizedTest - @MethodSource({ - "generateMatchPhrasePrefixQueries" - }) + @MethodSource({"generateMatchPhrasePrefixQueries"}) public void canParseComplexMatchPhrasePrefixQueries(String query) { assertNotNull(parser.parse(query)); } private static Stream matchPhraseComplexQueries() { return Stream.of( - "SELECT * FROM t WHERE match_phrase(c, 3)", - "SELECT * FROM t WHERE match_phrase(c, 3, fuzziness=AUTO)", - "SELECT * FROM t WHERE match_phrase(c, 3, zero_terms_query=\"all\")", - "SELECT * FROM t WHERE match_phrase(c, 3, lenient=true)", - "SELECT * FROM t WHERE match_phrase(c, 3, lenient='true')", - "SELECT * FROM t WHERE match_phrase(c, 3, operator=xor)", - "SELECT * FROM t WHERE match_phrase(c, 3, cutoff_frequency=0.04)", - "SELECT * FROM t WHERE match_phrase(c, 3, cutoff_frequency=0.04, analyzer = english, " - + "prefix_length=34, fuzziness='auto', minimum_should_match='2<-25% 9<-3')", - "SELECT * FROM t WHERE match_phrase(c, 3, minimum_should_match='2<-25% 9<-3')", - "SELECT * FROM t WHERE match_phrase(c, 3, operator='AUTO')" - ); + "SELECT * FROM t WHERE match_phrase(c, 3)", + "SELECT * FROM t WHERE match_phrase(c, 3, fuzziness=AUTO)", + "SELECT * FROM t WHERE match_phrase(c, 3, zero_terms_query=\"all\")", + "SELECT * FROM t WHERE match_phrase(c, 3, lenient=true)", + "SELECT * FROM t WHERE match_phrase(c, 3, lenient='true')", + "SELECT * FROM t WHERE match_phrase(c, 3, operator=xor)", + "SELECT * FROM t WHERE match_phrase(c, 3, cutoff_frequency=0.04)", + "SELECT * FROM t WHERE match_phrase(c, 3, cutoff_frequency=0.04, analyzer = english, " + + "prefix_length=34, fuzziness='auto', minimum_should_match='2<-25% 9<-3')", + "SELECT * FROM t WHERE match_phrase(c, 3, minimum_should_match='2<-25% 9<-3')", + "SELECT * FROM t WHERE match_phrase(c, 3, operator='AUTO')"); } @Test @@ -771,50 +731,51 @@ private static Stream matchPhraseQueryComplexQueries() { "SELECT * FROM t WHERE matchphrasequery(c, 3, cutoff_frequency=0.04, analyzer = english, " + "prefix_length=34, fuzziness='auto', minimum_should_match='2<-25% 9<-3')", "SELECT * FROM t WHERE matchphrasequery(c, 3, minimum_should_match='2<-25% 9<-3')", - "SELECT * FROM t WHERE matchphrasequery(c, 3, operator='AUTO')" - ); + "SELECT * FROM t WHERE matchphrasequery(c, 3, operator='AUTO')"); } private static Stream matchPhraseGeneratedQueries() { var matchArgs = new HashMap(); - matchArgs.put("fuzziness", new String[]{ "AUTO", "AUTO:1,5", "1" }); - matchArgs.put("fuzzy_transpositions", new Boolean[]{ true, false }); - matchArgs.put("operator", new String[]{ "and", "or" }); - matchArgs.put("minimum_should_match", - new String[]{ "3", "-2", "75%", "-25%", "3<90%", "2<-25% 9<-3" }); - matchArgs.put("analyzer", new String[]{ "standard", "stop", "english" }); - matchArgs.put("zero_terms_query", new String[]{ "none", "all" }); - matchArgs.put("lenient", new Boolean[]{ true, false }); + matchArgs.put("fuzziness", new String[] {"AUTO", "AUTO:1,5", "1"}); + matchArgs.put("fuzzy_transpositions", new Boolean[] {true, false}); + matchArgs.put("operator", new String[] {"and", "or"}); + matchArgs.put( + "minimum_should_match", new String[] {"3", "-2", "75%", "-25%", "3<90%", "2<-25% 9<-3"}); + matchArgs.put("analyzer", new String[] {"standard", "stop", "english"}); + matchArgs.put("zero_terms_query", new String[] {"none", "all"}); + matchArgs.put("lenient", new Boolean[] {true, false}); // deprecated - matchArgs.put("cutoff_frequency", new Double[]{ .0, 0.001, 1., 42. }); - matchArgs.put("prefix_length", new Integer[]{ 0, 2, 5 }); - matchArgs.put("max_expansions", new Integer[]{ 0, 5, 20 }); - matchArgs.put("boost", new Double[]{ .5, 1., 2.3 }); + matchArgs.put("cutoff_frequency", new Double[] {.0, 0.001, 1., 42.}); + matchArgs.put("prefix_length", new Integer[] {0, 2, 5}); + matchArgs.put("max_expansions", new Integer[] {0, 5, 20}); + matchArgs.put("boost", new Double[] {.5, 1., 2.3}); return generateQueries("match", matchArgs); } private static Stream generateMatchPhraseQueries() { var matchPhraseArgs = new HashMap(); - matchPhraseArgs.put("analyzer", new String[]{ "standard", "stop", "english" }); - matchPhraseArgs.put("max_expansions", new Integer[]{ 0, 5, 20 }); - matchPhraseArgs.put("slop", new Integer[]{ 0, 1, 2 }); + matchPhraseArgs.put("analyzer", new String[] {"standard", "stop", "english"}); + matchPhraseArgs.put("max_expansions", new Integer[] {0, 5, 20}); + matchPhraseArgs.put("slop", new Integer[] {0, 1, 2}); return generateQueries("match_phrase", matchPhraseArgs); } private static Stream generateMatchPhrasePrefixQueries() { - return generateQueries("match_phrase_prefix", ImmutableMap.builder() - .put("analyzer", new String[] {"standard", "stop", "english"}) - .put("slop", new Integer[] {0, 1, 2}) - .put("max_expansions", new Integer[] {0, 3, 10}) - .put("zero_terms_query", new String[] {"NONE", "ALL", "NULL"}) - .put("boost", new Float[] {-0.5f, 1.0f, 1.2f}) - .build()); - } - - private static Stream generateQueries(String function, - Map functionArgs) { + return generateQueries( + "match_phrase_prefix", + ImmutableMap.builder() + .put("analyzer", new String[] {"standard", "stop", "english"}) + .put("slop", new Integer[] {0, 1, 2}) + .put("max_expansions", new Integer[] {0, 3, 10}) + .put("zero_terms_query", new String[] {"NONE", "ALL", "NULL"}) + .put("boost", new Float[] {-0.5f, 1.0f, 1.2f}) + .build()); + } + + private static Stream generateQueries( + String function, Map functionArgs) { var rand = new Random(0); class QueryGenerator implements Iterator { @@ -822,7 +783,7 @@ class QueryGenerator implements Iterator { private int currentQuery = 0; private String randomIdentifier() { - return RandomStringUtils.random(10, 0, 0,true, false, null, rand); + return RandomStringUtils.random(10, 0, 0, true, false, null, rand); } @Override @@ -836,16 +797,17 @@ public String next() { currentQuery += 1; StringBuilder query = new StringBuilder(); - query.append(String.format("SELECT * FROM test WHERE %s(%s, %s", function, - randomIdentifier(), - randomIdentifier())); + query.append( + String.format( + "SELECT * FROM test WHERE %s(%s, %s", + function, randomIdentifier(), randomIdentifier())); var args = new ArrayList(); for (var pair : functionArgs.entrySet()) { if (rand.nextBoolean()) { var arg = new StringBuilder(); arg.append(rand.nextBoolean() ? "," : ", "); - arg.append(rand.nextBoolean() ? pair.getKey().toLowerCase() - : pair.getKey().toUpperCase()); + arg.append( + rand.nextBoolean() ? pair.getKey().toLowerCase() : pair.getKey().toUpperCase()); arg.append(rand.nextBoolean() ? "=" : " = "); if (pair.getValue() instanceof String[] || rand.nextBoolean()) { var quoteSymbol = rand.nextBoolean() ? '\'' : '"'; diff --git a/sql/src/test/java/org/opensearch/sql/sql/domain/SQLQueryRequestTest.java b/sql/src/test/java/org/opensearch/sql/sql/domain/SQLQueryRequestTest.java index 1ffa4f0fa8..2b64b13b35 100644 --- a/sql/src/test/java/org/opensearch/sql/sql/domain/SQLQueryRequestTest.java +++ b/sql/src/test/java/org/opensearch/sql/sql/domain/SQLQueryRequestTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.domain; import static org.junit.jupiter.api.Assertions.assertAll; @@ -32,21 +31,15 @@ public void should_support_query() { @Test public void should_support_query_with_JDBC_format() { - SQLQueryRequest request = SQLQueryRequestBuilder.request("SELECT 1") - .format("jdbc") - .build(); + SQLQueryRequest request = SQLQueryRequestBuilder.request("SELECT 1").format("jdbc").build(); assertAll( - () -> assertTrue(request.isSupported()), - () -> assertEquals(request.format(), Format.JDBC) - ); + () -> assertTrue(request.isSupported()), () -> assertEquals(request.format(), Format.JDBC)); } @Test public void should_support_query_with_query_field_only() { SQLQueryRequest request = - SQLQueryRequestBuilder.request("SELECT 1") - .jsonContent("{\"query\": \"SELECT 1\"}") - .build(); + SQLQueryRequestBuilder.request("SELECT 1").jsonContent("{\"query\": \"SELECT 1\"}").build(); assertTrue(request.isSupported()); } @@ -57,21 +50,16 @@ public void should_support_query_with_parameters() { .jsonContent("{\"query\": \"SELECT 1\", \"parameters\":[]}") .build(); SQLQueryRequest requestWithParams = - SQLQueryRequestBuilder.request("SELECT 1") - .params(Map.of("one", "two")) - .build(); + SQLQueryRequestBuilder.request("SELECT 1").params(Map.of("one", "two")).build(); assertAll( () -> assertTrue(requestWithContent.isSupported()), - () -> assertTrue(requestWithParams.isSupported()) - ); + () -> assertTrue(requestWithParams.isSupported())); } @Test public void should_support_query_without_parameters() { SQLQueryRequest requestWithNoParams = - SQLQueryRequestBuilder.request("SELECT 1") - .params(Map.of()) - .build(); + SQLQueryRequestBuilder.request("SELECT 1").params(Map.of()).build(); assertTrue(requestWithNoParams.isSupported()); } @@ -79,8 +67,8 @@ public void should_support_query_without_parameters() { public void should_support_query_with_zero_fetch_size() { SQLQueryRequest request = SQLQueryRequestBuilder.request("SELECT 1") - .jsonContent("{\"query\": \"SELECT 1\", \"fetch_size\": 0}") - .build(); + .jsonContent("{\"query\": \"SELECT 1\", \"fetch_size\": 0}") + .build(); assertTrue(request.isSupported()); } @@ -96,52 +84,37 @@ public void should_support_query_with_parameters_and_zero_fetch_size() { @Test public void should_support_explain() { SQLQueryRequest explainRequest = - SQLQueryRequestBuilder.request("SELECT 1") - .path("_plugins/_sql/_explain") - .build(); + SQLQueryRequestBuilder.request("SELECT 1").path("_plugins/_sql/_explain").build(); assertAll( () -> assertTrue(explainRequest.isExplainRequest()), - () -> assertTrue(explainRequest.isSupported()) - ); + () -> assertTrue(explainRequest.isSupported())); } @Test public void should_support_cursor_request() { SQLQueryRequest fetchSizeRequest = SQLQueryRequestBuilder.request("SELECT 1") - .jsonContent("{\"query\": \"SELECT 1\", \"fetch_size\": 5}") - .build(); + .jsonContent("{\"query\": \"SELECT 1\", \"fetch_size\": 5}") + .build(); SQLQueryRequest cursorRequest = - SQLQueryRequestBuilder.request(null) - .cursor("abcdefgh...") - .build(); + SQLQueryRequestBuilder.request(null).cursor("abcdefgh...").build(); assertAll( () -> assertTrue(fetchSizeRequest.isSupported()), - () -> assertTrue(cursorRequest.isSupported()) - ); + () -> assertTrue(cursorRequest.isSupported())); } @Test public void should_support_cursor_close_request() { SQLQueryRequest closeRequest = - SQLQueryRequestBuilder.request(null) - .cursor("pewpew") - .path("_plugins/_sql/close") - .build(); + SQLQueryRequestBuilder.request(null).cursor("pewpew").path("_plugins/_sql/close").build(); SQLQueryRequest emptyCloseRequest = - SQLQueryRequestBuilder.request(null) - .cursor("") - .path("_plugins/_sql/close") - .build(); + SQLQueryRequestBuilder.request(null).cursor("").path("_plugins/_sql/close").build(); - SQLQueryRequest pagingRequest = - SQLQueryRequestBuilder.request(null) - .cursor("pewpew") - .build(); + SQLQueryRequest pagingRequest = SQLQueryRequestBuilder.request(null).cursor("pewpew").build(); assertAll( () -> assertTrue(closeRequest.isSupported()), @@ -149,71 +122,52 @@ public void should_support_cursor_close_request() { () -> assertTrue(pagingRequest.isSupported()), () -> assertFalse(pagingRequest.isCursorCloseRequest()), () -> assertFalse(emptyCloseRequest.isSupported()), - () -> assertTrue(emptyCloseRequest.isCursorCloseRequest()) - ); + () -> assertTrue(emptyCloseRequest.isCursorCloseRequest())); } @Test public void should_not_support_request_with_empty_cursor() { SQLQueryRequest requestWithEmptyCursor = - SQLQueryRequestBuilder.request(null) - .cursor("") - .build(); + SQLQueryRequestBuilder.request(null).cursor("").build(); SQLQueryRequest requestWithNullCursor = - SQLQueryRequestBuilder.request(null) - .cursor(null) - .build(); + SQLQueryRequestBuilder.request(null).cursor(null).build(); assertAll( () -> assertFalse(requestWithEmptyCursor.isSupported()), - () -> assertFalse(requestWithNullCursor.isSupported()) - ); + () -> assertFalse(requestWithNullCursor.isSupported())); } @Test public void should_not_support_request_with_unknown_field() { SQLQueryRequest request = - SQLQueryRequestBuilder.request("SELECT 1") - .jsonContent("{\"pewpew\": 42}") - .build(); + SQLQueryRequestBuilder.request("SELECT 1").jsonContent("{\"pewpew\": 42}").build(); assertFalse(request.isSupported()); } @Test public void should_not_support_request_with_cursor_and_something_else() { SQLQueryRequest requestWithQuery = - SQLQueryRequestBuilder.request("SELECT 1") - .cursor("n:12356") - .build(); + SQLQueryRequestBuilder.request("SELECT 1").cursor("n:12356").build(); SQLQueryRequest requestWithParams = - SQLQueryRequestBuilder.request(null) - .cursor("n:12356") - .params(Map.of("one", "two")) - .build(); + SQLQueryRequestBuilder.request(null).cursor("n:12356").params(Map.of("one", "two")).build(); SQLQueryRequest requestWithParamsWithFormat = SQLQueryRequestBuilder.request(null) - .cursor("n:12356") - .params(Map.of("format", "jdbc")) - .build(); + .cursor("n:12356") + .params(Map.of("format", "jdbc")) + .build(); SQLQueryRequest requestWithParamsWithFormatAnd = SQLQueryRequestBuilder.request(null) - .cursor("n:12356") - .params(Map.of("format", "jdbc", "something", "else")) - .build(); + .cursor("n:12356") + .params(Map.of("format", "jdbc", "something", "else")) + .build(); SQLQueryRequest requestWithFetchSize = SQLQueryRequestBuilder.request(null) - .cursor("n:12356") - .jsonContent("{\"fetch_size\": 5}") - .build(); + .cursor("n:12356") + .jsonContent("{\"fetch_size\": 5}") + .build(); SQLQueryRequest requestWithNoParams = - SQLQueryRequestBuilder.request(null) - .cursor("n:12356") - .params(Map.of()) - .build(); + SQLQueryRequestBuilder.request(null).cursor("n:12356").params(Map.of()).build(); SQLQueryRequest requestWithNoContent = - SQLQueryRequestBuilder.request(null) - .cursor("n:12356") - .jsonContent("{}") - .build(); + SQLQueryRequestBuilder.request(null).cursor("n:12356").jsonContent("{}").build(); assertAll( () -> assertFalse(requestWithQuery.isSupported()), () -> assertFalse(requestWithParams.isSupported()), @@ -221,8 +175,7 @@ public void should_not_support_request_with_cursor_and_something_else() { () -> assertTrue(requestWithNoParams.isSupported()), () -> assertTrue(requestWithParamsWithFormat.isSupported()), () -> assertFalse(requestWithParamsWithFormatAnd.isSupported()), - () -> assertTrue(requestWithNoContent.isSupported()) - ); + () -> assertTrue(requestWithNoContent.isSupported())); } @Test @@ -234,15 +187,11 @@ public void should_use_JDBC_format_by_default() { @Test public void should_support_CSV_format_and_sanitize() { - SQLQueryRequest csvRequest = - SQLQueryRequestBuilder.request("SELECT 1") - .format("csv") - .build(); + SQLQueryRequest csvRequest = SQLQueryRequestBuilder.request("SELECT 1").format("csv").build(); assertAll( () -> assertTrue(csvRequest.isSupported()), () -> assertEquals(csvRequest.format(), Format.CSV), - () -> assertTrue(csvRequest.sanitize()) - ); + () -> assertTrue(csvRequest.sanitize())); } @Test @@ -252,36 +201,28 @@ public void should_skip_sanitize_if_set_false() { SQLQueryRequest csvRequest = SQLQueryRequestBuilder.request("SELECT 1").params(params).build(); assertAll( () -> assertEquals(csvRequest.format(), Format.CSV), - () -> assertFalse(csvRequest.sanitize()) - ); + () -> assertFalse(csvRequest.sanitize())); } @Test public void should_not_support_other_format() { - SQLQueryRequest csvRequest = - SQLQueryRequestBuilder.request("SELECT 1") - .format("other") - .build(); + SQLQueryRequest csvRequest = SQLQueryRequestBuilder.request("SELECT 1").format("other").build(); assertAll( () -> assertFalse(csvRequest.isSupported()), - () -> assertEquals("response in other format is not supported.", - assertThrows(IllegalArgumentException.class, csvRequest::format).getMessage()) - ); + () -> + assertEquals( + "response in other format is not supported.", + assertThrows(IllegalArgumentException.class, csvRequest::format).getMessage())); } @Test public void should_support_raw_format() { - SQLQueryRequest csvRequest = - SQLQueryRequestBuilder.request("SELECT 1") - .format("raw") - .build(); + SQLQueryRequest csvRequest = SQLQueryRequestBuilder.request("SELECT 1").format("raw").build(); assertTrue(csvRequest.isSupported()); } - /** - * SQL query request build helper to improve test data setup readability. - */ + /** SQL query request build helper to improve test data setup readability. */ private static class SQLQueryRequestBuilder { private String jsonContent; private String query; @@ -325,9 +266,8 @@ SQLQueryRequest build() { if (format != null) { params.put("format", format); } - return new SQLQueryRequest(jsonContent == null ? null : new JSONObject(jsonContent), - query, path, params, cursor); + return new SQLQueryRequest( + jsonContent == null ? null : new JSONObject(jsonContent), query, path, params, cursor); } } - } diff --git a/sql/src/test/java/org/opensearch/sql/sql/parser/AnonymizerListenerTest.java b/sql/src/test/java/org/opensearch/sql/sql/parser/AnonymizerListenerTest.java index 59d723e3a2..4d2addf3d3 100644 --- a/sql/src/test/java/org/opensearch/sql/sql/parser/AnonymizerListenerTest.java +++ b/sql/src/test/java/org/opensearch/sql/sql/parser/AnonymizerListenerTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.parser; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -23,6 +22,7 @@ public class AnonymizerListenerTest { /** * Helper function to parse SQl queries for testing purposes. + * * @param query SQL query to be anonymized. */ private void parse(String query) { @@ -36,8 +36,9 @@ private void parse(String query) { @Test public void queriesShouldHaveAnonymousFieldAndIndex() { String query = "SELECT ABS(balance) FROM accounts WHERE age > 30 GROUP BY ABS(balance)"; - String expectedQuery = "( SELECT ABS ( identifier ) FROM table " - + "WHERE identifier > number GROUP BY ABS ( identifier ) )"; + String expectedQuery = + "( SELECT ABS ( identifier ) FROM table " + + "WHERE identifier > number GROUP BY ABS ( identifier ) )"; parse(query); assertEquals(expectedQuery, anonymizerListener.getAnonymizedQueryString()); } @@ -92,12 +93,13 @@ public void queriesWithAggregatesShouldAnonymizeSensitiveData() { @Test public void queriesWithSubqueriesShouldAnonymizeSensitiveData() { - String query = "SELECT a.f, a.l, a.a FROM " - + "(SELECT firstname AS f, lastname AS l, age AS a FROM accounts WHERE age > 30) a"; + String query = + "SELECT a.f, a.l, a.a FROM " + + "(SELECT firstname AS f, lastname AS l, age AS a FROM accounts WHERE age > 30) a"; String expectedQuery = - "( SELECT identifier.identifier, identifier.identifier, identifier.identifier FROM " - + "( SELECT identifier AS identifier, identifier AS identifier, identifier AS identifier " - + "FROM table WHERE identifier > number ) identifier )"; + "( SELECT identifier.identifier, identifier.identifier, identifier.identifier FROM ( SELECT" + + " identifier AS identifier, identifier AS identifier, identifier AS identifier FROM" + + " table WHERE identifier > number ) identifier )"; parse(query); assertEquals(expectedQuery, anonymizerListener.getAnonymizedQueryString()); } @@ -121,8 +123,9 @@ public void queriesWithOrderByShouldAnonymizeSensitiveData() { @Test public void queriesWithHavingShouldAnonymizeSensitiveData() { String query = "SELECT SUM(balance) FROM accounts GROUP BY lastname HAVING COUNT(balance) > 2"; - String expectedQuery = "( SELECT SUM ( identifier ) FROM table " - + "GROUP BY identifier HAVING COUNT ( identifier ) > number )"; + String expectedQuery = + "( SELECT SUM ( identifier ) FROM table " + + "GROUP BY identifier HAVING COUNT ( identifier ) > number )"; parse(query); assertEquals(expectedQuery, anonymizerListener.getAnonymizedQueryString()); } @@ -130,8 +133,9 @@ public void queriesWithHavingShouldAnonymizeSensitiveData() { @Test public void queriesWithHighlightShouldAnonymizeSensitiveData() { String query = "SELECT HIGHLIGHT(str0) FROM CALCS WHERE QUERY_STRING(['str0'], 'FURNITURE')"; - String expectedQuery = "( SELECT HIGHLIGHT ( identifier ) FROM table WHERE " - + "QUERY_STRING ( [ 'string_literal' ], 'string_literal' ) )"; + String expectedQuery = + "( SELECT HIGHLIGHT ( identifier ) FROM table WHERE " + + "QUERY_STRING ( [ 'string_literal' ], 'string_literal' ) )"; parse(query); assertEquals(expectedQuery, anonymizerListener.getAnonymizedQueryString()); } @@ -139,8 +143,8 @@ public void queriesWithHighlightShouldAnonymizeSensitiveData() { @Test public void queriesWithMatchShouldAnonymizeSensitiveData() { String query = "SELECT str0 FROM CALCS WHERE MATCH(str0, 'FURNITURE')"; - String expectedQuery = "( SELECT identifier FROM table " - + "WHERE MATCH ( identifier, 'string_literal' ) )"; + String expectedQuery = + "( SELECT identifier FROM table " + "WHERE MATCH ( identifier, 'string_literal' ) )"; parse(query); assertEquals(expectedQuery, anonymizerListener.getAnonymizedQueryString()); } @@ -155,10 +159,12 @@ public void queriesWithPositionShouldAnonymizeSensitiveData() { @Test public void queriesWithMatch_Bool_Prefix_ShouldAnonymizeSensitiveData() { - String query = "SELECT firstname, address FROM accounts WHERE " - + "match_bool_prefix(address, 'Bristol Street', minimum_should_match=2)"; - String expectedQuery = "( SELECT identifier, identifier FROM table WHERE MATCH_BOOL_PREFIX " - + "( identifier, 'string_literal', MINIMUM_SHOULD_MATCH = number ) )"; + String query = + "SELECT firstname, address FROM accounts WHERE " + + "match_bool_prefix(address, 'Bristol Street', minimum_should_match=2)"; + String expectedQuery = + "( SELECT identifier, identifier FROM table WHERE MATCH_BOOL_PREFIX " + + "( identifier, 'string_literal', MINIMUM_SHOULD_MATCH = number ) )"; parse(query); assertEquals(expectedQuery, anonymizerListener.getAnonymizedQueryString()); } @@ -195,10 +201,7 @@ public void queriesWithNotEqualAlternateShouldAnonymizeSensitiveData() { assertEquals(expectedQuery, anonymizerListener.getAnonymizedQueryString()); } - - /** - * Test added for coverage, but the errorNode will not be hit normally. - */ + /** Test added for coverage, but the errorNode will not be hit normally. */ @Test public void enterErrorNote() { ErrorNode node = mock(ErrorNode.class); diff --git a/sql/src/test/java/org/opensearch/sql/sql/parser/AstAggregationBuilderTest.java b/sql/src/test/java/org/opensearch/sql/sql/parser/AstAggregationBuilderTest.java index fff789de44..95188e20b6 100644 --- a/sql/src/test/java/org/opensearch/sql/sql/parser/AstAggregationBuilderTest.java +++ b/sql/src/test/java/org/opensearch/sql/sql/parser/AstAggregationBuilderTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.parser; import static java.util.Collections.emptyList; @@ -59,10 +58,9 @@ void can_build_group_by_clause_with_scalar_expression() { buildAggregation("SELECT ABS(age + 1) FROM test GROUP BY ABS(age + 1)"), allOf( hasGroupByItems( - alias("ABS(+(age, 1))", function("ABS", - function("+", - qualifiedName("age"), - intLiteral(1))))), + alias( + "ABS(+(age, 1))", + function("ABS", function("+", qualifiedName("age"), intLiteral(1))))), hasAggregators())); } @@ -79,9 +77,7 @@ void can_build_group_by_clause_with_complicated_aggregators() { void can_build_group_by_clause_without_aggregators() { assertThat( buildAggregation("SELECT state FROM test GROUP BY state"), - allOf( - hasGroupByItems(alias("state", qualifiedName("state"))), - hasAggregators())); + allOf(hasGroupByItems(alias("state", qualifiedName("state"))), hasAggregators())); } @Test @@ -101,50 +97,43 @@ void can_build_implicit_group_by_for_aggregator_in_having_clause() { buildAggregation("SELECT true FROM test HAVING AVG(age) > 30"), allOf( hasGroupByItems(), - hasAggregators( - alias("AVG(age)", aggregate("AVG", qualifiedName("age")))))); + hasAggregators(alias("AVG(age)", aggregate("AVG", qualifiedName("age")))))); assertThat( - buildAggregation("SELECT PI() FROM test HAVING AVG(age) > 30"), - allOf( - hasGroupByItems(), - hasAggregators( - alias("AVG(age)", aggregate("AVG", qualifiedName("age")))))); + buildAggregation("SELECT PI() FROM test HAVING AVG(age) > 30"), + allOf( + hasGroupByItems(), + hasAggregators(alias("AVG(age)", aggregate("AVG", qualifiedName("age")))))); assertThat( - buildAggregation("SELECT ABS(1.5) FROM test HAVING AVG(age) > 30"), - allOf( - hasGroupByItems(), - hasAggregators( - alias("AVG(age)", aggregate("AVG", qualifiedName("age")))))); + buildAggregation("SELECT ABS(1.5) FROM test HAVING AVG(age) > 30"), + allOf( + hasGroupByItems(), + hasAggregators(alias("AVG(age)", aggregate("AVG", qualifiedName("age")))))); assertThat( - buildAggregation("SELECT ABS(ABS(1.5)) FROM test HAVING AVG(age) > 30"), - allOf( - hasGroupByItems(), - hasAggregators( - alias("AVG(age)", aggregate("AVG", qualifiedName("age")))))); + buildAggregation("SELECT ABS(ABS(1.5)) FROM test HAVING AVG(age) > 30"), + allOf( + hasGroupByItems(), + hasAggregators(alias("AVG(age)", aggregate("AVG", qualifiedName("age")))))); assertThat( buildAggregation("SELECT INTERVAL 1 DAY FROM test HAVING AVG(age) > 30"), allOf( hasGroupByItems(), - hasAggregators( - alias("AVG(age)", aggregate("AVG", qualifiedName("age")))))); + hasAggregators(alias("AVG(age)", aggregate("AVG", qualifiedName("age")))))); assertThat( buildAggregation("SELECT CAST(1 AS LONG) FROM test HAVING AVG(age) > 30"), allOf( hasGroupByItems(), - hasAggregators( - alias("AVG(age)", aggregate("AVG", qualifiedName("age")))))); + hasAggregators(alias("AVG(age)", aggregate("AVG", qualifiedName("age")))))); assertThat( buildAggregation("SELECT CASE WHEN true THEN 1 ELSE 2 END FROM test HAVING AVG(age) > 30"), allOf( hasGroupByItems(), - hasAggregators( - alias("AVG(age)", aggregate("AVG", qualifiedName("age")))))); + hasAggregators(alias("AVG(age)", aggregate("AVG", qualifiedName("age")))))); } @Test @@ -154,8 +143,7 @@ void can_build_distinct_aggregator() { allOf( hasGroupByItems(alias("age", qualifiedName("age"))), hasAggregators( - alias("COUNT(DISTINCT name)", distinctAggregate("COUNT", qualifiedName( - "name")))))); + alias("COUNT(DISTINCT name)", distinctAggregate("COUNT", qualifiedName("name")))))); } @Test @@ -167,8 +155,8 @@ void should_build_nothing_if_no_group_by_and_no_aggregators_in_select() { void should_replace_group_by_alias_by_expression_in_select_clause() { assertThat( buildAggregation("SELECT state AS s, name FROM test GROUP BY s, name"), - hasGroupByItems(alias("state", qualifiedName("state")), - alias("name", qualifiedName("name")))); + hasGroupByItems( + alias("state", qualifiedName("state")), alias("name", qualifiedName("name")))); assertThat( buildAggregation("SELECT ABS(age) AS a FROM test GROUP BY a"), @@ -190,25 +178,30 @@ void should_replace_group_by_ordinal_by_expression_in_select_clause() { @Test void should_report_error_for_non_integer_ordinal_in_group_by() { - SemanticCheckException error = assertThrows(SemanticCheckException.class, () -> - buildAggregation("SELECT state AS s FROM test GROUP BY 1.5")); - assertEquals( - "Non-integer constant [1.5] found in ordinal", - error.getMessage()); + SemanticCheckException error = + assertThrows( + SemanticCheckException.class, + () -> buildAggregation("SELECT state AS s FROM test GROUP BY 1.5")); + assertEquals("Non-integer constant [1.5] found in ordinal", error.getMessage()); } - @Disabled("This validation is supposed to be in analyzing phase. This test should be enabled " + @Disabled( + "This validation is supposed to be in analyzing phase. This test should be enabled " + "once https://github.com/opensearch-project/sql/issues/910 has been resolved") @Test void should_report_error_for_mismatch_between_select_and_group_by_items() { - SemanticCheckException error1 = assertThrows(SemanticCheckException.class, () -> - buildAggregation("SELECT name FROM test GROUP BY state")); + SemanticCheckException error1 = + assertThrows( + SemanticCheckException.class, + () -> buildAggregation("SELECT name FROM test GROUP BY state")); assertEquals( "Expression [name] that contains non-aggregated column is not present in group by clause", error1.getMessage()); - SemanticCheckException error2 = assertThrows(SemanticCheckException.class, () -> - buildAggregation("SELECT ABS(name + 1) FROM test GROUP BY name")); + SemanticCheckException error2 = + assertThrows( + SemanticCheckException.class, + () -> buildAggregation("SELECT ABS(name + 1) FROM test GROUP BY name")); assertEquals( "Expression [Function(funcName=ABS, funcArgs=[Function(funcName=+, " + "funcArgs=[name, Literal(value=1, type=INTEGER)])])] that contains " @@ -218,15 +211,19 @@ void should_report_error_for_mismatch_between_select_and_group_by_items() { @Test void should_report_error_for_non_aggregated_item_in_select_if_no_group_by() { - SemanticCheckException error1 = assertThrows(SemanticCheckException.class, () -> - buildAggregation("SELECT age, AVG(balance) FROM tests")); + SemanticCheckException error1 = + assertThrows( + SemanticCheckException.class, + () -> buildAggregation("SELECT age, AVG(balance) FROM tests")); assertEquals( "Explicit GROUP BY clause is required because expression [age] " + "contains non-aggregated column", error1.getMessage()); - SemanticCheckException error2 = assertThrows(SemanticCheckException.class, () -> - buildAggregation("SELECT ABS(age + 1), AVG(balance) FROM tests")); + SemanticCheckException error2 = + assertThrows( + SemanticCheckException.class, + () -> buildAggregation("SELECT ABS(age + 1), AVG(balance) FROM tests")); assertEquals( "Explicit GROUP BY clause is required because expression [ABS(+(age, 1))] " + "contains non-aggregated column", @@ -235,19 +232,25 @@ void should_report_error_for_non_aggregated_item_in_select_if_no_group_by() { @Test void should_report_error_for_group_by_ordinal_out_of_bound_of_select_list() { - SemanticCheckException error1 = assertThrows(SemanticCheckException.class, () -> - buildAggregation("SELECT age, AVG(balance) FROM tests GROUP BY 0")); + SemanticCheckException error1 = + assertThrows( + SemanticCheckException.class, + () -> buildAggregation("SELECT age, AVG(balance) FROM tests GROUP BY 0")); assertEquals("Ordinal [0] is out of bound of select item list", error1.getMessage()); - SemanticCheckException error2 = assertThrows(SemanticCheckException.class, () -> - buildAggregation("SELECT age, AVG(balance) FROM tests GROUP BY 3")); + SemanticCheckException error2 = + assertThrows( + SemanticCheckException.class, + () -> buildAggregation("SELECT age, AVG(balance) FROM tests GROUP BY 3")); assertEquals("Ordinal [3] is out of bound of select item list", error2.getMessage()); } @Test void should_report_error_for_non_aggregated_item_in_select_if_only_having() { - SemanticCheckException error = assertThrows(SemanticCheckException.class, () -> - buildAggregation("SELECT age FROM tests HAVING AVG(balance) > 30")); + SemanticCheckException error = + assertThrows( + SemanticCheckException.class, + () -> buildAggregation("SELECT age FROM tests HAVING AVG(balance) > 30")); assertEquals( "Explicit GROUP BY clause is required because expression [age] " + "contains non-aggregated column", @@ -262,10 +265,10 @@ private Matcher hasAggregators(UnresolvedExpression... exprs) { return featureValueOf("aggregators", Aggregation::getAggExprList, exprs); } - private Matcher featureValueOf(String name, - Function> getter, - UnresolvedExpression... exprs) { + private Matcher featureValueOf( + String name, + Function> getter, + UnresolvedExpression... exprs) { Matcher> subMatcher = (exprs.length == 0) ? equalTo(emptyList()) : equalTo(Arrays.asList(exprs)); return new FeatureMatcher>(subMatcher, name, "") { @@ -295,5 +298,4 @@ private QuerySpecificationContext parse(String query) { parser.addErrorListener(new SyntaxAnalysisErrorListener()); return parser.querySpecification(); } - } diff --git a/sql/src/test/java/org/opensearch/sql/sql/parser/AstBuilderTest.java b/sql/src/test/java/org/opensearch/sql/sql/parser/AstBuilderTest.java index 3e56a89754..8ab314f695 100644 --- a/sql/src/test/java/org/opensearch/sql/sql/parser/AstBuilderTest.java +++ b/sql/src/test/java/org/opensearch/sql/sql/parser/AstBuilderTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.parser; import static java.util.Collections.emptyList; @@ -53,36 +52,20 @@ public void can_build_select_literals() { alias("'hello'", stringLiteral("hello")), alias("\"world\"", stringLiteral("world")), alias("false", booleanLiteral(false)), - alias("-4.567", doubleLiteral(-4.567)) - ), - buildAST("SELECT 123, 'hello', \"world\", false, -4.567") - ); + alias("-4.567", doubleLiteral(-4.567))), + buildAST("SELECT 123, 'hello', \"world\", false, -4.567")); } @Test public void can_build_select_function_call_with_alias() { assertEquals( - project( - relation("test"), - alias( - "ABS(age)", - function("ABS", qualifiedName("age")), - "a" - ) - ), - buildAST("SELECT ABS(age) AS a FROM test") - ); + project(relation("test"), alias("ABS(age)", function("ABS", qualifiedName("age")), "a")), + buildAST("SELECT ABS(age) AS a FROM test")); } @Test public void can_build_select_all_from_index() { - assertEquals( - project( - relation("test"), - AllFields.of() - ), - buildAST("SELECT * FROM test") - ); + assertEquals(project(relation("test"), AllFields.of()), buildAST("SELECT * FROM test")); assertThrows(SyntaxCheckException.class, () -> buildAST("SELECT *")); } @@ -90,14 +73,8 @@ public void can_build_select_all_from_index() { @Test public void can_build_nested_select_all() { assertEquals( - project( - relation("test"), - alias("nested(field.*)", - new NestedAllTupleFields("field") - ) - ), - buildAST("SELECT nested(field.*) FROM test") - ); + project(relation("test"), alias("nested(field.*)", new NestedAllTupleFields("field"))), + buildAST("SELECT nested(field.*) FROM test")); } @Test @@ -107,32 +84,22 @@ public void can_build_select_all_and_fields_from_index() { relation("test"), AllFields.of(), alias("age", qualifiedName("age")), - alias("age", qualifiedName("age"), "a") - ), - buildAST("SELECT *, age, age as a FROM test") - ); + alias("age", qualifiedName("age"), "a")), + buildAST("SELECT *, age, age as a FROM test")); } @Test public void can_build_select_fields_from_index() { assertEquals( - project( - relation("test"), - alias("age", qualifiedName("age")) - ), - buildAST("SELECT age FROM test") - ); + project(relation("test"), alias("age", qualifiedName("age"))), + buildAST("SELECT age FROM test")); } @Test public void can_build_select_fields_with_alias() { assertEquals( - project( - relation("test"), - alias("age", qualifiedName("age"), "a") - ), - buildAST("SELECT age AS a FROM test") - ); + project(relation("test"), alias("age", qualifiedName("age"), "a")), + buildAST("SELECT age AS a FROM test")); } @Test @@ -140,17 +107,8 @@ public void can_build_select_fields_with_alias_quoted() { assertEquals( project( relation("test"), - alias( - "(age + 10)", - function("+", qualifiedName("age"), intLiteral(10)), - "Age_Expr" - ) - ), - buildAST("SELECT" - + " (age + 10) AS `Age_Expr` " - + "FROM test" - ) - ); + alias("(age + 10)", function("+", qualifiedName("age"), intLiteral(10)), "Age_Expr")), + buildAST("SELECT (age + 10) AS `Age_Expr` FROM test")); } @Test @@ -158,42 +116,27 @@ public void can_build_from_index_with_alias() { assertEquals( project( filter( - relation("test", "tt"), - function("=", qualifiedName("tt", "age"), intLiteral(30))), - alias("tt.name", qualifiedName("tt", "name")) - ), - buildAST("SELECT tt.name FROM test AS tt WHERE tt.age = 30") - ); + relation("test", "tt"), function("=", qualifiedName("tt", "age"), intLiteral(30))), + alias("tt.name", qualifiedName("tt", "name"))), + buildAST("SELECT tt.name FROM test AS tt WHERE tt.age = 30")); } @Test public void can_build_from_index_with_alias_quoted() { assertEquals( project( - filter( - relation("test", "t"), - function("=", qualifiedName("t", "age"), intLiteral(30))), - alias("`t`.name", qualifiedName("t", "name")) - ), - buildAST("SELECT `t`.name FROM test `t` WHERE `t`.age = 30") - ); + filter(relation("test", "t"), function("=", qualifiedName("t", "age"), intLiteral(30))), + alias("`t`.name", qualifiedName("t", "name"))), + buildAST("SELECT `t`.name FROM test `t` WHERE `t`.age = 30")); } @Test public void can_build_where_clause() { assertEquals( project( - filter( - relation("test"), - function( - "=", - qualifiedName("name"), - stringLiteral("John")) - ), - alias("name", qualifiedName("name")) - ), - buildAST("SELECT name FROM test WHERE name = 'John'") - ); + filter(relation("test"), function("=", qualifiedName("name"), stringLiteral("John"))), + alias("name", qualifiedName("name"))), + buildAST("SELECT name FROM test WHERE name = 'John'")); } @Test @@ -202,8 +145,7 @@ public void can_build_count_literal() { project( agg( relation("test"), - ImmutableList.of( - alias("COUNT(1)", aggregate("COUNT", intLiteral(1)))), + ImmutableList.of(alias("COUNT(1)", aggregate("COUNT", intLiteral(1)))), emptyList(), emptyList(), emptyList()), @@ -217,8 +159,7 @@ public void can_build_count_star() { project( agg( relation("test"), - ImmutableList.of( - alias("COUNT(*)", aggregate("COUNT", AllFields.of()))), + ImmutableList.of(alias("COUNT(*)", aggregate("COUNT", AllFields.of()))), emptyList(), emptyList(), emptyList()), @@ -328,9 +269,7 @@ public void can_build_having_clause() { emptyList(), ImmutableList.of(alias("name", qualifiedName("name"))), emptyList()), - function(">", - aggregate("MIN", qualifiedName("balance")), - intLiteral(1000))), + function(">", aggregate("MIN", qualifiedName("balance")), intLiteral(1000))), alias("name", qualifiedName("name")), alias("AVG(age)", aggregate("AVG", qualifiedName("age")))), buildAST("SELECT name, AVG(age) FROM test GROUP BY name HAVING MIN(balance) > 1000")); @@ -343,14 +282,11 @@ public void can_build_having_condition_using_alias() { filter( agg( relation("test"), - ImmutableList.of( - alias("AVG(age)", aggregate("AVG", qualifiedName("age")))), + ImmutableList.of(alias("AVG(age)", aggregate("AVG", qualifiedName("age")))), emptyList(), ImmutableList.of(alias("name", qualifiedName("name"))), emptyList()), - function(">", - aggregate("AVG", qualifiedName("age")), - intLiteral(1000))), + function(">", aggregate("AVG", qualifiedName("age")), intLiteral(1000))), alias("name", qualifiedName("name")), alias("AVG(age)", aggregate("AVG", qualifiedName("age")), "a")), buildAST("SELECT name, AVG(age) AS a FROM test GROUP BY name HAVING a > 1000")); @@ -360,9 +296,7 @@ public void can_build_having_condition_using_alias() { public void can_build_order_by_field_name() { assertEquals( project( - sort( - relation("test"), - field("name", argument("asc", booleanLiteral(true)))), + sort(relation("test"), field("name", argument("asc", booleanLiteral(true)))), alias("name", qualifiedName("name"))), buildAST("SELECT name FROM test ORDER BY name")); } @@ -374,8 +308,7 @@ public void can_build_order_by_function() { sort( relation("test"), field( - function("ABS", qualifiedName("name")), - argument("asc", booleanLiteral(true)))), + function("ABS", qualifiedName("name")), argument("asc", booleanLiteral(true)))), alias("name", qualifiedName("name"))), buildAST("SELECT name FROM test ORDER BY ABS(name)")); } @@ -384,9 +317,7 @@ public void can_build_order_by_function() { public void can_build_order_by_alias() { assertEquals( project( - sort( - relation("test"), - field("name", argument("asc", booleanLiteral(true)))), + sort(relation("test"), field("name", argument("asc", booleanLiteral(true)))), alias("name", qualifiedName("name"), "n")), buildAST("SELECT name AS n FROM test ORDER BY n ASC")); } @@ -395,9 +326,7 @@ public void can_build_order_by_alias() { public void can_build_order_by_ordinal() { assertEquals( project( - sort( - relation("test"), - field("name", argument("asc", booleanLiteral(false)))), + sort(relation("test"), field("name", argument("asc", booleanLiteral(false)))), alias("name", qualifiedName("name"))), buildAST("SELECT name FROM test ORDER BY 1 DESC")); } @@ -424,8 +353,7 @@ public void can_build_select_distinct_clause() { emptyList(), emptyList(), ImmutableList.of( - alias("name", qualifiedName("name")), - alias("age", qualifiedName("age"))), + alias("name", qualifiedName("name")), alias("age", qualifiedName("age"))), emptyList()), alias("name", qualifiedName("name")), alias("age", qualifiedName("age"))), @@ -441,26 +369,21 @@ public void can_build_select_distinct_clause_with_function() { emptyList(), emptyList(), ImmutableList.of( - alias("SUBSTRING(name, 1, 2)", + alias( + "SUBSTRING(name, 1, 2)", function( - "SUBSTRING", - qualifiedName("name"), - intLiteral(1), intLiteral(2)))), + "SUBSTRING", qualifiedName("name"), intLiteral(1), intLiteral(2)))), emptyList()), - alias("SUBSTRING(name, 1, 2)", - function( - "SUBSTRING", - qualifiedName("name"), - intLiteral(1), intLiteral(2)))), + alias( + "SUBSTRING(name, 1, 2)", + function("SUBSTRING", qualifiedName("name"), intLiteral(1), intLiteral(2)))), buildAST("SELECT DISTINCT SUBSTRING(name, 1, 2) FROM test")); } @Test public void can_build_select_all_clause() { assertEquals( - buildAST("SELECT name, age FROM test"), - buildAST("SELECT ALL name, age FROM test") - ); + buildAST("SELECT name, age FROM test"), buildAST("SELECT ALL name, age FROM test")); } @Test @@ -469,22 +392,28 @@ public void can_build_order_by_null_option() { project( sort( relation("test"), - field("name", + field( + "name", argument("asc", booleanLiteral(true)), argument("nullFirst", booleanLiteral(false)))), - alias("name", qualifiedName("name"))), + alias("name", qualifiedName("name"))), buildAST("SELECT name FROM test ORDER BY name NULLS LAST")); } /** + * + * + *
    * Ensure Nested function falls back to legacy engine when used in an HAVING clause.
    * TODO Remove this test when support is added.
+   * 
*/ @Test public void nested_in_having_clause_throws_exception() { - SyntaxCheckException exception = assertThrows(SyntaxCheckException.class, - () -> buildAST("SELECT count(*) FROM test HAVING nested(message.info)") - ); + SyntaxCheckException exception = + assertThrows( + SyntaxCheckException.class, + () -> buildAST("SELECT count(*) FROM test HAVING nested(message.info)")); assertEquals( "Falling back to legacy engine. Nested function is not supported in the HAVING clause.", @@ -495,23 +424,15 @@ public void nested_in_having_clause_throws_exception() { public void can_build_order_by_sort_order_keyword_insensitive() { assertEquals( project( - sort( - relation("test"), - field("age", - argument("asc", booleanLiteral(true)))), + sort(relation("test"), field("age", argument("asc", booleanLiteral(true)))), alias("age", qualifiedName("age"))), - buildAST("SELECT age FROM test ORDER BY age ASC") - ); + buildAST("SELECT age FROM test ORDER BY age ASC")); assertEquals( project( - sort( - relation("test"), - field("age", - argument("asc", booleanLiteral(true)))), + sort(relation("test"), field("age", argument("asc", booleanLiteral(true)))), alias("age", qualifiedName("age"))), - buildAST("SELECT age FROM test ORDER BY age asc") - ); + buildAST("SELECT age FROM test ORDER BY age asc")); } @Test @@ -523,20 +444,15 @@ public void can_build_from_subquery() { project( relation("test"), alias("firstname", qualifiedName("firstname"), "firstName"), - alias("lastname", qualifiedName("lastname"), "lastName") - ), - "a" - ), - function(">", qualifiedName("age"), intLiteral(20)) - ), + alias("lastname", qualifiedName("lastname"), "lastName")), + "a"), + function(">", qualifiedName("age"), intLiteral(20))), alias("a.firstName", qualifiedName("a", "firstName")), alias("lastName", qualifiedName("lastName"))), buildAST( "SELECT a.firstName, lastName FROM (" + "SELECT firstname AS firstName, lastname AS lastName FROM test" - + ") AS a where age > 20" - ) - ); + + ") AS a where age > 20")); } @Test @@ -545,19 +461,15 @@ public void can_build_from_subquery_with_backquoted_alias() { project( relationSubquery( project( - relation("test"), - alias("firstname", qualifiedName("firstname"), "firstName")), + relation("test"), alias("firstname", qualifiedName("firstname"), "firstName")), "a"), - alias("a.firstName", qualifiedName("a", "firstName")) - ), + alias("a.firstName", qualifiedName("a", "firstName"))), buildAST( "SELECT a.firstName " + "FROM ( " + " SELECT `firstname` AS `firstName` " + " FROM `test` " - + ") AS `a`" - ) - ); + + ") AS `a`")); } @Test @@ -566,12 +478,9 @@ public void can_build_show_all_tables() { project( filter( relation(TABLE_INFO), - function("like", qualifiedName("TABLE_NAME"), stringLiteral("%")) - ), - AllFields.of() - ), - buildAST("SHOW TABLES LIKE '%'") - ); + function("like", qualifiedName("TABLE_NAME"), stringLiteral("%"))), + AllFields.of()), + buildAST("SHOW TABLES LIKE '%'")); } @Test @@ -580,12 +489,9 @@ public void can_build_show_selected_tables() { project( filter( relation(TABLE_INFO), - function("like", qualifiedName("TABLE_NAME"), stringLiteral("a_c%")) - ), - AllFields.of() - ), - buildAST("SHOW TABLES LIKE 'a_c%'") - ); + function("like", qualifiedName("TABLE_NAME"), stringLiteral("a_c%"))), + AllFields.of()), + buildAST("SHOW TABLES LIKE 'a_c%'")); } @Test @@ -594,23 +500,16 @@ public void show_compatible_with_old_engine_syntax() { project( filter( relation(TABLE_INFO), - function("like", qualifiedName("TABLE_NAME"), stringLiteral("%")) - ), - AllFields.of() - ), - buildAST("SHOW TABLES LIKE '%'") - ); + function("like", qualifiedName("TABLE_NAME"), stringLiteral("%"))), + AllFields.of()), + buildAST("SHOW TABLES LIKE '%'")); } @Test public void can_build_describe_selected_tables() { assertEquals( - project( - relation(mappingTable("a_c%")), - AllFields.of() - ), - buildAST("DESCRIBE TABLES LIKE 'a_c%'") - ); + project(relation(mappingTable("a_c%")), AllFields.of()), + buildAST("DESCRIBE TABLES LIKE 'a_c%'")); } @Test @@ -619,23 +518,16 @@ public void can_build_describe_selected_tables_field_filter() { project( filter( relation(mappingTable("a_c%")), - function("like", qualifiedName("COLUMN_NAME"), stringLiteral("name%")) - ), - AllFields.of() - ), - buildAST("DESCRIBE TABLES LIKE 'a_c%' COLUMNS LIKE 'name%'") - ); + function("like", qualifiedName("COLUMN_NAME"), stringLiteral("name%"))), + AllFields.of()), + buildAST("DESCRIBE TABLES LIKE 'a_c%' COLUMNS LIKE 'name%'")); } @Test public void can_build_alias_by_keywords() { assertEquals( - project( - relation("test"), - alias("avg_age", qualifiedName("avg_age"), "avg") - ), - buildAST("SELECT avg_age AS avg FROM test") - ); + project(relation("test"), alias("avg_age", qualifiedName("avg_age"), "avg")), + buildAST("SELECT avg_age AS avg FROM test")); } @Test @@ -643,42 +535,20 @@ public void can_build_limit_clause() { assertEquals( project( limit( - sort( - relation("test"), - field("age", argument("asc", booleanLiteral(true))) - ), - 10, - 0 - ), + sort(relation("test"), field("age", argument("asc", booleanLiteral(true)))), 10, 0), alias("name", qualifiedName("name")), - alias("age", qualifiedName("age")) - ), - buildAST("SELECT name, age FROM test ORDER BY age LIMIT 10") - ); + alias("age", qualifiedName("age"))), + buildAST("SELECT name, age FROM test ORDER BY age LIMIT 10")); } @Test public void can_build_limit_clause_with_offset() { assertEquals( - project( - limit( - relation("test"), - 10, - 5 - ), - alias("name", qualifiedName("name")) - ), + project(limit(relation("test"), 10, 5), alias("name", qualifiedName("name"))), buildAST("SELECT name FROM test LIMIT 10 OFFSET 5")); assertEquals( - project( - limit( - relation("test"), - 10, - 5 - ), - alias("name", qualifiedName("name")) - ), + project(limit(relation("test"), 10, 5), alias("name", qualifiedName("name"))), buildAST("SELECT name FROM test LIMIT 5, 10")); } @@ -686,11 +556,10 @@ public void can_build_limit_clause_with_offset() { public void can_build_qualified_name_highlight() { Map args = new HashMap<>(); assertEquals( - project(relation("test"), - alias("highlight(fieldA)", - highlight(AstDSL.qualifiedName("fieldA"), args))), - buildAST("SELECT highlight(fieldA) FROM test") - ); + project( + relation("test"), + alias("highlight(fieldA)", highlight(AstDSL.qualifiedName("fieldA"), args))), + buildAST("SELECT highlight(fieldA) FROM test")); } @Test @@ -699,22 +568,22 @@ public void can_build_qualified_highlight_with_arguments() { args.put("pre_tags", new Literal("", DataType.STRING)); args.put("post_tags", new Literal("", DataType.STRING)); assertEquals( - project(relation("test"), - alias("highlight(fieldA, pre_tags='', post_tags='')", + project( + relation("test"), + alias( + "highlight(fieldA, pre_tags='', post_tags='')", highlight(AstDSL.qualifiedName("fieldA"), args))), - buildAST("SELECT highlight(fieldA, pre_tags='', post_tags='') " - + "FROM test") - ); + buildAST( + "SELECT highlight(fieldA, pre_tags='', post_tags='') " + "FROM test")); } @Test public void can_build_string_literal_highlight() { Map args = new HashMap<>(); assertEquals( - project(relation("test"), - alias("highlight(\"fieldA\")", - highlight(AstDSL.stringLiteral("fieldA"), args))), - buildAST("SELECT highlight(\"fieldA\") FROM test") - ); + project( + relation("test"), + alias("highlight(\"fieldA\")", highlight(AstDSL.stringLiteral("fieldA"), args))), + buildAST("SELECT highlight(\"fieldA\") FROM test")); } } diff --git a/sql/src/test/java/org/opensearch/sql/sql/parser/AstBuilderTestBase.java b/sql/src/test/java/org/opensearch/sql/sql/parser/AstBuilderTestBase.java index 2161eb5b1a..602f17ce85 100644 --- a/sql/src/test/java/org/opensearch/sql/sql/parser/AstBuilderTestBase.java +++ b/sql/src/test/java/org/opensearch/sql/sql/parser/AstBuilderTestBase.java @@ -10,9 +10,7 @@ import org.opensearch.sql.sql.antlr.SQLSyntaxParser; public class AstBuilderTestBase { - /** - * SQL syntax parser that helps prepare parse tree as AstBuilder input. - */ + /** SQL syntax parser that helps prepare parse tree as AstBuilder input. */ private final SQLSyntaxParser parser = new SQLSyntaxParser(); protected UnresolvedPlan buildAST(String query) { diff --git a/sql/src/test/java/org/opensearch/sql/sql/parser/AstExpressionBuilderTest.java b/sql/src/test/java/org/opensearch/sql/sql/parser/AstExpressionBuilderTest.java index 20655bc020..f2e7fdb2d8 100644 --- a/sql/src/test/java/org/opensearch/sql/sql/parser/AstExpressionBuilderTest.java +++ b/sql/src/test/java/org/opensearch/sql/sql/parser/AstExpressionBuilderTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.parser; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -57,185 +56,122 @@ class AstExpressionBuilderTest { @Test public void canBuildStringLiteral() { - assertEquals( - stringLiteral("hello"), - buildExprAst("'hello'") - ); - assertEquals( - stringLiteral("hello"), - buildExprAst("\"hello\"") - ); + assertEquals(stringLiteral("hello"), buildExprAst("'hello'")); + assertEquals(stringLiteral("hello"), buildExprAst("\"hello\"")); } @Test public void canBuildIntegerLiteral() { - assertEquals( - intLiteral(123), - buildExprAst("123") - ); - assertEquals( - intLiteral(Integer.MAX_VALUE), - buildExprAst(String.valueOf(Integer.MAX_VALUE)) - ); - assertEquals( - intLiteral(Integer.MIN_VALUE), - buildExprAst(String.valueOf(Integer.MIN_VALUE)) - ); + assertEquals(intLiteral(123), buildExprAst("123")); + assertEquals(intLiteral(Integer.MAX_VALUE), buildExprAst(String.valueOf(Integer.MAX_VALUE))); + assertEquals(intLiteral(Integer.MIN_VALUE), buildExprAst(String.valueOf(Integer.MIN_VALUE))); } @Test public void canBuildLongLiteral() { + assertEquals(longLiteral(1234567890123L), buildExprAst("1234567890123")); assertEquals( - longLiteral(1234567890123L), - buildExprAst("1234567890123") - ); + longLiteral(Integer.MAX_VALUE + 1L), buildExprAst(String.valueOf(Integer.MAX_VALUE + 1L))); assertEquals( - longLiteral(Integer.MAX_VALUE + 1L), - buildExprAst(String.valueOf(Integer.MAX_VALUE + 1L)) - ); - assertEquals( - longLiteral(Integer.MIN_VALUE - 1L), - buildExprAst(String.valueOf(Integer.MIN_VALUE - 1L)) - ); + longLiteral(Integer.MIN_VALUE - 1L), buildExprAst(String.valueOf(Integer.MIN_VALUE - 1L))); } @Test public void canBuildNegativeRealLiteral() { - assertEquals( - doubleLiteral(-4.567), - buildExprAst("-4.567") - ); + assertEquals(doubleLiteral(-4.567), buildExprAst("-4.567")); } @Test public void canBuildBooleanLiteral() { - assertEquals( - booleanLiteral(true), - buildExprAst("true") - ); + assertEquals(booleanLiteral(true), buildExprAst("true")); } @Test public void canBuildDateLiteral() { - assertEquals( - dateLiteral("2020-07-07"), - buildExprAst("DATE '2020-07-07'") - ); + assertEquals(dateLiteral("2020-07-07"), buildExprAst("DATE '2020-07-07'")); } @Test public void canBuildTimeLiteral() { - assertEquals( - timeLiteral("11:30:45"), - buildExprAst("TIME '11:30:45'") - ); + assertEquals(timeLiteral("11:30:45"), buildExprAst("TIME '11:30:45'")); } @Test public void canBuildTimestampLiteral() { assertEquals( - timestampLiteral("2020-07-07 11:30:45"), - buildExprAst("TIMESTAMP '2020-07-07 11:30:45'") - ); + timestampLiteral("2020-07-07 11:30:45"), buildExprAst("TIMESTAMP '2020-07-07 11:30:45'")); } @Test public void canBuildIntervalLiteral() { - assertEquals( - intervalLiteral(1, DataType.INTEGER, "day"), - buildExprAst("interval 1 day") - ); + assertEquals(intervalLiteral(1, DataType.INTEGER, "day"), buildExprAst("interval 1 day")); } @Test public void canBuildArithmeticExpression() { - assertEquals( - function("+", intLiteral(1), intLiteral(2)), - buildExprAst("1 + 2") - ); + assertEquals(function("+", intLiteral(1), intLiteral(2)), buildExprAst("1 + 2")); } @Test public void canBuildArithmeticExpressionPrecedence() { assertEquals( - function("+", - intLiteral(1), - function("*", - intLiteral(2), intLiteral(3))), - buildExprAst("1 + 2 * 3") - ); + function("+", intLiteral(1), function("*", intLiteral(2), intLiteral(3))), + buildExprAst("1 + 2 * 3")); } @Test public void canBuildFunctionWithoutArguments() { - assertEquals( - function("PI"), - buildExprAst("PI()") - ); + assertEquals(function("PI"), buildExprAst("PI()")); } @Test public void canBuildExpressionWithParentheses() { assertEquals( - function("*", + function( + "*", function("+", doubleLiteral(-1.0), doubleLiteral(2.3)), - function("-", intLiteral(3), intLiteral(1)) - ), - buildExprAst("(-1.0 + 2.3) * (3 - 1)") - ); + function("-", intLiteral(3), intLiteral(1))), + buildExprAst("(-1.0 + 2.3) * (3 - 1)")); } @Test public void canBuildFunctionCall() { - assertEquals( - function("abs", intLiteral(-1)), - buildExprAst("abs(-1)") - ); + assertEquals(function("abs", intLiteral(-1)), buildExprAst("abs(-1)")); } @Test public void canBuildExtractFunctionCall() { assertEquals( function("extract", stringLiteral("DAY"), dateLiteral("2023-02-09")).toString(), - buildExprAst("extract(DAY FROM \"2023-02-09\")").toString() - ); + buildExprAst("extract(DAY FROM \"2023-02-09\")").toString()); } @Test public void canBuildGetFormatFunctionCall() { assertEquals( function("get_format", stringLiteral("DATE"), stringLiteral("USA")), - buildExprAst("get_format(DATE,\"USA\")") - ); + buildExprAst("get_format(DATE,\"USA\")")); } @Test public void canBuildNestedFunctionCall() { assertEquals( - function("abs", - function("*", - function("abs", intLiteral(-5)), - intLiteral(-1) - ) - ), - buildExprAst("abs(abs(-5) * -1)") - ); + function("abs", function("*", function("abs", intLiteral(-5)), intLiteral(-1))), + buildExprAst("abs(abs(-5) * -1)")); } @Test public void canBuildDateAndTimeFunctionCall() { assertEquals( function("dayofmonth", dateLiteral("2020-07-07")), - buildExprAst("dayofmonth(DATE '2020-07-07')") - ); + buildExprAst("dayofmonth(DATE '2020-07-07')")); } @Test public void canBuildTimestampAddFunctionCall() { assertEquals( function("timestampadd", stringLiteral("WEEK"), intLiteral(1), dateLiteral("2023-03-14")), - buildExprAst("timestampadd(WEEK, 1, DATE '2023-03-14')") - ); + buildExprAst("timestampadd(WEEK, 1, DATE '2023-03-14')")); } @Test @@ -246,105 +182,69 @@ public void canBuildTimstampDiffFunctionCall() { stringLiteral("WEEK"), timestampLiteral("2023-03-15 00:00:01"), dateLiteral("2023-03-14")), - buildExprAst("timestampdiff(WEEK, TIMESTAMP '2023-03-15 00:00:01', DATE '2023-03-14')") - ); + buildExprAst("timestampdiff(WEEK, TIMESTAMP '2023-03-15 00:00:01', DATE '2023-03-14')")); } @Test public void canBuildComparisonExpression() { - assertEquals( - function("!=", intLiteral(1), intLiteral(2)), - buildExprAst("1 != 2") - ); + assertEquals(function("!=", intLiteral(1), intLiteral(2)), buildExprAst("1 != 2")); - assertEquals( - function("!=", intLiteral(1), intLiteral(2)), - buildExprAst("1 <> 2") - ); + assertEquals(function("!=", intLiteral(1), intLiteral(2)), buildExprAst("1 <> 2")); } @Test public void canBuildNullTestExpression() { - assertEquals( - function("is null", intLiteral(1)), - buildExprAst("1 is NULL") - ); + assertEquals(function("is null", intLiteral(1)), buildExprAst("1 is NULL")); - assertEquals( - function("is not null", intLiteral(1)), - buildExprAst("1 IS NOT null") - ); + assertEquals(function("is not null", intLiteral(1)), buildExprAst("1 IS NOT null")); } @Test public void canBuildNullTestExpressionWithNULLLiteral() { - assertEquals( - function("is null", nullLiteral()), - buildExprAst("NULL is NULL") - ); + assertEquals(function("is null", nullLiteral()), buildExprAst("NULL is NULL")); - assertEquals( - function("is not null", nullLiteral()), - buildExprAst("NULL IS NOT null") - ); + assertEquals(function("is not null", nullLiteral()), buildExprAst("NULL IS NOT null")); } @Test public void canBuildLikeExpression() { assertEquals( function("like", stringLiteral("str"), stringLiteral("st%")), - buildExprAst("'str' like 'st%'") - ); + buildExprAst("'str' like 'st%'")); assertEquals( function("not like", stringLiteral("str"), stringLiteral("st%")), - buildExprAst("'str' not like 'st%'") - ); + buildExprAst("'str' not like 'st%'")); } @Test public void canBuildRegexpExpression() { assertEquals( function("regexp", stringLiteral("str"), stringLiteral(".*")), - buildExprAst("'str' regexp '.*'") - ); + buildExprAst("'str' regexp '.*'")); } @Test public void canBuildBetweenExpression() { assertEquals( - between( - qualifiedName("age"), intLiteral(10), intLiteral(30)), - buildExprAst("age BETWEEN 10 AND 30") - ); + between(qualifiedName("age"), intLiteral(10), intLiteral(30)), + buildExprAst("age BETWEEN 10 AND 30")); } @Test public void canBuildNotBetweenExpression() { assertEquals( - not( - between( - qualifiedName("age"), intLiteral(10), intLiteral(30))), - buildExprAst("age NOT BETWEEN 10 AND 30") - ); + not(between(qualifiedName("age"), intLiteral(10), intLiteral(30))), + buildExprAst("age NOT BETWEEN 10 AND 30")); } @Test public void canBuildLogicalExpression() { - assertEquals( - and(booleanLiteral(true), booleanLiteral(false)), - buildExprAst("true AND false") - ); + assertEquals(and(booleanLiteral(true), booleanLiteral(false)), buildExprAst("true AND false")); - assertEquals( - or(booleanLiteral(true), booleanLiteral(false)), - buildExprAst("true OR false") - ); + assertEquals(or(booleanLiteral(true), booleanLiteral(false)), buildExprAst("true OR false")); - assertEquals( - not(booleanLiteral(false)), - buildExprAst("NOT false") - ); + assertEquals(not(booleanLiteral(false)), buildExprAst("NOT false")); } @Test @@ -373,8 +273,8 @@ public void canBuildWindowFunctionWithNullOrderSpecified() { window( function("DENSE_RANK"), ImmutableList.of(), - ImmutableList.of(ImmutablePair.of( - new SortOption(ASC, NULL_LAST), qualifiedName("age")))), + ImmutableList.of( + ImmutablePair.of(new SortOption(ASC, NULL_LAST), qualifiedName("age")))), buildExprAst("DENSE_RANK() OVER (ORDER BY age ASC NULLS LAST)")); } @@ -382,35 +282,27 @@ public void canBuildWindowFunctionWithNullOrderSpecified() { public void canBuildStringLiteralHighlightFunction() { HashMap args = new HashMap<>(); assertEquals( - highlight(AstDSL.stringLiteral("fieldA"), args), - buildExprAst("highlight(\"fieldA\")") - ); + highlight(AstDSL.stringLiteral("fieldA"), args), buildExprAst("highlight(\"fieldA\")")); } @Test public void canBuildQualifiedNameHighlightFunction() { HashMap args = new HashMap<>(); assertEquals( - highlight(AstDSL.qualifiedName("fieldA"), args), - buildExprAst("highlight(fieldA)") - ); + highlight(AstDSL.qualifiedName("fieldA"), args), buildExprAst("highlight(fieldA)")); } @Test public void canBuildStringLiteralPositionFunction() { assertEquals( - function("position", stringLiteral("substr"), stringLiteral("str")), - buildExprAst("position(\"substr\" IN \"str\")") - ); + function("position", stringLiteral("substr"), stringLiteral("str")), + buildExprAst("position(\"substr\" IN \"str\")")); } @Test public void canBuildWindowFunctionWithoutOrderBy() { assertEquals( - window( - function("RANK"), - ImmutableList.of(qualifiedName("state")), - ImmutableList.of()), + window(function("RANK"), ImmutableList.of(qualifiedName("state")), ImmutableList.of()), buildExprAst("RANK() OVER (PARTITION BY state)")); } @@ -420,8 +312,7 @@ public void canBuildAggregateWindowFunction() { window( aggregate("AVG", qualifiedName("age")), ImmutableList.of(qualifiedName("state")), - ImmutableList.of(ImmutablePair.of( - new SortOption(null, null), qualifiedName("age")))), + ImmutableList.of(ImmutablePair.of(new SortOption(null, null), qualifiedName("age")))), buildExprAst("AVG(age) OVER (PARTITION BY state ORDER BY age)")); } @@ -430,11 +321,8 @@ public void canBuildCaseConditionStatement() { assertEquals( caseWhen( null, // no else statement - when( - function(">", qualifiedName("age"), intLiteral(30)), - stringLiteral("age1"))), - buildExprAst("CASE WHEN age > 30 THEN 'age1' END") - ); + when(function(">", qualifiedName("age"), intLiteral(30)), stringLiteral("age1"))), + buildExprAst("CASE WHEN age > 30 THEN 'age1' END")); } @Test @@ -444,168 +332,147 @@ public void canBuildCaseValueStatement() { qualifiedName("age"), stringLiteral("age2"), when(intLiteral(30), stringLiteral("age1"))), - buildExprAst("CASE age WHEN 30 THEN 'age1' ELSE 'age2' END") - ); + buildExprAst("CASE age WHEN 30 THEN 'age1' ELSE 'age2' END")); } @Test public void canBuildKeywordsAsIdentifiers() { - assertEquals( - qualifiedName("timestamp"), - buildExprAst("timestamp") - ); + assertEquals(qualifiedName("timestamp"), buildExprAst("timestamp")); } @Test public void canBuildKeywordsAsIdentInQualifiedName() { - assertEquals( - qualifiedName("test", "timestamp"), - buildExprAst("test.timestamp") - ); + assertEquals(qualifiedName("test", "timestamp"), buildExprAst("test.timestamp")); } @Test public void canBuildMetaDataFieldAsQualifiedName() { - Stream.of("_id", "_index", "_sort", "_score", "_maxscore").forEach( - field -> assertEquals( - qualifiedName(field), - buildExprAst(field) - ) - ); + Stream.of("_id", "_index", "_sort", "_score", "_maxscore") + .forEach(field -> assertEquals(qualifiedName(field), buildExprAst(field))); } @Test public void canBuildNonMetaDataFieldAsQualifiedName() { - Stream.of("id", "__id", "_routing", "___field").forEach( - field -> assertEquals( - qualifiedName(field), - buildExprAst(field) - ) - ); + Stream.of("id", "__id", "_routing", "___field") + .forEach(field -> assertEquals(qualifiedName(field), buildExprAst(field))); } @Test public void canCastFieldAsString() { assertEquals( AstDSL.cast(qualifiedName("state"), stringLiteral("string")), - buildExprAst("cast(state as string)") - ); + buildExprAst("cast(state as string)")); } @Test public void canCastValueAsString() { assertEquals( - AstDSL.cast(intLiteral(1), stringLiteral("string")), - buildExprAst("cast(1 as string)") - ); + AstDSL.cast(intLiteral(1), stringLiteral("string")), buildExprAst("cast(1 as string)")); } @Test public void filteredAggregation() { assertEquals( - AstDSL.filteredAggregate("avg", qualifiedName("age"), - function(">", qualifiedName("age"), intLiteral(20))), - buildExprAst("avg(age) filter(where age > 20)") - ); + AstDSL.filteredAggregate( + "avg", qualifiedName("age"), function(">", qualifiedName("age"), intLiteral(20))), + buildExprAst("avg(age) filter(where age > 20)")); } @Test public void canBuildVarSamp() { - assertEquals( - aggregate("var_samp", qualifiedName("age")), - buildExprAst("var_samp(age)")); + assertEquals(aggregate("var_samp", qualifiedName("age")), buildExprAst("var_samp(age)")); } @Test public void canBuildVarPop() { - assertEquals( - aggregate("var_pop", qualifiedName("age")), - buildExprAst("var_pop(age)")); + assertEquals(aggregate("var_pop", qualifiedName("age")), buildExprAst("var_pop(age)")); } @Test public void canBuildVariance() { - assertEquals( - aggregate("variance", qualifiedName("age")), - buildExprAst("variance(age)")); + assertEquals(aggregate("variance", qualifiedName("age")), buildExprAst("variance(age)")); } @Test public void distinctCount() { assertEquals( AstDSL.distinctAggregate("count", qualifiedName("name")), - buildExprAst("count(distinct name)") - ); + buildExprAst("count(distinct name)")); } @Test public void filteredDistinctCount() { assertEquals( - AstDSL.filteredDistinctCount("count", qualifiedName("name"), function( - ">", qualifiedName("age"), intLiteral(30))), - buildExprAst("count(distinct name) filter(where age > 30)") - ); + AstDSL.filteredDistinctCount( + "count", qualifiedName("name"), function(">", qualifiedName("age"), intLiteral(30))), + buildExprAst("count(distinct name) filter(where age > 30)")); } @Test public void matchPhraseQueryAllParameters() { assertEquals( - AstDSL.function("matchphrasequery", + AstDSL.function( + "matchphrasequery", unresolvedArg("field", qualifiedName("test")), unresolvedArg("query", stringLiteral("search query")), unresolvedArg("slop", stringLiteral("3")), unresolvedArg("analyzer", stringLiteral("standard")), - unresolvedArg("zero_terms_query", stringLiteral("NONE")) - ), - buildExprAst("matchphrasequery(test, 'search query', slop = 3" - + ", analyzer = 'standard', zero_terms_query='NONE'" - + ")") - ); + unresolvedArg("zero_terms_query", stringLiteral("NONE"))), + buildExprAst( + "matchphrasequery(test, 'search query', slop = 3" + + ", analyzer = 'standard', zero_terms_query='NONE'" + + ")")); } @Test public void matchPhrasePrefixAllParameters() { assertEquals( - AstDSL.function("match_phrase_prefix", - unresolvedArg("field", qualifiedName("test")), - unresolvedArg("query", stringLiteral("search query")), - unresolvedArg("slop", stringLiteral("3")), - unresolvedArg("boost", stringLiteral("1.5")), - unresolvedArg("analyzer", stringLiteral("standard")), - unresolvedArg("max_expansions", stringLiteral("4")), - unresolvedArg("zero_terms_query", stringLiteral("NONE")) - ), - buildExprAst("match_phrase_prefix(test, 'search query', slop = 3, boost = 1.5" - + ", analyzer = 'standard', max_expansions = 4, zero_terms_query='NONE'" - + ")") - ); + AstDSL.function( + "match_phrase_prefix", + unresolvedArg("field", qualifiedName("test")), + unresolvedArg("query", stringLiteral("search query")), + unresolvedArg("slop", stringLiteral("3")), + unresolvedArg("boost", stringLiteral("1.5")), + unresolvedArg("analyzer", stringLiteral("standard")), + unresolvedArg("max_expansions", stringLiteral("4")), + unresolvedArg("zero_terms_query", stringLiteral("NONE"))), + buildExprAst( + "match_phrase_prefix(test, 'search query', slop = 3, boost = 1.5" + + ", analyzer = 'standard', max_expansions = 4, zero_terms_query='NONE'" + + ")")); } @Test public void relevanceMatch() { - assertEquals(AstDSL.function("match", - unresolvedArg("field", qualifiedName("message")), - unresolvedArg("query", stringLiteral("search query"))), - buildExprAst("match('message', 'search query')") - ); - - assertEquals(AstDSL.function("match", - unresolvedArg("field", qualifiedName("message")), - unresolvedArg("query", stringLiteral("search query")), - unresolvedArg("analyzer", stringLiteral("keyword")), - unresolvedArg("operator", stringLiteral("AND"))), + assertEquals( + AstDSL.function( + "match", + unresolvedArg("field", qualifiedName("message")), + unresolvedArg("query", stringLiteral("search query"))), + buildExprAst("match('message', 'search query')")); + + assertEquals( + AstDSL.function( + "match", + unresolvedArg("field", qualifiedName("message")), + unresolvedArg("query", stringLiteral("search query")), + unresolvedArg("analyzer", stringLiteral("keyword")), + unresolvedArg("operator", stringLiteral("AND"))), buildExprAst("match('message', 'search query', analyzer='keyword', operator='AND')")); } @Test public void relevanceMatchQuery() { - assertEquals(AstDSL.function("matchquery", + assertEquals( + AstDSL.function( + "matchquery", unresolvedArg("field", qualifiedName("message")), unresolvedArg("query", stringLiteral("search query"))), - buildExprAst("matchquery('message', 'search query')") - ); + buildExprAst("matchquery('message', 'search query')")); - assertEquals(AstDSL.function("matchquery", + assertEquals( + AstDSL.function( + "matchquery", unresolvedArg("field", qualifiedName("message")), unresolvedArg("query", stringLiteral("search query")), unresolvedArg("analyzer", stringLiteral("keyword")), @@ -615,13 +482,16 @@ public void relevanceMatchQuery() { @Test public void relevanceMatch_Query() { - assertEquals(AstDSL.function("match_query", + assertEquals( + AstDSL.function( + "match_query", unresolvedArg("field", qualifiedName("message")), unresolvedArg("query", stringLiteral("search query"))), - buildExprAst("match_query('message', 'search query')") - ); + buildExprAst("match_query('message', 'search query')")); - assertEquals(AstDSL.function("match_query", + assertEquals( + AstDSL.function( + "match_query", unresolvedArg("field", qualifiedName("message")), unresolvedArg("query", stringLiteral("search query")), unresolvedArg("analyzer", stringLiteral("keyword")), @@ -631,238 +501,279 @@ public void relevanceMatch_Query() { @Test public void relevanceMatchQueryAltSyntax() { - assertEquals(AstDSL.function("match_query", - unresolvedArg("field", stringLiteral("message")), - unresolvedArg("query", stringLiteral("search query"))).toString(), - buildExprAst("message = match_query('search query')").toString() - ); + assertEquals( + AstDSL.function( + "match_query", + unresolvedArg("field", stringLiteral("message")), + unresolvedArg("query", stringLiteral("search query"))) + .toString(), + buildExprAst("message = match_query('search query')").toString()); - assertEquals(AstDSL.function("match_query", - unresolvedArg("field", stringLiteral("message")), - unresolvedArg("query", stringLiteral("search query"))).toString(), - buildExprAst("message = match_query(\"search query\")").toString() - ); + assertEquals( + AstDSL.function( + "match_query", + unresolvedArg("field", stringLiteral("message")), + unresolvedArg("query", stringLiteral("search query"))) + .toString(), + buildExprAst("message = match_query(\"search query\")").toString()); - assertEquals(AstDSL.function("matchquery", - unresolvedArg("field", stringLiteral("message")), - unresolvedArg("query", stringLiteral("search query"))).toString(), - buildExprAst("message = matchquery('search query')").toString() - ); + assertEquals( + AstDSL.function( + "matchquery", + unresolvedArg("field", stringLiteral("message")), + unresolvedArg("query", stringLiteral("search query"))) + .toString(), + buildExprAst("message = matchquery('search query')").toString()); - assertEquals(AstDSL.function("matchquery", - unresolvedArg("field", stringLiteral("message")), - unresolvedArg("query", stringLiteral("search query"))).toString(), - buildExprAst("message = matchquery(\"search query\")").toString() - ); + assertEquals( + AstDSL.function( + "matchquery", + unresolvedArg("field", stringLiteral("message")), + unresolvedArg("query", stringLiteral("search query"))) + .toString(), + buildExprAst("message = matchquery(\"search query\")").toString()); } @Test public void relevanceMatchPhraseAltSyntax() { - assertEquals(AstDSL.function("match_phrase", - unresolvedArg("field", stringLiteral("message")), - unresolvedArg("query", stringLiteral("search query"))).toString(), - buildExprAst("message = match_phrase('search query')").toString() - ); + assertEquals( + AstDSL.function( + "match_phrase", + unresolvedArg("field", stringLiteral("message")), + unresolvedArg("query", stringLiteral("search query"))) + .toString(), + buildExprAst("message = match_phrase('search query')").toString()); - assertEquals(AstDSL.function("match_phrase", - unresolvedArg("field", stringLiteral("message")), - unresolvedArg("query", stringLiteral("search query"))).toString(), - buildExprAst("message = match_phrase(\"search query\")").toString() - ); + assertEquals( + AstDSL.function( + "match_phrase", + unresolvedArg("field", stringLiteral("message")), + unresolvedArg("query", stringLiteral("search query"))) + .toString(), + buildExprAst("message = match_phrase(\"search query\")").toString()); - assertEquals(AstDSL.function("matchphrase", - unresolvedArg("field", stringLiteral("message")), - unresolvedArg("query", stringLiteral("search query"))).toString(), - buildExprAst("message = matchphrase('search query')").toString() - ); + assertEquals( + AstDSL.function( + "matchphrase", + unresolvedArg("field", stringLiteral("message")), + unresolvedArg("query", stringLiteral("search query"))) + .toString(), + buildExprAst("message = matchphrase('search query')").toString()); - assertEquals(AstDSL.function("matchphrase", - unresolvedArg("field", stringLiteral("message")), - unresolvedArg("query", stringLiteral("search query"))).toString(), - buildExprAst("message = matchphrase(\"search query\")").toString() - ); + assertEquals( + AstDSL.function( + "matchphrase", + unresolvedArg("field", stringLiteral("message")), + unresolvedArg("query", stringLiteral("search query"))) + .toString(), + buildExprAst("message = matchphrase(\"search query\")").toString()); } @Test public void relevanceMultiMatchAltSyntax() { - assertEquals(AstDSL.function("multi_match", + assertEquals( + AstDSL.function( + "multi_match", unresolvedArg("fields", new RelevanceFieldList(ImmutableMap.of("field1", 1.F))), unresolvedArg("query", stringLiteral("search query"))), - buildExprAst("field1 = multi_match('search query')") - ); + buildExprAst("field1 = multi_match('search query')")); - assertEquals(AstDSL.function("multi_match", + assertEquals( + AstDSL.function( + "multi_match", unresolvedArg("fields", new RelevanceFieldList(ImmutableMap.of("field1", 1.F))), unresolvedArg("query", stringLiteral("search query"))), - buildExprAst("field1 = multi_match(\"search query\")") - ); + buildExprAst("field1 = multi_match(\"search query\")")); - assertEquals(AstDSL.function("multimatch", + assertEquals( + AstDSL.function( + "multimatch", unresolvedArg("fields", new RelevanceFieldList(ImmutableMap.of("field1", 1.F))), unresolvedArg("query", stringLiteral("search query"))), - buildExprAst("field1 = multimatch('search query')") - ); + buildExprAst("field1 = multimatch('search query')")); - assertEquals(AstDSL.function("multimatch", + assertEquals( + AstDSL.function( + "multimatch", unresolvedArg("fields", new RelevanceFieldList(ImmutableMap.of("field1", 1.F))), unresolvedArg("query", stringLiteral("search query"))), - buildExprAst("field1 = multimatch(\"search query\")") - ); + buildExprAst("field1 = multimatch(\"search query\")")); } @Test public void relevanceMulti_match() { - assertEquals(AstDSL.function("multi_match", - unresolvedArg("fields", new RelevanceFieldList(ImmutableMap.of( - "field2", 3.2F, "field1", 1.F))), + assertEquals( + AstDSL.function( + "multi_match", + unresolvedArg( + "fields", new RelevanceFieldList(ImmutableMap.of("field2", 3.2F, "field1", 1.F))), unresolvedArg("query", stringLiteral("search query"))), - buildExprAst("multi_match(['field1', 'field2' ^ 3.2], 'search query')") - ); + buildExprAst("multi_match(['field1', 'field2' ^ 3.2], 'search query')")); - assertEquals(AstDSL.function("multi_match", - unresolvedArg("fields", new RelevanceFieldList(ImmutableMap.of( - "field2", 3.2F, "field1", 1.F))), + assertEquals( + AstDSL.function( + "multi_match", + unresolvedArg( + "fields", new RelevanceFieldList(ImmutableMap.of("field2", 3.2F, "field1", 1.F))), unresolvedArg("query", stringLiteral("search query")), unresolvedArg("analyzer", stringLiteral("keyword")), unresolvedArg("operator", stringLiteral("AND"))), - buildExprAst("multi_match(['field1', 'field2' ^ 3.2], 'search query'," - + "analyzer='keyword', 'operator'='AND')")); + buildExprAst( + "multi_match(['field1', 'field2' ^ 3.2], 'search query'," + + "analyzer='keyword', 'operator'='AND')")); } @Test public void relevanceMultimatch_alternate_parameter_syntax() { - assertEquals(AstDSL.function("multimatch", - unresolvedArg("fields", new RelevanceFieldList(ImmutableMap.of( - "field1", 1F, "field2", 2F))), + assertEquals( + AstDSL.function( + "multimatch", + unresolvedArg( + "fields", new RelevanceFieldList(ImmutableMap.of("field1", 1F, "field2", 2F))), unresolvedArg("query", stringLiteral("search query"))), - buildExprAst("multimatch(query='search query', fields=['field1^1.0,field2^2.0'])") - ); + buildExprAst("multimatch(query='search query', fields=['field1^1.0,field2^2.0'])")); - assertEquals(AstDSL.function("multimatch", - unresolvedArg("fields", new RelevanceFieldList(ImmutableMap.of( - "field1", 1F, "field2", 2F))), + assertEquals( + AstDSL.function( + "multimatch", + unresolvedArg( + "fields", new RelevanceFieldList(ImmutableMap.of("field1", 1F, "field2", 2F))), unresolvedArg("query", stringLiteral("search query")), unresolvedArg("analyzer", stringLiteral("keyword")), unresolvedArg("operator", stringLiteral("AND"))), - buildExprAst("multimatch(query='search query', fields=['field1^1.0,field2^2.0']," - + "analyzer='keyword', operator='AND')")); + buildExprAst( + "multimatch(query='search query', fields=['field1^1.0,field2^2.0']," + + "analyzer='keyword', operator='AND')")); } @Test public void relevanceMultimatchquery_alternate_parameter_syntax() { - assertEquals(AstDSL.function("multimatchquery", - unresolvedArg("fields", new RelevanceFieldList(ImmutableMap.of( - "field", 1F))), + assertEquals( + AstDSL.function( + "multimatchquery", + unresolvedArg("fields", new RelevanceFieldList(ImmutableMap.of("field", 1F))), unresolvedArg("query", stringLiteral("search query"))), - buildExprAst("multimatchquery(query='search query', fields='field')") - ); + buildExprAst("multimatchquery(query='search query', fields='field')")); - assertEquals(AstDSL.function("multimatchquery", - unresolvedArg("fields", new RelevanceFieldList(ImmutableMap.of( - "field", 1F))), + assertEquals( + AstDSL.function( + "multimatchquery", + unresolvedArg("fields", new RelevanceFieldList(ImmutableMap.of("field", 1F))), unresolvedArg("query", stringLiteral("search query")), unresolvedArg("analyzer", stringLiteral("keyword")), unresolvedArg("operator", stringLiteral("AND"))), - buildExprAst("multimatchquery(query='search query', fields='field'," - + "analyzer='keyword', 'operator'='AND')")); + buildExprAst( + "multimatchquery(query='search query', fields='field'," + + "analyzer='keyword', 'operator'='AND')")); } @Test public void relevanceSimple_query_string() { - assertEquals(AstDSL.function("simple_query_string", - unresolvedArg("fields", new RelevanceFieldList(ImmutableMap.of( - "field2", 3.2F, "field1", 1.F))), + assertEquals( + AstDSL.function( + "simple_query_string", + unresolvedArg( + "fields", new RelevanceFieldList(ImmutableMap.of("field2", 3.2F, "field1", 1.F))), unresolvedArg("query", stringLiteral("search query"))), - buildExprAst("simple_query_string(['field1', 'field2' ^ 3.2], 'search query')") - ); + buildExprAst("simple_query_string(['field1', 'field2' ^ 3.2], 'search query')")); - assertEquals(AstDSL.function("simple_query_string", - unresolvedArg("fields", new RelevanceFieldList(ImmutableMap.of( - "field2", 3.2F, "field1", 1.F))), + assertEquals( + AstDSL.function( + "simple_query_string", + unresolvedArg( + "fields", new RelevanceFieldList(ImmutableMap.of("field2", 3.2F, "field1", 1.F))), unresolvedArg("query", stringLiteral("search query")), unresolvedArg("analyzer", stringLiteral("keyword")), unresolvedArg("operator", stringLiteral("AND"))), - buildExprAst("simple_query_string(['field1', 'field2' ^ 3.2], 'search query'," - + "analyzer='keyword', operator='AND')")); + buildExprAst( + "simple_query_string(['field1', 'field2' ^ 3.2], 'search query'," + + "analyzer='keyword', operator='AND')")); } @Test public void relevanceQuery_string() { - assertEquals(AstDSL.function("query_string", - unresolvedArg("fields", new RelevanceFieldList(ImmutableMap.of( - "field2", 3.2F, "field1", 1.F))), + assertEquals( + AstDSL.function( + "query_string", + unresolvedArg( + "fields", new RelevanceFieldList(ImmutableMap.of("field2", 3.2F, "field1", 1.F))), unresolvedArg("query", stringLiteral("search query"))), - buildExprAst("query_string(['field1', 'field2' ^ 3.2], 'search query')") - ); + buildExprAst("query_string(['field1', 'field2' ^ 3.2], 'search query')")); - assertEquals(AstDSL.function("query_string", - unresolvedArg("fields", new RelevanceFieldList(ImmutableMap.of( - "field2", 3.2F, "field1", 1.F))), + assertEquals( + AstDSL.function( + "query_string", + unresolvedArg( + "fields", new RelevanceFieldList(ImmutableMap.of("field2", 3.2F, "field1", 1.F))), unresolvedArg("query", stringLiteral("search query")), unresolvedArg("analyzer", stringLiteral("keyword")), unresolvedArg("time_zone", stringLiteral("Canada/Pacific")), unresolvedArg("tie_breaker", stringLiteral("1.3"))), - buildExprAst("query_string(['field1', 'field2' ^ 3.2], 'search query'," - + "analyzer='keyword', time_zone='Canada/Pacific', tie_breaker='1.3')")); + buildExprAst( + "query_string(['field1', 'field2' ^ 3.2], 'search query'," + + "analyzer='keyword', time_zone='Canada/Pacific', tie_breaker='1.3')")); } @Test public void relevanceWildcard_query() { - assertEquals(AstDSL.function("wildcard_query", + assertEquals( + AstDSL.function( + "wildcard_query", unresolvedArg("field", qualifiedName("field")), unresolvedArg("query", stringLiteral("search query*")), unresolvedArg("boost", stringLiteral("1.5")), unresolvedArg("case_insensitive", stringLiteral("true")), unresolvedArg("rewrite", stringLiteral("scoring_boolean"))), - buildExprAst("wildcard_query(field, 'search query*', boost=1.5," - + "case_insensitive=true, rewrite='scoring_boolean'))") - ); + buildExprAst( + "wildcard_query(field, 'search query*', boost=1.5," + + "case_insensitive=true, rewrite='scoring_boolean'))")); } @Test public void relevanceScore_query() { assertEquals( AstDSL.score( - AstDSL.function("query_string", - unresolvedArg("fields", new RelevanceFieldList(ImmutableMap.of( - "field1", 1.F, "field2", 3.2F))), - unresolvedArg("query", stringLiteral("search query")) - ), - AstDSL.doubleLiteral(1.0) - ), - buildExprAst("score(query_string(['field1', 'field2' ^ 3.2], 'search query'))") - ); + AstDSL.function( + "query_string", + unresolvedArg( + "fields", + new RelevanceFieldList(ImmutableMap.of("field1", 1.F, "field2", 3.2F))), + unresolvedArg("query", stringLiteral("search query"))), + AstDSL.doubleLiteral(1.0)), + buildExprAst("score(query_string(['field1', 'field2' ^ 3.2], 'search query'))")); } @Test public void relevanceScore_withBoost_query() { assertEquals( AstDSL.score( - AstDSL.function("query_string", - unresolvedArg("fields", new RelevanceFieldList(ImmutableMap.of( - "field1", 1.F, "field2", 3.2F))), - unresolvedArg("query", stringLiteral("search query")) - ), - doubleLiteral(1.0) - ), - buildExprAst("score(query_string(['field1', 'field2' ^ 3.2], 'search query'), 1.0)") - ); + AstDSL.function( + "query_string", + unresolvedArg( + "fields", + new RelevanceFieldList(ImmutableMap.of("field1", 1.F, "field2", 3.2F))), + unresolvedArg("query", stringLiteral("search query"))), + doubleLiteral(1.0)), + buildExprAst("score(query_string(['field1', 'field2' ^ 3.2], 'search query'), 1.0)")); } @Test public void relevanceQuery() { - assertEquals(AstDSL.function("query", - unresolvedArg("query", stringLiteral("field1:query OR field2:query"))), - buildExprAst("query('field1:query OR field2:query')") - ); + assertEquals( + AstDSL.function( + "query", unresolvedArg("query", stringLiteral("field1:query OR field2:query"))), + buildExprAst("query('field1:query OR field2:query')")); - assertEquals(AstDSL.function("query", - unresolvedArg("query", stringLiteral("search query")), - unresolvedArg("analyzer", stringLiteral("keyword")), - unresolvedArg("time_zone", stringLiteral("Canada/Pacific")), - unresolvedArg("tie_breaker", stringLiteral("1.3"))), - buildExprAst("query('search query'," - + "analyzer='keyword', time_zone='Canada/Pacific', tie_breaker='1.3')")); + assertEquals( + AstDSL.function( + "query", + unresolvedArg("query", stringLiteral("search query")), + unresolvedArg("analyzer", stringLiteral("keyword")), + unresolvedArg("time_zone", stringLiteral("Canada/Pacific")), + unresolvedArg("tie_breaker", stringLiteral("1.3"))), + buildExprAst( + "query('search query'," + + "analyzer='keyword', time_zone='Canada/Pacific', tie_breaker='1.3')")); } @Test @@ -876,7 +787,8 @@ public void canBuildInClause() { buildExprAst("age not in (20, 30)")); assertEquals( - AstDSL.in(qualifiedName("age"), + AstDSL.in( + qualifiedName("age"), AstDSL.function("abs", AstDSL.intLiteral(20)), AstDSL.function("abs", AstDSL.intLiteral(30))), buildExprAst("age in (abs(20), abs(30))")); diff --git a/sql/src/test/java/org/opensearch/sql/sql/parser/AstHavingFilterBuilderTest.java b/sql/src/test/java/org/opensearch/sql/sql/parser/AstHavingFilterBuilderTest.java index 1cb1ab5f8b..b2e4c54160 100644 --- a/sql/src/test/java/org/opensearch/sql/sql/parser/AstHavingFilterBuilderTest.java +++ b/sql/src/test/java/org/opensearch/sql/sql/parser/AstHavingFilterBuilderTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.parser; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -30,8 +29,7 @@ @ExtendWith(MockitoExtension.class) class AstHavingFilterBuilderTest { - @Mock - private QuerySpecification querySpec; + @Mock private QuerySpecification querySpec; private AstHavingFilterBuilder builder; diff --git a/sql/src/test/java/org/opensearch/sql/sql/parser/AstNowLikeFunctionTest.java b/sql/src/test/java/org/opensearch/sql/sql/parser/AstNowLikeFunctionTest.java index 4ce2a2d3f7..639d73e419 100644 --- a/sql/src/test/java/org/opensearch/sql/sql/parser/AstNowLikeFunctionTest.java +++ b/sql/src/test/java/org/opensearch/sql/sql/parser/AstNowLikeFunctionTest.java @@ -25,32 +25,29 @@ class AstNowLikeFunctionTest extends AstBuilderTestBase { private static Stream allFunctions() { - return Stream.of("curdate", - "current_date", - "current_time", - "current_timestamp", - "curtime", - "localtimestamp", - "localtime", - "now", - "sysdate", - "utc_date", - "utc_time", - "utc_timestamp") + return Stream.of( + "curdate", + "current_date", + "current_time", + "current_timestamp", + "curtime", + "localtimestamp", + "localtime", + "now", + "sysdate", + "utc_date", + "utc_time", + "utc_timestamp") .map(Arguments::of); } private static Stream supportFsp() { - return Stream.of("sysdate") - .map(Arguments::of); + return Stream.of("sysdate").map(Arguments::of); } private static Stream supportShortcut() { - return Stream.of("current_date", - "current_time", - "current_timestamp", - "localtimestamp", - "localtime") + return Stream.of( + "current_date", "current_time", "current_timestamp", "localtimestamp", "localtime") .map(Arguments::of); } @@ -59,12 +56,7 @@ private static Stream supportShortcut() { void project_call(String name) { String call = name + "()"; assertEquals( - project( - values(emptyList()), - alias(call, function(name)) - ), - buildAST("SELECT " + call) - ); + project(values(emptyList()), alias(call, function(name))), buildAST("SELECT " + call)); } @ParameterizedTest @@ -73,29 +65,16 @@ void filter_call(String name) { String call = name + "()"; assertEquals( project( - filter( - relation("test"), - function( - "=", - qualifiedName("data"), - function(name)) - ), - AllFields.of() - ), - buildAST("SELECT * FROM test WHERE data = " + call) - ); + filter(relation("test"), function("=", qualifiedName("data"), function(name))), + AllFields.of()), + buildAST("SELECT * FROM test WHERE data = " + call)); } - @ParameterizedTest @MethodSource("supportFsp") void fsp(String name) { assertEquals( - project( - values(emptyList()), - alias(name + "(0)", function(name, intLiteral(0))) - ), - buildAST("SELECT " + name + "(0)") - ); + project(values(emptyList()), alias(name + "(0)", function(name, intLiteral(0)))), + buildAST("SELECT " + name + "(0)")); } } diff --git a/sql/src/test/java/org/opensearch/sql/sql/parser/AstQualifiedNameBuilderTest.java b/sql/src/test/java/org/opensearch/sql/sql/parser/AstQualifiedNameBuilderTest.java index 28665dd7ef..b0a7592990 100644 --- a/sql/src/test/java/org/opensearch/sql/sql/parser/AstQualifiedNameBuilderTest.java +++ b/sql/src/test/java/org/opensearch/sql/sql/parser/AstQualifiedNameBuilderTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.parser; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -66,9 +65,10 @@ public void functionNameCanBeUsedAsIdentifier() { void assertFunctionNameCouldBeId(String antlrFunctionName) { List functionList = - Arrays.stream(antlrFunctionName.split("\\|")).map(String::stripLeading) - .map(String::stripTrailing).collect( - Collectors.toList()); + Arrays.stream(antlrFunctionName.split("\\|")) + .map(String::stripLeading) + .map(String::stripTrailing) + .collect(Collectors.toList()); assertFalse(functionList.isEmpty()); for (String functionName : functionList) { @@ -109,5 +109,4 @@ private OpenSearchSQLParser createParser(String expr) { return parser; } } - } diff --git a/sql/src/test/java/org/opensearch/sql/sql/parser/AstSortBuilderTest.java b/sql/src/test/java/org/opensearch/sql/sql/parser/AstSortBuilderTest.java index 3c8d155e65..f72f1ba0ff 100644 --- a/sql/src/test/java/org/opensearch/sql/sql/parser/AstSortBuilderTest.java +++ b/sql/src/test/java/org/opensearch/sql/sql/parser/AstSortBuilderTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.parser; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -40,14 +39,11 @@ @ExtendWith(MockitoExtension.class) class AstSortBuilderTest { - @Mock - private QuerySpecification querySpec; + @Mock private QuerySpecification querySpec; - @Mock - private OrderByClauseContext orderByClause; + @Mock private OrderByClauseContext orderByClause; - @Mock - private UnresolvedPlan child; + @Mock private UnresolvedPlan child; @Test void can_build_sort_node() { @@ -56,32 +52,35 @@ void can_build_sort_node() { ImmutableMap> expects = ImmutableMap.>builder() - .put(new SortOption(null, null), - ImmutableList.of(argument("asc", booleanLiteral(true)))) - .put(new SortOption(ASC, null), - ImmutableList.of(argument("asc", booleanLiteral(true)))) - .put(new SortOption(DESC, null), + .put( + new SortOption(null, null), ImmutableList.of(argument("asc", booleanLiteral(true)))) + .put(new SortOption(ASC, null), ImmutableList.of(argument("asc", booleanLiteral(true)))) + .put( + new SortOption(DESC, null), ImmutableList.of(argument("asc", booleanLiteral(false)))) - .put(new SortOption(null, NULL_LAST), + .put( + new SortOption(null, NULL_LAST), ImmutableList.of( argument("asc", booleanLiteral(true)), argument("nullFirst", booleanLiteral(false)))) - .put(new SortOption(DESC, NULL_FIRST), + .put( + new SortOption(DESC, NULL_FIRST), ImmutableList.of( argument("asc", booleanLiteral(false)), argument("nullFirst", booleanLiteral(true)))) .build(); - expects.forEach((option, expect) -> { - when(querySpec.getOrderByOptions()).thenReturn(ImmutableList.of(option)); + expects.forEach( + (option, expect) -> { + when(querySpec.getOrderByOptions()).thenReturn(ImmutableList.of(option)); - AstSortBuilder sortBuilder = new AstSortBuilder(querySpec); - assertEquals( - new Sort( - child, // has to mock and attach child otherwise Guava ImmutableList NPE in getChild() - ImmutableList.of(field("name", expect))), - sortBuilder.visitOrderByClause(orderByClause).attach(child)); - }); + AstSortBuilder sortBuilder = new AstSortBuilder(querySpec); + assertEquals( + new Sort( + child, // has to mock and attach child otherwise Guava ImmutableList NPE in + // getChild() + ImmutableList.of(field("name", expect))), + sortBuilder.visitOrderByClause(orderByClause).attach(child)); + }); } - } diff --git a/sql/src/test/java/org/opensearch/sql/sql/parser/context/QuerySpecificationTest.java b/sql/src/test/java/org/opensearch/sql/sql/parser/context/QuerySpecificationTest.java index 2f75e89002..6dd027a74c 100644 --- a/sql/src/test/java/org/opensearch/sql/sql/parser/context/QuerySpecificationTest.java +++ b/sql/src/test/java/org/opensearch/sql/sql/parser/context/QuerySpecificationTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.sql.parser.context; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -35,32 +34,27 @@ class QuerySpecificationTest { @Test void can_collect_group_by_items_in_group_by_clause() { - QuerySpecification querySpec = collect( - "SELECT name, ABS(age) FROM test GROUP BY name, ABS(age)"); + QuerySpecification querySpec = + collect("SELECT name, ABS(age) FROM test GROUP BY name, ABS(age)"); assertEquals( - ImmutableList.of( - qualifiedName("name"), - function("ABS", qualifiedName("age"))), + ImmutableList.of(qualifiedName("name"), function("ABS", qualifiedName("age"))), querySpec.getGroupByItems()); } @Test void can_collect_select_items_in_select_clause() { - QuerySpecification querySpec = collect( - "SELECT name, ABS(age) FROM test"); + QuerySpecification querySpec = collect("SELECT name, ABS(age) FROM test"); assertEquals( - ImmutableList.of( - qualifiedName("name"), - function("ABS", qualifiedName("age"))), + ImmutableList.of(qualifiedName("name"), function("ABS", qualifiedName("age"))), querySpec.getSelectItems()); } @Test void can_collect_aggregators_in_select_clause() { - QuerySpecification querySpec = collect( - "SELECT name, AVG(age), SUM(balance) FROM test GROUP BY name"); + QuerySpecification querySpec = + collect("SELECT name, AVG(age), SUM(balance) FROM test GROUP BY name"); assertEquals( ImmutableSet.of( @@ -71,29 +65,25 @@ void can_collect_aggregators_in_select_clause() { @Test void can_collect_nested_aggregators_in_select_clause() { - QuerySpecification querySpec = collect( - "SELECT name, ABS(1 + AVG(age)) FROM test GROUP BY name"); + QuerySpecification querySpec = + collect("SELECT name, ABS(1 + AVG(age)) FROM test GROUP BY name"); assertEquals( - ImmutableSet.of( - alias("AVG(age)", aggregate("AVG", qualifiedName("age")))), + ImmutableSet.of(alias("AVG(age)", aggregate("AVG", qualifiedName("age")))), querySpec.getAggregators()); } @Test void can_collect_alias_in_select_clause() { - QuerySpecification querySpec = collect( - "SELECT name AS n FROM test GROUP BY n"); + QuerySpecification querySpec = collect("SELECT name AS n FROM test GROUP BY n"); - assertEquals( - ImmutableMap.of("n", qualifiedName("name")), - querySpec.getSelectItemsByAlias()); + assertEquals(ImmutableMap.of("n", qualifiedName("name")), querySpec.getSelectItemsByAlias()); } @Test void should_deduplicate_same_aggregators() { - QuerySpecification querySpec = collect( - "SELECT AVG(age), AVG(balance), AVG(age) FROM test GROUP BY name"); + QuerySpecification querySpec = + collect("SELECT AVG(age), AVG(balance), AVG(age) FROM test GROUP BY name"); assertEquals( ImmutableSet.of( @@ -119,20 +109,24 @@ void can_collect_sort_options_in_order_by_clause() { @Test void should_skip_sort_items_in_window_function() { - assertEquals(1, - collect("SELECT name, RANK() OVER(ORDER BY age) " - + "FROM test ORDER BY name" - ).getOrderByOptions().size()); + assertEquals( + 1, + collect("SELECT name, RANK() OVER(ORDER BY age) FROM test ORDER BY name") + .getOrderByOptions() + .size()); } @Test void can_collect_filtered_aggregation() { assertEquals( - ImmutableSet.of(alias("AVG(age) FILTER(WHERE age > 20)", - filteredAggregate("AVG", qualifiedName("age"), - function(">", qualifiedName("age"), intLiteral(20))))), - collect("SELECT AVG(age) FILTER(WHERE age > 20) FROM test").getAggregators() - ); + ImmutableSet.of( + alias( + "AVG(age) FILTER(WHERE age > 20)", + filteredAggregate( + "AVG", + qualifiedName("age"), + function(">", qualifiedName("age"), intLiteral(20))))), + collect("SELECT AVG(age) FILTER(WHERE age > 20) FROM test").getAggregators()); } private QuerySpecification collect(String query) { @@ -147,5 +141,4 @@ private QuerySpecificationContext parse(String query) { parser.addErrorListener(new SyntaxAnalysisErrorListener()); return parser.querySpecification(); } - }