/** * Find relations such that its schema contains a given column * * @param block the current block * @param columnName The column name to find relation * @return relations including a given column */ public static Collection<RelationNode> lookupTableByColumns(LogicalPlan.QueryBlock block, String columnName) { Set<RelationNode> found = new HashSet<>(); for (RelationNode rel : block.getRelations()) { if (rel.getLogicalSchema().contains(columnName)) { found.add(rel); } } return found; }
/** * Find relations such that its schema contains a given column * * @param block the current block * @param columnName The column name to find relation * @return relations including a given column */ public static Collection<RelationNode> lookupTableByColumns(LogicalPlan.QueryBlock block, String columnName) { Set<RelationNode> found = TUtil.newHashSet(); for (RelationNode rel : block.getRelations()) { if (rel.getLogicalSchema().contains(columnName)) { found.add(rel); } } return found; }
/** * Trying to find a column from all relations in other blocks * * @param plan The logical plan * @param columnRef The column reference to be found * @return The found column */ static Column resolveFromAllRelsInAllBlocks(LogicalPlan plan, ColumnReferenceExpr columnRef) throws AmbiguousColumnException { List<Column> candidates = Lists.newArrayList(); // from all relations of all query blocks for (LogicalPlan.QueryBlock eachBlock : plan.getQueryBlocks()) { for (RelationNode rel : eachBlock.getRelations()) { Column found = rel.getLogicalSchema().getColumn(columnRef.getName()); if (found != null) { candidates.add(found); } } } if (!candidates.isEmpty()) { return NameResolver.ensureUniqueColumn(candidates); } else { return null; } }
/** * It checks if evalNode can be evaluated at this @{link RelationNode}. */ public static boolean checkIfBeEvaluatedAtRelation(QueryBlock block, EvalNode evalNode, RelationNode node) { Set<Column> columnRefs = EvalTreeUtil.findUniqueColumns(evalNode); // aggregation functions cannot be evaluated in scan node if (EvalTreeUtil.findDistinctAggFunction(evalNode).size() > 0) { return false; } // aggregation functions cannot be evaluated in scan node if (EvalTreeUtil.findEvalsByType(evalNode, EvalType.WINDOW_FUNCTION).size() > 0) { return false; } if (columnRefs.size() > 0 && !node.getLogicalSchema().containsAll(columnRefs)) { return false; } // Why? - When a {case when} is used with outer join, case when must be evaluated at topmost outer join. if (containsOuterJoin(block)) { Collection<EvalNode> found = EvalTreeUtil.findOuterJoinSensitiveEvals(evalNode); if (found.size() > 0) { return false; } } return true; }
/** * Trying to find a column from all relations in other blocks * * @param plan The logical plan * @param columnRef The column reference to be found * @return The found column */ static Column resolveFromAllRelsInAllBlocks(LogicalPlan plan, ColumnReferenceExpr columnRef) throws AmbiguousColumnException { List<Column> candidates = Lists.newArrayList(); // from all relations of all query blocks for (LogicalPlan.QueryBlock eachBlock : plan.getQueryBlocks()) { for (RelationNode rel : eachBlock.getRelations()) { Column found = rel.getLogicalSchema().getColumn(columnRef.getName()); if (found != null) { candidates.add(found); } } } if (!candidates.isEmpty()) { return NameResolver.ensureUniqueColumn(candidates); } else { return null; } }
/** * It checks if evalNode can be evaluated at this @{link RelationNode}. */ public static boolean checkIfBeEvaluatedAtRelation(QueryBlock block, EvalNode evalNode, RelationNode node) { Set<Column> columnRefs = EvalTreeUtil.findUniqueColumns(evalNode); // aggregation functions cannot be evaluated in scan node if (EvalTreeUtil.findDistinctAggFunction(evalNode).size() > 0) { return false; } // aggregation functions cannot be evaluated in scan node if (EvalTreeUtil.findEvalsByType(evalNode, EvalType.WINDOW_FUNCTION).size() > 0) { return false; } if (columnRefs.size() > 0 && !node.getLogicalSchema().containsAll(columnRefs)) { return false; } // Why? - When a {case when} is used with outer join, case when must be evaluated at topmost outer join. if (containsOuterJoin(block)) { Collection<EvalNode> found = EvalTreeUtil.findOuterJoinSensitiveEvals(evalNode); if (found.size() > 0) { return false; } } return true; }
Column found = rel.getLogicalSchema().getColumn(columnName); if (found != null) { candidates.add(found);
private static LinkedHashSet<Target> createFieldTargetsFromRelation(QueryBlock block, RelationNode relationNode, Set<String> newlyEvaluatedRefNames) { LinkedHashSet<Target> targets = Sets.newLinkedHashSet(); for (Column column : relationNode.getLogicalSchema().getAllColumns()) { // TODO - Currently, EvalNode has DataType as a return type. So, RECORD cannot be used for any target. // The following line is a kind of hack, preventing RECORD to be used for target in the logical planning phase. // This problem should be resolved after TAJO-1402. if (column.getTypeDesc().getDataType().getType() == TajoDataTypes.Type.RECORD) { continue; } String aliasName = block.namedExprsMgr.checkAndGetIfAliasedColumn(column.getQualifiedName()); if (aliasName != null) { targets.add(new Target(new FieldEval(column), aliasName)); newlyEvaluatedRefNames.remove(aliasName); } else { targets.add(new Target(new FieldEval(column))); } } return targets; }
private static LinkedHashSet<Target> createFieldTargetsFromRelation(QueryBlock block, RelationNode relationNode, Set<String> newlyEvaluatedRefNames) { LinkedHashSet<Target> targets = Sets.newLinkedHashSet(); for (Column column : relationNode.getLogicalSchema().getAllColumns()) { // TODO - Currently, EvalNode has DataType as a return type. So, RECORD cannot be used for any target. // The following line is a kind of hack, preventing RECORD to be used for target in the logical planning phase. // This problem should be resolved after TAJO-1402. if (column.getTypeDesc().getDataType().getType() == TajoDataTypes.Type.RECORD) { continue; } String aliasName = block.namedExprsMgr.checkAndGetIfAliasedColumn(column.getQualifiedName()); if (aliasName != null) { targets.add(new Target(new FieldEval(column), aliasName)); newlyEvaluatedRefNames.remove(aliasName); } else { targets.add(new Target(new FieldEval(column))); } } return targets; }
Column found = rel.getLogicalSchema().getColumn(columnName); if (found != null) { candidates.add(found);
Schema schema = relationOp.getLogicalSchema(); Column[] resolvedColumns = new Column[schema.size()]; return schema.getRootColumns().toArray(resolvedColumns); relationOp = iterator.next(); if (relationOp.isNameResolveBase()) { schema = relationOp.getLogicalSchema(); resolvedColumns.addAll(schema.getRootColumns());
Schema schema = relationOp.getLogicalSchema(); Column[] resolvedColumns = new Column[schema.size()]; return schema.getRootColumns().toArray(resolvedColumns); relationOp = iterator.next(); if (relationOp.isNameResolveBase()) { schema = relationOp.getLogicalSchema(); resolvedColumns.addAll(schema.getRootColumns());
if (currentNode != null) { if (currentNode instanceof RelationNode) { currentNodeSchema = ((RelationNode) currentNode).getLogicalSchema(); } else { currentNodeSchema = currentNode.getInSchema();
if (currentNode != null) { if (currentNode instanceof RelationNode) { currentNodeSchema = ((RelationNode) currentNode).getLogicalSchema(); } else { currentNodeSchema = currentNode.getInSchema();
createIndexNode.setKeySortSpecs(relationNode.getLogicalSchema(), annotateSortSpecs(block, referNames, sortSpecs)); createIndexNode.setIndexMethod(IndexMethod.valueOf(createIndex.getMethodSpec().getName().toUpperCase())); if (createIndex.isExternal()) {
createIndexNode.setKeySortSpecs(relationNode.getLogicalSchema(), annotateSortSpecs(block, referNames, sortSpecs)); createIndexNode.setIndexMethod(IndexMethod.valueOf(createIndex.getMethodSpec().getName().toUpperCase())); if (createIndex.isExternal()) {
LogicalPlan.QueryBlock parentBlock = plan.getParentBlock(current); for (RelationNode relationNode : parentBlock.getRelations()) { if (relationNode.getLogicalSchema().containsByQualifiedName(columnRef.getCanonicalName())) { throw new TajoRuntimeException(new NotImplementedException("Correlated subquery")); Schema schema = relationOp.getLogicalSchema(); column = schema.getColumn(canonicalName);
LogicalPlan.QueryBlock parentBlock = plan.getParentBlock(current); for (RelationNode relationNode : parentBlock.getRelations()) { if (relationNode.getLogicalSchema().containsByQualifiedName(columnRef.getCanonicalName())) { throw new TajoRuntimeException(new NotImplementedException("Correlated subquery")); Schema schema = relationOp.getLogicalSchema(); column = schema.getColumn(canonicalName);
RelationNode relationNode = (RelationNode) projectable; prohibitNestedRecordProjection((Projectable) relationNode); verifyIfTargetsCanBeEvaluated(relationNode.getLogicalSchema(), (Projectable) relationNode);
RelationNode relationNode = (RelationNode) projectable; prohibitNestedRecordProjection((Projectable) relationNode); verifyIfTargetsCanBeEvaluated(relationNode.getLogicalSchema(), (Projectable) relationNode);