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()); } } } }
private Projection parseProjection(SqlSelect sqlSelect) { Projection projection; ExpressionGenerator exprGenerator = new ExpressionGenerator(streams, catalogUdfs); ExpressionList exprList = (ExpressionList) sqlSelect.getSelectList().accept(exprGenerator); if (exprList.getExpressions().size() == 1 && exprList.getExpressions().get(0) == STAR) { projection = null; } else { projection = new Projection(exprList.getExpressions()); } referredUdfs.addAll(exprGenerator.getReferredUdfs()); LOG.debug("Projection {}", projection); return projection; }
private String parseAndSerialize(TopologyWindow topologyWindow) throws JsonProcessingException { if (topologyWindow.getStreams() == null || topologyWindow.getStreams().isEmpty()) { LOG.error("Streams should be specified."); return StringUtils.EMPTY; } Rule rule = new Rule(); rule.setId(topologyWindow.getId()); rule.setName(topologyWindow.getName()); rule.setDescription(topologyWindow.getDescription()); rule.setWindow(topologyWindow.getWindow()); rule.setActions(topologyWindow.getActions()); String sql = getSqlString(topologyWindow.getStreams(), topologyWindow.getProjections(), topologyWindow.getCondition(), topologyWindow.getGroupbykeys()); updateRuleWithSql(rule, sql, topologyWindow.getTopologyId(), topologyWindow.getVersionId()); validateProjection(rule.getProjection().getExpressions(), rule.getGroupBy().getExpressions()); ObjectMapper mapper = new ObjectMapper(); return mapper.writeValueAsString(rule); }