You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ma...@apache.org on 2016/02/24 22:14:08 UTC

[50/50] [abbrv] phoenix git commit: 1. Expose and correct (new issue to be opened) the byte estimate interface from ResultIterators and apply it in costing; 2. Remove walk-around for PHOENIX-2647 and verify the tests all work; 3. Apply temporary fix for

1. Expose and correct (new issue to be opened) the byte estimate interface from ResultIterators and apply it in costing; 2. Remove walk-around for PHOENIX-2647 and verify the tests all work; 3. Apply temporary fix for PHOENIX-2712


Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/9ac854ae
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/9ac854ae
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/9ac854ae

Branch: refs/heads/calcite
Commit: 9ac854ae5335a00d2a61ec6f1929ebc64e7137e2
Parents: bc4b891
Author: maryannxue <ma...@gmail.com>
Authored: Wed Feb 24 16:12:25 2016 -0500
Committer: maryannxue <ma...@gmail.com>
Committed: Wed Feb 24 16:12:25 2016 -0500

----------------------------------------------------------------------
 .../apache/phoenix/calcite/BaseCalciteIT.java   |  52 ++++--
 .../org/apache/phoenix/calcite/CalciteIT.java   | 163 ++++++++++---------
 .../apache/phoenix/calcite/CalciteIndexIT.java  |  36 ++--
 .../phoenix/calcite/rel/PhoenixTableScan.java   |  74 +--------
 .../org/apache/phoenix/execute/ScanPlan.java    |   5 +
 .../phoenix/iterate/BaseResultIterators.java    |  12 +-
 .../apache/phoenix/iterate/ResultIterators.java |   1 +
 .../phoenix/iterate/UnionResultIterators.java   |   5 +
 .../apache/phoenix/schema/MetaDataClient.java   |   3 +
 .../iterate/AggregateResultScannerTest.java     |   5 +
 .../iterate/ConcatResultIteratorTest.java       |  10 ++
 .../iterate/MergeSortResultIteratorTest.java    |  15 ++
 12 files changed, 204 insertions(+), 177 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/9ac854ae/phoenix-core/src/it/java/org/apache/phoenix/calcite/BaseCalciteIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/calcite/BaseCalciteIT.java b/phoenix-core/src/it/java/org/apache/phoenix/calcite/BaseCalciteIT.java
index 35c46e7..65a9c6e 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/calcite/BaseCalciteIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/calcite/BaseCalciteIT.java
@@ -168,14 +168,28 @@ public class BaseCalciteIT extends BaseClientManagedTimeIT {
             start.close();
         }
 
