@Override public ColumnReferenceExpr visitColumn_reference(Column_referenceContext ctx) { String columnReferenceName = buildIdentifierChain(ctx.identifier()); // find the last dot (.) position to separate a name into both a qualifier and name int lastDotIdx = columnReferenceName.lastIndexOf("."); if (lastDotIdx > 0) { // if any qualifier is given String qualifier = columnReferenceName.substring(0, lastDotIdx); String name = columnReferenceName.substring(lastDotIdx + 1, columnReferenceName.length()); return new ColumnReferenceExpr(qualifier, name); } else { return new ColumnReferenceExpr(ctx.getText()); } }
/** * It transforms ColumnDefinition array to String array. * * @param columnReferenceExprs * @return */ private static String[] convertColumnsToStrings(ColumnReferenceExpr[] columnReferenceExprs) { int columnCount = columnReferenceExprs.length; String[] columns = new String[columnCount]; for(int i = 0; i < columnCount; i++) { ColumnReferenceExpr columnReferenceExpr = columnReferenceExprs[i]; columns[i] = columnReferenceExpr.getName(); } return columns; }
@Override public Expr visitColumnReference(ExprNormalizedResult ctx, Stack<Expr> stack, ColumnReferenceExpr expr) throws TajoException { if (ctx.block.isAliasedName(expr.getCanonicalName())) { String originalName = ctx.block.getOriginalName(expr.getCanonicalName()); expr.setName(originalName); return expr; } // if a column reference is not qualified, it finds and sets the qualified column name. if (!(expr.hasQualifier() && CatalogUtil.isFQTableName(expr.getQualifier()))) { if (!ctx.block.namedExprsMgr.contains(expr.getCanonicalName()) && expr.getType() == OpType.Column) { try { String normalized = NameResolver.resolve(ctx.plan, ctx.block, expr, NameResolvingMode.LEGACY).getQualifiedName(); expr.setName(normalized); } catch (UndefinedColumnException nsc) { } } } return expr; }
@Override public LogicalNode visitFilter(ProcessorContext ctx, Stack<Expr> stack, Selection expr) throws TajoException { Set<ColumnReferenceExpr> columnSet = ExprFinder.finds(expr.getQual(), OpType.Column); for (ColumnReferenceExpr col : columnSet) { if (!ctx.aliasSet.contains(col.getName())) { NameRefInSelectListNormalizer.normalize(ctx.planContext, col); TUtil.putToNestedList(ctx.projectColumns, col.getQualifier(), col); } } super.visitFilter(ctx, stack, expr); SelectionNode node = getNodeFromExpr(ctx.planContext.getPlan(), expr); LogicalNode child = getNonRelationListExpr(ctx.planContext.getPlan(), expr.getChild()); node.setInSchema(child.getOutSchema()); node.setOutSchema(node.getInSchema()); return node; }
qualifiedName = IdentifierUtil.buildFQName(qualifier, columnRef.getName()); throw new UndefinedColumnException(columnRef.getCanonicalName()); if (block.getNamedExprsManager().isAliased(qualifiedName)) { String alias = block.getNamedExprsManager().getAlias(qualifiedName); found = resolve(plan, block, new ColumnReferenceExpr(alias), NameResolvingMode.LEGACY, includeSeflDescTable); if (found != null) { candidates.add(found);
throws AmbiguousColumnException, AmbiguousTableException, UndefinedColumnException { Preconditions.checkArgument(columnRef.hasQualifier(), "ColumnReferenceExpr must be qualified."); String [] qualifierParts = columnRef.getQualifier().split("\\."); throw new AmbiguousColumnException(columnRef.getCanonicalName()); throw new AmbiguousColumnException(columnRef.getCanonicalName()); } else if (guessedRelations.size() == 0) { throw new UndefinedColumnException(columnRef.getCanonicalName()); throw new UndefinedColumnException(columnRef.getCanonicalName()); throw new AmbiguousColumnException(columnRef.getCanonicalName()); columnName = columnRef.getName(); } else { columnName += NestedPathUtil.PATH_DELIMITER + columnRef.getName();
static Column resolveColumnWithoutQualifier(LogicalPlan plan, LogicalPlan.QueryBlock block, ColumnReferenceExpr columnRef, boolean includeSeflDescTable) throws AmbiguousColumnException, UndefinedColumnException { Column found = lookupColumnFromAllRelsInBlock(block, columnRef.getName(), includeSeflDescTable); if (found != null) { return found; } found = resolveAliasedName(block, columnRef); if (found != null) { return found; } found = resolveFromCurrentAndChildNode(block, columnRef); if (found != null) { return found; } found = resolveFromAllRelsInAllBlocks(plan, columnRef); if (found != null) { return found; } throw new UndefinedColumnException(columnRef.getCanonicalName()); } }
String canonicalName; if (columnRef.hasQualifier()) { Pair<String, String> normalized; try { LogicalPlan.QueryBlock parentBlock = plan.getParentBlock(current); for (RelationNode relationNode : parentBlock.getRelations()) { if (relationNode.getLogicalSchema().containsByQualifiedName(columnRef.getCanonicalName())) { throw new TajoRuntimeException(new NotImplementedException("Correlated subquery")); return lookupColumnFromAllRelsInBlock(block, columnRef.getName(), includeSeflDescTable);
/** * It returns an original column name if it is aliased column reference. * Otherwise, it will return NULL. */ public String checkAndGetIfAliasedColumn(String name) { Expr expr = getExpr(name); if (expr != null && expr.getType() == OpType.Column) { ColumnReferenceExpr column = (ColumnReferenceExpr) expr; if (!column.getCanonicalName().equals(name)) { return column.getCanonicalName(); } } return null; }
public ColumnReferenceExpr(String referenceName) { super(OpType.Column); setName(referenceName); }
@Override public Object clone() throws CloneNotSupportedException { RangePartition range = (RangePartition) super.clone(); if (columns != null) { range.columns = new ColumnReferenceExpr[columns.length]; for (int i = 0; i < columns.length; i++) { range.columns[i] = (ColumnReferenceExpr) columns[i].clone(); } } if (specifiers != null) { range.specifiers = new ArrayList<>(); for (int i = 0; i < specifiers.size(); i++) { range.specifiers.add(specifiers.get(i)); } } return range; } }
@Override public LogicalNode visitProjection(ProcessorContext ctx, Stack<Expr> stack, Projection expr) throws TajoException { if (PlannerUtil.hasAsterisk(expr.getNamedExprs())) { throw new UnsupportedException("Asterisk for self-describing data formats"); } for (NamedExpr eachNamedExpr : expr.getNamedExprs()) { Set<ColumnReferenceExpr> columns = ExprFinder.finds(eachNamedExpr, OpType.Column); for (ColumnReferenceExpr col : columns) { TUtil.putToNestedList(ctx.projectColumns, col.getQualifier(), col); } if (eachNamedExpr.hasAlias()) { ctx.aliasSet.add(eachNamedExpr.getAlias()); } } super.visitProjection(ctx, stack, expr); ProjectionNode node = getNodeFromExpr(ctx.planContext.getPlan(), expr); LogicalNode child = getNonRelationListExpr(ctx.planContext.getPlan(), expr.getChild()); node.setInSchema(child.getOutSchema()); return node; }
@Override public Column resolve(LogicalPlan plan, LogicalPlan.QueryBlock block, ColumnReferenceExpr columnRef, boolean includeSeflDescTable) throws TajoException { if (columnRef.hasQualifier()) { return resolveColumnWithQualifier(plan, block, columnRef, includeSeflDescTable); } else { return resolveColumnWithoutQualifier(plan, block, columnRef, includeSeflDescTable); } }
@Override public LogicalNode visitFilter(ProcessorContext ctx, Stack<Expr> stack, Selection expr) throws TajoException { Set<ColumnReferenceExpr> columnSet = ExprFinder.finds(expr.getQual(), OpType.Column); for (ColumnReferenceExpr col : columnSet) { if (!ctx.aliasSet.contains(col.getName())) { NameRefInSelectListNormalizer.normalize(ctx.planContext, col); TUtil.putToNestedList(ctx.projectColumns, col.getQualifier(), col); } } super.visitFilter(ctx, stack, expr); SelectionNode node = getNodeFromExpr(ctx.planContext.getPlan(), expr); LogicalNode child = getNonRelationListExpr(ctx.planContext.getPlan(), expr.getChild()); node.setInSchema(child.getOutSchema()); node.setOutSchema(node.getInSchema()); return node; }
qualifiedName = CatalogUtil.buildFQName(qualifier, columnRef.getName()); throw new UndefinedColumnException(columnRef.getCanonicalName()); if (block.getNamedExprsManager().isAliased(qualifiedName)) { String alias = block.getNamedExprsManager().getAlias(qualifiedName); found = resolve(plan, block, new ColumnReferenceExpr(alias), NameResolvingMode.LEGACY, includeSeflDescTable); if (found != null) { candidates.add(found);
throws AmbiguousColumnException, AmbiguousTableException, UndefinedColumnException { Preconditions.checkArgument(columnRef.hasQualifier(), "ColumnReferenceExpr must be qualified."); String [] qualifierParts = columnRef.getQualifier().split("\\."); throw new AmbiguousColumnException(columnRef.getCanonicalName()); throw new AmbiguousColumnException(columnRef.getCanonicalName()); } else if (guessedRelations.size() == 0) { throw new UndefinedColumnException(columnRef.getCanonicalName()); throw new UndefinedColumnException(columnRef.getCanonicalName()); throw new AmbiguousColumnException(columnRef.getCanonicalName()); columnName = columnRef.getName(); } else { columnName += NestedPathUtil.PATH_DELIMITER + columnRef.getName();
static Column resolveColumnWithoutQualifier(LogicalPlan plan, LogicalPlan.QueryBlock block, ColumnReferenceExpr columnRef, boolean includeSeflDescTable) throws AmbiguousColumnException, UndefinedColumnException { Column found = lookupColumnFromAllRelsInBlock(block, columnRef.getName(), includeSeflDescTable); if (found != null) { return found; } found = resolveAliasedName(block, columnRef); if (found != null) { return found; } found = resolveFromCurrentAndChildNode(block, columnRef); if (found != null) { return found; } found = resolveFromAllRelsInAllBlocks(plan, columnRef); if (found != null) { return found; } throw new UndefinedColumnException(columnRef.getCanonicalName()); } }
String canonicalName; if (columnRef.hasQualifier()) { Pair<String, String> normalized; try { LogicalPlan.QueryBlock parentBlock = plan.getParentBlock(current); for (RelationNode relationNode : parentBlock.getRelations()) { if (relationNode.getLogicalSchema().containsByQualifiedName(columnRef.getCanonicalName())) { throw new TajoRuntimeException(new NotImplementedException("Correlated subquery")); return lookupColumnFromAllRelsInBlock(block, columnRef.getName(), includeSeflDescTable);
/** * It returns an original column name if it is aliased column reference. * Otherwise, it will return NULL. */ public String checkAndGetIfAliasedColumn(String name) { Expr expr = getExpr(name); if (expr != null && expr.getType() == OpType.Column) { ColumnReferenceExpr column = (ColumnReferenceExpr) expr; if (!column.getCanonicalName().equals(name)) { return column.getCanonicalName(); } } return null; }
public ColumnReferenceExpr(String referenceName) { super(OpType.Column); setName(referenceName); }