Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -361,10 +361,12 @@ public void testCostOverridesStaticPlanOrderingInUnionQuery() throws Exception {
verifyQueryPlan(query,
"UNION ALL OVER 2 QUERIES\n" +
" CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + tableName + " [1]\n" +
" SERVER MERGE [0.C2]\n" +
" SERVER FILTER BY FIRST KEY ONLY AND \"ROWKEY\" <= 'z'\n" +
" SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY [\"C1\"]\n" +
" CLIENT MERGE SORT\n" +
" CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + tableName + " [1]\n" +
" SERVER MERGE [0.C2]\n" +
" SERVER FILTER BY FIRST KEY ONLY AND \"ROWKEY\" >= 'a'\n" +
" SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY [\"C1\"]\n" +
" CLIENT MERGE SORT");
Expand DownExpand Up@@ -413,11 +415,13 @@ public void testCostOverridesStaticPlanOrderingInJoinQuery() throws Exception {
// Use the optimal plan based on cost when stats become available.
verifyQueryPlan(query,
"CLIENT PARALLEL 626-WAY RANGE SCAN OVER " + tableName + " [1,'X0'] - [1,'X1']\n" +
" SERVER MERGE [0.C2]\n" +
" SERVER FILTER BY FIRST KEY ONLY\n" +
" SERVER SORTED BY [\"T1.:ROWKEY\"]\n" +
"CLIENT MERGE SORT\n" +
" PARALLEL INNER-JOIN TABLE 0\n" +
" CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + tableName + " [1]\n" +
" SERVER MERGE [0.C2]\n" +
" SERVER FILTER BY FIRST KEY ONLY AND \"ROWKEY\" <= 'z'\n" +
" SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY [\"C1\"]\n" +
" CLIENT MERGE SORT\n" +
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -309,6 +309,7 @@ public void testUseUncoveredLocalIndexWithPrefix() throws Exception {
assertEquals(
"CLIENT PARALLEL 1-WAY RANGE SCAN OVER "
+ physicalTableName + " [1,3,4,3]\n"
+ " SERVER MERGE [0.V3]\n"
+ " SERVER FILTER BY FIRST KEY ONLY AND \"V3\" = 1\n"
+ "CLIENT MERGE SORT",
QueryUtil.getExplainPlan(rs));
Expand DownExpand Up@@ -338,6 +339,7 @@ public void testUseUncoveredLocalIndexWithSplitPrefix() throws Exception {
assertEquals(
"CLIENT PARALLEL 16-WAY RANGE SCAN OVER "
+ indexPhysicalTableName + " [1,2,3]\n"
+ " SERVER MERGE [0.V1]\n"
+ " SERVER FILTER BY FIRST KEY ONLY\n"
+ "CLIENT MERGE SORT",
QueryUtil.getExplainPlan(rs));
Expand DownExpand Up@@ -383,6 +385,7 @@ public void testUseUncoveredLocalIndex() throws Exception {
assertEquals(
"CLIENT PARALLEL 1-WAY RANGE SCAN OVER "
+ indexPhysicalTableName + " [1]\n"
+ " SERVER MERGE [0.V1]\n"
+ " SERVER FILTER BY FIRST KEY ONLY\n"
+ "CLIENT MERGE SORT",
QueryUtil.getExplainPlan(rs));
Expand All@@ -403,6 +406,7 @@ public void testUseUncoveredLocalIndex() throws Exception {
assertEquals(
"CLIENT PARALLEL 1-WAY RANGE SCAN OVER "
+ indexPhysicalTableName + " [1,2]\n"
+ " SERVER MERGE [0.V1]\n"
+ " SERVER FILTER BY FIRST KEY ONLY\n"
+ "CLIENT MERGE SORT",
QueryUtil.getExplainPlan(rs));
Expand DownExpand Up@@ -431,6 +435,7 @@ public void testUseUncoveredLocalIndex() throws Exception {
assertEquals(
"CLIENT PARALLEL 1-WAY RANGE SCAN OVER "
+ indexPhysicalTableName + " [1,2]\n"
+ " SERVER MERGE [0.V1]\n"
+ " SERVER FILTER BY FIRST KEY ONLY\n"
+ "CLIENT MERGE SORT",
QueryUtil.getExplainPlan(rs));
Expand All@@ -441,6 +446,7 @@ public void testUseUncoveredLocalIndex() throws Exception {
assertEquals(
"CLIENT PARALLEL 1-WAY RANGE SCAN OVER "
+ indexPhysicalTableName + " [1,2]\n"
+ " SERVER MERGE [0.V1]\n"
+ " SERVER FILTER BY FIRST KEY ONLY AND TO_INTEGER(\"V4\") = 4\n"
+ "CLIENT MERGE SORT",
QueryUtil.getExplainPlan(rs));
Expand All@@ -451,6 +457,7 @@ public void testUseUncoveredLocalIndex() throws Exception {
assertEquals(
"CLIENT PARALLEL 1-WAY RANGE SCAN OVER "
+ indexPhysicalTableName + " [1,2]\n"
+ " SERVER MERGE [0.V1]\n"
+ " SERVER FILTER BY FIRST KEY ONLY AND \"V1\" = 3.0\n"
+ "CLIENT MERGE SORT",
QueryUtil.getExplainPlan(rs));
Expand DownExpand Up@@ -661,6 +668,7 @@ public void testLocalIndexUsedForUncoveredOrderBy() throws Exception {
assertEquals(
"CLIENT PARALLEL " + numRegions + "-WAY RANGE SCAN OVER "
+ indexPhysicalTableName + " [1]\n"
+ " SERVER MERGE [0.K3]\n"
+ " SERVER FILTER BY FIRST KEY ONLY\n"
+ "CLIENT MERGE SORT",
QueryUtil.getExplainPlan(rs));
Expand All@@ -683,6 +691,7 @@ public void testLocalIndexUsedForUncoveredOrderBy() throws Exception {
assertEquals(
"CLIENT PARALLEL " + numRegions + "-WAY REVERSE RANGE SCAN OVER "
+ indexPhysicalTableName + " [1]\n"
+ " SERVER MERGE [0.K3]\n"
+ " SERVER FILTER BY FIRST KEY ONLY\n"
+ "CLIENT MERGE SORT",
QueryUtil.getExplainPlan(rs));
Expand DownExpand Up@@ -778,6 +787,7 @@ public void testLocalIndexScanJoinColumnsFromDataTable() throws Exception {
assertEquals(
"CLIENT PARALLEL " + numRegions + "-WAY RANGE SCAN OVER "
+ indexPhysicalTableName + " [1,'a']\n"
+ " SERVER MERGE [0.K3]\n"
+ " SERVER FILTER BY FIRST KEY ONLY\n"
+ "CLIENT MERGE SORT",
QueryUtil.getExplainPlan(rs));
Expand All@@ -801,6 +811,7 @@ public void testLocalIndexScanJoinColumnsFromDataTable() throws Exception {
assertEquals(
"CLIENT PARALLEL " + numRegions + "-WAY RANGE SCAN OVER "
+ indexPhysicalTableName +" [1,*] - [1,'z']\n"
+ " SERVER MERGE [0.K3]\n"
+ " SERVER FILTER BY FIRST KEY ONLY\n"
+ "CLIENT MERGE SORT",
QueryUtil.getExplainPlan(rs));
Expand DownExpand Up@@ -837,6 +848,7 @@ public void testLocalIndexScanJoinColumnsFromDataTable() throws Exception {
assertEquals(
"CLIENT PARALLEL " + numRegions + "-WAY RANGE SCAN OVER "
+ indexPhysicalTableName +" [1,*] - [1,'z']\n"
+ " SERVER MERGE [0.K3]\n"
+ " SERVER FILTER BY FIRST KEY ONLY\n"
+ " SERVER AGGREGATE INTO DISTINCT ROWS BY [\"V1\", \"T_ID\", \"K3\"]\nCLIENT MERGE SORT",
QueryUtil.getExplainPlan(rs));
Expand DownExpand Up@@ -865,6 +877,7 @@ public void testLocalIndexScanJoinColumnsFromDataTable() throws Exception {
assertEquals(
"CLIENT PARALLEL " + numRegions + "-WAY RANGE SCAN OVER "
+ indexPhysicalTableName +" [1,*] - [1,'z']\n"
+ " SERVER MERGE [0.K3]\n"
+ " SERVER FILTER BY FIRST KEY ONLY\n"
+ " SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY [\"V1\"]\nCLIENT MERGE SORT",
QueryUtil.getExplainPlan(rs));
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -181,6 +181,7 @@ public void testCoveredColumnUpdates() throws Exception {
query = "SELECT b.* from " + fullTableName + " where int_col1 = 4 AND char_col1 = 'chara'";
rs = conn.createStatement().executeQuery("EXPLAIN " + query);
assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + fullTableName +" [1,'chara',4]\n" +
" SERVER MERGE [B.VARCHAR_COL2, B.CHAR_COL2, B.INT_COL2, B.DECIMAL_COL2, B.DATE_COL]\n" +
"CLIENT MERGE SORT", QueryUtil.getExplainPlan(rs));
rs = conn.createStatement().executeQuery(query);
assertTrue(rs.next());
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -239,6 +239,7 @@ public void testMultiTenantViewLocalIndex() throws Exception {
ResultSet rs = conn1.prepareStatement("EXPLAIN " + sql).executeQuery();
assertEquals(
"CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + SchemaUtil.getPhysicalTableName(Bytes.toBytes(fullTableName), isNamespaceMapped) + " [1,'10',100]\n" +
" SERVER MERGE [0.V1]\n" +
" SERVER FILTER BY FIRST KEY ONLY\n" +
"CLIENT MERGE SORT", QueryUtil.getExplainPlan(rs));
rs = conn1.prepareStatement(sql).executeQuery();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -463,6 +463,7 @@ public static synchronized Collection<Object> data() {
* WHERE s.name = 'S1' AND i.name < 'T6'
*/
"CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_SUPPLIER_TABLE_FULL_NAME + " [1,'S1']\n" +
" SERVER MERGE [0.PHONE]\n" +
" SERVER FILTER BY FIRST KEY ONLY\n" +
"CLIENT MERGE SORT\n" +
" PARALLEL INNER-JOIN TABLE 0\n" +
Expand All@@ -479,6 +480,7 @@ public static synchronized Collection<Object> data() {
* GROUP BY phone
*/
"CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_SUPPLIER_TABLE_FULL_NAME + " [1,'S1']\n" +
" SERVER MERGE [0.PHONE]\n" +
" SERVER FILTER BY FIRST KEY ONLY\n" +
" SERVER AGGREGATE INTO DISTINCT ROWS BY [\"S.PHONE\"]\n" +
"CLIENT MERGE SORT\n" +
Expand All@@ -495,6 +497,7 @@ public static synchronized Collection<Object> data() {
* WHERE s.name <= 'S3'
*/
"CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_SUPPLIER_TABLE_FULL_NAME + " [1,*] - [1,'S3']\n" +
" SERVER MERGE [0.PHONE]\n" +
" SERVER FILTER BY FIRST KEY ONLY\n" +
" SERVER AGGREGATE INTO SINGLE ROW\n" +
" PARALLEL LEFT-JOIN TABLE 0\n" +
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,9 +18,12 @@

package org.apache.phoenix.compile;

import java.util.Set;

import org.apache.hadoop.hbase.client.Consistency;
import org.apache.phoenix.parse.HintNode;
import org.apache.phoenix.parse.HintNode.Hint;
import org.apache.phoenix.schema.PColumn;

/**
* ExplainPlan attributes that contain individual attributes of ExplainPlan
Expand DownExpand Up@@ -69,6 +72,7 @@ public class ExplainPlanAttributes {
// For non-Join queries related Plans, rhsJoinQueryExplainPlan will always
// be null
private final ExplainPlanAttributes rhsJoinQueryExplainPlan;
private Set<PColumn> serverMergeColumns;

private static final ExplainPlanAttributes EXPLAIN_PLAN_INSTANCE =
new ExplainPlanAttributes();
Expand DownExpand Up@@ -107,6 +111,7 @@ private ExplainPlanAttributes() {
this.clientCursorName = null;
this.clientSortAlgo = null;
this.rhsJoinQueryExplainPlan = null;
this.serverMergeColumns = null;
}

public ExplainPlanAttributes(String abstractExplainPlan,
Expand All@@ -126,7 +131,8 @@ public ExplainPlanAttributes(String abstractExplainPlan,
Integer clientOffset, Integer clientRowLimit,
Integer clientSequenceCount, String clientCursorName,
String clientSortAlgo,
ExplainPlanAttributes rhsJoinQueryExplainPlan) {
ExplainPlanAttributes rhsJoinQueryExplainPlan,
Set<PColumn> serverMergeColumns) {
this.abstractExplainPlan = abstractExplainPlan;
this.splitsChunk = splitsChunk;
this.estimatedRows = estimatedRows;
Expand DownExpand Up@@ -160,6 +166,7 @@ public ExplainPlanAttributes(String abstractExplainPlan,
this.clientCursorName = clientCursorName;
this.clientSortAlgo = clientSortAlgo;
this.rhsJoinQueryExplainPlan = rhsJoinQueryExplainPlan;
this.serverMergeColumns = serverMergeColumns;
}

public String getAbstractExplainPlan() {
Expand DownExpand Up@@ -294,6 +301,10 @@ public ExplainPlanAttributes getRhsJoinQueryExplainPlan() {
return rhsJoinQueryExplainPlan;
}

public Set<PColumn> getServerMergeColumns() {
return serverMergeColumns;
}

public static ExplainPlanAttributes getDefaultExplainPlan() {
return EXPLAIN_PLAN_INSTANCE;
}
Expand DownExpand Up@@ -332,6 +343,7 @@ public static class ExplainPlanAttributesBuilder {
private String clientCursorName;
private String clientSortAlgo;
private ExplainPlanAttributes rhsJoinQueryExplainPlan;
private Set<PColumn> serverMergeColumns;

public ExplainPlanAttributesBuilder() {
// default
Expand DownExpand Up@@ -383,6 +395,7 @@ public ExplainPlanAttributesBuilder(
this.clientSortAlgo = explainPlanAttributes.getClientSortAlgo();
this.rhsJoinQueryExplainPlan =
explainPlanAttributes.getRhsJoinQueryExplainPlan();
this.serverMergeColumns = explainPlanAttributes.getServerMergeColumns();
}

public ExplainPlanAttributesBuilder setAbstractExplainPlan(
Expand DownExpand Up@@ -580,6 +593,12 @@ public ExplainPlanAttributesBuilder setRhsJoinQueryExplainPlan(
return this;
}

public ExplainPlanAttributesBuilder setServerMergeColumns(
Set<PColumn> columns) {
this.serverMergeColumns = columns;
return this;
}

public ExplainPlanAttributes build() {
return new ExplainPlanAttributes(abstractExplainPlan, splitsChunk,
estimatedRows, estimatedSizeInBytes, iteratorTypeAndScanSize,
Expand All@@ -592,7 +611,7 @@ public ExplainPlanAttributes build() {
clientFilterBy, clientAggregate, clientSortedBy,
clientAfterAggregate, clientDistinctFilter, clientOffset,
clientRowLimit, clientSequenceCount, clientCursorName,
clientSortAlgo, rhsJoinQueryExplainPlan);
clientSortAlgo, rhsJoinQueryExplainPlan, serverMergeColumns);
}
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,6 +22,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Set;

import org.apache.hadoop.hbase.client.Consistency;
import org.apache.hadoop.hbase.client.Scan;
Expand All@@ -44,6 +45,7 @@
import org.apache.phoenix.parse.HintNode.Hint;
import org.apache.phoenix.query.KeyRange;
import org.apache.phoenix.query.KeyRange.Bound;
import org.apache.phoenix.schema.PColumn;
import org.apache.phoenix.schema.RowKeySchema;
import org.apache.phoenix.schema.SortOrder;
import org.apache.phoenix.schema.TableRef;
Expand DownExpand Up@@ -178,6 +180,13 @@ protected void explain(String prefix, List<String> planSteps,
}
} while (filterIterator.hasNext());
}
Set<PColumn> dataColumns = context.getDataColumns();

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Technically if you wanted to be pedantic this would be after SERVER FILTER BY FIRST KEY ONLY and before any other filters. Since Phoenix puts these together in one line I chose to put this in front.

if (dataColumns != null && !dataColumns.isEmpty()) {
planSteps.add(" SERVER MERGE " + dataColumns.toString());
if (explainPlanAttributesBuilder != null) {
explainPlanAttributesBuilder.setServerMergeColumns(dataColumns);
}
}
String whereFilterStr = null;
if (whereFilter != null) {
whereFilterStr = whereFilter.toString();
Expand Down