-        public Sql resultIs(boolean ordered, Object[][] expected) throws SQLException {
+        public Sql resultIs(Object[][] expected) throws SQLException {
             final Statement statement = start.getConnection().createStatement();
             final ResultSet resultSet = statement.executeQuery(sql);
-            if (ordered) {
-                checkResultOrdered(resultSet, expected);
-            } else {
-                checkResultUnordered(resultSet, expected);
-            }
+            checkResultOrdered(resultSet, expected);
+            resultSet.close();
+            statement.close();
+            return this;
+        }
+
+        public Sql resultIs(int orderedCount, Object[][] expected) throws SQLException {
+            final Statement statement = start.getConnection().createStatement();
+            final ResultSet resultSet = statement.executeQuery(sql);
+            checkResultUnordered(resultSet, expected, orderedCount, null);
+            resultSet.close();
+            statement.close();
+            return this;
+        }
+
+        public Sql resultIsSomeOf(int count, Object[][] expected) throws SQLException {
+            final Statement statement = start.getConnection().createStatement();
+            final ResultSet resultSet = statement.executeQuery(sql);
+            checkResultUnordered(resultSet, expected, 0, count);
             resultSet.close();
             statement.close();
             return this;
@@ -198,21 +212,28 @@ public class BaseCalciteIT extends BaseClientManagedTimeIT {
             assertFalse("Got more rows than expected.", resultSet.next());            
         }
         
-        private void checkResultUnordered(ResultSet resultSet, Object[][] expected) throws SQLException {
+        private void checkResultUnordered(ResultSet resultSet, Object[][] expected, int orderedCount, Integer checkContains) throws SQLException {
             List<List<Object>> expectedResults = Lists.newArrayList();
             List<List<Object>> actualResults = Lists.newArrayList();
             List<List<Object>> errorResults = Lists.newArrayList();
             int columnCount = expected.length > 0 ? expected[0].length : 0;
             for (Object[] e : expected) {
                 List<Object> row = Lists.newArrayList();
-                for (Object o : e) {
-                    row.add(canonicalize(o));
+                for (int i = orderedCount; i < e.length; i++) {
+                    row.add(canonicalize(e[i]));
                 }
                 expectedResults.add(row);
             }
             while (resultSet.next()) {
+                // check the ordered part
+                Object[] row = expected[actualResults.size()];
+                for (int i = 0; i < orderedCount; i++) {
+                    Object obj = resultSet.getObject(i + 1);
+                    assertEquals(canonicalize(row[i]), canonicalize(obj));
+                }
+                // check the unordered part
                 List<Object> result = Lists.newArrayList();
-                for (int i = 0; i < columnCount; i++) {
+                for (int i = orderedCount; i < columnCount; i++) {
                     result.add(canonicalize(resultSet.getObject(i+1)));
                 }
                 if (!expectedResults.remove(result)) {
@@ -220,10 +241,15 @@ public class BaseCalciteIT extends BaseClientManagedTimeIT {
                 }
                 actualResults.add(result);
             }
+            boolean allContainedInExpected = errorResults.isEmpty();
+            boolean allExpectedFound = checkContains == null ? expectedResults.isEmpty() : checkContains == actualResults.size();
             assertTrue(
-                    (expectedResults.isEmpty() ? "" : ("Count not find " + expectedResults + " in actual results: " + actualResults + ".\n")) +
-                    (errorResults.isEmpty() ? "" : "Could not find " + errorResults + " in expected results.\n"),
-                    errorResults.isEmpty() && expectedResults.isEmpty());
+                    (allContainedInExpected ? "" : "Could not find " + errorResults + " in expected results.\n") +
+                    (allExpectedFound ? "" : 
+                        (checkContains == null
+                              ? ("Count not find " + expectedResults + " in actual results: " + actualResults + ".\n")
+                              : ("Expected " + checkContains + " rows, but got " + actualResults.size() + " rows."))),
+                    allContainedInExpected && allExpectedFound);
         }
         
         private Object canonicalize(Object obj) {

http://git-wip-us.apache.org/repos/asf/phoenix/blob/9ac854ae/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteIT.java b/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteIT.java
index df6ac81..fc08252 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteIT.java
@@ -64,7 +64,7 @@ public class CalciteIT extends BaseCalciteIT {
         start(false, 1000f).sql("select * from aTable where a_string = 'a'")
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[=($2, 'a')])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                           {"00D300000000XHP", "00A123122312312", "a"}, 
                           {"00D300000000XHP", "00A223122312312", "a"}, 
                           {"00D300000000XHP", "00A323122312312", "a"}, 
@@ -73,12 +73,12 @@ public class CalciteIT extends BaseCalciteIT {
         
         // FIXME: Should be 14:22:56 instead. Wrong due to time zone.
         start(false, 1000f).sql("select \"DATE\" from " + JOIN_ORDER_TABLE_FULL_NAME + " where \"order_id\" = '000000000000001'")
-                .resultIs(false, new Object[][]{
+                .resultIs(0, new Object[][]{
                         {new Timestamp(format.parse("2013-11-22 19:22:56").getTime())}})
                 .close();
         
         start(false, 1000f).sql("select student_id, scores from " + SCORES_TABLE_NAME)
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                         {1, new Integer[] {85, 80, 82}},
                         {2, null},
                         {3, new Integer[] {87, 88, 80}}})
@@ -90,7 +90,7 @@ public class CalciteIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerProject(ENTITY_ID=[$1], A_STRING=[$2], ORGANIZATION_ID=[$0])\n" +
                            "    PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[=($2, 'a')])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                           {"00A123122312312", "a", "00D300000000XHP"}, 
                           {"00A223122312312", "a", "00D300000000XHP"}, 
                           {"00A323122312312", "a", "00D300000000XHP"}, 
@@ -107,7 +107,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "        PhoenixTableScan(table=[[phoenix, ATABLE]])\n" +
                            "      PhoenixServerProject(ORGANIZATION_ID=[$0], ENTITY_ID=[$1], A_STRING=[$2])\n" +
                            "        PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[=($2, 'a')])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                           {"00A123122312312", "a", "00D300000000XHP"}, 
                           {"00A223122312312", "a", "00D300000000XHP"}, 
                           {"00A323122312312", "a", "00D300000000XHP"}, 
@@ -122,7 +122,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "        PhoenixTableScan(table=[[phoenix, Join, ItemTable]])\n" +
                            "      PhoenixServerProject(supplier_id=[$0], NAME=[$1])\n" +
                            "        PhoenixTableScan(table=[[phoenix, Join, SupplierTable]])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                           {"0000000001", "T1", "0000000001", "S1"}, 
                           {"0000000002", "T2", "0000000001", "S1"}, 
                           {"0000000003", "T3", "0000000002", "S2"}, 
@@ -138,7 +138,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "      PhoenixTableScan(table=[[phoenix, Join, ItemTable]])\n" +
                            "      PhoenixServerProject(supplier_id=[$0], NAME=[$1], PHONE=[$2], ADDRESS=[$3], LOC_ID=[$4], NAME5=[CAST($1):VARCHAR(2) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\"])\n" +
                            "        PhoenixTableScan(table=[[phoenix, Join, SupplierTable]], filter=[=(CAST($1):VARCHAR(2) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\", 'S5')])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                           {"0000000005", "T5", 500, 8, 15, "0000000005", "Item T5", "0000000005", "S5", "888-888-5555", "505 YYY Street", "10005"}})
                 .close();
         
@@ -151,7 +151,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "        PhoenixTableScan(table=[[phoenix, Join, ItemTable]])\n" +
                            "      PhoenixServerProject(order_id=[$0], item_id=[$2], QUANTITY=[$4], PRICE7=[CAST($3):DECIMAL(17, 6)])\n" +
                            "        PhoenixTableScan(table=[[phoenix, Join, OrderTable]], filter=[<($4, 5000)])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                           {"000000000000004", "T6", 600, 15, 4000}})
                 .close();
     }
@@ -165,7 +165,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "        PhoenixTableScan(table=[[phoenix, Join, SupplierTable]])\n" +
                            "      PhoenixServerProject(item_id=[$0], NAME=[$1], supplier_id=[$5])\n" +
                            "        PhoenixTableScan(table=[[phoenix, Join, ItemTable]])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                           {"0000000001", "T1", "0000000001", "S1"}, 
                           {"0000000002", "T2", "0000000001", "S1"}, 
                           {"0000000003", "T3", "0000000002", "S2"}, 
@@ -188,7 +188,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "            PhoenixTableScan(table=[[phoenix, Join, ItemTable]])\n" +
                            "        PhoenixServerProject(supplier_id=[$0], NAME=[$1])\n" +
                            "          PhoenixTableScan(table=[[phoenix, Join, SupplierTable]], scanOrder=[FORWARD])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                         {"0000000001", "T1", "0000000001", "S1"},
                         {"0000000002", "T2", "0000000001", "S1"},
                         {"0000000003", "T3", "0000000002", "S2"},
@@ -208,7 +208,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "        PhoenixTableScan(table=[[phoenix, ATABLE]], scanOrder=[FORWARD])\n" +
                            "      PhoenixServerProject(ORGANIZATION_ID=[$0], ENTITY_ID=[$1], A_STRING=[$2])\n" +
                            "        PhoenixTableScan(table=[[phoenix, ATABLE]], scanOrder=[FORWARD])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                           {"00A123122312312", "a", "00D300000000XHP"},
                           {"00A223122312312", "a", "00D300000000XHP"},
                           {"00A323122312312", "a", "00D300000000XHP"},
@@ -284,7 +284,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "            PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[=($2, 'a')])\n" +
                            "          PhoenixServerProject(ORGANIZATION_ID=[$0], ENTITY_ID=[$1], A_STRING=[$2], B_STRING=[$3])\n" +
                            "            PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[AND(=($2, 'a'), >($3, 'a'))])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                           {"00A123122312312", "a", "00D300000000XHP"}, 
                           {"00A223122312312", "a", "00D300000000XHP"}, 
                           {"00A323122312312", "a", "00D300000000XHP"}, 
@@ -305,7 +305,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "      PhoenixServerSort(sort0=[$1], sort1=[$0], dir0=[ASC], dir1=[ASC])\n" +
                            "        PhoenixServerProject(ORGANIZATION_ID=[$0], ENTITY_ID=[$1], A_STRING=[$2])\n" +
                            "          PhoenixTableScan(table=[[phoenix, ATABLE]])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                           {"00A123122312312", "a", "00D300000000XHP"},
                           {"00A223122312312", "a", "00D300000000XHP"},
                           {"00A323122312312", "a", "00D300000000XHP"},
@@ -323,7 +323,7 @@ public class CalciteIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerAggregate(group=[{}], EXPR$0=[COUNT($3)])\n" +
                            "    PhoenixTableScan(table=[[phoenix, ATABLE]])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                           {9L}})
                 .close();
         
@@ -331,7 +331,7 @@ public class CalciteIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerAggregate(group=[{0}], EXPR$1=[COUNT($3)], isOrdered=[true])\n" +
                            "    PhoenixTableScan(table=[[phoenix, ATABLE]], scanOrder=[FORWARD])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                           {"00D300000000XHP", 9L}})
                 .close();
         
@@ -339,7 +339,7 @@ public class CalciteIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerAggregate(group=[{0, 1}], EXPR$2=[COUNT($3)], isOrdered=[true])\n" +
                            "    PhoenixTableScan(table=[[phoenix, ATABLE]], scanOrder=[FORWARD])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                           {"00D300000000XHP", "00A123122312312", 1L}, 
                           {"00D300000000XHP", "00A223122312312", 1L}, 
                           {"00D300000000XHP", "00A323122312312", 1L}, 
@@ -355,7 +355,7 @@ public class CalciteIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerAggregate(group=[{1}], EXPR$1=[COUNT($3)], isOrdered=[false])\n" +
                            "    PhoenixTableScan(table=[[phoenix, ATABLE]])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                         {"00A123122312312", 1L}, 
                         {"00A223122312312", 1L}, 
                         {"00A323122312312", 1L}, 
@@ -371,7 +371,7 @@ public class CalciteIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerAggregate(group=[{2}], EXPR$1=[COUNT($3)], isOrdered=[false])\n" +
                            "    PhoenixTableScan(table=[[phoenix, ATABLE]])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                           {"a", 4L},
                           {"b", 4L},
                           {"c", 1L}})
@@ -382,7 +382,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "  PhoenixClientProject(EXPR$0=[$1], A_STRING=[$0])\n" +
                            "    PhoenixServerAggregate(group=[{2}], EXPR$0=[COUNT()], isOrdered=[false])\n" +
                            "      PhoenixTableScan(table=[[phoenix, ATABLE]])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                           {4L, "a"},
                           {4L, "b"},
                           {1L, "c"}})
@@ -396,7 +396,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "        PhoenixTableScan(table=[[phoenix, Join, SupplierTable]])\n" +
                            "      PhoenixServerProject(supplier_id=[$5])\n" +
                            "        PhoenixTableScan(table=[[phoenix, Join, ItemTable]])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                           {"S1", 2L},
                           {"S2", 2L},
                           {"S5", 1L},
@@ -412,7 +412,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "        PhoenixTableScan(table=[[phoenix, Join, SupplierTable]], scanOrder=[FORWARD])\n" +
                            "      PhoenixServerProject(supplier_id=[$5])\n" +
                            "        PhoenixTableScan(table=[[phoenix, Join, ItemTable]])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                           {"0000000001", 2L},
                           {"0000000002", 2L},
                           {"0000000005", 1L},
@@ -423,7 +423,7 @@ public class CalciteIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerAggregate(group=[{2}], EXPR$1=[SUM($4)], isOrdered=[false])\n" +
                            "    PhoenixTableScan(table=[[phoenix, ATABLE]])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                            {"a", 10L},
                            {"b", 26L},
                            {"c", 9L}})
@@ -439,7 +439,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "  PhoenixClientProject(MYPK0=[$0], EXPR$1=[CAST(/($1, $2)):INTEGER NOT NULL])\n" +
                            "    PhoenixServerAggregate(group=[{0}], agg#0=[$SUM0($1)], agg#1=[COUNT()], isOrdered=[true])\n" +
                            "      PhoenixTableScan(table=[[phoenix, SALTED_TEST_TABLE]], scanOrder=[FORWARD])\n")
-                .resultIs(false, expectedResult)
+                .resultIs(0, expectedResult)
                 .close();
     }
     
