@Override public TupleExpression visitBinary(BinaryTupleExpression binaryExpr) { // serialize expression+true serializeExpression(1, binaryExpr, buffer, cs); // serialize children TupleExpression left = binaryExpr.getLeft().accept(this); TupleExpression right = binaryExpr.getRight().accept(this); // serialize none serializeExpression(-1, binaryExpr, buffer, cs); return decorator == null ? binaryExpr : new BinaryTupleExpression(binaryExpr.getOperator(), Lists.newArrayList(left, right)); }
@Override public boolean ifForDynamicColumn() { return ifAbleToPushDown(); }
private BinaryTupleExpression getBinaryTupleExpression(RexCall call, TupleExpression.ExpressionOperatorEnum op) { assert call.operands.size() == 2; TupleExpression left = call.operands.get(0).accept(this); TupleExpression right = call.operands.get(1).accept(this); BinaryTupleExpression tuple = new BinaryTupleExpression(op, Lists.newArrayList(left, right)); tuple.setDigest(call.toString()); return tuple; }
@Override public TupleExpression visitNumber(NumberTupleExpression numExpr) { NumberTupleExpression copyExpr = new NumberTupleExpression(numExpr.getValue()); if (ifToCnt) { List<TupleExpression> children = Lists.newArrayList(cntExpr, copyExpr); ifCntSet = true; return new BinaryTupleExpression(TupleExpression.ExpressionOperatorEnum.MULTIPLE, children); } return copyExpr; }
ColumnTupleExpression colTuple2 = new ColumnTupleExpression(col2); BinaryTupleExpression biTuple1 = new BinaryTupleExpression(TupleExpression.ExpressionOperatorEnum.MULTIPLE, Lists.newArrayList(constTuple1, colTuple1)); biTuple1.verify(); BinaryTupleExpression biTuple2 = new BinaryTupleExpression(TupleExpression.ExpressionOperatorEnum.DIVIDE, Lists.newArrayList(constTuple2, colTuple2)); try { biTuple2.verify(); fail("IllegalArgumentException should be thrown"); } catch (IllegalArgumentException e) { biTuple2 = new BinaryTupleExpression(TupleExpression.ExpressionOperatorEnum.DIVIDE, Lists.newArrayList(colTuple2, constTuple2)); biTuple2.verify(); BinaryTupleExpression biTuple = new BinaryTupleExpression(TupleExpression.ExpressionOperatorEnum.MULTIPLE, Lists.<TupleExpression> newArrayList(biTuple1, biTuple2)); try { biTuple.verify(); fail("IllegalArgumentException should be thrown"); } catch (IllegalArgumentException e) {
private void verifyDivide() { if (ExpressionColCollector.collectMeasureColumns(getRight()).size() > 0) { throw new IllegalArgumentException( "That the right side of the BinaryTupleExpression owns columns is not supported for " + operator.toString()); } }
case MULTIPLE: case DIVIDE: tuple = new BinaryTupleExpression(op); break; case NUMBER:
private void verifyDivide() { if (ExpressionColCollector.collectMeasureColumns(getRight()).size() > 0) { throw new IllegalArgumentException( "That the right side of the BinaryTupleExpression owns columns is not supported for " + operator.toString()); } }
switch (binaryExpr.getOperator()) { case PLUS: case MINUS: boolean ifCntSetO = ifCntSet; leftCopy = binaryExpr.getLeft().accept(this); ifToCnt = ifToCntO; ifCntSet = ifCntSetO; rightCopy = binaryExpr.getRight().accept(this); break; case MULTIPLE: case DIVIDE: if (ifToCntO) { ifToCnt = ExpressionColCollector.collectMeasureColumns(binaryExpr.getRight()).isEmpty(); leftCopy = binaryExpr.getLeft().accept(this); ifToCnt = ExpressionColCollector.collectMeasureColumns(binaryExpr.getLeft()).isEmpty(); rightCopy = binaryExpr.getRight().accept(this); ifCntSet = ifToCntO && (ifCntSet || !ifToCnt); break; default: throw new IllegalArgumentException("Unsupported operator " + binaryExpr.getOperator()); return new BinaryTupleExpression(binaryExpr.getOperator(), Lists.newArrayList(leftCopy, rightCopy));
TupleExpression t14 = new NumberTupleExpression(5); TupleExpression b0 = new BinaryTupleExpression(ExpressionOperatorEnum.PLUS, Lists.newArrayList(t1, t2)); TupleExpression b1 = new BinaryTupleExpression(ExpressionOperatorEnum.MULTIPLE, Lists.newArrayList(t0, b0)); TupleExpression b2 = new BinaryTupleExpression(ExpressionOperatorEnum.PLUS, Lists.newArrayList(t3, t4)); TupleExpression b3 = new BinaryTupleExpression(ExpressionOperatorEnum.PLUS, Lists.newArrayList(t7, t8)); TupleExpression b4 = new BinaryTupleExpression(ExpressionOperatorEnum.PLUS, Lists.newArrayList(t9, t10)); TupleExpression b11 = new BinaryTupleExpression(ExpressionOperatorEnum.MULTIPLE, Lists.newArrayList(b1, b2)); TupleExpression b12 = new BinaryTupleExpression(ExpressionOperatorEnum.PLUS, Lists.newArrayList(t5, t6)); TupleExpression b13 = new BinaryTupleExpression(ExpressionOperatorEnum.MULTIPLE, Lists.newArrayList(b3, b4)); TupleExpression b14 = new BinaryTupleExpression(ExpressionOperatorEnum.PLUS, Lists.newArrayList(t11, t12)); TupleExpression b21 = new BinaryTupleExpression(ExpressionOperatorEnum.MULTIPLE, Lists.newArrayList(b11, b12)); TupleExpression b22 = new BinaryTupleExpression(ExpressionOperatorEnum.MULTIPLE, Lists.newArrayList(b13, b14)); TupleExpression b31 = new BinaryTupleExpression(ExpressionOperatorEnum.PLUS, Lists.newArrayList(b21, b22)); TupleExpression b41 = new BinaryTupleExpression(ExpressionOperatorEnum.MINUS, Lists.newArrayList(b31, t13)); TupleExpression b51 = new BinaryTupleExpression(ExpressionOperatorEnum.PLUS, Lists.newArrayList(b41, t14));
private BinaryTupleExpression getBinaryTupleExpression(RexCall call, TupleExpression.ExpressionOperatorEnum op) { assert call.operands.size() == 2; TupleExpression left = call.operands.get(0).accept(this); TupleExpression right = call.operands.get(1).accept(this); BinaryTupleExpression tuple = new BinaryTupleExpression(op, Lists.newArrayList(left, right)); tuple.setDigest(call.toString()); return tuple; }
private void verifyMultiply() { if (ExpressionColCollector.collectMeasureColumns(getLeft()).size() > 0 // && ExpressionColCollector.collectMeasureColumns(getRight()).size() > 0) { throw new IllegalArgumentException( "That both of the two sides of the BinaryTupleExpression own columns is not supported for " + operator.toString()); } }
@Override public boolean ifForDynamicColumn() { return ifAbleToPushDown(); }
@Override public TupleExpression visitBinary(BinaryTupleExpression binaryExpr) { // serialize expression+true serializeExpression(1, binaryExpr, buffer, cs); // serialize children TupleExpression left = binaryExpr.getLeft().accept(this); TupleExpression right = binaryExpr.getRight().accept(this); // serialize none serializeExpression(-1, binaryExpr, buffer, cs); return decorator == null ? binaryExpr : new BinaryTupleExpression(binaryExpr.getOperator(), Lists.newArrayList(left, right)); }
TupleExpression t14 = new NumberTupleExpression(1); TupleExpression b1 = new BinaryTupleExpression(ExpressionOperatorEnum.PLUS, Lists.newArrayList(t1, t2)); TupleExpression b2 = new BinaryTupleExpression(ExpressionOperatorEnum.PLUS, Lists.newArrayList(t3, t4)); TupleExpression b3 = new BinaryTupleExpression(ExpressionOperatorEnum.PLUS, Lists.newArrayList(t5, t6)); TupleExpression b4 = new BinaryTupleExpression(ExpressionOperatorEnum.PLUS, Lists.newArrayList(t8, t5)); TupleExpression b5 = new BinaryTupleExpression(ExpressionOperatorEnum.PLUS, Lists.newArrayList(t9, t10)); TupleExpression b6 = new BinaryTupleExpression(ExpressionOperatorEnum.MULTIPLE, Lists.newArrayList(t5, t13)); TupleExpression b11 = new BinaryTupleExpression(ExpressionOperatorEnum.MULTIPLE, Lists.newArrayList(b2, b3)); TupleExpression b12 = new BinaryTupleExpression(ExpressionOperatorEnum.MULTIPLE, Lists.newArrayList(b4, b5)); TupleExpression b21 = new BinaryTupleExpression(ExpressionOperatorEnum.PLUS, Lists.newArrayList(b11, t7)); TupleExpression b22 = new BinaryTupleExpression(ExpressionOperatorEnum.PLUS, Lists.newArrayList(b12, t11)); TupleExpression b31 = new CaseTupleExpression(whenList, t12); TupleExpression b41 = new BinaryTupleExpression(ExpressionOperatorEnum.MULTIPLE, Lists.newArrayList(b1, b31)); TupleExpression b51 = new BinaryTupleExpression(ExpressionOperatorEnum.PLUS, Lists.newArrayList(b41, b6)); TupleExpression b61 = new BinaryTupleExpression(ExpressionOperatorEnum.PLUS, Lists.newArrayList(b51, t14));
@Override public BigDecimal calculate(IEvaluatableTuple tuple, IFilterCodeSystem<?> cs) { assert children.size() == 2; BigDecimal left = DecimalUtil.toBigDecimal(getLeft().calculate(tuple, cs)); if (left == null) return null; BigDecimal right = DecimalUtil.toBigDecimal(getRight().calculate(tuple, cs)); if (right == null) return null; switch (operator) { case PLUS: return left.add(right); case MINUS: return left.subtract(right); case MULTIPLE: return left.multiply(right); case DIVIDE: return left.divide(right); default: throw new UnsupportedOperationException(); } }
switch (binaryExpr.getOperator()) { case PLUS: case MINUS: boolean ifCntSetO = ifCntSet; leftCopy = binaryExpr.getLeft().accept(this); ifToCnt = ifToCntO; ifCntSet = ifCntSetO; rightCopy = binaryExpr.getRight().accept(this); break; case MULTIPLE: case DIVIDE: if (ifToCntO) { ifToCnt = ExpressionColCollector.collectMeasureColumns(binaryExpr.getRight()).isEmpty(); leftCopy = binaryExpr.getLeft().accept(this); ifToCnt = ExpressionColCollector.collectMeasureColumns(binaryExpr.getLeft()).isEmpty(); rightCopy = binaryExpr.getRight().accept(this); ifCntSet = ifToCntO && (ifCntSet || !ifToCnt); break; default: throw new IllegalArgumentException("Unsupported operator " + binaryExpr.getOperator()); return new BinaryTupleExpression(binaryExpr.getOperator(), Lists.newArrayList(leftCopy, rightCopy));
TupleExpression constExpression1 = new NumberTupleExpression(1); TupleExpression constExpression2 = new NumberTupleExpression(2); TupleExpression biExpression = new BinaryTupleExpression(ExpressionOperatorEnum.MULTIPLE, Lists.newArrayList(colExpression, constExpression2)); TupleExpression thenExpression = new BinaryTupleExpression(ExpressionOperatorEnum.PLUS, Lists.newArrayList(biExpression, constExpression1));