void parseDisplayColumns(VoltXMLElement columnsNode) { for (VoltXMLElement child : columnsNode.children) { ParsedColInfo col = new ParsedColInfo(); col.expression = parseExpressionTree(child); if (col.expression instanceof ConstantValueExpression) { assert (col.expression.getValueType() != VoltType.NUMERIC); } ExpressionUtil.finalizeValueTypes(col.expression); assert (col.expression != null); col.alias = child.attributes.get("alias"); if (child.name.equals("columnref")) { col.columnName = child.attributes.get("column"); col.tableName = child.attributes.get("table"); } else { // XXX hacky, assume all non-column refs come from a temp table col.tableName = "VOLT_TEMP_TABLE"; col.columnName = ""; } // This index calculation is only used for sanity checking // materialized views (which use the parsed select statement but // don't go through the planner pass that does more involved // column index resolution). col.index = displayColumns.size(); displayColumns.add(col); } }
void parseGroupByColumn(VoltXMLElement groupByNode) { ParsedColInfo col = new ParsedColInfo(); col.expression = parseExpressionTree(groupByNode); assert (col.expression != null); if (groupByNode.name.equals("columnref")) { col.alias = groupByNode.attributes.get("alias"); col.columnName = groupByNode.attributes.get("column"); col.tableName = groupByNode.attributes.get("table"); col.groupBy = true; } else { throw new RuntimeException("GROUP BY with complex expressions not yet supported"); } assert (col.alias.equalsIgnoreCase(col.columnName)); assert (getTableFromDB(col.tableName) != null); assert (getTableFromDB(col.tableName).getColumns().getIgnoreCase(col.columnName) != null); org.voltdb.catalog.Column catalogColumn = getTableFromDB(col.tableName).getColumns().getIgnoreCase(col.columnName); col.index = catalogColumn.getIndex(); groupByColumns.add(col); }