String [] qualifierParts = columnRef.getQualifier().split("\\.");
String [] qualifierParts = columnRef.getQualifier().split("\\.");
@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; }
@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; }
@Override public LogicalNode visitSort(ProcessorContext ctx, Stack<Expr> stack, Sort expr) throws TajoException { for (Sort.SortSpec sortSpec : expr.getSortSpecs()) { Set<ColumnReferenceExpr> columns = ExprFinder.finds(sortSpec.getKey(), OpType.Column); for (ColumnReferenceExpr col : columns) { if (!ctx.aliasSet.contains(col.getName())) { NameRefInSelectListNormalizer.normalize(ctx.planContext, col); TUtil.putToNestedList(ctx.projectColumns, col.getQualifier(), col); } } } super.visitSort(ctx, stack, expr); SortNode node = getNodeFromExpr(ctx.planContext.getPlan(), expr); LogicalNode child = getNonRelationListExpr(ctx.planContext.getPlan(), expr.getChild()); node.setInSchema(child.getOutSchema()); node.setOutSchema(node.getInSchema()); return node; }
@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 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 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() && IdentifierUtil.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 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; }
assertEquals("default.lineitem", conditionLeft.getQualifier()); assertEquals("l_discount", conditionLeft.getName()); assertEquals(OpType.Divide, result.getType()); ColumnReferenceExpr resultLeft = result.getLeft(); assertEquals("default.lineitem", resultLeft.getQualifier()); assertEquals("l_discount", resultLeft.getName()); assertEquals("default.lineitem", resultRight.getQualifier()); assertEquals("l_tax", resultRight.getName());
@Test public final void testBinaryOperator1() throws CloneNotSupportedException, TajoException { QueryContext qc = createQueryContext(); Expr expr = sqlAnalyzer.parse(QUERIES[0]); LogicalPlan plan = planner.createPlan(qc, expr); LogicalOptimizer optimizer = new LogicalOptimizer(util.getConfiguration(), catalog, TablespaceManager.getInstance()); optimizer.optimize(plan); LogicalNode node = plan.getRootBlock().getRoot(); ScanNode scanNode = PlannerUtil.findTopNode(node, NodeType.SCAN); EvalNodeToExprConverter convertor = new EvalNodeToExprConverter(scanNode.getTableName()); convertor.visit(null, scanNode.getQual(), new Stack<>()); Expr resultExpr = convertor.getResult(); BinaryOperator binaryOperator = AlgebraicUtil.findTopExpr(resultExpr, OpType.GreaterThan); assertNotNull(binaryOperator); ColumnReferenceExpr column = binaryOperator.getLeft(); assertEquals("default.lineitem", column.getQualifier()); assertEquals("l_orderkey", column.getName()); LiteralValue literalValue = binaryOperator.getRight(); assertEquals("500", literalValue.getValue()); assertEquals(LiteralValue.LiteralType.Unsigned_Integer, literalValue.getValueType()); }
@Test public final void testBinaryOperator2() throws CloneNotSupportedException, TajoException { QueryContext qc = createQueryContext(); Expr expr = sqlAnalyzer.parse(QUERIES[1]); LogicalPlan plan = planner.createPlan(qc, expr); LogicalOptimizer optimizer = new LogicalOptimizer(util.getConfiguration(), catalog, TablespaceManager.getInstance()); optimizer.optimize(plan); LogicalNode node = plan.getRootBlock().getRoot(); ScanNode scanNode = PlannerUtil.findTopNode(node, NodeType.SCAN); EvalNodeToExprConverter convertor = new EvalNodeToExprConverter(scanNode.getTableName()); convertor.visit(null, scanNode.getQual(), new Stack<>()); Expr resultExpr = convertor.getResult(); BinaryOperator equals = AlgebraicUtil.findTopExpr(resultExpr, OpType.Equals); assertNotNull(equals); ColumnReferenceExpr column = equals.getLeft(); assertEquals("default.region", column.getQualifier()); assertEquals("r_name", column.getName()); LiteralValue literalValue = equals.getRight(); assertEquals("EUROPE", literalValue.getValue()); assertEquals(LiteralValue.LiteralType.String, literalValue.getValueType()); }
assertEquals("default.lineitem", greaterThanOrEqualsLeft.getQualifier()); assertEquals("l_discount", greaterThanOrEqualsLeft.getName()); assertEquals("default.lineitem", lessThanOrEqualsLeft.getQualifier()); assertEquals("l_discount", lessThanOrEqualsLeft.getName()); assertEquals("default.lineitem", lessThanLeft.getQualifier()); assertEquals("l_quantity", lessThanLeft.getName());
assertEquals("default.part", predicand.getQualifier()); assertEquals("p_size", predicand.getName()); assertEquals("default.part", equalsLeft.getQualifier()); assertEquals("p_brand", equalsLeft.getName());
assertNotNull(binaryOperator); ColumnReferenceExpr column = binaryOperator.getLeft(); assertEquals("default.lineitem", column.getQualifier()); assertEquals("l_orderkey", column.getName()); assertEquals("default.lineitem", predicand.getQualifier()); assertEquals("l_discount", predicand.getName());