|
@@ -14,6 +14,7 @@ import org.elasticsearch.xpack.ql.expression.FieldAttribute;
|
|
|
import org.elasticsearch.xpack.ql.expression.Literal;
|
|
|
import org.elasticsearch.xpack.ql.expression.Nullability;
|
|
|
import org.elasticsearch.xpack.ql.expression.function.aggregate.Count;
|
|
|
+import org.elasticsearch.xpack.ql.expression.function.scalar.string.StartsWith;
|
|
|
import org.elasticsearch.xpack.ql.expression.predicate.BinaryOperator;
|
|
|
import org.elasticsearch.xpack.ql.expression.predicate.Predicates;
|
|
|
import org.elasticsearch.xpack.ql.expression.predicate.Range;
|
|
@@ -1768,7 +1769,90 @@ public class OptimizerRulesTests extends ESTestCase {
|
|
|
// expected
|
|
|
Filter expected = new Filter(EMPTY, new Aggregate(EMPTY, combinedFilter, emptyList(), emptyList()), aggregateCondition);
|
|
|
assertEquals(expected, new PushDownAndCombineFilters().apply(fb));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testIsNotNullOnIsNullField() {
|
|
|
+ EsRelation relation = relation();
|
|
|
+ var fieldA = getFieldAttribute("a");
|
|
|
+ Expression inn = isNotNull(fieldA);
|
|
|
+ Filter f = new Filter(EMPTY, relation, inn);
|
|
|
+
|
|
|
+ assertEquals(f, new OptimizerRules.InferIsNotNull().apply(f));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testIsNotNullOnOperatorWithOneField() {
|
|
|
+ EsRelation relation = relation();
|
|
|
+ var fieldA = getFieldAttribute("a");
|
|
|
+ Expression inn = isNotNull(new Add(EMPTY, fieldA, ONE));
|
|
|
+ Filter f = new Filter(EMPTY, relation, inn);
|
|
|
+ Filter expected = new Filter(EMPTY, relation, new And(EMPTY, isNotNull(fieldA), inn));
|
|
|
+
|
|
|
+ assertEquals(expected, new OptimizerRules.InferIsNotNull().apply(f));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testIsNotNullOnOperatorWithTwoFields() {
|
|
|
+ EsRelation relation = relation();
|
|
|
+ var fieldA = getFieldAttribute("a");
|
|
|
+ var fieldB = getFieldAttribute("b");
|
|
|
+ Expression inn = isNotNull(new Add(EMPTY, fieldA, fieldB));
|
|
|
+ Filter f = new Filter(EMPTY, relation, inn);
|
|
|
+ Filter expected = new Filter(EMPTY, relation, new And(EMPTY, new And(EMPTY, isNotNull(fieldA), isNotNull(fieldB)), inn));
|
|
|
+
|
|
|
+ assertEquals(expected, new OptimizerRules.InferIsNotNull().apply(f));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testIsNotNullOnFunctionWithOneField() {
|
|
|
+ EsRelation relation = relation();
|
|
|
+ var fieldA = getFieldAttribute("a");
|
|
|
+ var pattern = L("abc");
|
|
|
+ Expression inn = isNotNull(
|
|
|
+ new And(EMPTY, new TestStartsWith(EMPTY, fieldA, pattern, false), greaterThanOf(new Add(EMPTY, ONE, TWO), THREE))
|
|
|
+ );
|
|
|
+
|
|
|
+ Filter f = new Filter(EMPTY, relation, inn);
|
|
|
+ Filter expected = new Filter(EMPTY, relation, new And(EMPTY, isNotNull(fieldA), inn));
|
|
|
+
|
|
|
+ assertEquals(expected, new OptimizerRules.InferIsNotNull().apply(f));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testIsNotNullOnFunctionWithTwoFields() {
|
|
|
+ EsRelation relation = relation();
|
|
|
+ var fieldA = getFieldAttribute("a");
|
|
|
+ var fieldB = getFieldAttribute("b");
|
|
|
+ var pattern = L("abc");
|
|
|
+ Expression inn = isNotNull(new TestStartsWith(EMPTY, fieldA, fieldB, false));
|
|
|
+
|
|
|
+ Filter f = new Filter(EMPTY, relation, inn);
|
|
|
+ Filter expected = new Filter(EMPTY, relation, new And(EMPTY, new And(EMPTY, isNotNull(fieldA), isNotNull(fieldB)), inn));
|
|
|
+
|
|
|
+ assertEquals(expected, new OptimizerRules.InferIsNotNull().apply(f));
|
|
|
+ }
|
|
|
+
|
|
|
+ public static class TestStartsWith extends StartsWith {
|
|
|
+
|
|
|
+ public TestStartsWith(Source source, Expression input, Expression pattern, boolean caseInsensitive) {
|
|
|
+ super(source, input, pattern, caseInsensitive);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Expression replaceChildren(List<Expression> newChildren) {
|
|
|
+ return new TestStartsWith(source(), newChildren.get(0), newChildren.get(1), isCaseInsensitive());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected NodeInfo<TestStartsWith> info() {
|
|
|
+ return NodeInfo.create(this, TestStartsWith::new, input(), pattern(), isCaseInsensitive());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testIsNotNullOnFunctionWithTwoField() {}
|
|
|
+
|
|
|
+ private IsNotNull isNotNull(Expression field) {
|
|
|
+ return new IsNotNull(EMPTY, field);
|
|
|
+ }
|
|
|
|
|
|
+ private IsNull isNull(Expression field) {
|
|
|
+ return new IsNull(EMPTY, field);
|
|
|
}
|
|
|
|
|
|
private Literal nullOf(DataType dataType) {
|