@@ -448,7 +448,7 @@ public class CalciteIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerAggregate(group=[{2}], isOrdered=[false])\n" +
                            "    PhoenixTableScan(table=[[phoenix, ATABLE]])\n")
-                .resultIs(false, new Object[][]{
+                .resultIs(0, new Object[][]{
                           {"a"}, 
                           {"b"}, 
                           {"c"}})
@@ -461,7 +461,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "  PhoenixServerSort(sort0=[$2], sort1=[$1], dir0=[ASC], dir1=[ASC])\n" +
                            "    PhoenixServerProject(ORGANIZATION_ID=[$0], ENTITY_ID=[$1], A_STRING=[$2])\n" +
                            "      PhoenixTableScan(table=[[phoenix, ATABLE]])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                           {"00D300000000XHP", "00A123122312312", "a"}, 
                           {"00D300000000XHP", "00A223122312312", "a"}, 
                           {"00D300000000XHP", "00A323122312312", "a"}, 
@@ -477,7 +477,7 @@ public class CalciteIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerProject(ORGANIZATION_ID=[$0], ENTITY_ID=[$1], A_STRING=[$2])\n" +
                            "    PhoenixTableScan(table=[[phoenix, ATABLE]], scanOrder=[FORWARD])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                           {"00D300000000XHP", "00A123122312312", "a"}, 
                           {"00D300000000XHP", "00A223122312312", "a"}, 
                           {"00D300000000XHP", "00A323122312312", "a"}, 
@@ -493,7 +493,7 @@ public class CalciteIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerProject(ORGANIZATION_ID=[$0], ENTITY_ID=[$1], A_STRING=[$2])\n" +
                            "    PhoenixTableScan(table=[[phoenix, ATABLE]], scanOrder=[REVERSE])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                           {"00D300000000XHP", "00C923122312312", "c"},
                           {"00D300000000XHP", "00B823122312312", "b"}, 
                           {"00D300000000XHP", "00B723122312312", "b"}, 
@@ -509,7 +509,7 @@ public class CalciteIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerProject(ORGANIZATION_ID=[$0], ENTITY_ID=[$1], A_STRING=[$2])\n" +
                            "    PhoenixTableScan(table=[[phoenix, ATABLE]], scanOrder=[REVERSE])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                           {"00D300000000XHP", "00C923122312312", "c"},
                           {"00D300000000XHP", "00B823122312312", "b"}, 
                           {"00D300000000XHP", "00B723122312312", "b"}, 
@@ -526,7 +526,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "  PhoenixServerSort(sort0=[$0], sort1=[$1], dir0=[ASC], dir1=[DESC])\n" +
                            "    PhoenixServerProject(ORGANIZATION_ID=[$0], ENTITY_ID=[$1], A_STRING=[$2])\n" +
                            "      PhoenixTableScan(table=[[phoenix, ATABLE]])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                           {"00D300000000XHP", "00C923122312312", "c"},
                           {"00D300000000XHP", "00B823122312312", "b"}, 
                           {"00D300000000XHP", "00B723122312312", "b"}, 
@@ -544,7 +544,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "    PhoenixCompactClientSort(sort0=[$1], sort1=[$0], dir0=[ASC], dir1=[DESC])\n" +
                            "      PhoenixServerAggregate(group=[{2}], EXPR$0=[COUNT()], isOrdered=[false])\n" +
                            "        PhoenixTableScan(table=[[phoenix, ATABLE]])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                           {1L, "c"},
                           {4L, "b"},
                           {4L, "a"}})
@@ -559,7 +559,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "          PhoenixTableScan(table=[[phoenix, Join, SupplierTable]])\n" +
                            "        PhoenixServerProject(supplier_id=[$5])\n" +
                            "          PhoenixTableScan(table=[[phoenix, Join, ItemTable]])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                           {"S6", 1L},
                           {"S5", 1L},
                           {"S2", 2L},
@@ -575,7 +575,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "          PhoenixTableScan(table=[[phoenix, Join, ItemTable]])\n" +
                            "        PhoenixServerProject(supplier_id=[$0], NAME=[$1])\n" +
                            "          PhoenixTableScan(table=[[phoenix, Join, SupplierTable]])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                           {"0000000006", "T6", "0000000006", "S6"}, 
                           {"0000000005", "T5", "0000000005", "S5"}, 
                           {"0000000004", "T4", "0000000002", "S2"}, 
@@ -592,7 +592,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "    PhoenixServerSort(sort0=[$2], sort1=[$1], dir0=[ASC], dir1=[ASC])\n" +
                            "      PhoenixServerProject(ORGANIZATION_ID=[$0], ENTITY_ID=[$1], A_STRING=[$2])\n" +
                            "        PhoenixTableScan(table=[[phoenix, ATABLE]])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                           {"00D300000000XHP", "00A123122312312", "a"}, 
                           {"00D300000000XHP", "00A223122312312", "a"}, 
                           {"00D300000000XHP", "00A323122312312", "a"}, 
@@ -605,7 +605,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "  PhoenixLimit(fetch=[5])\n" +
                            "    PhoenixServerProject(ORGANIZATION_ID=[$0], ENTITY_ID=[$1], A_STRING=[$2])\n" +
                            "      PhoenixTableScan(table=[[phoenix, ATABLE]], scanOrder=[FORWARD])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                           {"00D300000000XHP", "00A123122312312", "a"}, 
                           {"00D300000000XHP", "00A223122312312", "a"}, 
                           {"00D300000000XHP", "00A323122312312", "a"}, 
@@ -618,7 +618,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "  PhoenixLimit(fetch=[5])\n" +
                            "    PhoenixServerProject(ORGANIZATION_ID=[$0], ENTITY_ID=[$1], A_STRING=[$2])\n" +
                            "      PhoenixTableScan(table=[[phoenix, ATABLE]], scanOrder=[REVERSE])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                           {"00D300000000XHP", "00C923122312312", "c"},
                           {"00D300000000XHP", "00B823122312312", "b"}, 
                           {"00D300000000XHP", "00B723122312312", "b"}, 
@@ -631,7 +631,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "  PhoenixLimit(fetch=[5])\n" +
                            "    PhoenixServerProject(ORGANIZATION_ID=[$0], ENTITY_ID=[$1], A_STRING=[$2])\n" +
                            "      PhoenixTableScan(table=[[phoenix, ATABLE]], scanOrder=[REVERSE])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                           {"00D300000000XHP", "00C923122312312", "c"},
                           {"00D300000000XHP", "00B823122312312", "b"}, 
                           {"00D300000000XHP", "00B723122312312", "b"}, 
@@ -645,7 +645,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "    PhoenixServerSort(sort0=[$0], sort1=[$1], dir0=[ASC], dir1=[DESC])\n" +
                            "      PhoenixServerProject(ORGANIZATION_ID=[$0], ENTITY_ID=[$1], A_STRING=[$2])\n" +
                            "        PhoenixTableScan(table=[[phoenix, ATABLE]])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                           {"00D300000000XHP", "00C923122312312", "c"},
                           {"00D300000000XHP", "00B823122312312", "b"}, 
                           {"00D300000000XHP", "00B723122312312", "b"}, 
@@ -660,7 +660,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "      PhoenixCompactClientSort(sort0=[$1], sort1=[$0], dir0=[ASC], dir1=[DESC])\n" +
                            "        PhoenixServerAggregate(group=[{2}], EXPR$0=[COUNT()], isOrdered=[false])\n" +
                            "          PhoenixTableScan(table=[[phoenix, ATABLE]])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                           {1L, "c"},
                           {4L, "b"}})
                 .close();
@@ -675,7 +675,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "            PhoenixTableScan(table=[[phoenix, Join, SupplierTable]])\n" +
                            "          PhoenixServerProject(supplier_id=[$5])\n" +
                            "            PhoenixTableScan(table=[[phoenix, Join, ItemTable]])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                           {"S6", 1L},
                           {"S5", 1L},
                           {"S2", 2L}})
@@ -691,7 +691,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "            PhoenixTableScan(table=[[phoenix, Join, ItemTable]])\n" +
                            "          PhoenixServerProject(supplier_id=[$0], NAME=[$1])\n" +
                            "            PhoenixTableScan(table=[[phoenix, Join, SupplierTable]])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                           {"0000000006", "T6", "0000000006", "S6"}, 
                           {"0000000005", "T5", "0000000005", "S5"}, 
                           {"0000000004", "T4", "0000000002", "S2"}})
