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

[PPL] Support expression and boolean operators #518

Merged
merged 17 commits into from Jun 26, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -23,9 +23,11 @@
import com.amazon.opendistroforelasticsearch.sql.ast.expression.Field;
import com.amazon.opendistroforelasticsearch.sql.ast.expression.Function;
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.UnresolvedAttribute;
import com.amazon.opendistroforelasticsearch.sql.ast.expression.UnresolvedExpression;
import com.amazon.opendistroforelasticsearch.sql.ast.expression.Xor;
import com.amazon.opendistroforelasticsearch.sql.data.model.ExprValueUtils;
import com.amazon.opendistroforelasticsearch.sql.exception.SemanticCheckException;
import com.amazon.opendistroforelasticsearch.sql.expression.DSL;
Expand Down Expand Up @@ -96,6 +98,19 @@ public Expression visitOr(Or node, AnalysisContext context) {
return dsl.or(context.peek(), left, right);
}

@Override
public Expression visitXor(Xor node, AnalysisContext context) {
Expression left = node.getLeft().accept(this, context);
Expression right = node.getRight().accept(this, context);

return dsl.xor(context.peek(), left, right);
}

@Override
public Expression visitNot(Not node, AnalysisContext context) {
return dsl.not(context.peek(), node.getExpression().accept(this, context));
}

