Search in sources :

Example 6 with AggregatePlan

use of org.apache.phoenix.execute.AggregatePlan in project phoenix by apache.

the class QueryCompilerTest method testSortMergeJoinSubQueryOrderByOverrideBug3745.

@Test
public void testSortMergeJoinSubQueryOrderByOverrideBug3745() throws Exception {
    Connection conn = null;
    try {
        conn = DriverManager.getConnection(getUrl());
        String tableName1 = "MERGE1";
        String tableName2 = "MERGE2";
        conn.createStatement().execute("DROP TABLE if exists " + tableName1);
        String sql = "CREATE TABLE IF NOT EXISTS " + tableName1 + " ( " + "AID INTEGER PRIMARY KEY," + "AGE INTEGER" + ")";
        conn.createStatement().execute(sql);
        conn.createStatement().execute("DROP TABLE if exists " + tableName2);
        sql = "CREATE TABLE IF NOT EXISTS " + tableName2 + " ( " + "BID INTEGER PRIMARY KEY," + "CODE INTEGER" + ")";
        conn.createStatement().execute(sql);
        //test for simple scan
        sql = "select /*+ USE_SORT_MERGE_JOIN */ a.aid,b.code from (select aid,age from " + tableName1 + " where age >=11 and age<=33 order by age limit 3) a inner join " + "(select bid,code from " + tableName2 + " order by code limit 1) b on a.aid=b.bid ";
        QueryPlan queryPlan = getQueryPlan(conn, sql);
        SortMergeJoinPlan sortMergeJoinPlan = (SortMergeJoinPlan) ((ClientScanPlan) queryPlan).getDelegate();
        ClientScanPlan lhsOuterPlan = (ClientScanPlan) ((TupleProjectionPlan) (sortMergeJoinPlan.getLhsPlan())).getDelegate();
        OrderBy orderBy = lhsOuterPlan.getOrderBy();
        assertTrue(orderBy.getOrderByExpressions().size() == 1);
        assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("AID"));
        ScanPlan innerScanPlan = (ScanPlan) ((TupleProjectionPlan) lhsOuterPlan.getDelegate()).getDelegate();
        orderBy = innerScanPlan.getOrderBy();
        assertTrue(orderBy.getOrderByExpressions().size() == 1);
        assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("AGE"));
        assertTrue(innerScanPlan.getLimit().intValue() == 3);
        ClientScanPlan rhsOuterPlan = (ClientScanPlan) ((TupleProjectionPlan) (sortMergeJoinPlan.getRhsPlan())).getDelegate();
        orderBy = rhsOuterPlan.getOrderBy();
        assertTrue(orderBy.getOrderByExpressions().size() == 1);
        assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("BID"));
        innerScanPlan = (ScanPlan) ((TupleProjectionPlan) rhsOuterPlan.getDelegate()).getDelegate();
        orderBy = innerScanPlan.getOrderBy();
        assertTrue(orderBy.getOrderByExpressions().size() == 1);
        assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("CODE"));
        assertTrue(innerScanPlan.getLimit().intValue() == 1);
        //test for aggregate
        sql = "select /*+ USE_SORT_MERGE_JOIN */ a.aid,b.codesum from (select aid,sum(age) agesum from " + tableName1 + " where age >=11 and age<=33 group by aid order by agesum limit 3) a inner join " + "(select bid,sum(code) codesum from " + tableName2 + " group by bid order by codesum limit 1) b on a.aid=b.bid ";
        queryPlan = getQueryPlan(conn, sql);
        sortMergeJoinPlan = (SortMergeJoinPlan) ((ClientScanPlan) queryPlan).getDelegate();
        lhsOuterPlan = (ClientScanPlan) ((TupleProjectionPlan) (sortMergeJoinPlan.getLhsPlan())).getDelegate();
        orderBy = lhsOuterPlan.getOrderBy();
        assertTrue(orderBy.getOrderByExpressions().size() == 1);
        assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("AID"));
        AggregatePlan innerAggregatePlan = (AggregatePlan) ((TupleProjectionPlan) lhsOuterPlan.getDelegate()).getDelegate();
        orderBy = innerAggregatePlan.getOrderBy();
        assertTrue(orderBy.getOrderByExpressions().size() == 1);
        assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("SUM(AGE)"));
        assertTrue(innerAggregatePlan.getLimit().intValue() == 3);
        rhsOuterPlan = (ClientScanPlan) ((TupleProjectionPlan) (sortMergeJoinPlan.getRhsPlan())).getDelegate();
        orderBy = rhsOuterPlan.getOrderBy();
        assertTrue(orderBy.getOrderByExpressions().size() == 1);
        assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("BID"));
        innerAggregatePlan = (AggregatePlan) ((TupleProjectionPlan) rhsOuterPlan.getDelegate()).getDelegate();
        orderBy = innerAggregatePlan.getOrderBy();
        assertTrue(orderBy.getOrderByExpressions().size() == 1);
        assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("SUM(CODE)"));
        assertTrue(innerAggregatePlan.getLimit().intValue() == 1);
        String tableName3 = "merge3";
        conn.createStatement().execute("DROP TABLE if exists " + tableName3);
        sql = "CREATE TABLE IF NOT EXISTS " + tableName3 + " ( " + "CID INTEGER PRIMARY KEY," + "REGION INTEGER" + ")";
        conn.createStatement().execute(sql);
        //test for join
        sql = "select t1.aid,t1.code,t2.region from " + "(select a.aid,b.code from " + tableName1 + " a inner join " + tableName2 + " b on a.aid=b.bid where b.code >=44 and b.code<=66 order by b.code limit 3) t1 inner join " + "(select a.aid,c.region from " + tableName1 + " a inner join " + tableName3 + " c on a.aid=c.cid where c.region>=77 and c.region<=99 order by c.region desc limit 1) t2 on t1.aid=t2.aid";
        PhoenixPreparedStatement phoenixPreparedStatement = conn.prepareStatement(sql).unwrap(PhoenixPreparedStatement.class);
        queryPlan = phoenixPreparedStatement.optimizeQuery(sql);
        sortMergeJoinPlan = (SortMergeJoinPlan) ((ClientScanPlan) queryPlan).getDelegate();
        lhsOuterPlan = (ClientScanPlan) ((TupleProjectionPlan) (sortMergeJoinPlan.getLhsPlan())).getDelegate();
        orderBy = lhsOuterPlan.getOrderBy();
        assertTrue(orderBy.getOrderByExpressions().size() == 1);
        assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("AID"));
        innerScanPlan = (ScanPlan) ((HashJoinPlan) ((TupleProjectionPlan) lhsOuterPlan.getDelegate()).getDelegate()).getDelegate();
        orderBy = innerScanPlan.getOrderBy();
        assertTrue(orderBy.getOrderByExpressions().size() == 1);
        assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("B.CODE"));
        assertTrue(innerScanPlan.getLimit().intValue() == 3);
        rhsOuterPlan = (ClientScanPlan) ((TupleProjectionPlan) (sortMergeJoinPlan.getRhsPlan())).getDelegate();
        orderBy = rhsOuterPlan.getOrderBy();
        assertTrue(orderBy.getOrderByExpressions().size() == 1);
        assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("AID"));
        innerScanPlan = (ScanPlan) ((HashJoinPlan) ((TupleProjectionPlan) rhsOuterPlan.getDelegate()).getDelegate()).getDelegate();
        orderBy = innerScanPlan.getOrderBy();
        assertTrue(orderBy.getOrderByExpressions().size() == 1);
        assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("C.REGION DESC"));
        assertTrue(innerScanPlan.getLimit().intValue() == 1);
        //test for join and aggregate
        sql = "select t1.aid,t1.codesum,t2.regionsum from " + "(select a.aid,sum(b.code) codesum from " + tableName1 + " a inner join " + tableName2 + " b on a.aid=b.bid where b.code >=44 and b.code<=66 group by a.aid order by codesum limit 3) t1 inner join " + "(select a.aid,sum(c.region) regionsum from " + tableName1 + " a inner join " + tableName3 + " c on a.aid=c.cid where c.region>=77 and c.region<=99 group by a.aid order by regionsum desc limit 2) t2 on t1.aid=t2.aid";
        phoenixPreparedStatement = conn.prepareStatement(sql).unwrap(PhoenixPreparedStatement.class);
        queryPlan = phoenixPreparedStatement.optimizeQuery(sql);
        sortMergeJoinPlan = (SortMergeJoinPlan) ((ClientScanPlan) queryPlan).getDelegate();
        lhsOuterPlan = (ClientScanPlan) ((TupleProjectionPlan) (sortMergeJoinPlan.getLhsPlan())).getDelegate();
        orderBy = lhsOuterPlan.getOrderBy();
        assertTrue(orderBy.getOrderByExpressions().size() == 1);
        assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("AID"));
        innerAggregatePlan = (AggregatePlan) ((HashJoinPlan) ((TupleProjectionPlan) lhsOuterPlan.getDelegate()).getDelegate()).getDelegate();
        orderBy = innerAggregatePlan.getOrderBy();
        assertTrue(orderBy.getOrderByExpressions().size() == 1);
        assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("SUM(B.CODE)"));
        assertTrue(innerAggregatePlan.getLimit().intValue() == 3);
        rhsOuterPlan = (ClientScanPlan) ((TupleProjectionPlan) (sortMergeJoinPlan.getRhsPlan())).getDelegate();
        orderBy = rhsOuterPlan.getOrderBy();
        assertTrue(orderBy.getOrderByExpressions().size() == 1);
        assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("AID"));
        innerAggregatePlan = (AggregatePlan) ((HashJoinPlan) ((TupleProjectionPlan) rhsOuterPlan.getDelegate()).getDelegate()).getDelegate();
        orderBy = innerAggregatePlan.getOrderBy();
        assertTrue(orderBy.getOrderByExpressions().size() == 1);
        assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("SUM(C.REGION) DESC"));
        assertTrue(innerAggregatePlan.getLimit().intValue() == 2);
        //test for if SubselectRewriter.isOrderByPrefix had take effect
        sql = "select t1.aid,t1.codesum,t2.regionsum from " + "(select a.aid,sum(b.code) codesum from " + tableName1 + " a inner join " + tableName2 + " b on a.aid=b.bid where b.code >=44 and b.code<=66 group by a.aid order by a.aid,codesum limit 3) t1 inner join " + "(select a.aid,sum(c.region) regionsum from " + tableName1 + " a inner join " + tableName3 + " c on a.aid=c.cid where c.region>=77 and c.region<=99 group by a.aid order by a.aid desc,regionsum desc limit 2) t2 on t1.aid=t2.aid " + "order by t1.aid desc";
        phoenixPreparedStatement = conn.prepareStatement(sql).unwrap(PhoenixPreparedStatement.class);
        queryPlan = phoenixPreparedStatement.optimizeQuery(sql);
        orderBy = queryPlan.getOrderBy();
        assertTrue(orderBy.getOrderByExpressions().size() == 1);
        assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("T1.AID DESC"));
        sortMergeJoinPlan = (SortMergeJoinPlan) ((ClientScanPlan) queryPlan).getDelegate();
        innerAggregatePlan = (AggregatePlan) ((HashJoinPlan) (((TupleProjectionPlan) sortMergeJoinPlan.getLhsPlan()).getDelegate())).getDelegate();
        orderBy = innerAggregatePlan.getOrderBy();
        assertTrue(orderBy.getOrderByExpressions().size() == 2);
        assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("A.AID"));
        assertTrue(orderBy.getOrderByExpressions().get(1).toString().equals("SUM(B.CODE)"));
        assertTrue(innerAggregatePlan.getLimit().intValue() == 3);
        rhsOuterPlan = (ClientScanPlan) ((TupleProjectionPlan) (sortMergeJoinPlan.getRhsPlan())).getDelegate();
        orderBy = rhsOuterPlan.getOrderBy();
        assertTrue(orderBy.getOrderByExpressions().size() == 1);
        assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("AID"));
        innerAggregatePlan = (AggregatePlan) ((HashJoinPlan) ((TupleProjectionPlan) rhsOuterPlan.getDelegate()).getDelegate()).getDelegate();
        orderBy = innerAggregatePlan.getOrderBy();
        assertTrue(orderBy.getOrderByExpressions().size() == 2);
        assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("A.AID DESC"));
        assertTrue(orderBy.getOrderByExpressions().get(1).toString().equals("SUM(C.REGION) DESC"));
        assertTrue(innerAggregatePlan.getLimit().intValue() == 2);
    } finally {
        if (conn != null) {
            conn.close();
        }
    }
}
Also used : OrderBy(org.apache.phoenix.compile.OrderByCompiler.OrderBy) ClientScanPlan(org.apache.phoenix.execute.ClientScanPlan) ScanPlan(org.apache.phoenix.execute.ScanPlan) TupleProjectionPlan(org.apache.phoenix.execute.TupleProjectionPlan) HashJoinPlan(org.apache.phoenix.execute.HashJoinPlan) Connection(java.sql.Connection) PhoenixConnection(org.apache.phoenix.jdbc.PhoenixConnection) SortMergeJoinPlan(org.apache.phoenix.execute.SortMergeJoinPlan) AggregatePlan(org.apache.phoenix.execute.AggregatePlan) PhoenixPreparedStatement(org.apache.phoenix.jdbc.PhoenixPreparedStatement) ClientScanPlan(org.apache.phoenix.execute.ClientScanPlan) Test(org.junit.Test) BaseConnectionlessQueryTest(org.apache.phoenix.query.BaseConnectionlessQueryTest)

