[ https://issues.apache.org/jira/browse/PHOENIX-1580?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14395476#comment-14395476 ]
Maryann Xue edited comment on PHOENIX-1580 at 4/4/15 2:39 AM: -------------------------------------------------------------- This is what I put in ParseNodeFactory.select(), very simple straight-forward steps: {code} + public SelectStatement select(List<SelectStatement> statements, List<OrderByNode> orderBy, LimitNode limit, int bindCount, boolean isAggregate) { + if (statements.size() == 1) + return select(statements.get(0), orderBy, limit, bindCount, isAggregate); + + return select(null, HintNode.EMPTY_HINT_NODE, false, Lists.newArrayList(aliasedNode(null, wildcard())), + null, null, null, null, limit, bindCount, false, false, statements); + } + {code} And this is what compiler does for ORDER-BY and LIMIT push down: {code} + public QueryPlan compileUnionAll(SelectStatement select) throws SQLException { + List<SelectStatement> unionAllSelects = select.getSelects(); + List<QueryPlan> plans = new ArrayList<QueryPlan>(); + + int numSelects = unionAllSelects.size(); + for (int i=0; i < numSelects; i++ ) { + SelectStatement subSelect = unionAllSelects.get(i); + // Push down order-by and limit into sub-selects. + if (!select.getOrderBy().isEmpty() || select.getLimit() != null) { + subSelect = NODE_FACTORY.select(subSelect, select.getOrderBy(), select.getLimit()); + } + QueryPlan subPlan = compileSubquery(subSelect); + TupleProjector projector = new TupleProjector(subPlan.getProjector()); + subPlan = new TupleProjectionPlan(subPlan, projector, null); + plans.add(subPlan); + } + UnionCompiler.checkProjectionNumAndTypes(plans); + + TableRef tableRef = UnionCompiler.contructSchemaTable(statement, plans.get(0)); + ColumnResolver resolver = FromCompiler.getResolver(tableRef); + StatementContext context = new StatementContext(statement, resolver, scan, sequenceManager); + + QueryPlan plan = compileSingleFlatQuery(context, select, statement.getParameters(), false, false, null, null, false); + plan = new UnionPlan(context, select, tableRef, plan.getProjector(), plan.getLimit(), plan.getOrderBy(), GroupBy.EMPTY_GROUP_BY, plans, null); + return plan; + } {code} was (Author: maryannxue): This is what I put in ParseNodeFactory.select(), very simple straight-forward steps: {code} + public SelectStatement select(List<SelectStatement> statements, List<OrderByNode> orderBy, LimitNode limit, int bindCount) { + if (statements.size() == 1) + return statements.get(0); + + return select(null, HintNode.EMPTY_HINT_NODE, false, Lists.newArrayList(aliasedNode(null, wildcard())), + null, null, null, null, limit, bindCount, false, false, statements); + } + {code} And this is what compiler does for ORDER-BY and LIMIT push down: {code} + public QueryPlan compileUnionAll(SelectStatement select) throws SQLException { + List<SelectStatement> unionAllSelects = select.getSelects(); + List<QueryPlan> plans = new ArrayList<QueryPlan>(); + + int numSelects = unionAllSelects.size(); + for (int i=0; i < numSelects; i++ ) { + SelectStatement subSelect = unionAllSelects.get(i); + // Push down order-by and limit into sub-selects. + if (!select.getOrderBy().isEmpty() || select.getLimit() != null) { + subSelect = NODE_FACTORY.select(subSelect, select.getOrderBy(), select.getLimit()); + } + QueryPlan subPlan = compileSubquery(subSelect); + TupleProjector projector = new TupleProjector(subPlan.getProjector()); + subPlan = new TupleProjectionPlan(subPlan, projector, null); + plans.add(subPlan); + } + UnionCompiler.checkProjectionNumAndTypes(plans); + + TableRef tableRef = UnionCompiler.contructSchemaTable(statement, plans.get(0)); + ColumnResolver resolver = FromCompiler.getResolver(tableRef); + StatementContext context = new StatementContext(statement, resolver, scan, sequenceManager); + + QueryPlan plan = compileSingleFlatQuery(context, select, statement.getParameters(), false, false, null, null, false); + plan = new UnionPlan(context, select, tableRef, plan.getProjector(), plan.getLimit(), plan.getOrderBy(), GroupBy.EMPTY_GROUP_BY, plans, null); + return plan; + } {code} > Support UNION ALL > ----------------- > > Key: PHOENIX-1580 > URL: https://issues.apache.org/jira/browse/PHOENIX-1580 > Project: Phoenix > Issue Type: Improvement > Reporter: Alicia Ying Shu > Assignee: Alicia Ying Shu > Attachments: PHOENIX-1580-grammar.patch, Phoenix-1580-v1.patch, > Phoenix-1580-v2.patch, Phoenix-1580-v3.patch, Phoenix-1580-v4.patch, > Phoenix-1580-v5.patch, Phoenix-1580-v6.patch, Phoenix-1580-v7.patch, > Phoenix-1580-v8.patch, phoenix-1580-v1-wipe.patch, phoenix-1580.patch, > unionall-wipe.patch > > > Select * from T1 > UNION ALL > Select * from T2 -- This message was sent by Atlassian JIRA (v6.3.4#6332)