Skip to content
This repository has been archived by the owner on Aug 2, 2022. It is now read-only.

Support of nested function calls in new engine #1175

Open
wants to merge 52 commits into
base: develop
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
599a8ab
Support long literals (#2)
FreCap May 6, 2021
8b942a6
Adding support to NOT REGEXP_QUERY, which is currently failing when r…
FreCap May 6, 2021
b021028
Merge branch 'opendistro-for-elasticsearch:develop' into develop
FreCap May 20, 2021
4a5f712
In support (#3)
FreCap May 22, 2021
f6d62d3
Date Autocast for new engine
FreCap Jun 1, 2021
862b9c4
Merge branch 'develop' into date-autocast-new-engine
FreCap Jun 1, 2021
a6e0935
Date Autocast for new engine
FreCap Jun 1, 2021
08f83b6
Merge remote-tracking branch 'freRemote/date-autocast-new-engine' int…
FreCap Jun 1, 2021
4910e2d
Date Autocast for new engine
FreCap Jun 1, 2021
76248c7
Adding field comparison in Legacy Engine
FreCap Jun 7, 2021
3a93478
Adding support for much more permissive date parsing for ExprTimestam…
FreCap Jun 12, 2021
656ea2a
Merge pull request #2 from FreCap/add-support-timestamp-without-t
FreCap Jun 12, 2021
0284f03
Legacy: field comparison, adding support to <> operator (behave as !=)
FreCap Jun 19, 2021
69b82eb
Merge branch 'date-autocast-new-engine' into comparison-datecast
FreCap Jun 30, 2021
19bedb2
Fixing date after merge
FreCap Jul 1, 2021
e0928c4
Revert "In support (#3)"
FreCap Jul 1, 2021
ea83334
Allowing customizing the number of nested results through config
FreCap Jul 8, 2021
6645080
Merge branch 'comparison-datecast' into nestedLimit-comparison-datecast
FreCap Jul 21, 2021
6114478
Improved support of jdbc format for nested fields in SELECT statements
Aug 13, 2021
1a9d1aa
Improved support of jdbc format for nested fields in SELECT statements
Aug 13, 2021
880c258
Now jdbc format takes into account limit (if it exists) when flatteni…
Aug 15, 2021
5072613
Updated some variable names for clarity's sake
Aug 15, 2021
4a70d84
Merge branch 'jdbc-nested' into nestedLimit-comparison-datecast
Aug 15, 2021
501ab9f
Test commit
Aug 15, 2021
7df68e4
Update actions to run on next LTS Ubuntu version
Aug 15, 2021
a17f901
Update actions to run on next LTS Ubuntu version
Aug 15, 2021
b670e86
Merge branch 'nestedLimit-comparison-datecast' into enforceLimit-nest…
Aug 15, 2021
953ad26
Implemented "greatest" and "least" functions in old engine
cip999 Aug 21, 2021
83107e0
Implemented "greatest" and "least" functions in old engine
cip999 Aug 22, 2021
f5ea58b
Merge branch 'jdbc-nested' into greatestLeastFunctions
cip999 Aug 22, 2021
3644545
Merge branch 'greatestFunction-temp' into greatestLeastFunctions
cip999 Aug 22, 2021
89a6567
Added "datetime_format" URL parameter to handle jdbj date and time fo…
Aug 18, 2021
209664b
Added "datetime_format" URL parameter to handle jdbj date and time fo…
Aug 18, 2021
b412e9a
Added "datetime_format" URL parameter to handle jdbj date and time fo…
Aug 18, 2021
fdfec15
Added "datetime_format" URL parameter to handle jdbj date and time fo…
Aug 18, 2021
39380c2
Added "datetime_format" URL parameter to handle jdbc date and time fo…
cip999 Aug 20, 2021
60da9ed
Added "datetime_format" URL parameter to handle jdbc date and time fo…
cip999 Aug 20, 2021
ea616d8
Added "datetime_format" URL parameter to handle jdbc date and time fo…
cip999 Aug 20, 2021
b6b925d
Added "datetime_format" URL parameter to handle jdbc date and time fo…
cip999 Aug 20, 2021
8fb065c
Added "datetime_format" URL parameter to handle jdbc date and time fo…
cip999 Aug 20, 2021
8c99a03
Added "datetime_format" URL parameter to handle jdbc date and time fo…
cip999 Aug 20, 2021
e892bda
Added "datetime_format" URL parameter to handle jdbc date and time fo…
cip999 Aug 20, 2021
ccbbe49
Massive refactoring of modules handling SQL functions to allow for ne…
cip999 Aug 24, 2021
92ca579
Merge branch 'SQLFunctionsEncapsulation-temp' into SQLFunctionsEncaps…
cip999 Aug 24, 2021
9f91648
Massive refactoring of modules handling SQL functions to allow for ne…
cip999 Aug 24, 2021
76a357f
Merge branch 'SQLFunctionsEncapsulation-temp' into SQLFunctionsEncaps…
cip999 Aug 24, 2021
27450a7
Massive refactoring of modules handling SQL functions to allow for ne…
cip999 Aug 25, 2021
86a7e3e
Merge branch 'SQLFunctionsEncapsulation-temp' into SQLFunctionsEncaps…
cip999 Aug 25, 2021
3d10353
Massive refactoring of modules handling SQL functions to allow for ne…
cip999 Aug 25, 2021
c406750
Merge branch 'SQLFunctionsEncapsulation-temp' into SQLFunctionsEncaps…
cip999 Aug 25, 2021
6b7ef8b
Fixed bug in SQL comparison functions implementation
cip999 Aug 26, 2021
e6bc19e
Merge branch 'SQLFunctionsEncapsulation-temp' into SQLFunctionsEncaps…
cip999 Aug 26, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Revert "In support (#3)"
This reverts commit 4a5f712
FreCap committed Jul 1, 2021
commit e0928c464922a1191719c0c8282c96f05939e048
Original file line number Diff line number Diff line change
@@ -161,10 +161,6 @@ public static Literal timestampLiteral(String value) {
return literal(value, DataType.TIMESTAMP);
}

public static <T> Literal arrayLiteral(List<T> value) {
return literal(value, DataType.ARRAY);
}

public static Literal doubleLiteral(Double value) {
return literal(value, DataType.DOUBLE);
}
Original file line number Diff line number Diff line change
@@ -37,7 +37,6 @@ public enum DataType {
DATE(ExprCoreType.DATE),
TIME(ExprCoreType.TIME),
TIMESTAMP(ExprCoreType.TIMESTAMP),
ARRAY(ExprCoreType.ARRAY),
INTERVAL(ExprCoreType.INTERVAL);

@Getter
Original file line number Diff line number Diff line change
@@ -28,10 +28,7 @@
* Params include the field expression and/or wildcard field expression,
* nested field expression (@field).
* And the values that the field is mapped to (@valueList).
*
* @deprecated use function ("in") instead
*/
@Deprecated
@Getter
@ToString
@EqualsAndHashCode(callSuper = false)
Original file line number Diff line number Diff line change
@@ -88,7 +88,7 @@ public static ExprValue tupleValue(Map<String, Object> map) {
/**
* {@link ExprCollectionValue} constructor.
*/
public static <T> ExprValue collectionValue(List<T> list) {
public static ExprValue collectionValue(List<Object> list) {
List<ExprValue> valueList = new ArrayList<>();
list.forEach(o -> valueList.add(fromObjectValue(o)));
return new ExprCollectionValue(valueList);
@@ -129,10 +129,6 @@ public static ExprValue fromObjectValue(Object o) {
return stringValue((String) o);
} else if (o instanceof Float) {
return floatValue((Float) o);
} else if (o instanceof ExprValue) {
// since there is no primitive in Java for differentiating TIMESTAMP DATETIME and DATE
// we can allow passing a ExprValue that already contains this information
return (ExprValue) o;
} else {
throw new ExpressionEvaluationException("unsupported object " + o.getClass());
}
Original file line number Diff line number Diff line change
@@ -26,10 +26,8 @@
import com.amazon.opendistroforelasticsearch.sql.expression.function.BuiltinFunctionName;
import com.amazon.opendistroforelasticsearch.sql.expression.function.BuiltinFunctionRepository;
import com.amazon.opendistroforelasticsearch.sql.expression.window.ranking.RankingWindowFunction;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@@ -254,7 +252,7 @@ public FunctionExpression subtract(Expression... expressions) {
public FunctionExpression multiply(Expression... expressions) {
return function(BuiltinFunctionName.MULTIPLY, expressions);
}

public FunctionExpression adddate(Expression... expressions) {
return function(BuiltinFunctionName.ADDDATE, expressions);
}
@@ -366,7 +364,7 @@ public FunctionExpression module(Expression... expressions) {
public FunctionExpression substr(Expression... expressions) {
return function(BuiltinFunctionName.SUBSTR, expressions);
}

public FunctionExpression substring(Expression... expressions) {
return function(BuiltinFunctionName.SUBSTR, expressions);
}
@@ -590,19 +588,4 @@ public FunctionExpression castTimestamp(Expression value) {
return (FunctionExpression) repository
.compile(BuiltinFunctionName.CAST_TO_TIMESTAMP.getName(), Arrays.asList(value));
}

/**
* Check that a field is contained in a set of values.
*/
public FunctionExpression in(Expression field, Expression... expressions) {
List<Expression> where = new ArrayList<>();
where.add(field);
where.addAll(Arrays.asList(expressions));

return function(BuiltinFunctionName.IN, where.toArray(new Expression[0]));
}

public FunctionExpression not_in(Expression field, Expression... expressions) {
return not(in(field, expressions));
}
}
Original file line number Diff line number Diff line change
@@ -106,7 +106,6 @@ public enum BuiltinFunctionName {
GTE(FunctionName.of(">=")),
LIKE(FunctionName.of("like")),
NOT_LIKE(FunctionName.of("not like")),
IN(FunctionName.of("in")),

/**
* Aggregation Function.
Original file line number Diff line number Diff line change
@@ -19,16 +19,9 @@
import static com.amazon.opendistroforelasticsearch.sql.data.model.ExprValueUtils.LITERAL_MISSING;
import static com.amazon.opendistroforelasticsearch.sql.data.model.ExprValueUtils.LITERAL_NULL;
import static com.amazon.opendistroforelasticsearch.sql.data.model.ExprValueUtils.LITERAL_TRUE;
import static com.amazon.opendistroforelasticsearch.sql.data.type.ExprCoreType.ARRAY;
import static com.amazon.opendistroforelasticsearch.sql.data.type.ExprCoreType.BOOLEAN;
import static com.amazon.opendistroforelasticsearch.sql.data.type.ExprCoreType.DATE;
import static com.amazon.opendistroforelasticsearch.sql.data.type.ExprCoreType.DATETIME;
import static com.amazon.opendistroforelasticsearch.sql.data.type.ExprCoreType.DOUBLE;
import static com.amazon.opendistroforelasticsearch.sql.data.type.ExprCoreType.FLOAT;
import static com.amazon.opendistroforelasticsearch.sql.data.type.ExprCoreType.INTEGER;
import static com.amazon.opendistroforelasticsearch.sql.data.type.ExprCoreType.LONG;
import static com.amazon.opendistroforelasticsearch.sql.data.type.ExprCoreType.STRING;
import static com.amazon.opendistroforelasticsearch.sql.data.type.ExprCoreType.TIMESTAMP;

import com.amazon.opendistroforelasticsearch.sql.data.model.ExprBooleanValue;
import com.amazon.opendistroforelasticsearch.sql.data.model.ExprValue;
@@ -80,7 +73,6 @@ public static void register(BuiltinFunctionRepository repository) {
repository.register(like());
repository.register(notLike());
repository.register(regexp());
repository.register(in());
}

/**
@@ -271,26 +263,6 @@ private static FunctionResolver notLike() {
STRING));
}

private static FunctionResolver in() {
return FunctionDSL.define(BuiltinFunctionName.IN.getName(),
FunctionDSL.impl(FunctionDSL.nullMissingHandling(OperatorUtils::in),
BOOLEAN, INTEGER, ARRAY),
FunctionDSL.impl(FunctionDSL.nullMissingHandling(OperatorUtils::in),
BOOLEAN, STRING, ARRAY),
FunctionDSL.impl(FunctionDSL.nullMissingHandling(OperatorUtils::in),
BOOLEAN, LONG, ARRAY),
FunctionDSL.impl(FunctionDSL.nullMissingHandling(OperatorUtils::in),
BOOLEAN, FLOAT, ARRAY),
FunctionDSL.impl(FunctionDSL.nullMissingHandling(OperatorUtils::in),
BOOLEAN, DOUBLE, ARRAY),
FunctionDSL.impl(FunctionDSL.nullMissingHandling(OperatorUtils::in),
BOOLEAN, DATE, ARRAY),
FunctionDSL.impl(FunctionDSL.nullMissingHandling(OperatorUtils::in),
BOOLEAN, DATETIME, ARRAY),
FunctionDSL.impl(FunctionDSL.nullMissingHandling(OperatorUtils::in),
BOOLEAN, TIMESTAMP, ARRAY));
}

private static ExprValue lookupTableFunction(ExprValue arg1, ExprValue arg2,
Table<ExprValue, ExprValue, ExprValue> table) {
if (table.contains(arg1, arg2)) {
Original file line number Diff line number Diff line change
@@ -15,10 +15,8 @@

package com.amazon.opendistroforelasticsearch.sql.utils;

import com.amazon.opendistroforelasticsearch.sql.data.model.AbstractExprNumberValue;
import com.amazon.opendistroforelasticsearch.sql.data.model.ExprBooleanValue;
import com.amazon.opendistroforelasticsearch.sql.data.model.ExprIntegerValue;
import com.amazon.opendistroforelasticsearch.sql.data.model.ExprStringValue;
import com.amazon.opendistroforelasticsearch.sql.data.model.ExprValue;
import java.util.regex.Pattern;
import lombok.experimental.UtilityClass;
@@ -101,24 +99,4 @@ private static String patternToRegex(String patternString) {
regex.append('$');
return regex.toString();
}


/**
* IN (..., ...) operator util.
* Expression { expr IN (collection of values..) } is to judge
* if expr is contained in a given collection.
*/
public static ExprBooleanValue in(ExprValue expr, ExprValue setOfValues) {
return ExprBooleanValue.of(isIn(expr, setOfValues));
}

private static boolean isIn(ExprValue expr, ExprValue setOfValues) {
if (expr instanceof AbstractExprNumberValue) {
return setOfValues.collectionValue().contains(expr.value());
} else if (expr instanceof ExprStringValue) {
return setOfValues.collectionValue().contains(expr.stringValue());
} else {
return setOfValues.collectionValue().contains(expr);
}
}
}
Original file line number Diff line number Diff line change
@@ -215,24 +215,13 @@ public void invalidConvertExprValue(ExprValue value, Function<ExprValue, Object>
assertThat(exception.getMessage(), Matchers.containsString("invalid"));
}

// disabling test because in case of expr collections, we could pass ExprValues
// @Test
// public void unSupportedObject() {
// Exception exception = assertThrows(ExpressionEvaluationException.class,
// () -> ExprValueUtils.fromObjectValue(integerValue(1)));
// assertEquals(
// "unsupported object "
// + "class com.amazon.opendistroforelasticsearch.sql.data.model.ExprIntegerValue",
// exception.getMessage());
// }

@Test
public void unSupportedObject() {
Exception exception = assertThrows(ExpressionEvaluationException.class,
() -> ExprValueUtils.fromObjectValue(new Object()));
() -> ExprValueUtils.fromObjectValue(integerValue(1)));
assertEquals(
"unsupported object "
+ "class java.lang.Object",
+ "class com.amazon.opendistroforelasticsearch.sql.data.model.ExprIntegerValue",
exception.getMessage());
}

Original file line number Diff line number Diff line change
@@ -27,17 +27,14 @@
import static com.amazon.opendistroforelasticsearch.sql.data.model.ExprValueUtils.LITERAL_TRUE;
import static com.amazon.opendistroforelasticsearch.sql.data.model.ExprValueUtils.booleanValue;
import static com.amazon.opendistroforelasticsearch.sql.data.model.ExprValueUtils.fromObjectValue;
import static com.amazon.opendistroforelasticsearch.sql.data.model.ExprValueUtils.missingValue;
import static com.amazon.opendistroforelasticsearch.sql.data.type.ExprCoreType.BOOLEAN;
import static com.amazon.opendistroforelasticsearch.sql.data.type.ExprCoreType.DATE;
import static com.amazon.opendistroforelasticsearch.sql.data.type.ExprCoreType.DATETIME;
import static com.amazon.opendistroforelasticsearch.sql.data.type.ExprCoreType.INTEGER;
import static com.amazon.opendistroforelasticsearch.sql.data.type.ExprCoreType.STRING;
import static com.amazon.opendistroforelasticsearch.sql.data.type.ExprCoreType.TIMESTAMP;
import static com.amazon.opendistroforelasticsearch.sql.utils.ComparisonUtil.compare;
import static com.amazon.opendistroforelasticsearch.sql.utils.OperatorUtils.matches;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

import com.amazon.opendistroforelasticsearch.sql.data.model.ExprBooleanValue;
@@ -56,15 +53,14 @@
import com.amazon.opendistroforelasticsearch.sql.data.model.ExprTupleValue;
import com.amazon.opendistroforelasticsearch.sql.data.model.ExprValue;
import com.amazon.opendistroforelasticsearch.sql.data.model.ExprValueUtils;
import com.amazon.opendistroforelasticsearch.sql.exception.ExpressionEvaluationException;
import com.amazon.opendistroforelasticsearch.sql.expression.DSL;
import com.amazon.opendistroforelasticsearch.sql.expression.Expression;
import com.amazon.opendistroforelasticsearch.sql.expression.ExpressionTestBase;
import com.amazon.opendistroforelasticsearch.sql.expression.FunctionExpression;
import com.amazon.opendistroforelasticsearch.sql.utils.OperatorUtils;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.sun.org.apache.xpath.internal.Arg;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
@@ -868,66 +864,4 @@ public void compare_int_long() {
FunctionExpression equal = dsl.equal(DSL.literal(1), DSL.literal(1L));
assertTrue(equal.valueOf(valueEnv()).booleanValue());
}

private static Stream<Arguments> testInArguments() {
List<List> arguments =
Arrays.asList(Arrays.asList(1, Arrays.asList(0, 2, 1, 3)),
Arrays.asList(1, Arrays.asList(2, 0)), Arrays.asList(1L, Arrays.asList(1L, 2L, 3L)),
Arrays.asList(2L, Arrays.asList(1L, 2L)), Arrays.asList(3F, Arrays.asList(1F, 2F)),
Arrays.asList(0F, Arrays.asList(1F, 2F)), Arrays.asList(1D, Arrays.asList(1D, 1D)),
Arrays.asList(1D, Arrays.asList(2D, 2D)),
Arrays.asList("b", Arrays.asList("a", "c")),
Arrays.asList("b", Arrays.asList("c", "a")),
Arrays.asList("a", Arrays.asList("a", "b")),
Arrays.asList("b", Arrays.asList("a", "b")),
Arrays.asList("c", Arrays.asList("a", "b")),
Arrays.asList("a", Arrays.asList("b", "c")),
Arrays.asList("a", Arrays.asList("a", "a")),
Arrays.asList("b", Arrays.asList("a", "a")));

Stream.Builder<Arguments> builder = Stream.builder();
for (List<Object> argGroup : arguments) {
builder.add(Arguments.of(fromObjectValue(argGroup.get(0)), fromObjectValue(argGroup.get(1))));
}
builder
.add(Arguments.of(fromObjectValue("2021-01-02", DATE),
fromObjectValue(Arrays.asList(fromObjectValue("2021-01-01", DATE),
fromObjectValue("2021-01-03", DATE)))))
.add(Arguments.of(fromObjectValue("2021-01-02", DATE),
fromObjectValue(Arrays.asList(fromObjectValue("2021-01-01", DATE),
fromObjectValue("2021-01-03", DATE)))))
.add(Arguments.of(fromObjectValue("2021-01-01 03:00:00", DATETIME),
fromObjectValue(Arrays.asList(fromObjectValue("2021-01-01 01:00:00", DATETIME),
fromObjectValue("3021-01-01 02:00:00", DATETIME)))))
.add(Arguments.of(fromObjectValue("2021-01-01 01:00:00", TIMESTAMP),
fromObjectValue(Arrays.asList(fromObjectValue("2021-01-01 01:00:00", TIMESTAMP),
fromObjectValue("3021-01-01 01:00:00", TIMESTAMP)))));
return builder.build();
}

@ParameterizedTest(name = "in({0}, ({1}))")
@MethodSource("testInArguments")
public void in(ExprValue field, ExprValue arrayOfArgs) {
FunctionExpression in = dsl.in(
DSL.literal(field), DSL.literal(arrayOfArgs));
assertEquals(BOOLEAN, in.type());
assertEquals(OperatorUtils.in(field, arrayOfArgs), in.valueOf(valueEnv()));
}

@ParameterizedTest(name = "not in({0}, ({1}))")
@MethodSource("testInArguments")
public void not_in(ExprValue field, ExprValue arrayOfArgs) {
FunctionExpression notIn = dsl.not_in(
DSL.literal(field), DSL.literal(arrayOfArgs));
assertEquals(BOOLEAN, notIn.type());
assertEquals(!OperatorUtils.in(field, arrayOfArgs).booleanValue(),
notIn.valueOf(valueEnv()).booleanValue());
}

@Test
public void in_not_an_array() {
assertThrows(ExpressionEvaluationException.class, () ->
dsl.in(DSL.literal(1), DSL.literal("1")));
}

}
Original file line number Diff line number Diff line change
@@ -24,7 +24,6 @@
import com.amazon.opendistroforelasticsearch.sql.elasticsearch.storage.script.filter.lucene.RangeQuery;
import com.amazon.opendistroforelasticsearch.sql.elasticsearch.storage.script.filter.lucene.RangeQuery.Comparison;
import com.amazon.opendistroforelasticsearch.sql.elasticsearch.storage.script.filter.lucene.TermQuery;
import com.amazon.opendistroforelasticsearch.sql.elasticsearch.storage.script.filter.lucene.TermsQuery;
import com.amazon.opendistroforelasticsearch.sql.elasticsearch.storage.script.filter.lucene.WildcardQuery;
import com.amazon.opendistroforelasticsearch.sql.elasticsearch.storage.serialization.ExpressionSerializer;
import com.amazon.opendistroforelasticsearch.sql.expression.Expression;
@@ -64,7 +63,6 @@ public class FilterQueryBuilder extends ExpressionNodeVisitor<QueryBuilder, Obje
.put(BuiltinFunctionName.LTE.getName(), new RangeQuery(Comparison.LTE))
.put(BuiltinFunctionName.GTE.getName(), new RangeQuery(Comparison.GTE))
.put(BuiltinFunctionName.LIKE.getName(), new WildcardQuery())
.put(BuiltinFunctionName.IN.getName(), new TermsQuery())
.build();

/**

This file was deleted.

Original file line number Diff line number Diff line change
@@ -16,7 +16,6 @@

package com.amazon.opendistroforelasticsearch.sql.elasticsearch.storage.script.filter;

import static com.amazon.opendistroforelasticsearch.sql.data.model.ExprValueUtils.fromObjectValue;
import static com.amazon.opendistroforelasticsearch.sql.data.type.ExprCoreType.DATE;
import static com.amazon.opendistroforelasticsearch.sql.data.type.ExprCoreType.DATETIME;
import static com.amazon.opendistroforelasticsearch.sql.data.type.ExprCoreType.INTEGER;
@@ -149,43 +148,6 @@ void shouldBuildRangeQueryForDateComparisonExpressionAutocast(ExprType exprType,
buildQuery(expr)));
}

@Test
void should_build_terms_query_for_in_operator() {
assertJsonEquals(
"{\n"
+ " \"terms\" : {\n"
+ " \"age\" : [\n"
+ " 30,\n"
+ " 19\n"
+ " ],\n"
+ " \"boost\" : 1.0\n"
+ " }\n"
+ "}",
buildQuery(dsl.in(ref("age", INTEGER),
literal(fromObjectValue(Arrays.asList(30, 19))))));

assertJsonEquals(
"{\n"
+ " \"bool\" : {\n"
+ " \"must_not\" : [\n"
+ " {\n"
+ " \"terms\" : {\n"
+ " \"age\" : [\n"
+ " 30,\n"
+ " 19\n"
+ " ],\n"
+ " \"boost\" : 1.0\n"
+ " }\n"
+ " }\n"
+ " ],\n"
+ " \"adjust_pure_negative\" : true,\n"
+ " \"boost\" : 1.0\n"
+ " }\n"
+ "}",
buildQuery(dsl.not_in(ref("age", INTEGER),
literal(fromObjectValue(Arrays.asList(30,19))))));
}

@Test
void should_build_wildcard_query_for_like_expression() {
assertJsonEquals(
Original file line number Diff line number Diff line change
@@ -395,9 +395,6 @@ public void aggAfterTermsGroupBy() throws Exception {

@Test
public void aggAfterTwoTermsGroupBy() throws Exception {
// disabling test for new engine because COUNT returns int in new engine,
// and float in the old engine
Assume.assumeFalse(isNewQueryEngineEabled());
String query = String.format(Locale.ROOT,
"SELECT COUNT(*) FROM %s where age in (35,36) GROUP BY gender,age",
TEST_INDEX_ACCOUNT);
@@ -417,9 +414,6 @@ public void aggAfterTwoTermsGroupBy() throws Exception {

@Test
public void multipleAggAfterTwoTermsGroupBy() throws Exception {
// disabling test for new engine because COUNT returns int in new engine,
// and float in the old engine
Assume.assumeFalse(isNewQueryEngineEabled());
String query = String.format(Locale.ROOT,
"SELECT COUNT(*) , sum(balance) FROM %s where age in (35,36) GROUP BY gender,age",
TEST_INDEX_ACCOUNT);

This file was deleted.

9 changes: 0 additions & 9 deletions sql/src/main/antlr/OpenDistroSQLParser.g4
Original file line number Diff line number Diff line change
@@ -260,7 +260,6 @@ predicate
| predicate IS nullNotnull #isNullPredicate
| left=predicate NOT? LIKE right=predicate #likePredicate
| left=predicate REGEXP right=predicate #regexpPredicate
| predicate NOT? IN LR_BRACKET arrayArgs? RR_BRACKET #inPredicate
;

expressionAtom
@@ -371,11 +370,3 @@ functionArg
: expression
;

arrayArgs
: arrayArg (COMMA arrayArg)*
;

arrayArg
: expression
;

Original file line number Diff line number Diff line change
@@ -18,11 +18,9 @@

import static com.amazon.opendistroforelasticsearch.sql.ast.dsl.AstDSL.qualifiedName;
import static com.amazon.opendistroforelasticsearch.sql.ast.dsl.AstDSL.stringLiteral;
import static com.amazon.opendistroforelasticsearch.sql.expression.function.BuiltinFunctionName.IN;
import static com.amazon.opendistroforelasticsearch.sql.expression.function.BuiltinFunctionName.IS_NOT_NULL;
import static com.amazon.opendistroforelasticsearch.sql.expression.function.BuiltinFunctionName.IS_NULL;
import static com.amazon.opendistroforelasticsearch.sql.expression.function.BuiltinFunctionName.LIKE;
import static com.amazon.opendistroforelasticsearch.sql.expression.function.BuiltinFunctionName.NOT;
import static com.amazon.opendistroforelasticsearch.sql.expression.function.BuiltinFunctionName.NOT_LIKE;
import static com.amazon.opendistroforelasticsearch.sql.expression.function.BuiltinFunctionName.REGEXP;
import static com.amazon.opendistroforelasticsearch.sql.sql.antlr.parser.OpenDistroSQLParser.BinaryComparisonPredicateContext;
@@ -63,10 +61,8 @@
import com.amazon.opendistroforelasticsearch.sql.ast.expression.Case;
import com.amazon.opendistroforelasticsearch.sql.ast.expression.Cast;
import com.amazon.opendistroforelasticsearch.sql.ast.expression.Function;
import com.amazon.opendistroforelasticsearch.sql.ast.expression.In;
import com.amazon.opendistroforelasticsearch.sql.ast.expression.Interval;
import com.amazon.opendistroforelasticsearch.sql.ast.expression.IntervalUnit;
import com.amazon.opendistroforelasticsearch.sql.ast.expression.Literal;
import com.amazon.opendistroforelasticsearch.sql.ast.expression.Not;
import com.amazon.opendistroforelasticsearch.sql.ast.expression.Or;
import com.amazon.opendistroforelasticsearch.sql.ast.expression.QualifiedName;
@@ -237,19 +233,6 @@ public UnresolvedExpression visitRegexpPredicate(RegexpPredicateContext ctx) {
Arrays.asList(visit(ctx.left), visit(ctx.right)));
}

@Override
public UnresolvedExpression visitInPredicate(OpenDistroSQLParser.InPredicateContext ctx) {
UnresolvedExpression between = new Function(IN.getName().getFunctionName(),
Arrays.asList(visit(ctx.predicate()), AstDSL.arrayLiteral(ctx.arrayArgs().arrayArg()
.stream()
.map(this::visitArrayArg)
.map(unresolvedExpression -> ((Literal) unresolvedExpression).getValue())
.collect(Collectors.toList()))));

return ctx.NOT() == null ? between :
new Function(NOT.getName().getFunctionName(), Collections.singletonList(between));
}

@Override
public UnresolvedExpression visitAndExpression(AndExpressionContext ctx) {
return new And(visit(ctx.left), visit(ctx.right));
Original file line number Diff line number Diff line change
@@ -131,13 +131,6 @@ public void canParseCaseStatement() {
assertNotNull(parser.parse("SELECT CASE age WHEN 30 THEN 'age1' END FROM test"));
}

@Test
public void canParseInStatement() {
assertNotNull(parser.parse("SELECT age FROM test WHERE age IN (1,30)"));
assertNotNull(parser.parse("SELECT age FROM test WHERE age NOT IN (1,30)"));
assertNotNull(parser.parse("SELECT age FROM test WHERE NOT (age IN (1,30))"));
}

@Test
public void canNotParseAggregateFunctionWithWrongArgument() {
assertThrows(SyntaxCheckException.class, () -> parser.parse("SELECT SUM() FROM test"));
Original file line number Diff line number Diff line change
@@ -18,13 +18,11 @@

import static com.amazon.opendistroforelasticsearch.sql.ast.dsl.AstDSL.aggregate;
import static com.amazon.opendistroforelasticsearch.sql.ast.dsl.AstDSL.and;
import static com.amazon.opendistroforelasticsearch.sql.ast.dsl.AstDSL.arrayLiteral;
import static com.amazon.opendistroforelasticsearch.sql.ast.dsl.AstDSL.booleanLiteral;
import static com.amazon.opendistroforelasticsearch.sql.ast.dsl.AstDSL.caseWhen;
import static com.amazon.opendistroforelasticsearch.sql.ast.dsl.AstDSL.dateLiteral;
import static com.amazon.opendistroforelasticsearch.sql.ast.dsl.AstDSL.doubleLiteral;
import static com.amazon.opendistroforelasticsearch.sql.ast.dsl.AstDSL.function;
import static com.amazon.opendistroforelasticsearch.sql.ast.dsl.AstDSL.in;
import static com.amazon.opendistroforelasticsearch.sql.ast.dsl.AstDSL.intLiteral;
import static com.amazon.opendistroforelasticsearch.sql.ast.dsl.AstDSL.intervalLiteral;
import static com.amazon.opendistroforelasticsearch.sql.ast.dsl.AstDSL.longLiteral;
@@ -51,7 +49,6 @@
import com.amazon.opendistroforelasticsearch.sql.sql.antlr.parser.OpenDistroSQLLexer;
import com.amazon.opendistroforelasticsearch.sql.sql.antlr.parser.OpenDistroSQLParser;
import com.google.common.collect.ImmutableList;
import java.util.Arrays;
import org.antlr.v4.runtime.CommonTokenStream;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.junit.jupiter.api.Test;
@@ -286,20 +283,6 @@ public void canBuildLogicalExpression() {
);
}

@Test
public void canBuildInPredicate() {
assertEquals(function("in", intLiteral(1), arrayLiteral(Arrays.asList(0,2,3,4))),
buildExprAst("1 in (0,2,3,4)"));
}

@Test
public void canBuildNotInPredicate() {
assertEquals(
function("not",
function("in", intLiteral(1),arrayLiteral(Arrays.asList(0,2,3,4)))),
buildExprAst("1 not in (0,2,3,4)"));
}

@Test
public void canBuildWindowFunction() {
assertEquals(