private ParseNode getJoinConditionNode(ParseNode lhs, List<AliasedNode> rhs, String rhsTableAlias) throws SQLException { List<ParseNode> lhsNodes; if (lhs instanceof RowValueConstructorParseNode) { lhsNodes = ((RowValueConstructorParseNode) lhs).getChildren(); } else { lhsNodes = Collections.singletonList(lhs); } if (lhsNodes.size() != (rhs.size() - 1)) throw new SQLExceptionInfo.Builder(SQLExceptionCode.SUBQUERY_RETURNS_DIFFERENT_NUMBER_OF_FIELDS).build().buildException(); int count = lhsNodes.size(); TableName rhsTableName = NODE_FACTORY.table(null, rhsTableAlias); List<ParseNode> equalNodes = Lists.newArrayListWithExpectedSize(count); for (int i = 0; i < count; i++) { ParseNode rhsNode = NODE_FACTORY.column(rhsTableName, rhs.get(i + 1).getAlias(), null); equalNodes.add(NODE_FACTORY.equal(lhsNodes.get(i), rhsNode)); } return count == 1 ? equalNodes.get(0) : NODE_FACTORY.and(equalNodes); }
aliasedNodes = Lists.newArrayListWithExpectedSize(aliases.size()); for (String alias : aliases) { aliasedNodes.add(aliasedNode(alias, column(null, alias, alias)));
@Override public ParseNode visit(ColumnParseNode node) throws SQLException { if (node.getTableName() == null) return super.visit(node); if (removeAlias) { if (node.getTableName().equals(tableAlias)) { return NODE_FACTORY.column(null, node.getName(), node.getAlias()); } return super.visit(node); } ParseNode aliasedNode = aliasMap.get(node.getFullName()); if (aliasedNode != null) { return aliasedNode; } return node; }
ColumnParseNode newColumnParseNode=NODE_FACTORY.column(null, selectAliasName, selectAliasName); Integer index=rewrittenOrderByParseNodeToIndex.get(oldSelectAliasParseNode); if(index !=null) {
rhsNode = derivedTableAlias == null ? aliasedNodes.get(0).getNode() : NODE_FACTORY.column(NODE_FACTORY.table(null, derivedTableAlias), aliasedNodes.get(0).getAlias(), null); } else { List<ParseNode> nodes = Lists.<ParseNode> newArrayListWithExpectedSize(aliasedNodes.size()); for (AliasedNode aliasedNode : aliasedNodes) { nodes.add(derivedTableAlias == null ? aliasedNode.getNode() : NODE_FACTORY.column(NODE_FACTORY.table(null, derivedTableAlias), aliasedNode.getAlias(), null)); String alias = ParseNodeFactory.createTempAlias(); derivedTableSelect.add(NODE_FACTORY.aliasedNode(alias, aliasedNode.getNode())); aliasedNode = NODE_FACTORY.aliasedNode(aliasedNode.getAlias(), NODE_FACTORY.column(NODE_FACTORY.table(null, derivedTableAlias), alias, null)); selectNodes.set(i, aliasedNode); groupbyNodes.set(i - 1, aliasedNode.getNode()); tableNode = NODE_FACTORY.join(joinType, tableNode, rhsTable, onNode, false); firstChild = NODE_FACTORY.column(NODE_FACTORY.table(null, rhsTableAlias), selectNodes.get(0).getAlias(), null); if (isNonGroupByAggregate) { firstChild = NODE_FACTORY.upsertStmtArrayNode(Collections.singletonList(firstChild));
String alias = ParseNodeFactory.createTempAlias(); this.additionalSelectNodes.add(NODE_FACTORY.aliasedNode(alias, node.getLHS())); ParseNode lhsNode = NODE_FACTORY.column(tableName, alias, null); this.joinConditions.add(NODE_FACTORY.equal(lhsNode, node.getRHS())); return null; String alias = ParseNodeFactory.createTempAlias(); this.additionalSelectNodes.add(NODE_FACTORY.aliasedNode(alias, node.getRHS())); ParseNode rhsNode = NODE_FACTORY.column(tableName, alias, null); this.joinConditions.add(NODE_FACTORY.equal(node.getLHS(), rhsNode)); return null;
TableNode rhsTable = NODE_FACTORY.derivedTable(rhsTableAlias, subquery); JoinType joinType = isTopNode ? JoinType.Inner : JoinType.Left; ParseNode ret = NODE_FACTORY.comparison(node.getFilterOp(), l.get(0), NODE_FACTORY.column(NODE_FACTORY.table(null, rhsTableAlias), selectNodes.get(0).getAlias(), null)); tableNode = NODE_FACTORY.join(joinType, tableNode, rhsTable, onNode, !isAggregate || isGroupby);
@Override public ParseNode visitLeave(InParseNode node, List<ParseNode> l) throws SQLException { boolean isTopNode = topNode == node; if (isTopNode) { topNode = null; } SubqueryParseNode subqueryNode = (SubqueryParseNode) l.get(1); SelectStatement subquery = fixSubqueryStatement(subqueryNode.getSelectNode()); String rhsTableAlias = ParseNodeFactory.createTempAlias(); List<AliasedNode> selectNodes = fixAliasedNodes(subquery.getSelect(), true); subquery = NODE_FACTORY.select(subquery, !node.isSubqueryDistinct(), selectNodes); ParseNode onNode = getJoinConditionNode(l.get(0), selectNodes, rhsTableAlias); TableNode rhsTable = NODE_FACTORY.derivedTable(rhsTableAlias, subquery); JoinType joinType = isTopNode ? (node.isNegate() ? JoinType.Anti : JoinType.Semi) : JoinType.Left; ParseNode ret = isTopNode ? null : NODE_FACTORY.isNull(NODE_FACTORY.column(NODE_FACTORY.table(null, rhsTableAlias), selectNodes.get(0).getAlias(), null), !node.isNegate()); tableNode = NODE_FACTORY.join(joinType, tableNode, rhsTable, onNode, false); return ret; }
TableNode rhsTable = NODE_FACTORY.derivedTable(rhsTableAlias, subquery); JoinType joinType = isTopNode ? (node.isNegate() ? JoinType.Anti : JoinType.Semi) : JoinType.Left; ParseNode ret = isTopNode ? null : NODE_FACTORY.isNull(NODE_FACTORY.column(NODE_FACTORY.table(null, rhsTableAlias), selectNodes.get(0).getAlias(), null), !node.isNegate()); tableNode = NODE_FACTORY.join(joinType, tableNode, rhsTable, onNode, false);
@Override public ParseNode visit(ColumnParseNode node) throws SQLException { if (multiTable && node.getAlias() != null && node.getTableName() != null && SchemaUtil.normalizeIdentifier(node.getAlias()).equals(node.getName())) { node = NODE_FACTORY.column(TableName.create(node.getSchemaName(), node.getTableName()), node.isCaseSensitive() ? '"' + node.getName() + '"' : node.getName(), node.isCaseSensitive() ? '"' + node.getFullName() + '"' : node.getFullName()); } return super.visit(node); }
PColumn column = table.getPKColumns().get(i); projectedColumns.add(column); aliasedNodes.add(FACTORY.aliasedNode(null, FACTORY.column(null, '"' + column.getName().getString() + '"', null))); if(!projectedColumns.contains(column)) { projectedColumns.add(column); aliasedNodes.add(FACTORY.aliasedNode(null, FACTORY.column(hasNoColumnFamilies ? null : TableName.create(null, familyName), '"' + columnName + '"', null)));
table.getParentTableName().getString()); for (PColumn column : parentTableRef.getTable().getColumns()) { NODE_FACTORY.column(null, '"' + IndexUtil.getIndexColumnName(column) + '"', null).accept(visitor); table.getParentTableName().getString()); for (PColumn column : parentTableRef.getTable().getColumnFamily(familyName).getColumns()) { NODE_FACTORY.column(null, '"' + IndexUtil.getIndexColumnName(column) + '"', null).accept(visitor); NODE_FACTORY.column(TableName.create(null, familyName), '"' + column.getName().getString() + '"', null).accept(visitor);
private ParseNode getJoinConditionNode(ParseNode lhs, List<AliasedNode> rhs, String rhsTableAlias) throws SQLException { List<ParseNode> lhsNodes; if (lhs instanceof RowValueConstructorParseNode) { lhsNodes = ((RowValueConstructorParseNode) lhs).getChildren(); } else { lhsNodes = Collections.singletonList(lhs); } if (lhsNodes.size() != (rhs.size() - 1)) throw new SQLExceptionInfo.Builder(SQLExceptionCode.SUBQUERY_RETURNS_DIFFERENT_NUMBER_OF_FIELDS).build().buildException(); int count = lhsNodes.size(); TableName rhsTableName = NODE_FACTORY.table(null, rhsTableAlias); List<ParseNode> equalNodes = Lists.newArrayListWithExpectedSize(count); for (int i = 0; i < count; i++) { ParseNode rhsNode = NODE_FACTORY.column(rhsTableName, rhs.get(i + 1).getAlias(), null); equalNodes.add(NODE_FACTORY.equal(lhsNodes.get(i), rhsNode)); } return count == 1 ? equalNodes.get(0) : NODE_FACTORY.and(equalNodes); }
private ParseNode getJoinConditionNode(ParseNode lhs, List<AliasedNode> rhs, String rhsTableAlias) throws SQLException { List<ParseNode> lhsNodes; if (lhs instanceof RowValueConstructorParseNode) { lhsNodes = ((RowValueConstructorParseNode) lhs).getChildren(); } else { lhsNodes = Collections.singletonList(lhs); } if (lhsNodes.size() != (rhs.size() - 1)) throw new SQLExceptionInfo.Builder(SQLExceptionCode.SUBQUERY_RETURNS_DIFFERENT_NUMBER_OF_FIELDS).build().buildException(); int count = lhsNodes.size(); TableName rhsTableName = NODE_FACTORY.table(null, rhsTableAlias); List<ParseNode> equalNodes = Lists.newArrayListWithExpectedSize(count); for (int i = 0; i < count; i++) { ParseNode rhsNode = NODE_FACTORY.column(rhsTableName, rhs.get(i + 1).getAlias(), null); equalNodes.add(NODE_FACTORY.equal(lhsNodes.get(i), rhsNode)); } return count == 1 ? equalNodes.get(0) : NODE_FACTORY.and(equalNodes); }
@Override public ParseNode visit(ColumnParseNode node) throws SQLException { if (node.getTableName() == null) return super.visit(node); if (removeAlias) { if (node.getTableName().equals(tableAlias)) { return NODE_FACTORY.column(null, node.getName(), node.getAlias()); } return super.visit(node); } ParseNode aliasedNode = aliasMap.get(node.getFullName()); if (aliasedNode != null) { return aliasedNode; } return node; }
@Override public ParseNode visit(ColumnParseNode node) throws SQLException { if (node.getTableName() == null) return super.visit(node); if (removeAlias) { if (node.getTableName().equals(tableAlias)) { return NODE_FACTORY.column(null, node.getName(), node.getAlias()); } return super.visit(node); } ParseNode aliasedNode = aliasMap.get(node.getFullName()); if (aliasedNode != null) { return aliasedNode; } return node; }
@Override public ParseNode visitLeave(InParseNode node, List<ParseNode> l) throws SQLException { boolean isTopNode = topNode == node; if (isTopNode) { topNode = null; } SubqueryParseNode subqueryNode = (SubqueryParseNode) l.get(1); SelectStatement subquery = fixSubqueryStatement(subqueryNode.getSelectNode()); String rhsTableAlias = ParseNodeFactory.createTempAlias(); List<AliasedNode> selectNodes = fixAliasedNodes(subquery.getSelect(), true); subquery = NODE_FACTORY.select(subquery, !node.isSubqueryDistinct(), selectNodes); ParseNode onNode = getJoinConditionNode(l.get(0), selectNodes, rhsTableAlias); TableNode rhsTable = NODE_FACTORY.derivedTable(rhsTableAlias, subquery); JoinType joinType = isTopNode ? (node.isNegate() ? JoinType.Anti : JoinType.Semi) : JoinType.Left; ParseNode ret = isTopNode ? null : NODE_FACTORY.isNull(NODE_FACTORY.column(NODE_FACTORY.table(null, rhsTableAlias), selectNodes.get(0).getAlias(), null), !node.isNegate()); tableNode = NODE_FACTORY.join(joinType, tableNode, rhsTable, onNode, false); return ret; }
@Override public ParseNode visit(ColumnParseNode node) throws SQLException { if (multiTable && node.getAlias() != null && node.getTableName() != null && SchemaUtil.normalizeIdentifier(node.getAlias()).equals(node.getName())) { node = NODE_FACTORY.column(TableName.create(node.getSchemaName(), node.getTableName()), node.isCaseSensitive() ? '"' + node.getName() + '"' : node.getName(), node.isCaseSensitive() ? '"' + node.getFullName() + '"' : node.getFullName()); } return super.visit(node); }
@Override public ParseNode visit(ColumnParseNode node) throws SQLException { if (multiTable && node.getAlias() != null && node.getTableName() != null && SchemaUtil.normalizeIdentifier(node.getAlias()).equals(node.getName())) { node = NODE_FACTORY.column(TableName.create(node.getSchemaName(), node.getTableName()), node.isCaseSensitive() ? '"' + node.getName() + '"' : node.getName(), node.isCaseSensitive() ? '"' + node.getFullName() + '"' : node.getFullName()); } return super.visit(node); }