Aggregations

AggregatePlan (org.apache.phoenix.execute.AggregatePlan)6 PhoenixConnection (org.apache.phoenix.jdbc.PhoenixConnection)4 SelectStatement (org.apache.phoenix.parse.SelectStatement)4 TableRef (org.apache.phoenix.schema.TableRef)4 Scan (org.apache.hadoop.hbase.client.Scan)3 ImmutableBytesWritable (org.apache.hadoop.hbase.io.ImmutableBytesWritable)3 MutationState (org.apache.phoenix.execute.MutationState)3 Hint (org.apache.phoenix.parse.HintNode.Hint)3 ParseNode (org.apache.phoenix.parse.ParseNode)3 SQLException (java.sql.SQLException)2 List (java.util.List)2 Cell (org.apache.hadoop.hbase.Cell)2 ServerCache (org.apache.phoenix.cache.ServerCacheClient.ServerCache)2 OrderBy (org.apache.phoenix.compile.OrderByCompiler.OrderBy)2 SQLExceptionInfo (org.apache.phoenix.exception.SQLExceptionInfo)2 ClientScanPlan (org.apache.phoenix.execute.ClientScanPlan)2 RowMutationState (org.apache.phoenix.execute.MutationState.RowMutationState)2 ScanPlan (org.apache.phoenix.execute.ScanPlan)2 Expression (org.apache.phoenix.expression.Expression)2 LiteralExpression (org.apache.phoenix.expression.LiteralExpression)2