@@ -704,12 +704,16 @@ public class CalciteIT extends BaseCalciteIT {
                            "  PhoenixLimit(fetch=[5])\n" +
                            "    PhoenixServerProject(ORGANIZATION_ID=[$0], ENTITY_ID=[$1], A_STRING=[$2])\n" +
                            "      PhoenixTableScan(table=[[phoenix, ATABLE]])\n")
-                .resultIs(false, new Object[][] {
-                          {"00D300000000XHP", "00A123122312312", "a"}, 
-                          {"00D300000000XHP", "00A223122312312", "a"}, 
-                          {"00D300000000XHP", "00A323122312312", "a"}, 
-                          {"00D300000000XHP", "00A423122312312", "a"}, 
-                          {"00D300000000XHP", "00B523122312312", "b"}})
+                .resultIsSomeOf(5, new Object[][] {
+                        {"00D300000000XHP", "00A123122312312", "a"}, 
+                        {"00D300000000XHP", "00A223122312312", "a"}, 
+                        {"00D300000000XHP", "00A323122312312", "a"}, 
+                        {"00D300000000XHP", "00A423122312312", "a"}, 
+                        {"00D300000000XHP", "00B523122312312", "b"}, 
+                        {"00D300000000XHP", "00B623122312312", "b"}, 
+                        {"00D300000000XHP", "00B723122312312", "b"}, 
+                        {"00D300000000XHP", "00B823122312312", "b"}, 
+                        {"00D300000000XHP", "00C923122312312", "c"}})
                 .close();
         
         start(false, 1000f).sql("select count(entity_id), a_string from atable group by a_string limit 2")
@@ -718,9 +722,10 @@ public class CalciteIT extends BaseCalciteIT {
                            "    PhoenixLimit(fetch=[2])\n" +
                            "      PhoenixServerAggregate(group=[{2}], EXPR$0=[COUNT()], isOrdered=[false])\n" +
                            "        PhoenixTableScan(table=[[phoenix, ATABLE]])\n")
-                .resultIs(false, new Object[][] {
+                .resultIsSomeOf(2, new Object[][] {
                           {4L, "a"},
-                          {4L, "b"}})
+                          {4L, "b"},
+                          {1L, "c"}})
                 .close();
         
         start(false, 1000f).sql("select s.name, count(\"item_id\") from " + JOIN_SUPPLIER_TABLE_FULL_NAME + " s join " + JOIN_ITEM_TABLE_FULL_NAME + " i on s.\"supplier_id\" = i.\"supplier_id\" group by s.name limit 3")
@@ -732,10 +737,11 @@ public class CalciteIT extends BaseCalciteIT {
                            "          PhoenixTableScan(table=[[phoenix, Join, SupplierTable]])\n" +
                            "        PhoenixServerProject(supplier_id=[$5])\n" +
                            "          PhoenixTableScan(table=[[phoenix, Join, ItemTable]])\n")
-                .resultIs(false, new Object[][] {
+                .resultIsSomeOf(3, new Object[][] {
                           {"S1", 2L},
                           {"S2", 2L},
-                          {"S5", 1L}})
+                          {"S5", 1L},
+                          {"S6", 1L}})
                 .close();
         
         start(false, 1000f).sql("SELECT item.\"item_id\", item.name, supp.\"supplier_id\", supp.name FROM " + JOIN_ITEM_TABLE_FULL_NAME + " item JOIN " + JOIN_SUPPLIER_TABLE_FULL_NAME + " supp ON item.\"supplier_id\" = supp.\"supplier_id\" limit 3")
@@ -747,10 +753,13 @@ public class CalciteIT extends BaseCalciteIT {
                            "          PhoenixTableScan(table=[[phoenix, Join, ItemTable]])\n" +
                            "        PhoenixServerProject(supplier_id=[$0], NAME=[$1])\n" +
                            "          PhoenixTableScan(table=[[phoenix, Join, SupplierTable]])\n")
-                .resultIs(false, new Object[][] {
+                .resultIsSomeOf(3, new Object[][] {
                           {"0000000001", "T1", "0000000001", "S1"}, 
                           {"0000000002", "T2", "0000000001", "S1"}, 
-                          {"0000000003", "T3", "0000000002", "S2"}})
+                          {"0000000003", "T3", "0000000002", "S2"}, 
+                          {"0000000004", "T4", "0000000002", "S2"}, 
+                          {"0000000005", "T5", "0000000005", "S5"}, 
+                          {"0000000006", "T6", "0000000006", "S6"}})
                 .close();
         
         start(false, 1000f).sql("SELECT x from (values (1, 2), (2, 4), (3, 6)) as t(x, y) limit 2")
@@ -758,7 +767,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "  PhoenixClientProject(X=[$0])\n" +
                            "    PhoenixLimit(fetch=[2])\n" +
                            "      PhoenixValues(tuples=[[{ 1, 2 }, { 2, 4 }, { 3, 6 }]])\n")
-                .resultIs(false, new Object[][] {{1}, {2}})
+                .resultIsSomeOf(2, new Object[][] {{1}, {2}, {3}})
                 .close();
     }
 
@@ -776,7 +785,7 @@ public class CalciteIT extends BaseCalciteIT {
                        "          PhoenixServerProject(item_id=[$0])\n" +
                        "            PhoenixTableScan(table=[[phoenix, Join, ItemTable]], scanOrder=[FORWARD])\n" +
                        "          PhoenixTableScan(table=[[phoenix, Join, OrderTable]])\n")
