|
|
@@ -38,7 +38,25 @@ import org.elasticsearch.xpack.ql.expression.predicate.regex.Like;
|
|
|
import org.elasticsearch.xpack.ql.expression.predicate.regex.LikePattern;
|
|
|
import org.elasticsearch.xpack.ql.expression.predicate.regex.RLike;
|
|
|
import org.elasticsearch.xpack.ql.expression.predicate.regex.RegexMatch;
|
|
|
+import org.elasticsearch.xpack.ql.querydsl.query.BoolQuery;
|
|
|
+import org.elasticsearch.xpack.ql.querydsl.query.ExistsQuery;
|
|
|
+import org.elasticsearch.xpack.ql.querydsl.query.GeoDistanceQuery;
|
|
|
+import org.elasticsearch.xpack.ql.querydsl.query.MatchQuery;
|
|
|
+import org.elasticsearch.xpack.ql.querydsl.query.MultiMatchQuery;
|
|
|
+import org.elasticsearch.xpack.ql.querydsl.query.NestedQuery;
|
|
|
+import org.elasticsearch.xpack.ql.querydsl.query.NotQuery;
|
|
|
+import org.elasticsearch.xpack.ql.querydsl.query.Query;
|
|
|
+import org.elasticsearch.xpack.ql.querydsl.query.QueryStringQuery;
|
|
|
+import org.elasticsearch.xpack.ql.querydsl.query.RangeQuery;
|
|
|
+import org.elasticsearch.xpack.ql.querydsl.query.RegexQuery;
|
|
|
+import org.elasticsearch.xpack.ql.querydsl.query.ScriptQuery;
|
|
|
+import org.elasticsearch.xpack.ql.querydsl.query.TermQuery;
|
|
|
+import org.elasticsearch.xpack.ql.querydsl.query.TermsQuery;
|
|
|
+import org.elasticsearch.xpack.ql.querydsl.query.WildcardQuery;
|
|
|
import org.elasticsearch.xpack.ql.tree.Source;
|
|
|
+import org.elasticsearch.xpack.ql.type.DataType;
|
|
|
+import org.elasticsearch.xpack.ql.type.DataTypes;
|
|
|
+import org.elasticsearch.xpack.ql.util.CollectionUtils;
|
|
|
import org.elasticsearch.xpack.ql.util.Holder;
|
|
|
import org.elasticsearch.xpack.ql.util.ReflectionUtils;
|
|
|
import org.elasticsearch.xpack.sql.SqlIllegalArgumentException;
|
|
|
@@ -79,28 +97,16 @@ import org.elasticsearch.xpack.sql.querydsl.agg.PercentilesAgg;
|
|
|
import org.elasticsearch.xpack.sql.querydsl.agg.StatsAgg;
|
|
|
import org.elasticsearch.xpack.sql.querydsl.agg.SumAgg;
|
|
|
import org.elasticsearch.xpack.sql.querydsl.agg.TopHitsAgg;
|
|
|
-import org.elasticsearch.xpack.sql.querydsl.query.BoolQuery;
|
|
|
-import org.elasticsearch.xpack.sql.querydsl.query.ExistsQuery;
|
|
|
-import org.elasticsearch.xpack.sql.querydsl.query.GeoDistanceQuery;
|
|
|
-import org.elasticsearch.xpack.sql.querydsl.query.MatchQuery;
|
|
|
-import org.elasticsearch.xpack.sql.querydsl.query.MultiMatchQuery;
|
|
|
-import org.elasticsearch.xpack.sql.querydsl.query.NestedQuery;
|
|
|
-import org.elasticsearch.xpack.sql.querydsl.query.NotQuery;
|
|
|
-import org.elasticsearch.xpack.sql.querydsl.query.Query;
|
|
|
-import org.elasticsearch.xpack.sql.querydsl.query.QueryStringQuery;
|
|
|
-import org.elasticsearch.xpack.sql.querydsl.query.RangeQuery;
|
|
|
-import org.elasticsearch.xpack.sql.querydsl.query.RegexQuery;
|
|
|
-import org.elasticsearch.xpack.sql.querydsl.query.ScriptQuery;
|
|
|
-import org.elasticsearch.xpack.sql.querydsl.query.TermQuery;
|
|
|
-import org.elasticsearch.xpack.sql.querydsl.query.TermsQuery;
|
|
|
-import org.elasticsearch.xpack.sql.querydsl.query.WildcardQuery;
|
|
|
+import org.elasticsearch.xpack.sql.type.SqlDataTypeConverter;
|
|
|
import org.elasticsearch.xpack.sql.util.Check;
|
|
|
|
|
|
import java.time.OffsetTime;
|
|
|
import java.time.ZonedDateTime;
|
|
|
import java.time.temporal.TemporalAccessor;
|
|
|
import java.util.Arrays;
|
|
|
+import java.util.LinkedHashSet;
|
|
|
import java.util.List;
|
|
|
+import java.util.Set;
|
|
|
import java.util.function.Supplier;
|
|
|
|
|
|
import static java.util.Collections.singletonList;
|
|
|
@@ -584,9 +590,17 @@ final class QueryTranslator {
|
|
|
else {
|
|
|
Query q = null;
|
|
|
if (in.value() instanceof FieldAttribute) {
|
|
|
- FieldAttribute fa = (FieldAttribute) in.value();
|
|
|
// equality should always be against an exact match (which is important for strings)
|
|
|
- q = new TermsQuery(in.source(), fa.exactAttribute().name(), in.list());
|
|
|
+ FieldAttribute fa = (FieldAttribute) in.value();
|
|
|
+ List<Expression> list = in.list();
|
|
|
+ // TODO: this needs to be handled inside the optimizer
|
|
|
+ list.removeIf(e -> DataTypes.isNull(e.dataType()));
|
|
|
+ DataType dt = list.get(0).dataType();
|
|
|
+ Set<Object> set = new LinkedHashSet<>(CollectionUtils.mapSize(list.size()));
|
|
|
+ for (Expression e : list) {
|
|
|
+ set.add(SqlDataTypeConverter.convert(e.fold(), dt));
|
|
|
+ }
|
|
|
+ q = new TermsQuery(in.source(), fa.exactAttribute().name(), set);
|
|
|
} else {
|
|
|
q = new ScriptQuery(in.source(), in.asScript());
|
|
|
}
|