in modules/lang-painless/src/main/java/org/elasticsearch/painless/phase/DefaultConstantFoldingOptimizationPhase.java [507:673]
public void visitComparison(ComparisonNode irComparisonNode, Consumer<ExpressionNode> scope) {
irComparisonNode.getLeftNode().visit(this, irComparisonNode::setLeftNode);
irComparisonNode.getRightNode().visit(this, irComparisonNode::setRightNode);
if ((irComparisonNode.getLeftNode() instanceof ConstantNode || irComparisonNode.getLeftNode() instanceof NullNode)
&& (irComparisonNode.getRightNode() instanceof ConstantNode || irComparisonNode.getRightNode() instanceof NullNode)) {
ExpressionNode irLeftConstantNode = irComparisonNode.getLeftNode() instanceof NullNode ? null : irComparisonNode.getLeftNode();
ExpressionNode irRightConstantNode = irComparisonNode.getRightNode() instanceof NullNode
? null
: irComparisonNode.getRightNode();
Object leftConstantValue = irLeftConstantNode == null ? null : irLeftConstantNode.getDecorationValue(IRDConstant.class);
Object rightConstantValue = irRightConstantNode == null ? null : irRightConstantNode.getDecorationValue(IRDConstant.class);
Operation operation = irComparisonNode.getDecorationValue(IRDOperation.class);
Class<?> type = irComparisonNode.getDecorationValue(IRDComparisonType.class);
if (operation == Operation.EQ || operation == Operation.EQR) {
if (irLeftConstantNode == null && irRightConstantNode == null) {
irLeftConstantNode = new ConstantNode(irComparisonNode.getLeftNode().getLocation());
irLeftConstantNode.attachDecoration(new IRDConstant(true));
} else if (irLeftConstantNode == null || irRightConstantNode == null) {
irLeftConstantNode = new ConstantNode(irComparisonNode.getLeftNode().getLocation());
irLeftConstantNode.attachDecoration(new IRDConstant(false));
} else if (type == boolean.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((boolean) leftConstantValue == (boolean) rightConstantValue));
} else if (type == int.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((int) leftConstantValue == (int) rightConstantValue));
} else if (type == long.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((long) leftConstantValue == (long) rightConstantValue));
} else if (type == float.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((float) leftConstantValue == (float) rightConstantValue));
} else if (type == double.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((double) leftConstantValue == (double) rightConstantValue));
} else {
if (operation == Operation.EQ) {
irLeftConstantNode.attachDecoration(new IRDConstant(leftConstantValue.equals(rightConstantValue)));
} else {
irLeftConstantNode.attachDecoration(new IRDConstant(leftConstantValue == rightConstantValue));
}
}
irLeftConstantNode.attachDecoration(new IRDExpressionType(boolean.class));
scope.accept(irLeftConstantNode);
} else if (operation == Operation.NE || operation == Operation.NER) {
if (irLeftConstantNode == null && irRightConstantNode == null) {
irLeftConstantNode = new ConstantNode(irComparisonNode.getLeftNode().getLocation());
irLeftConstantNode.attachDecoration(new IRDConstant(false));
} else if (irLeftConstantNode == null || irRightConstantNode == null) {
irLeftConstantNode = new ConstantNode(irComparisonNode.getLeftNode().getLocation());
irLeftConstantNode.attachDecoration(new IRDConstant(true));
} else if (type == boolean.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((boolean) leftConstantValue != (boolean) rightConstantValue));
} else if (type == int.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((int) leftConstantValue != (int) rightConstantValue));
} else if (type == long.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((long) leftConstantValue != (long) rightConstantValue));
} else if (type == float.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((float) leftConstantValue != (float) rightConstantValue));
} else if (type == double.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((double) leftConstantValue != (double) rightConstantValue));
} else {
if (operation == Operation.NE) {
irLeftConstantNode.attachDecoration(new IRDConstant(leftConstantValue.equals(rightConstantValue) == false));
} else {
irLeftConstantNode.attachDecoration(new IRDConstant(leftConstantValue != rightConstantValue));
}
}
irLeftConstantNode.attachDecoration(new IRDExpressionType(boolean.class));
scope.accept(irLeftConstantNode);
} else if (irLeftConstantNode != null && irRightConstantNode != null) {
if (operation == Operation.GT) {
if (type == int.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((int) leftConstantValue > (int) rightConstantValue));
} else if (type == long.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((long) leftConstantValue > (long) rightConstantValue));
} else if (type == float.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((float) leftConstantValue > (float) rightConstantValue));
} else if (type == double.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((double) leftConstantValue > (double) rightConstantValue));
} else {
throw irComparisonNode.getLocation()
.createError(
comparisonError(
PainlessLookupUtility.typeToCanonicalTypeName(type),
operation.symbol,
irLeftConstantNode.getDecorationString(IRDConstant.class),
irRightConstantNode.getDecorationString(IRDConstant.class)
)
);
}
irLeftConstantNode.attachDecoration(new IRDExpressionType(boolean.class));
scope.accept(irLeftConstantNode);
} else if (operation == Operation.GTE) {
if (type == int.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((int) leftConstantValue >= (int) rightConstantValue));
} else if (type == long.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((long) leftConstantValue >= (long) rightConstantValue));
} else if (type == float.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((float) leftConstantValue >= (float) rightConstantValue));
} else if (type == double.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((double) leftConstantValue >= (double) rightConstantValue));
} else {
throw irComparisonNode.getLocation()
.createError(
comparisonError(
PainlessLookupUtility.typeToCanonicalTypeName(type),
operation.symbol,
irLeftConstantNode.getDecorationString(IRDConstant.class),
irRightConstantNode.getDecorationString(IRDConstant.class)
)
);
}
irLeftConstantNode.attachDecoration(new IRDExpressionType(boolean.class));
scope.accept(irLeftConstantNode);
} else if (operation == Operation.LT) {
if (type == int.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((int) leftConstantValue < (int) rightConstantValue));
} else if (type == long.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((long) leftConstantValue < (long) rightConstantValue));
} else if (type == float.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((float) leftConstantValue < (float) rightConstantValue));
} else if (type == double.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((double) leftConstantValue < (double) rightConstantValue));
} else {
throw irComparisonNode.getLocation()
.createError(
comparisonError(
PainlessLookupUtility.typeToCanonicalTypeName(type),
operation.symbol,
irLeftConstantNode.getDecorationString(IRDConstant.class),
irRightConstantNode.getDecorationString(IRDConstant.class)
)
);
}
irLeftConstantNode.attachDecoration(new IRDExpressionType(boolean.class));
scope.accept(irLeftConstantNode);
} else if (operation == Operation.LTE) {
if (type == int.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((int) leftConstantValue <= (int) rightConstantValue));
} else if (type == long.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((long) leftConstantValue <= (long) rightConstantValue));
} else if (type == float.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((float) leftConstantValue <= (float) rightConstantValue));
} else if (type == double.class) {
irLeftConstantNode.attachDecoration(new IRDConstant((double) leftConstantValue <= (double) rightConstantValue));
} else {
throw irComparisonNode.getLocation()
.createError(
comparisonError(
PainlessLookupUtility.typeToCanonicalTypeName(type),
operation.symbol,
irLeftConstantNode.getDecorationString(IRDConstant.class),
irRightConstantNode.getDecorationString(IRDConstant.class)
)
);
}
irLeftConstantNode.attachDecoration(new IRDExpressionType(boolean.class));
scope.accept(irLeftConstantNode);
}
}
}
}