-            .resultIs(false, new Object[][] {
+            .resultIs(0, new Object[][] {
                     new Object[] {"0000000001", "T1", 1000},
                     new Object[] {"0000000002", "T2", 3000},
                     new Object[] {"0000000003", "T3", 5000},
@@ -798,7 +807,7 @@ public class CalciteIT extends BaseCalciteIT {
                           "          PhoenixTableScan(table=[[phoenix, Join, OrderTable]])\n" +
                           "          PhoenixServerProject(item_id=[$0])\n" +
                           "            PhoenixTableScan(table=[[phoenix, Join, ItemTable]], filter=[<($0, '0000000006')])\n")
-               .resultIs(false, new Object[][] {
+               .resultIs(0, new Object[][] {
                          new Object[] {"0000000001", "T1", 1000},
                          new Object[] {"0000000002", "T2", 3000},
                          new Object[] {"0000000003", "T3", 5000},
@@ -817,7 +826,7 @@ public class CalciteIT extends BaseCalciteIT {
             .explainIs("PhoenixToEnumerableConverter\n" +
                        "  PhoenixClientAggregate(group=[{}], EXPR$0=[COUNT()], EXPR$1=[MAX($1)])\n" +
                        "    PhoenixValues(tuples=[[{ 2, 1 }, { 3, 4 }, { 5, 2 }]])\n")
-            .resultIs(false, new Object[][] {{3L, 4}})
+            .resultIs(0, new Object[][] {{3L, 4}})
             .close();
     }
     
@@ -829,7 +838,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "      PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[=($2, 'a')])\n" +
                            "    PhoenixServerProject(ENTITY_ID=[$1])\n" +
                            "      PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[=($2, 'b')])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                         {"00A123122312312"},
                         {"00A223122312312"},
                         {"00A323122312312"},
@@ -852,7 +861,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "        PhoenixServerSort(sort0=[$0], dir0=[DESC])\n" +
                            "          PhoenixServerProject(ENTITY_ID=[$1], A_STRING=[$2])\n" +
                            "            PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[=($2, 'c')])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                         {"00C923122312312", "c"},
                         {"00A423122312312", "a"},
                         {"00A323122312312", "a"}})
@@ -867,7 +876,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "    PhoenixServerSort(sort0=[$0], dir0=[DESC])\n" +
                            "      PhoenixServerProject(ENTITY_ID=[$1], A_STRING=[$2])\n" +
                            "        PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[=($2, 'c')])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                         {"00C923122312312", "c"},
                         {"00A423122312312", "a"},
                         {"00A323122312312", "a"},
@@ -882,7 +891,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "  PhoenixUncollect\n" +
                            "    PhoenixServerProject(EXPR$0=[$2])\n" +
                            "      PhoenixTableScan(table=[[phoenix, SCORES]])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                         {85}, 
                         {80}, 
                         {82}, 
@@ -898,7 +907,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "      PhoenixUncollect\n" +
                            "        PhoenixServerProject(EXPR$0=[$2])\n" +
                            "          PhoenixTableScan(table=[[phoenix, SCORES]], filter=[=($cor0.STUDENT_ID, $0)])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                         {1, 85}, 
                         {1, 80}, 
                         {1, 82}, 
@@ -941,8 +950,8 @@ public class CalciteIT extends BaseCalciteIT {
                 "            PhoenixTableScan(table=[[phoenix, Join, OrderTable]])\n" +
                 "          PhoenixServerAggregate(group=[{2}], isOrdered=[false])\n" +
                 "            PhoenixTableScan(table=[[phoenix, Join, OrderTable]])\n";
-        start(correlProps).sql(q1).explainIs(p1Correlate).resultIs(false, r1).close();
-        start(decorrelProps).sql(q1).explainIs(p1Decorrelated).resultIs(false, r1).close();
+        start(correlProps).sql(q1).explainIs(p1Correlate).resultIs(0, r1).close();
+        start(decorrelProps).sql(q1).explainIs(p1Decorrelated).resultIs(0, r1).close();
                 
         String q2 = "select name from " + JOIN_ITEM_TABLE_FULL_NAME + " i where price = (select max(price) from " + JOIN_ITEM_TABLE_FULL_NAME + " i2 where i.\"item_id\" = i2.\"item_id\" and i.name = i2.name and i2.\"item_id\" <> 'invalid001')";
         Object[][] r2 = new Object[][]{
@@ -973,8 +982,8 @@ public class CalciteIT extends BaseCalciteIT {
                 "            PhoenixTableScan(table=[[phoenix, Join, ItemTable]])\n" +
                 "          PhoenixServerProject(item_id=[$0], NAME=[$1], PRICE=[$2])\n" +
                 "            PhoenixTableScan(table=[[phoenix, Join, ItemTable]], filter=[<>($0, 'invalid001')])\n";
-        start(correlProps).sql(q2).explainIs(p2Correlate).resultIs(false, r2).close();
-        start(decorrelProps).sql(q2).explainIs(p2Decorrelated).resultIs(false, r2).close();
+        start(correlProps).sql(q2).explainIs(p2Correlate).resultIs(0, r2).close();
+        start(decorrelProps).sql(q2).explainIs(p2Decorrelated).resultIs(0, r2).close();
         
         // Test PhoenixClientSemiJoin
         String q3 = "select \"item_id\", name from " + JOIN_ITEM_TABLE_FULL_NAME + " i where exists (select 1 from " + JOIN_ORDER_TABLE_FULL_NAME + " o where i.\"item_id\" = o.\"item_id\")";
@@ -1002,8 +1011,8 @@ public class CalciteIT extends BaseCalciteIT {
                 "        PhoenixTableScan(table=[[phoenix, Join, ItemTable]], scanOrder=[FORWARD])\n" +
                 "      PhoenixServerProject(item_id=[$2])\n" +
                 "        PhoenixTableScan(table=[[phoenix, Join, OrderTable]])\n";
-        start(correlProps).sql(q3).explainIs(p3Correlate).resultIs(false, r3).close();
-        start(decorrelProps).sql(q3).explainIs(p3Decorrelated).resultIs(false, r3).close();
+        start(correlProps).sql(q3).explainIs(p3Correlate).resultIs(0, r3).close();
+        start(decorrelProps).sql(q3).explainIs(p3Decorrelated).resultIs(0, r3).close();
         
         String q4 = "select \"item_id\", name from " + JOIN_ITEM_TABLE_FULL_NAME + " i where \"item_id\" in (select \"item_id\" from " + JOIN_ORDER_TABLE_FULL_NAME + ")";
         Object[][] r4 = new Object[][] {
@@ -1018,7 +1027,7 @@ public class CalciteIT extends BaseCalciteIT {
                 "      PhoenixTableScan(table=[[phoenix, Join, ItemTable]])\n" +
                 "    PhoenixServerProject(item_id=[$2])\n" +
                 "      PhoenixTableScan(table=[[phoenix, Join, OrderTable]])\n";
-        start(decorrelProps).sql(q4).explainIs(p4Decorrelated).resultIs(false, r4).close();
+        start(decorrelProps).sql(q4).explainIs(p4Decorrelated).resultIs(0, r4).close();
         
         String q5 = "select \"order_id\" from " + JOIN_ITEM_TABLE_FULL_NAME + " i JOIN " + JOIN_ORDER_TABLE_FULL_NAME + " o on o.\"item_id\" = i.\"item_id\" where quantity = (select max(quantity) from " + JOIN_ORDER_TABLE_FULL_NAME + " o2 JOIN " + JOIN_ITEM_TABLE_FULL_NAME + " i2 on o2.\"item_id\" = i2.\"item_id\" where i.\"supplier_id\" = i2.\"supplier_id\")";
         Object [][] r5 = new Object[][] {
@@ -1062,7 +1071,7 @@ public class CalciteIT extends BaseCalciteIT {
                 "                    PhoenixTableScan(table=[[phoenix, Join, ItemTable]])\n" +
                 "                  PhoenixServerProject(item_id=[$2])\n" +
                 "                    PhoenixTableScan(table=[[phoenix, Join, OrderTable]])\n";
-        start(correlProps).sql(q5).explainIs(p5Correlate).resultIs(false, r5).close();
+        start(correlProps).sql(q5).explainIs(p5Correlate).resultIs(0, r5).close();
         //TODO long-running query, disable for now.
         //start(decorrelProps).sql(q5).explainIs(p5Decorrelated).resultIs(false, r5).close();
         
@@ -1092,8 +1101,8 @@ public class CalciteIT extends BaseCalciteIT {
                 "            PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[=($2, 'a')])\n" +
                 "          PhoenixServerAggregate(group=[{0, 3}], isOrdered=[false])\n" +
                 "            PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[=($2, 'a')])\n";
-        start(correlProps).sql(q6).explainIs(p6Correlate).resultIs(false, r6).close();
-        start(decorrelProps).sql(q6).explainIs(p6Decorrelated).resultIs(false, r6).close();
+        start(correlProps).sql(q6).explainIs(p6Correlate).resultIs(0, r6).close();
+        start(decorrelProps).sql(q6).explainIs(p6Decorrelated).resultIs(0, r6).close();
     }
     
     @Test public void testInValueList() throws Exception {
@@ -1101,7 +1110,7 @@ public class CalciteIT extends BaseCalciteIT {
             .explainIs("PhoenixToEnumerableConverter\n" +
                        "  PhoenixServerProject(ENTITY_ID=[$1])\n" +
                        "    PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[AND(=($0, '00D300000000XHP'), OR(=($1, '00A123122312312'), =($1, '00A223122312312'), =($1, '00B523122312312'), =($1, '00B623122312312'), =($1, '00C923122312312')))])\n")
-            .resultIs(false, new Object[][] {
+            .resultIs(0, new Object[][] {
                     {"00A123122312312"},
                     {"00A223122312312"},
                     {"00B523122312312"},
@@ -1114,7 +1123,7 @@ public class CalciteIT extends BaseCalciteIT {
         start(false, 1000f).sql("select * from v")
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[=($2, 'a')])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                         {"00D300000000XHP", "00A123122312312", "a"}, 
                         {"00D300000000XHP", "00A223122312312", "a"}, 
                         {"00D300000000XHP", "00A323122312312", "a"}, 
@@ -1127,7 +1136,7 @@ public class CalciteIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixClientProject(EXPR$0=[NEXT_VALUE('\"SEQ0\"')], C0=[$0])\n" +
                            "    PhoenixValues(tuples=[[{ 1 }, { 1 }]])\n")
-                .resultIs(false, new Object[][]{
+                .resultIs(0, new Object[][]{
                         {1L, 1},
                         {2L, 1}})
                 .close();
@@ -1136,7 +1145,7 @@ public class CalciteIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixClientProject(EXPR$0=[NEXT_VALUE('\"MY\".\"SEQ1\"')], ENTITY_ID=[$1])\n" +
                            "    PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[=($2, 'a')])\n")
-                .resultIs(false, new Object[][]{
+                .resultIs(1, new Object[][]{
                         {2L, "00A123122312312"},
                         {4L, "00A223122312312"},
                         {6L, "00A323122312312"},
@@ -1151,7 +1160,7 @@ public class CalciteIT extends BaseCalciteIT {
                            "        PhoenixTableScan(table=[[phoenix, Join, ItemTable]])\n" +
                            "      PhoenixServerProject(supplier_id=[$0], NAME=[$1])\n" +
                            "        PhoenixTableScan(table=[[phoenix, Join, SupplierTable]])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(1, new Object[][] {
                         {3L, "0000000001", "T1", "0000000001", "S1"}, 
                         {4L, "0000000002", "T2", "0000000001", "S1"}, 
                         {5L, "0000000003", "T3", "0000000002", "S2"}, 
@@ -1196,7 +1205,7 @@ public class CalciteIT extends BaseCalciteIT {
                        "          JdbcToEnumerableConverter\n" +
                        "            JdbcProject(time_id=[$0], the_date=[$1], the_day=[$2], the_month=[$3], the_year=[$4], day_of_month=[$5], week_of_year=[$6], month_of_year=[$7], quarter=[$8], fiscal_period=[$9], the_year10=[CAST($4):INTEGER])\n" +
                        "              JdbcTableScan(table=[[foodmart, time_by_day]])\n")
-            .resultIs(false, new Object[][] {
+            .resultIs(0, new Object[][] {
                     new Object[] {1997, 1000, 365L}, 
                     new Object[] {1997, 2000, 365L},
                     new Object[] {1997, 3000, 365L},

http://git-wip-us.apache.org/repos/asf/phoenix/blob/9ac854ae/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteIndexIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteIndexIT.java
index d1aea74..067d0fc 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteIndexIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteIndexIT.java
@@ -131,20 +131,20 @@ public class CalciteIndexIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerAggregate(group=[{}], EXPR$0=[COUNT()])\n" +
                            "    PhoenixTableScan(table=[[phoenix, IDXSALTED_NOSALT_TEST_TABLE]], filter=[>(CAST($0):INTEGER, 3)])\n")
-                .resultIs(false, new Object[][]{{999L}})
+                .resultIs(0, new Object[][]{{999L}})
                 .close();
         start(true, 1f).sql("select mypk0, mypk1, col0 from " + NOSALT_TABLE_NAME + " where col0 <= 4")
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerProject(MYPK0=[$1], MYPK1=[$2], COL0=[CAST($0):INTEGER])\n" +
                            "    PhoenixTableScan(table=[[phoenix, IDXSALTED_NOSALT_TEST_TABLE]], filter=[<=(CAST($0):INTEGER, 4)])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                         {2, 3, 4},
                         {1, 2, 3}})
                 .close();
         start(true, 1f).sql("select * from " + SALTED_TABLE_NAME + " where mypk0 < 3")
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixTableScan(table=[[phoenix, SALTED_TEST_TABLE]], filter=[<($0, 3)])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                         {1, 2, 3, 4},
                         {2, 3, 4, 5}})
                 .close();
@@ -152,13 +152,13 @@ public class CalciteIndexIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerAggregate(group=[{}], EXPR$0=[COUNT()])\n" +
                            "    PhoenixTableScan(table=[[phoenix, IDX_SALTED_TEST_TABLE]], filter=[>(CAST($0):INTEGER, 3)])\n")
-                .resultIs(false, new Object[][]{{999L}})
+                .resultIs(0, new Object[][]{{999L}})
                 .close();
         start(true, 1f).sql("select mypk0, mypk1, col0 from " + SALTED_TABLE_NAME + " where col0 <= 4")
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerProject(MYPK0=[$1], MYPK1=[$2], COL0=[CAST($0):INTEGER])\n" +
                            "    PhoenixTableScan(table=[[phoenix, IDX_SALTED_TEST_TABLE]], filter=[<=(CAST($0):INTEGER, 4)])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                         {2, 3, 4},
                         {1, 2, 3}})
                 .close();
@@ -166,13 +166,13 @@ public class CalciteIndexIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerAggregate(group=[{}], EXPR$0=[COUNT()])\n" +
                            "    PhoenixTableScan(table=[[phoenix, IDXSALTED_SALTED_TEST_TABLE]], filter=[>(CAST($0):INTEGER, 4)])\n")
-                .resultIs(false, new Object[][]{{999L}})
+                .resultIs(0, new Object[][]{{999L}})
                 .close();
         start(true, 1f).sql("select * from " + SALTED_TABLE_NAME + " where col1 <= 5 order by col1")
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerProject(MYPK0=[$1], MYPK1=[$2], COL0=[$3], COL1=[CAST($0):INTEGER])\n" +
                            "    PhoenixTableScan(table=[[phoenix, IDXSALTED_SALTED_TEST_TABLE]], filter=[<=(CAST($0):INTEGER, 5)], scanOrder=[FORWARD])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                         {1, 2, 3, 4},
                         {2, 3, 4, 5}})
                 .close();
@@ -182,7 +182,7 @@ public class CalciteIndexIT extends BaseCalciteIT {
                            "    PhoenixTableScan(table=[[phoenix, SALTED_TEST_TABLE]], filter=[>($0, 500)])\n" +
                            "    PhoenixServerProject(MYPK0=[$1], MYPK1=[$2], COL0=[$3], COL1=[CAST($0):INTEGER])\n" +
                            "      PhoenixTableScan(table=[[phoenix, IDXSALTED_SALTED_TEST_TABLE]], filter=[<(CAST($0):INTEGER, 505)])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                         {501, 502, 503, 504, 501, 502, 503, 504}})
                 .close();
     }
@@ -192,7 +192,7 @@ public class CalciteIndexIT extends BaseCalciteIT {
         start(props).sql("select * from " + MULTI_TENANT_TABLE + " where tenant_id = '10' and id <= '0004'")
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixTableScan(table=[[phoenix, MULTITENANT_TEST_TABLE]], filter=[AND(=(CAST($0):VARCHAR(2) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\" NOT NULL, '10'), <=($1, '0004'))])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                         {"10", "0002", 3, 4, 5},
                         {"10", "0003", 4, 5, 6},
                         {"10", "0004", 5, 6, 7}})
@@ -202,7 +202,7 @@ public class CalciteIndexIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerProject(TENANT_ID=[$0], ID=[$2], COL0=[$3], COL1=[CAST($1):INTEGER], COL2=[$4])\n" +
                            "    PhoenixTableScan(table=[[phoenix, IDX_MULTITENANT_TEST_TABLE]], filter=[AND(=(CAST($0):VARCHAR(2) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\" NOT NULL, '20'), <(CAST($1):INTEGER, 8))])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                         {"20", "0004", 5, 6, 7},
                         {"20", "0005", 6, 7, 8}})
                 .close();
@@ -219,7 +219,7 @@ public class CalciteIndexIT extends BaseCalciteIT {
         start(props).sql("select * from " + MULTI_TENANT_TABLE + " where id = '0284'")
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixTableScan(table=[[phoenix, MULTITENANT_TEST_TABLE]], filter=[=(CAST($0):VARCHAR(4) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\" NOT NULL, '0284')])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                         {"0284", 285, 286, 287}})
                 .close();
         
@@ -227,7 +227,7 @@ public class CalciteIndexIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerProject(ID=[$1], COL0=[$2], COL1=[CAST($0):INTEGER], COL2=[$3])\n" +
                            "    PhoenixTableScan(table=[[phoenix, IDX_MULTITENANT_TEST_TABLE]], filter=[>(CAST($0):INTEGER, 1000)])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                         {"0999", 1000, 1001, 1002},
                         {"1000", 1001, 1002, 1003},
                         {"1001", 1002, 1003, 1004},
@@ -246,7 +246,7 @@ public class CalciteIndexIT extends BaseCalciteIT {
         start(props).sql("select * from " + MULTI_TENANT_VIEW1 + " where id = '0512'")
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixTableScan(table=[[phoenix, MULTITENANT_TEST_TABLE]], filter=[=(CAST($0):VARCHAR(4) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\" NOT NULL, '0512')])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                         {"0512", 513, 514, 515}})
                 .close();
         
@@ -254,7 +254,7 @@ public class CalciteIndexIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerProject(ID=[$1], COL0=[$2], COL1=[CAST($0):INTEGER], COL2=[$3])\n" +
                            "    PhoenixTableScan(table=[[phoenix, IDX_MULTITENANT_TEST_TABLE]], filter=[<=(CAST($0):INTEGER, 6)])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                         {"0002", 3, 4, 5},
                         {"0003", 4, 5, 6},
                         {"0004", 5, 6, 7}})
@@ -264,7 +264,7 @@ public class CalciteIndexIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerProject(ID=[$1], COL0=[CAST($0):INTEGER])\n" +
                            "    PhoenixTableScan(table=[[phoenix, S1, IDX_MULTITENANT_TEST_VIEW1]], filter=[>=(CAST($0):INTEGER, 1000)])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                         {"0999", 1000},
                         {"1000", 1001},
                         {"1001", 1002}})
@@ -274,7 +274,7 @@ public class CalciteIndexIT extends BaseCalciteIT {
         start(props).sql("select * from " + MULTI_TENANT_VIEW2 + " where id = '0765'")
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixTableScan(table=[[phoenix, MULTITENANT_TEST_TABLE]], filter=[AND(>($3, 7), =(CAST($0):VARCHAR(4) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\" NOT NULL, '0765'))])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                         {"0765", 766, 767, 768}})
                 .close();
         
@@ -282,7 +282,7 @@ public class CalciteIndexIT extends BaseCalciteIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixServerProject(ID=[$1], COL0=[CAST($0):INTEGER])\n" +
                            "    PhoenixTableScan(table=[[phoenix, S2, IDX_MULTITENANT_TEST_VIEW2]], filter=[AND(>=(CAST($0):INTEGER, 272), <=(CAST($0):INTEGER, 275))])\n")
-                .resultIs(false, new Object[][] {
+                .resultIs(0, new Object[][] {
                         {"0271", 272},
                         {"0272", 273},
                         {"0273", 274},
@@ -294,7 +294,7 @@ public class CalciteIndexIT extends BaseCalciteIT {
                            "  PhoenixLimit(fetch=[5])\n" +
                            "    PhoenixServerProject(ID=[$1], COL0=[CAST($0):INTEGER])\n" +
                            "      PhoenixTableScan(table=[[phoenix, S2, IDX_MULTITENANT_TEST_VIEW2]], scanOrder=[FORWARD])\n")
-                .resultIs(true, new Object[][] {
+                .resultIs(new Object[][] {
                         {"0005", 6},
                         {"0006", 7},
                         {"0007", 8},

http://git-wip-us.apache.org/repos/asf/phoenix/blob/9ac854ae/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixTableScan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixTableScan.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixTableScan.java
index db6ac24..80c328f 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixTableScan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixTableScan.java
@@ -1,6 +1,5 @@
 package org.apache.phoenix.calcite.rel;
 
-import java.io.IOException;
 import java.sql.SQLException;
 import java.util.List;
 
@@ -20,7 +19,6 @@ import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.ImmutableIntList;
 import org.apache.hadoop.hbase.HConstants;
-import org.apache.hadoop.hbase.client.HTableInterface;
 import org.apache.hadoop.hbase.client.Scan;
 import org.apache.phoenix.calcite.CalciteUtils;
 import org.apache.phoenix.calcite.PhoenixTable;
@@ -38,9 +36,7 @@ import org.apache.phoenix.execute.ScanPlan;
 import org.apache.phoenix.execute.TupleProjector;
 import org.apache.phoenix.expression.Expression;
 import org.apache.phoenix.expression.LiteralExpression;
-import org.apache.phoenix.hbase.index.util.ImmutableBytesPtr;
 import org.apache.phoenix.iterate.ParallelIteratorFactory;
-import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData;
 import org.apache.phoenix.jdbc.PhoenixStatement;
 import org.apache.phoenix.parse.SelectStatement;
 import org.apache.phoenix.query.QueryServices;
@@ -49,11 +45,7 @@ import org.apache.phoenix.schema.PColumn;
 import org.apache.phoenix.schema.PName;
 import org.apache.phoenix.schema.PTable;
 import org.apache.phoenix.schema.TableRef;
-import org.apache.phoenix.schema.stats.GuidePostsInfo;
-import org.apache.phoenix.schema.stats.StatisticsUtil;
 import org.apache.phoenix.schema.types.PDataType;
-import org.apache.phoenix.util.SchemaUtil;
-
 import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableList.Builder;
@@ -72,7 +64,7 @@ public class PhoenixTableScan extends TableScan implements PhoenixRel {
     public final ScanOrder scanOrder;
     public final ScanRanges scanRanges;
     
-    protected final GuidePostsInfo filteredGuideposts;
+    protected final long estimatedBytes;
     protected final float rowCountFactor;
     
     public static PhoenixTableScan create(RelOptCluster cluster, final RelOptTable table) {
@@ -106,8 +98,7 @@ public class PhoenixTableScan extends TableScan implements PhoenixRel {
                 .getProps().getFloat(PhoenixRel.ROW_COUNT_FACTOR, 1f);
         
         ScanRanges scanRanges = null;
-        GuidePostsInfo info = null;
-        HTableInterface statsHTable = null;
+        long estimatedSize = 0;
         if (filter != null) {
             try {
                 // TODO simplify this code
@@ -138,35 +129,16 @@ public class PhoenixTableScan extends TableScan implements PhoenixRel {
                 StatementContext context = new StatementContext(stmt, resolver, new Scan(), new SequenceManager(stmt));
                 Expression filterExpr = CalciteUtils.toExpression(filter, tmpImplementor);
                 filterExpr = WhereOptimizer.pushKeyExpressionsToScan(context, select, filterExpr);
+                WhereCompiler.setScanFilter(context, select, filterExpr, true, false);
                 scanRanges = context.getScanRanges();
-                if (!scanRanges.isPointLookup()
-                        && !scanRanges.isDegenerate()
-                        && !scanRanges.isEverything()) {
-                    // TODO get the cf and timestamp right.
-                    Scan scan = context.getScan();
-                    byte[] cf = SchemaUtil.getEmptyColumnFamily(pTable);
-                    statsHTable = phoenixTable.pc.getQueryServices()
-                            .getTable(PhoenixDatabaseMetaData.SYSTEM_STATS_NAME_BYTES);
-                    info = StatisticsUtil.readStatistics(
-                            statsHTable, pTable.getPhysicalName().getBytes(),
-                            new ImmutableBytesPtr(cf),
-                            scan.getStartRow(),
-                            scan.getStopRow(),
-                            HConstants.LATEST_TIMESTAMP).getGuidePosts().get(cf);
-                }
-            } catch (SQLException | IOException e) {
+                ScanPlan plan = new ScanPlan(context, select, tableRef, RowProjector.EMPTY_PROJECTOR, null, OrderBy.EMPTY_ORDER_BY, null, true, null);
+                estimatedSize = plan.getEstimatedBytes();
+            } catch (SQLException e) {
                 throw new RuntimeException(e);
-            } finally {
-                if (statsHTable != null) {
-                    try {
-                        statsHTable.close();
-                    } catch (IOException e) {
-                    }
-                }
             }
         }        
         this.scanRanges = scanRanges;
-        this.filteredGuideposts = info;
+        this.estimatedBytes = estimatedSize;
     }
     
     private static ScanOrder getDefaultScanOrder(PhoenixTable table) {
@@ -211,37 +183,7 @@ public class PhoenixTableScan extends TableScan implements PhoenixRel {
         double byteCount;
         PhoenixTable phoenixTable = table.unwrap(PhoenixTable.class);
         if (scanRanges != null) {
-            if (scanRanges.isPointLookup()) {
-                byteCount = 1.0;
-            } else if (scanRanges.isDegenerate()) {
-                byteCount = 0.0;
-            } else if (scanRanges.isEverything()) {
-                byteCount = phoenixTable.byteCount;
-            } else {
-                if (filteredGuideposts != null) {
-                    byteCount = 0;
-                    for (long b : filteredGuideposts.getByteCounts()) {
-                        byteCount += b;
-                    }
-                    // TODO why zero byteCount? a bug?
-                    if (byteCount == 0 && filteredGuideposts.getGuidePostsCount() > 0) {
-                        PTable pTable = phoenixTable.getTable();
-                        byte[] emptyCf = SchemaUtil.getEmptyColumnFamily(pTable);
-                        GuidePostsInfo info = pTable.getTableStats().getGuidePosts().get(emptyCf);
-                        byteCount = phoenixTable.byteCount * filteredGuideposts.getGuidePostsCount() / info.getGuidePostsCount();                        
-                    }
-                } else {
-                    PTable pTable = phoenixTable.getTable();
-                    byte[] emptyCf = SchemaUtil.getEmptyColumnFamily(pTable);
-                    GuidePostsInfo info = pTable.getTableStats().getGuidePosts().get(emptyCf);
-                    if (info != null) {
-                        byteCount = phoenixTable.byteCount / info.getGuidePostsCount() / 2;
-                    } else {
-                        int pkCount = scanRanges.getBoundPkColumnCount();
-                        byteCount = phoenixTable.byteCount * Math.pow(mq.getSelectivity(this, filter), pkCount);
-                    }
-                }
-            }
+            byteCount = estimatedBytes;
         } else {
             byteCount = phoenixTable.byteCount;
         }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/9ac854ae/phoenix-core/src/main/java/org/apache/phoenix/execute/ScanPlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/ScanPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/ScanPlan.java
index 673a641..f622e8e 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/ScanPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/ScanPlan.java
@@ -34,6 +34,7 @@ import org.apache.phoenix.coprocessor.ScanRegionObserver;
 import org.apache.phoenix.expression.Expression;
 import org.apache.phoenix.iterate.ChunkedResultIterator;
 import org.apache.phoenix.iterate.ConcatResultIterator;
+import org.apache.phoenix.iterate.DefaultParallelScanGrouper;
 import org.apache.phoenix.iterate.LimitingResultIterator;
 import org.apache.phoenix.iterate.MergeSortRowKeyResultIterator;
 import org.apache.phoenix.iterate.MergeSortTopNResultIterator;
@@ -257,4 +258,8 @@ public class ScanPlan extends BaseQueryPlan {
         }
     }
 
+    public long getEstimatedBytes() throws SQLException {
+        return new ParallelIterators(this, null, parallelIteratorFactory, DefaultParallelScanGrouper.getInstance()).getEstimatedSize();
+    }
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/phoenix/blob/9ac854ae/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java b/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
index d321c50..c3da407 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
@@ -147,7 +147,7 @@ public abstract class BaseResultIterators extends ExplainTable implements Result
         if (isPointLookup || ScanUtil.isAnalyzeTable(scan)) {
             return false;
         }
-        return false;
+        return true;
     }
     
     private static void initializeScan(QueryPlan plan, Integer perScanLimit) {
@@ -560,8 +560,10 @@ public abstract class BaseResultIterators extends ExplainTable implements Result
                 while (guideIndex < gpsSize && (currentGuidePost.compareTo(endKey) <= 0 || endKey.length == 0)) {
                     Scan newScan = scanRanges.intersectScan(scan, currentKeyBytes, currentGuidePostBytes, keyOffset,
                             false);
-                    estimatedRows += gps.getRowCounts().get(guideIndex);
-                    estimatedSize += gps.getByteCounts().get(guideIndex);
+                    if (newScan != null) {
+                        estimatedRows += gps.getRowCounts().get(guideIndex);
+                        estimatedSize += gps.getByteCounts().get(guideIndex);
+                    }
                     scans = addNewScan(parallelScans, scans, newScan, currentGuidePostBytes, false, regionLocation);
                     currentKeyBytes = currentGuidePost.copyBytes();
                     currentGuidePost = PrefixByteCodec.decode(decoder, input);
@@ -872,4 +874,8 @@ public abstract class BaseResultIterators extends ExplainTable implements Result
         return "ResultIterators [name=" + getName() + ",id=" + scanId + ",scans=" + scans + "]";
     }
 
+    @Override
+    public long getEstimatedSize() {
+        return estimatedSize;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/phoenix/blob/9ac854ae/phoenix-core/src/main/java/org/apache/phoenix/iterate/ResultIterators.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/iterate/ResultIterators.java b/phoenix-core/src/main/java/org/apache/phoenix/iterate/ResultIterators.java
index 16f8b41..e76db56 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/iterate/ResultIterators.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/iterate/ResultIterators.java
@@ -26,6 +26,7 @@ import org.apache.phoenix.util.SQLCloseable;
 
 public interface ResultIterators extends SQLCloseable {
     public int size();
+    public long getEstimatedSize();
     public List<KeyRange> getSplits();
     public List<List<Scan>> getScans();
     public void explain(List<String> planSteps);

http://git-wip-us.apache.org/repos/asf/phoenix/blob/9ac854ae/phoenix-core/src/main/java/org/apache/phoenix/iterate/UnionResultIterators.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/iterate/UnionResultIterators.java b/phoenix-core/src/main/java/org/apache/phoenix/iterate/UnionResultIterators.java
index 5018dad..0c2cfea 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/iterate/UnionResultIterators.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/iterate/UnionResultIterators.java
@@ -139,4 +139,9 @@ public class UnionResultIterators implements ResultIterators {
     public List<PeekingResultIterator> getIterators() throws SQLException {    
         return iterators;
     }
+
+    @Override
+    public long getEstimatedSize() {
+        return 0;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/phoenix/blob/9ac854ae/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
index 7f3f850..7e28933 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
@@ -963,6 +963,9 @@ public class MetaDataClient {
          *  This supports scenarios in which a major compaction was manually initiated and the
          *  client wants the modified stats to be reflected immediately.
          */
+        connection.getQueryServices().clearTableFromCache(logicalTable.getTenantId() == null ? ByteUtil.EMPTY_BYTE_ARRAY : logicalTable.getTenantId().getBytes(),
+                Bytes.toBytes(SchemaUtil.getSchemaNameFromFullName(logicalTable.getName().toString())),
+                Bytes.toBytes(SchemaUtil.getTableNameFromFullName(logicalTable.getName().toString())), clientTimeStamp);
         connection.getQueryServices().clearTableFromCache(tenantIdBytes,
                 Bytes.toBytes(SchemaUtil.getSchemaNameFromFullName(physicalName.getString())),
                 Bytes.toBytes(SchemaUtil.getTableNameFromFullName(physicalName.getString())), clientTimeStamp);

http://git-wip-us.apache.org/repos/asf/phoenix/blob/9ac854ae/phoenix-core/src/test/java/org/apache/phoenix/iterate/AggregateResultScannerTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/iterate/AggregateResultScannerTest.java b/phoenix-core/src/test/java/org/apache/phoenix/iterate/AggregateResultScannerTest.java
index f53e871..60e4b2d 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/iterate/AggregateResultScannerTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/iterate/AggregateResultScannerTest.java
@@ -168,6 +168,11 @@ public class AggregateResultScannerTest extends BaseConnectionlessQueryTest {
             @Override
             public void close() throws SQLException {
             }
+
+            @Override
+            public long getEstimatedSize() {
+                return 0;
+            }
             
         };
         ResultIterator scanner = new GroupedAggregatingResultIterator(new MergeSortRowKeyResultIterator(iterators), aggregationManager.getAggregators());

http://git-wip-us.apache.org/repos/asf/phoenix/blob/9ac854ae/phoenix-core/src/test/java/org/apache/phoenix/iterate/ConcatResultIteratorTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/iterate/ConcatResultIteratorTest.java b/phoenix-core/src/test/java/org/apache/phoenix/iterate/ConcatResultIteratorTest.java
index cf71724..2670c6d 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/iterate/ConcatResultIteratorTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/iterate/ConcatResultIteratorTest.java
@@ -85,6 +85,11 @@ public class ConcatResultIteratorTest {
             @Override
             public void close() throws SQLException {
             }
+
+            @Override
+            public long getEstimatedSize() {
+                return 0;
+            }
         };
 
         Tuple[] expectedResults = new Tuple[] {
@@ -148,6 +153,11 @@ public class ConcatResultIteratorTest {
             @Override
             public void close() throws SQLException {
             }
+
+            @Override
+            public long getEstimatedSize() {
+                return 0;
+            }
         };
         ResultIterator scanner = new MergeSortRowKeyResultIterator(iterators);
         AssertResults.assertResults(scanner, expectedResults);

http://git-wip-us.apache.org/repos/asf/phoenix/blob/9ac854ae/phoenix-core/src/test/java/org/apache/phoenix/iterate/MergeSortResultIteratorTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/iterate/MergeSortResultIteratorTest.java b/phoenix-core/src/test/java/org/apache/phoenix/iterate/MergeSortResultIteratorTest.java
index 9b2e8de..6e3e0b7 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/iterate/MergeSortResultIteratorTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/iterate/MergeSortResultIteratorTest.java
@@ -100,6 +100,11 @@ public class MergeSortResultIteratorTest {
             @Override
             public void close() throws SQLException {
             }
+
+            @Override
+            public long getEstimatedSize() {
+                return 0;
+            }
         };
         ResultIterators reverseIterators = new ResultIterators() {
 
@@ -130,6 +135,11 @@ public class MergeSortResultIteratorTest {
             @Override
             public void close() throws SQLException {
             }
+
+            @Override
+            public long getEstimatedSize() {
+                return 0;
+            }
         };
         ResultIterator scanner = new MergeSortRowKeyResultIterator(iterators);
         AssertResults.assertResults(scanner, expectedResults);
@@ -193,6 +203,11 @@ public class MergeSortResultIteratorTest {
             @Override
             public void close() throws SQLException {
             }
+
+            @Override
+            public long getEstimatedSize() {
+                return 0;
+            }
         };
         ResultIterator scanner = new MergeSortRowKeyResultIterator(iterators, 0, true);
         AssertResults.assertResults(scanner, expectedResults);