private <U> ColumnExpressions<U> binaryOpWithNumericPromotion(String opString, TypedValue leftVal, TypedValue rightVal, SymbExPassDown passdown) throws TypedValueVisitorException { boolean isFinalTypeFromLeft = true; // Handle operations with NULL separately if (leftVal instanceof ConstantValue.NullConstant || rightVal instanceof ConstantValue.NullConstant) return binaryOpWithNull(opString, leftVal, rightVal, passdown); // Check if we have a valid numeric promotion (i.e. one side has a widening cast // to match the type of the other side). assert(leftVal.getType().equals(rightVal.getType()) || (leftVal.getType().getInternalName().equals("java/lang/Object") && config.isObjectEqualsSafe)// in Scala, many comparisons are done on Objects || (rightVal.getType().getInternalName().equals("java/lang/Object") && config.isObjectEqualsSafe)); if (isWideningCast(leftVal)) { if (!isWideningCast(rightVal)) { leftVal = skipWideningCast(leftVal); isFinalTypeFromLeft = false; } } else if (isWideningCast(rightVal)) { rightVal = skipWideningCast(rightVal); } // Actually translate the expressions now ColumnExpressions<U> left = (ColumnExpressions<U>)leftVal.visit(this, passdown); ColumnExpressions<U> right = (ColumnExpressions<U>)rightVal.visit(this, passdown); return ColumnExpressions.singleColumn(isFinalTypeFromLeft ? left.reader : right.reader, new BinaryExpression(opString, left.getOnlyColumn(), right.getOnlyColumn())); }
&& other.getType() == Type.BOOLEAN_TYPE)
Type fromType = castedVal.operand.getType(); if (!numericPromotionPriority.containsKey(fromType)) return false; if (!numericPromotionPriority.containsKey(toType)) return false;
@Override public ColumnExpressions<?> mathOpValue(TypedValue.MathOpValue val, SymbExPassDown in) throws TypedValueVisitorException { if (val.op == TypedValue.MathOpValue.Op.cmp) throw new TypedValueVisitorException("cmp operator was not converted to a boolean operator"); if (val.op == TypedValue.MathOpValue.Op.mod) { if (val.left.getType().equals(Type.INT_TYPE) || val.right.getType().equals(Type.INT_TYPE)) { SymbExPassDown passdown = SymbExPassDown.with(val, false); ColumnExpressions<?> left = (ColumnExpressions<?>)val.left.visit(this, passdown); ColumnExpressions<?> right = (ColumnExpressions<?>)val.right.visit(this, passdown); return ColumnExpressions.singleColumn(left.reader, FunctionExpression.twoParam("MOD", left.getOnlyColumn(), right.getOnlyColumn())); } throw new TypedValueVisitorException("mod operator cannot be used for the given types."); } SymbExPassDown passdown = SymbExPassDown.with(val, false); return binaryOpWithNumericPromotion(val.sqlOpString(), val.left, val.right, passdown); }
if (!val.args.get(0).getType().equals(Type.getObjectType("java/lang/String"))) throw new TypedValueVisitorException("Do not know how to convert type " + val.args.get(0).getType() + " to a string"); SymbExPassDown passdown = SymbExPassDown.with(val, in.isExpectingConditional); ColumnExpressions<?> base = val.args.get(0).visit(this, passdown);