static ASTNode replaceAliases(ASTNode node, int nodePos, Map<String, String> colToTableAlias) { if (node == null) { return node; } int nodeType = node.getToken().getType(); if (nodeType == HiveParser.TOK_TABLE_OR_COL || nodeType == HiveParser.DOT) { String colName = HQLParser.getColName(node); String newAlias = colToTableAlias.get(colName.toLowerCase()); if (StringUtils.isBlank(newAlias)) { return node; } if (nodeType == HiveParser.DOT) { // No need to create a new node, just replace the table name ident ASTNode aliasNode = (ASTNode) node.getChild(0); ASTNode newAliasIdent = new ASTNode(new CommonToken(HiveParser.Identifier, newAlias)); aliasNode.setChild(0, newAliasIdent); } else { // Just a column ref, we need to make it alias.col // '.' will become the parent node ASTNode dot = new ASTNode(new CommonToken(HiveParser.DOT, ".")); ASTNode aliasIdentNode = new ASTNode(new CommonToken(HiveParser.Identifier, newAlias)); ASTNode tabRefNode = new ASTNode(new CommonToken(HiveParser.TOK_TABLE_OR_COL, "TOK_TABLE_OR_COL")); tabRefNode.addChild(aliasIdentNode); dot.addChild(tabRefNode); ASTNode colIdentNode = new ASTNode(new CommonToken(HiveParser.Identifier, colName)); dot.addChild(colIdentNode); ASTNode parent = (ASTNode) node.getParent(); if (parent != null) { parent.setChild(nodePos, dot); } else { return dot; } } } else { // recurse down for (int i = 0; i < node.getChildCount(); i++) { ASTNode child = (ASTNode) node.getChild(i); replaceAliases(child, i, colToTableAlias); } } return node; }
private void resolveClause(CubeQueryContext query, ASTNode node) throws LensException { if (node == null) { return; } int nodeType = node.getToken().getType(); if (nodeType == HiveParser.DOT) { String colName = HQLParser.getColName(node).toLowerCase(); if (!pickedReferences.containsKey(colName)) { return; } // No need to create a new node, // replace the table name identifier and column name identifier ASTNode tableNode = (ASTNode) node.getChild(0); ASTNode tabident = HQLParser.findNodeByPath(node, TOK_TABLE_OR_COL, Identifier); PickedReference refered = getPickedReference(colName, tabident.getText().toLowerCase()); if (refered == null) { return; } ASTNode newTableNode = new ASTNode( new CommonToken(HiveParser.Identifier, refered.getChainRef().getChainName())); tableNode.setChild(0, newTableNode); ASTNode newColumnNode = new ASTNode( new CommonToken(HiveParser.Identifier, refered.getChainRef().getRefColumn())); node.setChild(1, newColumnNode); } else { // recurse down for (int i = 0; i < node.getChildCount(); i++) { ASTNode child = (ASTNode) node.getChild(i); resolveClause(query, child); } } }