@Override
public Expression visitAggregateFunction(AggregateFunction node, AnalysisContext context) {
Optional<BuiltinFunctionName> builtinFunctionName = BuiltinFunctionName.of(node.getFuncName());
Expand Down
Expand Up @@ -31,6 +31,7 @@
import com.amazon.opendistroforelasticsearch.sql.ast.expression.Or;
import com.amazon.opendistroforelasticsearch.sql.ast.expression.QualifiedName;
import com.amazon.opendistroforelasticsearch.sql.ast.expression.UnresolvedAttribute;
import com.amazon.opendistroforelasticsearch.sql.ast.expression.Xor;
import com.amazon.opendistroforelasticsearch.sql.ast.tree.Aggregation;
import com.amazon.opendistroforelasticsearch.sql.ast.tree.Dedupe;
import com.amazon.opendistroforelasticsearch.sql.ast.tree.Eval;
Expand Down Expand Up @@ -121,6 +122,10 @@ public T visitAnd(And node, C context) {
return visitChildren(node, context);
}

public T visitXor(Xor node, C context) {
return visitChildren(node, context);
}

public T visitAggregateFunction(AggregateFunction node, C context) {
return visitChildren(node, context);
}
Expand Down
Expand Up @@ -32,6 +32,7 @@
import com.amazon.opendistroforelasticsearch.sql.ast.expression.QualifiedName;
import com.amazon.opendistroforelasticsearch.sql.ast.expression.UnresolvedAttribute;
import com.amazon.opendistroforelasticsearch.sql.ast.expression.UnresolvedExpression;
import com.amazon.opendistroforelasticsearch.sql.ast.expression.Xor;
import com.amazon.opendistroforelasticsearch.sql.ast.tree.Aggregation;
import com.amazon.opendistroforelasticsearch.sql.ast.tree.Dedupe;
import com.amazon.opendistroforelasticsearch.sql.ast.tree.Eval;
Expand Down Expand Up @@ -159,6 +160,10 @@ public static UnresolvedExpression and(UnresolvedExpression left, UnresolvedExpr
return new And(left, right);
}

public static UnresolvedExpression xor(UnresolvedExpression left, UnresolvedExpression right) {
return new Xor(left, right);
}

public static UnresolvedExpression in(
UnresolvedExpression field, UnresolvedExpression... valueList) {
return new In(field, Arrays.asList(valueList));
Expand Down
@@ -0,0 +1,46 @@
/*
* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/

package com.amazon.opendistroforelasticsearch.sql.ast.expression;

import com.amazon.opendistroforelasticsearch.sql.ast.AbstractNodeVisitor;
import java.util.Arrays;
import java.util.List;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.ToString;

/**
* Expression node of the logic XOR.
*/
@Getter
@ToString
@EqualsAndHashCode(callSuper = false)
@RequiredArgsConstructor
public class Xor extends UnresolvedExpression {
private final UnresolvedExpression left;
private final UnresolvedExpression right;

@Override
public List<UnresolvedExpression> getChild() {
return Arrays.asList(left, right);
}

@Override
public <R, C> R accept(AbstractNodeVisitor<R, C> nodeVisitor, C context) {
return nodeVisitor.visitXor(this, context);
}
}
Expand Up @@ -23,10 +23,10 @@
import static com.amazon.opendistroforelasticsearch.sql.data.model.ExprValueUtils.getLongValue;
import static com.amazon.opendistroforelasticsearch.sql.data.model.ExprValueUtils.getStringValue;
import static com.amazon.opendistroforelasticsearch.sql.data.model.ExprValueUtils.getTupleValue;
import static com.amazon.opendistroforelasticsearch.sql.expression.scalar.OperatorUtils.COMPARE_WITH_NULL_OR_MISSING;
import static com.amazon.opendistroforelasticsearch.sql.expression.scalar.OperatorUtils.LIST_COMPARATOR;
import static com.amazon.opendistroforelasticsearch.sql.expression.scalar.OperatorUtils.MAP_COMPARATOR;
import static com.amazon.opendistroforelasticsearch.sql.expression.scalar.OperatorUtils.STRING_COMPARATOR;
import static com.amazon.opendistroforelasticsearch.sql.expression.operator.OperatorUtils.COMPARE_WITH_NULL_OR_MISSING;
import static com.amazon.opendistroforelasticsearch.sql.expression.operator.OperatorUtils.LIST_COMPARATOR;
import static com.amazon.opendistroforelasticsearch.sql.expression.operator.OperatorUtils.MAP_COMPARATOR;
import static com.amazon.opendistroforelasticsearch.sql.expression.operator.OperatorUtils.STRING_COMPARATOR;

import com.amazon.opendistroforelasticsearch.sql.data.model.ExprValue;
import com.amazon.opendistroforelasticsearch.sql.exception.ExpressionEvaluationException;
Expand Down
Expand Up @@ -113,6 +113,36 @@ public FunctionExpression equal(
repository.compile(BuiltinFunctionName.EQUAL.getName(), Arrays.asList(expressions), env);
}

public FunctionExpression notequal(
Environment<Expression, ExprType> env, Expression... expressions) {
return (FunctionExpression)
repository.compile(BuiltinFunctionName.NOTEQUAL.getName(), Arrays.asList(expressions), env);
}

public FunctionExpression less(
Environment<Expression, ExprType> env, Expression... expressions) {
return (FunctionExpression)
repository.compile(BuiltinFunctionName.LESS.getName(), Arrays.asList(expressions), env);
}

public FunctionExpression lte(
Environment<Expression, ExprType> env, Expression... expressions) {
return (FunctionExpression)
repository.compile(BuiltinFunctionName.LTE.getName(), Arrays.asList(expressions), env);
}

public FunctionExpression greater(
Environment<Expression, ExprType> env, Expression... expressions) {
return (FunctionExpression)
repository.compile(BuiltinFunctionName.GREATER.getName(), Arrays.asList(expressions), env);
}

public FunctionExpression gte(
Environment<Expression, ExprType> env, Expression... expressions) {
return (FunctionExpression)
repository.compile(BuiltinFunctionName.GTE.getName(), Arrays.asList(expressions), env);
}

public Aggregator avg(Environment<Expression, ExprType> env, Expression... expressions) {
return (Aggregator)
repository.compile(BuiltinFunctionName.AVG.getName(), Arrays.asList(expressions), env);
Expand Down
Expand Up @@ -21,12 +21,14 @@
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.ToString;

/**
* Function Expression.
*/
@EqualsAndHashCode
@RequiredArgsConstructor
@ToString
public abstract class FunctionExpression implements Expression, FunctionImplementation {
@Getter
private final FunctionName functionName;
Expand Down
Expand Up @@ -25,6 +25,7 @@
import com.amazon.opendistroforelasticsearch.sql.expression.function.FunctionName;
import com.amazon.opendistroforelasticsearch.sql.storage.bindingtuple.BindingTuple;
import java.util.List;
import java.util.stream.Collectors;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
Expand Down
Expand Up @@ -18,10 +18,10 @@
import com.amazon.opendistroforelasticsearch.sql.expression.DSL;
import com.amazon.opendistroforelasticsearch.sql.expression.aggregation.AggregatorFunction;
import com.amazon.opendistroforelasticsearch.sql.expression.function.BuiltinFunctionRepository;
import com.amazon.opendistroforelasticsearch.sql.expression.scalar.arthmetic.ArithmeticFunction;
import com.amazon.opendistroforelasticsearch.sql.expression.scalar.arthmetic.UnaryFunction;
import com.amazon.opendistroforelasticsearch.sql.expression.scalar.predicate.BinaryPredicateFunction;
import com.amazon.opendistroforelasticsearch.sql.expression.scalar.predicate.UnaryPredicateFunction;
import com.amazon.opendistroforelasticsearch.sql.expression.operator.arthmetic.ArithmeticFunction;
import com.amazon.opendistroforelasticsearch.sql.expression.operator.arthmetic.UnaryFunction;
import com.amazon.opendistroforelasticsearch.sql.expression.operator.predicate.BinaryPredicateOperator;
import com.amazon.opendistroforelasticsearch.sql.expression.operator.predicate.UnaryPredicateOperator;
import java.util.HashMap;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand All @@ -39,9 +39,9 @@ public BuiltinFunctionRepository functionRepository() {
BuiltinFunctionRepository builtinFunctionRepository =
new BuiltinFunctionRepository(new HashMap<>());
ArithmeticFunction.register(builtinFunctionRepository);
BinaryPredicateFunction.register(builtinFunctionRepository);
BinaryPredicateOperator.register(builtinFunctionRepository);
UnaryFunction.register(builtinFunctionRepository);
UnaryPredicateFunction.register(builtinFunctionRepository);
UnaryPredicateOperator.register(builtinFunctionRepository);
AggregatorFunction.register(builtinFunctionRepository);
return builtinFunctionRepository;
}
Expand Down
Expand Up @@ -13,24 +13,31 @@
@RequiredArgsConstructor
public enum BuiltinFunctionName {
ABS(FunctionName.of("abs")),

AND(FunctionName.of("and")),
OR(FunctionName.of("or")),
XOR(FunctionName.of("xor")),
NOT(FunctionName.of("not")),
NOTEQUAL(FunctionName.of("notequal")),

TOSTRING(FunctionName.of("tostring")),

/**
* Operator.
* Arithmetic Operators.
*/
ADD(FunctionName.of("+")),
SUBTRACT(FunctionName.of("-")),
MULTIPLY(FunctionName.of("*")),
DIVIDE(FunctionName.of("/")),
MODULES(FunctionName.of("%")),

/**
* Boolean Operators.
*/
AND(FunctionName.of("and")),
OR(FunctionName.of("or")),
XOR(FunctionName.of("xor")),
NOT(FunctionName.of("not")),
EQUAL(FunctionName.of("=")),
NOTEQUAL(FunctionName.of("!=")),
LESS(FunctionName.of("<")),
LTE(FunctionName.of("<=")),
GREATER(FunctionName.of(">")),
GTE(FunctionName.of(">=")),
LIKE(FunctionName.of("like")),

/**
* Aggregation Function.
Expand Down
Expand Up @@ -13,7 +13,7 @@
* permissions and limitations under the License.
*/

package com.amazon.opendistroforelasticsearch.sql.expression.scalar;
package com.amazon.opendistroforelasticsearch.sql.expression.operator;

import com.amazon.opendistroforelasticsearch.sql.data.model.ExprType;
import com.amazon.opendistroforelasticsearch.sql.data.model.ExprValue;
Expand All @@ -28,6 +28,8 @@
import java.util.function.BiFunction;
import java.util.function.BiPredicate;
import java.util.function.Function;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import lombok.experimental.UtilityClass;

@UtilityClass
Expand Down Expand Up @@ -93,6 +95,12 @@ public ExprValue valueOf(Environment<Expression, ExprValue> env) {
public ExprType type(Environment<Expression, ExprType> env) {
return returnType;
}

@Override
public String toString() {
return String.format("%s %s %s", arguments.get(0).toString(), functionName, arguments
.get(1).toString());
}
};
}

Expand Down Expand Up @@ -133,6 +141,14 @@ public ExprValue valueOf(Environment<Expression, ExprValue> env) {
public ExprType type(Environment<Expression, ExprType> env) {
return returnType;
}

@Override
public String toString() {
return String.format("%s(%s)", functionName,
arguments.stream()
.map(Object::toString)
.collect(Collectors.joining(", ")));
}
};
}

Expand Down
Expand Up @@ -13,9 +13,9 @@
* permissions and limitations under the License.
*/

package com.amazon.opendistroforelasticsearch.sql.expression.scalar.arthmetic;
package com.amazon.opendistroforelasticsearch.sql.expression.operator.arthmetic;

import static com.amazon.opendistroforelasticsearch.sql.expression.scalar.OperatorUtils.binaryOperator;
import static com.amazon.opendistroforelasticsearch.sql.expression.operator.OperatorUtils.binaryOperator;

import com.amazon.opendistroforelasticsearch.sql.data.model.ExprType;
import com.amazon.opendistroforelasticsearch.sql.data.model.ExprValueUtils;
Expand Down
Expand Up @@ -13,9 +13,9 @@
* permissions and limitations under the License.
*/

package com.amazon.opendistroforelasticsearch.sql.expression.scalar.arthmetic;
package com.amazon.opendistroforelasticsearch.sql.expression.operator.arthmetic;

import static com.amazon.opendistroforelasticsearch.sql.expression.scalar.OperatorUtils.unaryOperator;
import static com.amazon.opendistroforelasticsearch.sql.expression.operator.OperatorUtils.unaryOperator;

import com.amazon.opendistroforelasticsearch.sql.data.model.ExprType;
import com.amazon.opendistroforelasticsearch.sql.data.model.ExprValueUtils;
Expand Down