diff --git a/integ-test/src/test/java/org/opensearch/sql/legacy/AggregationIT.java b/integ-test/src/test/java/org/opensearch/sql/legacy/AggregationIT.java index 82260b9f07..a3b1301a69 100644 --- a/integ-test/src/test/java/org/opensearch/sql/legacy/AggregationIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/legacy/AggregationIT.java @@ -22,6 +22,7 @@ import static org.opensearch.sql.util.MatcherUtils.verifySchema; import java.io.IOException; +import java.math.BigDecimal; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; @@ -1029,7 +1030,7 @@ public void minOnNestedField() throws Exception { TEST_INDEX_NESTED_TYPE); JSONObject result = executeQuery(query); JSONObject aggregation = getAggregation(result, "message.dayOfWeek@NESTED"); - Assert.assertEquals(1.0, (double) aggregation.query("/minDays/value"), 0.0001); + Assert.assertEquals(1.0, ((BigDecimal) aggregation.query("/minDays/value")).doubleValue(), 0.0001); } @Test @@ -1039,7 +1040,7 @@ public void sumOnNestedField() throws Exception { TEST_INDEX_NESTED_TYPE); JSONObject result = executeQuery(query); JSONObject aggregation = getAggregation(result, "message.dayOfWeek@NESTED"); - Assert.assertEquals(19.0, (double) aggregation.query("/sumDays/value"), 0.0001); + Assert.assertEquals(19.0, ((BigDecimal) aggregation.query("/sumDays/value")).doubleValue(), 0.0001); } @Test diff --git a/integ-test/src/test/java/org/opensearch/sql/legacy/NestedFieldQueryIT.java b/integ-test/src/test/java/org/opensearch/sql/legacy/NestedFieldQueryIT.java index cd83a09a03..80ca06fd5d 100644 --- a/integ-test/src/test/java/org/opensearch/sql/legacy/NestedFieldQueryIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/legacy/NestedFieldQueryIT.java @@ -16,6 +16,7 @@ import static org.opensearch.sql.util.MatcherUtils.kvString; import java.io.IOException; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.function.Function; import org.hamcrest.BaseMatcher; @@ -316,7 +317,7 @@ public void aggregationWithoutGroupBy() throws IOException { JSONObject result = executeQuery(sql); JSONObject aggregation = getAggregation(result, "message.dayOfWeek@NESTED"); - Assert.assertThat((Double) aggregation.query("/avgDay/value"), closeTo(3.166666666, 0.01)); + Assert.assertThat(((BigDecimal) aggregation.query("/avgDay/value")).doubleValue(), closeTo(3.166666666, 0.01)); } @Test @@ -350,10 +351,10 @@ public void groupByRegularFieldAndSum() throws IOException { Assert.assertNotNull(msgInfoBuckets); Assert.assertThat(msgInfoBuckets.length(), equalTo(2)); Assert.assertThat(msgInfoBuckets.query("/0/key"), equalTo("a")); - Assert.assertThat((Double) msgInfoBuckets.query("/0/message.dayOfWeek@NESTED/sumDay/value"), + Assert.assertThat(((BigDecimal) msgInfoBuckets.query("/0/message.dayOfWeek@NESTED/sumDay/value")).doubleValue(), closeTo(9.0, 0.01)); Assert.assertThat(msgInfoBuckets.query("/1/key"), equalTo("b")); - Assert.assertThat((Double) msgInfoBuckets.query("/1/message.dayOfWeek@NESTED/sumDay/value"), + Assert.assertThat(((BigDecimal) msgInfoBuckets.query("/1/message.dayOfWeek@NESTED/sumDay/value")).doubleValue(), closeTo(10.0, 0.01)); } @@ -593,12 +594,12 @@ public void maxAggOnNestedInnerFieldWithoutWhere() throws IOException { Assert.assertThat(bucket.length(), equalTo(2)); Assert.assertThat(bucket.query("/0/key"), equalTo("Bob Smith")); Assert.assertThat( - bucket.query("/0/projects.started_year@NESTED/projects.started_year@FILTER/max/value"), - equalTo(2015.0)); + ((BigDecimal) bucket.query("/0/projects.started_year@NESTED/projects.started_year@FILTER/max/value")).doubleValue(), + closeTo(2015.0, 0.01)); Assert.assertThat(bucket.query("/1/key"), equalTo("Jane Smith")); Assert.assertThat( - bucket.query("/1/projects.started_year@NESTED/projects.started_year@FILTER/max/value"), - equalTo(2015.0)); + ((BigDecimal) bucket.query("/1/projects.started_year@NESTED/projects.started_year@FILTER/max/value")).doubleValue(), + closeTo(2015.0, 0.01)); } @Test @@ -780,12 +781,12 @@ public void havingMaxAggOnNestedInnerFieldWithoutWhere() throws IOException { Assert.assertThat(bucket.length(), equalTo(2)); Assert.assertThat(bucket.query("/0/key"), equalTo("Bob Smith")); Assert.assertThat( - bucket.query("/0/projects.started_year@NESTED/projects.started_year@FILTER/max_0/value"), - equalTo(2015.0)); + ((BigDecimal) bucket.query("/0/projects.started_year@NESTED/projects.started_year@FILTER/max_0/value")).doubleValue(), + closeTo(2015.0, 0.01)); Assert.assertThat(bucket.query("/1/key"), equalTo("Jane Smith")); Assert.assertThat( - bucket.query("/1/projects.started_year@NESTED/projects.started_year@FILTER/max_0/value"), - equalTo(2015.0)); + ((BigDecimal) bucket.query("/1/projects.started_year@NESTED/projects.started_year@FILTER/max_0/value")).doubleValue(), + closeTo(2015.0, 0.01)); } /*********************************************************** diff --git a/integ-test/src/test/java/org/opensearch/sql/legacy/SQLFunctionsIT.java b/integ-test/src/test/java/org/opensearch/sql/legacy/SQLFunctionsIT.java index 99f3c83cdc..a435787478 100644 --- a/integ-test/src/test/java/org/opensearch/sql/legacy/SQLFunctionsIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/legacy/SQLFunctionsIT.java @@ -501,7 +501,7 @@ public void concat_ws_field_and_string() throws Exception { } /** - * Ignore this test case because painless doesn't whitelist String.split function. + * Ignore this test case because painless doesn't allowlist String.split function. * * @see https://www.elastic.co/guide/en/elasticsearch/painless/7.0/painless-api-reference.html */ @@ -517,7 +517,7 @@ public void whereConditionLeftFunctionRightVariableEqualTest() throws Exception } /** - * Ignore this test case because painless doesn't whitelist String.split function. + * Ignore this test case because painless doesn't allowlist String.split function. * * @see https://www.elastic.co/guide/en/elasticsearch/painless/7.0/painless-api-reference.html */ @@ -810,7 +810,7 @@ public void isnullWithMathExpr() throws IOException { } /** - * Ignore this test case because painless doesn't whitelist String.split function. + * Ignore this test case because painless doesn't allowlist String.split function. * * @see https://www.elastic.co/guide/en/elasticsearch/painless/7.0/painless-api-reference.html */ 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 de73118a54..0d1091d7ec 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 @@ -7,6 +7,7 @@ package org.opensearch.sql.legacy; import static org.hamcrest.Matchers.both; +import static org.hamcrest.Matchers.closeTo; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.core.Is.is; import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_ACCOUNT; @@ -22,6 +23,7 @@ import com.google.common.collect.Ordering; import java.io.IOException; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -345,10 +347,10 @@ public void selectFromSubqueryCountAndSum() throws IOException { TEST_INDEX_ACCOUNT)); assertThat(result.query("/aggregations/count/value"), equalTo(1000)); - assertThat(result.query("/aggregations/balance/value"), equalTo(25714837.0)); + assertThat(((BigDecimal) result.query("/aggregations/balance/value")).doubleValue(), + closeTo(25714837.0, 0.01)); } - @Ignore("Skip to avoid breaking test due to inconsistency in JDBC schema") @Test public void selectFromSubqueryWithoutAliasShouldPass() throws IOException { JSONObject response = executeJdbcRequest( diff --git a/integ-test/src/test/java/org/opensearch/sql/util/MatcherUtils.java b/integ-test/src/test/java/org/opensearch/sql/util/MatcherUtils.java index 8c5be3d761..836f9a1690 100644 --- a/integ-test/src/test/java/org/opensearch/sql/util/MatcherUtils.java +++ b/integ-test/src/test/java/org/opensearch/sql/util/MatcherUtils.java @@ -21,6 +21,7 @@ import com.google.common.base.Strings; import com.google.gson.JsonParser; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -121,7 +122,7 @@ public static Matcher kvString(String key, Matcher matcher) } public static Matcher kvDouble(String key, Matcher matcher) { - return featureValueOf("Json Match", matcher, actual -> (Double) actual.query(key)); + return featureValueOf("Json Match", matcher, actual -> ((BigDecimal) actual.query(key)).doubleValue()); } public static Matcher kvInt(String key, Matcher matcher) { @@ -231,30 +232,7 @@ public void describeTo(Description description) { @Override protected boolean matchesSafely(JSONArray array) { - if (array.length() != expectedObjects.length) { - return false; - } - - for (int i = 0; i < expectedObjects.length; i++) { - Object expected = expectedObjects[i]; - boolean isEqual; - - // Use similar() because JSONObject/JSONArray.equals() only check if same reference - if (expected instanceof JSONObject) { - isEqual = ((JSONObject) expected).similar(array.get(i)); - } else if (expected instanceof JSONArray) { - isEqual = ((JSONArray) expected).similar(array.get(i)); - } else if (null == expected) { - isEqual = JSONObject.NULL == array.get(i); - } else { - isEqual = expected.equals(array.get(i)); - } - - if (!isEqual) { - return false; - } - } - return true; + return array.similar(new JSONArray(expectedObjects)); } }; } diff --git a/legacy/build.gradle b/legacy/build.gradle index 06c694f25d..849e21b694 100644 --- a/legacy/build.gradle +++ b/legacy/build.gradle @@ -89,7 +89,7 @@ dependencies { } } implementation group: 'com.google.guava', name: 'guava', version: '31.0.1-jre' - compile group: 'org.json', name: 'json', version:'20180813' + compile group: 'org.json', name: 'json', version:'20230227' compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.10' compile group: 'org.opensearch', name: 'opensearch', version: "${opensearch_version}" compile project(':sql') diff --git a/legacy/src/main/java/org/opensearch/sql/legacy/expression/model/ExprValueFactory.java b/legacy/src/main/java/org/opensearch/sql/legacy/expression/model/ExprValueFactory.java index bc7cb40c31..5dc2b5b50a 100644 --- a/legacy/src/main/java/org/opensearch/sql/legacy/expression/model/ExprValueFactory.java +++ b/legacy/src/main/java/org/opensearch/sql/legacy/expression/model/ExprValueFactory.java @@ -6,6 +6,7 @@ package org.opensearch.sql.legacy.expression.model; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -61,6 +62,8 @@ public static ExprValue from(Object o) { return booleanValue((Boolean) o); } else if (o instanceof Double) { return doubleValue((Double) o); + } else if (o instanceof BigDecimal) { + return doubleValue(((BigDecimal) o).doubleValue()); } else if (o instanceof String) { return stringValue((String) o); } else { diff --git a/opensearch/build.gradle b/opensearch/build.gradle index e871224004..412f9e5472 100644 --- a/opensearch/build.gradle +++ b/opensearch/build.gradle @@ -35,7 +35,7 @@ dependencies { compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: "${versions.jackson}" compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${versions.jackson_databind}" compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-cbor', version: "${versions.jackson}" - compile group: 'org.json', name: 'json', version:'20180813' + compile group: 'org.json', name: 'json', version:'20230227' compileOnly group: 'org.opensearch.client', name: 'opensearch-rest-high-level-client', version: "${opensearch_version}" compile group: 'org.opensearch', name:'opensearch-ml-client', version: '1.3.4.0-SNAPSHOT' diff --git a/ppl/build.gradle b/ppl/build.gradle index 8b96d302d8..1feb1322ef 100644 --- a/ppl/build.gradle +++ b/ppl/build.gradle @@ -47,7 +47,7 @@ dependencies { compile "org.antlr:antlr4-runtime:4.7.1" compile group: 'com.google.guava', name: 'guava', version: '31.0.1-jre' compile group: 'org.opensearch', name: 'opensearch-x-content', version: "${opensearch_version}" - compile group: 'org.json', name: 'json', version: '20180813' + compile group: 'org.json', name: 'json', version: '20230227' compile group: 'org.springframework', name: 'spring-context', version: "${spring_version}" compile group: 'org.springframework', name: 'spring-beans', version: "${spring_version}" compile group: 'org.apache.logging.log4j', name: 'log4j-core', version:'2.17.1' diff --git a/sql/build.gradle b/sql/build.gradle index 8572be7f3f..6aad866550 100644 --- a/sql/build.gradle +++ b/sql/build.gradle @@ -46,7 +46,7 @@ dependencies { compile "org.antlr:antlr4-runtime:4.7.1" implementation group: 'com.google.guava', name: 'guava', version: '31.0.1-jre' - compile group: 'org.json', name: 'json', version:'20180813' + compile group: 'org.json', name: 'json', version:'20230227' compile group: 'org.springframework', name: 'spring-context', version: "${spring_version}" compile group: 'org.springframework', name: 'spring-beans', version: "${spring_version}" compile project(':common')