Skip to content

Commit

Permalink
[expr] expose AbstractOp::isConst intf.
Browse files Browse the repository at this point in the history
  • Loading branch information
lasyard committed Mar 8, 2024
1 parent a189d20 commit e37dd6e
Show file tree
Hide file tree
Showing 18 changed files with 143 additions and 83 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,24 +22,25 @@
import io.dingodb.expr.runtime.op.OpSymbol;
import io.dingodb.expr.runtime.op.OpType;
import io.dingodb.expr.runtime.type.Type;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.checkerframework.checker.nullness.qual.NonNull;

@RequiredArgsConstructor(access = AccessLevel.PUBLIC)
@EqualsAndHashCode(of = {"op", "operand0", "operand1"})
public class BinaryOpExpr implements OpExpr {
@EqualsAndHashCode(of = {"operand0", "operand1"}, callSuper = true)
public class BinaryOpExpr extends OpExpr<BinaryOp, BinaryOpExpr> {
private static final long serialVersionUID = -4980001325586095328L;

@Getter
protected final BinaryOp op;
@Getter
protected final Expr operand0;
@Getter
protected final Expr operand1;

public BinaryOpExpr(BinaryOp op, Expr operand0, Expr operand1) {
super(op);
this.operand0 = operand0;
this.operand1 = operand1;
}

@Override
public Object eval(EvalContext context, ExprConfig config) {
return op.eval(operand0, operand1, context, config);
Expand All @@ -52,7 +53,7 @@ public Type getType() {

@Override
public @NonNull Expr simplify(ExprConfig config) {
if (operand0 instanceof Val && operand1 instanceof Val) {
if (op.isConst(this)) {
return Exprs.val(eval(null, config), getType());
}
return op.simplify(this, config);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,14 @@
import io.dingodb.expr.runtime.op.OpSymbol;
import io.dingodb.expr.runtime.op.OpType;
import io.dingodb.expr.runtime.type.Type;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.checkerframework.checker.nullness.qual.NonNull;

@RequiredArgsConstructor(access = AccessLevel.PUBLIC)
@EqualsAndHashCode(of = {"op"})
public class NullaryOpExpr implements OpExpr {
public class NullaryOpExpr extends OpExpr<NullaryOp, NullaryOpExpr> {
private static final long serialVersionUID = 3647341413168339783L;

@Getter
protected final NullaryOp op;
public NullaryOpExpr(NullaryOp op) {
super(op);
}

@Override
public Object eval(EvalContext context, ExprConfig config) {
Expand All @@ -48,6 +43,9 @@ public Type getType() {

@Override
public @NonNull Expr simplify(ExprConfig config) {
if (op.isConst(this)) {
return Exprs.val(eval(null, config), getType());
}
return op.simplify(this, config);
}

Expand Down
22 changes: 16 additions & 6 deletions runtime/src/main/java/io/dingodb/expr/runtime/expr/OpExpr.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,30 @@

package io.dingodb.expr.runtime.expr;

import io.dingodb.expr.runtime.op.Op;
import io.dingodb.expr.runtime.op.AbstractOp;
import io.dingodb.expr.runtime.op.OpType;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import org.checkerframework.checker.nullness.qual.NonNull;

public interface OpExpr extends Expr {
@NonNull Op getOp();
@EqualsAndHashCode(of = {"op"})
public abstract class OpExpr<O extends AbstractOp<O, E>, E extends OpExpr<O, E>> implements Expr {
private static final long serialVersionUID = -9011805373573763769L;

default @NonNull OpType getOpType() {
@Getter
protected final O op;

protected OpExpr(O op) {
this.op = op;
}

public @NonNull OpType getOpType() {
return getOp().getOpType();
}

default String oprandToString(Expr operand) {
protected String oprandToString(Expr operand) {
if (operand instanceof OpExpr) {
OpExpr op = (OpExpr) operand;
OpExpr<?, ?> op = (OpExpr<?, ?>) operand;
if (op.getOpType().getPrecedence() > getOpType().getPrecedence()) {
return "(" + operand + ")";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,26 +22,28 @@
import io.dingodb.expr.runtime.op.OpType;
import io.dingodb.expr.runtime.op.TertiaryOp;
import io.dingodb.expr.runtime.type.Type;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.checkerframework.checker.nullness.qual.NonNull;

@RequiredArgsConstructor(access = AccessLevel.PUBLIC)
@EqualsAndHashCode(of = {"op", "operand0", "operand1", "operand2"})
public final class TertiaryOpExpr implements OpExpr {
@EqualsAndHashCode(of = {"operand0", "operand1", "operand2"}, callSuper = true)
public final class TertiaryOpExpr extends OpExpr<TertiaryOp, TertiaryOpExpr> {
private static final long serialVersionUID = -1597326280376061590L;

@Getter
private final TertiaryOp op;
@Getter
private final Expr operand0;
@Getter
private final Expr operand1;
@Getter
private final Expr operand2;

public TertiaryOpExpr(TertiaryOp op, Expr operand0, Expr operand1, Expr operand2) {
super(op);
this.operand0 = operand0;
this.operand1 = operand1;
this.operand2 = operand2;
}

@Override
public Object eval(EvalContext context, ExprConfig config) {
return op.eval(operand0, operand1, operand2, context, config);
Expand All @@ -54,7 +56,7 @@ public Type getType() {

@Override
public @NonNull Expr simplify(ExprConfig config) {
if (operand0 instanceof Val && operand1 instanceof Val && operand2 instanceof Val) {
if (op.isConst(this)) {
return Exprs.val(eval(null, config), getType());
}
return op.simplify(this, config);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,22 +22,22 @@
import io.dingodb.expr.runtime.op.OpType;
import io.dingodb.expr.runtime.op.UnaryOp;
import io.dingodb.expr.runtime.type.Type;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.checkerframework.checker.nullness.qual.NonNull;

@RequiredArgsConstructor(access = AccessLevel.PUBLIC)
@EqualsAndHashCode(of = {"op", "operand"})
public class UnaryOpExpr implements OpExpr {
@EqualsAndHashCode(of = {"operand"}, callSuper = true)
public class UnaryOpExpr extends OpExpr<UnaryOp, UnaryOpExpr> {
private static final long serialVersionUID = 7964987353969166202L;

@Getter
protected final UnaryOp op;
@Getter
protected final Expr operand;

public UnaryOpExpr(UnaryOp op, Expr operand) {
super(op);
this.operand = operand;
}

@Override
public Object eval(EvalContext context, ExprConfig config) {
return op.eval(operand, context, config);
Expand All @@ -50,7 +50,7 @@ public Type getType() {

@Override
public @NonNull Expr simplify(ExprConfig config) {
if (operand instanceof Val) {
if (op.isConst(this)) {
return Exprs.val(eval(null, config), getType());
}
return op.simplify(this, config);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,25 +22,25 @@
import io.dingodb.expr.runtime.op.OpType;
import io.dingodb.expr.runtime.op.VariadicOp;
import io.dingodb.expr.runtime.type.Type;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.checkerframework.checker.nullness.qual.NonNull;

import java.util.Arrays;
import java.util.stream.Collectors;

@RequiredArgsConstructor(access = AccessLevel.PUBLIC)
@EqualsAndHashCode(of = {"op", "operands"})
public final class VariadicOpExpr implements OpExpr {
@EqualsAndHashCode(of = {"operands"}, callSuper = true)
public final class VariadicOpExpr extends OpExpr<VariadicOp, VariadicOpExpr> {
private static final long serialVersionUID = -2145574267641248415L;

@Getter
private final VariadicOp op;
@Getter
private final Expr[] operands;

public VariadicOpExpr(VariadicOp op, Expr[] operands) {
super(op);
this.operands = operands;
}

@Override
public Object eval(EvalContext context, ExprConfig config) {
return op.eval(operands, context, config);
Expand All @@ -53,7 +53,7 @@ public Type getType() {

@Override
public @NonNull Expr simplify(ExprConfig config) {
if (Arrays.stream(operands).allMatch(o -> o instanceof Val)) {
if (op.isConst(this)) {
return Exprs.val(eval(null, config), getType());
}
return op.simplify(this, config);
Expand Down
20 changes: 14 additions & 6 deletions runtime/src/main/java/io/dingodb/expr/runtime/op/AbstractOp.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,12 @@
import io.dingodb.expr.runtime.ExprConfig;
import io.dingodb.expr.runtime.compiler.CastingFactory;
import io.dingodb.expr.runtime.expr.Expr;
import io.dingodb.expr.runtime.expr.OpExpr;
import io.dingodb.expr.runtime.type.Type;
import io.dingodb.expr.runtime.type.Types;
import org.checkerframework.checker.nullness.qual.NonNull;

public abstract class AbstractOp<E extends Op> implements Op, OpFactory<E> {
public abstract class AbstractOp<O extends AbstractOp<O, E>, E extends OpExpr<O, E>> implements Op, OpFactory<O> {
private static final long serialVersionUID = -2046211912438996616L;

protected AbstractOp() {
Expand All @@ -39,11 +40,6 @@ protected static Expr doCast(@NonNull Expr expr, Type type, @NonNull ExprConfig
return expr;
}

@Override
public String toString() {
return getName();
}

@Override
public Type getType() {
return Types.ANY;
Expand All @@ -54,6 +50,13 @@ public Type getType() {
return OpType.FUN;
}

public abstract boolean isConst(@NonNull E expr);

public @NonNull Expr simplify(@NonNull E expr, ExprConfig config) {
assert expr.getOp() == this;
return expr;
}

@Override
public @NonNull String getName() {
return getOpType().name();
Expand All @@ -71,4 +74,9 @@ public OpKey getKey() {
public boolean doRangeChecking() {
return false;
}

@Override
public String toString() {
return getName();
}
}
14 changes: 8 additions & 6 deletions runtime/src/main/java/io/dingodb/expr/runtime/op/BinaryOp.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,12 @@
import io.dingodb.expr.runtime.exception.OperatorTypeNotExist;
import io.dingodb.expr.runtime.expr.BinaryOpExpr;
import io.dingodb.expr.runtime.expr.Expr;
import io.dingodb.expr.runtime.expr.Val;
import io.dingodb.expr.runtime.type.Type;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;

public abstract class BinaryOp extends AbstractOp<BinaryOp> {
public abstract class BinaryOp extends AbstractOp<BinaryOp, BinaryOpExpr> {
private static final long serialVersionUID = -3432586934529603722L;

protected Object evalNonNullValue(@NonNull Object value0, @NonNull Object value1, ExprConfig config) {
Expand All @@ -43,6 +44,12 @@ public Object eval(@NonNull Expr expr0, @NonNull Expr expr1, EvalContext context
return evalValue(value0, value1, config);
}

@Override
public boolean isConst(@NonNull BinaryOpExpr expr) {
assert expr.getOp() == this;
return expr.getOperand0() instanceof Val && expr.getOperand1() instanceof Val;
}

public @Nullable OpKey keyOf(@NonNull Type type0, @NonNull Type type1) {
return OpKeys.DEFAULT.keyOf(type0, type1);
}
Expand Down Expand Up @@ -72,11 +79,6 @@ public OpKey bestKeyOf(@NonNull Type @NonNull [] types) {
return config.withSimplification() ? result.simplify(config) : result;
}

public @NonNull Expr simplify(@NonNull BinaryOpExpr expr, ExprConfig config) {
assert expr.getOp() == this;
return expr;
}

@Override
public BinaryOp getOp(OpKey key) {
return this;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,20 @@
import io.dingodb.expr.runtime.EvalContext;
import io.dingodb.expr.runtime.ExprConfig;
import io.dingodb.expr.runtime.exception.EvalNotImplemented;
import io.dingodb.expr.runtime.expr.Expr;
import io.dingodb.expr.runtime.expr.NullaryOpExpr;
import org.checkerframework.checker.nullness.qual.NonNull;

public abstract class NullaryOp extends AbstractOp<NullaryOp> {
public abstract class NullaryOp extends AbstractOp<NullaryOp, NullaryOpExpr> {
private static final long serialVersionUID = -5008875403399768833L;

public Object eval(EvalContext context, ExprConfig config) {
throw new EvalNotImplemented(this.getClass().getCanonicalName());
}

public @NonNull Expr simplify(@NonNull NullaryOpExpr expr, ExprConfig ignoredConfig) {
@Override
public boolean isConst(@NonNull NullaryOpExpr expr) {
assert expr.getOp() == this;
return expr;
return true;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@

package io.dingodb.expr.runtime.op;

public interface OpFactory<E extends Op> {
E getOp(OpKey key);
public interface OpFactory<O extends Op> {
O getOp(OpKey key);
}
Loading

0 comments on commit e37dd6e

Please sign in to comment.