@Override public void accept(ExpressionVisitor visitor) { for(Expression expression: expressions) { expression.accept(visitor); } }
@Override public void visit(ArrayFieldExpression arrayFieldExpression) { arrayFieldExpression.getExpression().accept(this); builder.append("[").append(arrayFieldExpression.getIndex()).append("]"); }
@Override public void visit(MapFieldExpression mapFieldExpression) { mapFieldExpression.getExpression().accept(this); builder.append("['").append(mapFieldExpression.getKey()).append("']"); }
private void buildFunctionExpression(FunctionExpression functionExpression) { builder.append(functionExpression.getFunction().getName()).append("("); int count = 0; for (Expression expression : functionExpression.getOperands()) { if (++count > 1) { builder.append(", "); } expression.accept(this); } builder.append(")"); }
@Override public void visit(AsExpression asExpression) { aliases.add(asExpression.getAlias()); asExpression.getExpression().accept(this); }
private void maybeParenthesize(BinaryExpression parent, Expression child) { boolean paren = false; if (child instanceof BinaryExpression) { int childPrecedence = ((BinaryExpression) child).getOperator().getPrecedence(); int parentPrecedence = parent.getOperator().getPrecedence(); if (childPrecedence > parentPrecedence) { paren = true; } } if (paren) { builder.append("("); child.accept(this); builder.append(")"); } else { child.accept(this); } }
private void handleFilter() { if (condition != null) { ExpressionTranslator conditionTranslator = new StormSqlExpressionTranslator(); condition.getExpression().accept(conditionTranslator); stormSqlFields.addAll(conditionTranslator.getFields()); if (!conditionTranslator.getAggregateFunctions().isEmpty()) { throw new IllegalArgumentException("Cannot have aggregate functions filter condition."); } functions.addAll(conditionTranslator.getFunctions()); expression = conditionTranslator.getTranslatedExpression(); LOG.debug("Built expression [{}] for filter condition [{}]", expression, condition); } }
private void handleProjection() { if (projection != null) { for (Expression expr : projection.getExpressions()) { ExpressionTranslator translator = new StormSqlExpressionTranslator(); expr.accept(translator); stormSqlFields.addAll(translator.getFields()); functions.addAll(translator.getFunctions()); aggregateFunctions.addAll(translator.getAggregateFunctions()); projectedFields.add(translator.getTranslatedExpression()); if (!translator.getAliases().isEmpty()) { outputFields.add(translator.getAliases().get(0)); } else { outputFields.add(translator.getUnquotedTranslatedExpression()); } } } }
@Override public String asString() { if (expression == null) { // Builds and caches the expression string the first time it is called GroovyExpressionTranslator expressionTranslator = new GroovyExpressionTranslator(); condition.getExpression().accept(expressionTranslator); expression = expressionTranslator.getTranslatedExpression(); } return expression; }
private void handleGroupByHaving() { if (groupBy != null) { List<String> groupByExpressions = new ArrayList<>(); for (Expression expr: groupBy.getExpressions()) { ExpressionTranslator groupByTranslator = new StormSqlExpressionTranslator(); expr.accept(groupByTranslator); stormSqlFields.addAll(groupByTranslator.getFields()); groupByFields.addAll(groupByTranslator.getFields()); functions.addAll(groupByTranslator.getFunctions()); groupByExpressions.add(groupByTranslator.getTranslatedExpression()); } groupByExpression = Joiner.on(",").join(groupByExpressions); if (having != null) { ExpressionTranslator havingTranslator = new StormSqlExpressionTranslator(); having.getExpression().accept(havingTranslator); stormSqlFields.addAll(havingTranslator.getFields()); functions.addAll(havingTranslator.getFunctions()); aggregateFunctions.addAll(havingTranslator.getAggregateFunctions()); havingExpression = havingTranslator.getTranslatedExpression(); LOG.debug("Built expression [{}] for having [{}]", havingExpression, having); } } }