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 2014/02/12 05:59:58 UTC

[3/4] git commit: Fix merge conflicts

Fix merge conflicts


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

Branch: refs/heads/master
Commit: 9ee8d645d55da0d079eef632df3123f535390115
Parents: 7ac4ee2 7a6a46c
Author: maryannxue <ma...@apache.org>
Authored: Tue Feb 11 23:13:53 2014 -0500
Committer: maryannxue <ma...@apache.org>
Committed: Tue Feb 11 23:13:53 2014 -0500

----------------------------------------------------------------------
 phoenix-core/src/main/antlr3/PhoenixSQL.g       |   32 +-
 .../phoenix/compile/CreateSequenceCompiler.java |   10 +-
 .../apache/phoenix/compile/DeleteCompiler.java  |    8 +-
 .../phoenix/compile/ExpressionCompiler.java     |   20 +-
 .../phoenix/compile/ExpressionProjector.java    |    2 +-
 .../apache/phoenix/compile/FromCompiler.java    |    4 +-
 .../apache/phoenix/compile/JoinCompiler.java    |    4 +-
 .../apache/phoenix/compile/LimitCompiler.java   |    4 +-
 .../apache/phoenix/compile/OrderByCompiler.java |    6 +-
 .../phoenix/compile/ProjectionCompiler.java     |  151 +-
 .../TrackOrderPreservingExpressionCompiler.java |   10 +-
 .../apache/phoenix/compile/UpsertCompiler.java  |   22 +-
 .../apache/phoenix/compile/WhereCompiler.java   |    8 +-
 .../apache/phoenix/compile/WhereOptimizer.java  |   25 +-
 .../coprocessor/MetaDataEndpointImpl.java       |   32 +-
 .../phoenix/coprocessor/ScanRegionObserver.java |  125 +-
 .../coprocessor/SequenceRegionObserver.java     |   11 +-
 .../UngroupedAggregateRegionObserver.java       |   17 +-
 .../expression/ArrayConstructorExpression.java  |    2 +-
 .../phoenix/expression/BaseExpression.java      |    6 +-
 .../phoenix/expression/CoerceExpression.java    |   28 +-
 .../phoenix/expression/ColumnExpression.java    |   14 +-
 .../expression/ComparisonExpression.java        |   22 +-
 .../phoenix/expression/DateAddExpression.java   |   12 +-
 .../expression/DateSubtractExpression.java      |   12 +-
 .../expression/DecimalAddExpression.java        |    6 +-
 .../expression/DecimalDivideExpression.java     |    6 +-
 .../expression/DecimalMultiplyExpression.java   |    6 +-
 .../expression/DecimalSubtractExpression.java   |    8 +-
 .../phoenix/expression/DoubleAddExpression.java |    2 +-
 .../expression/DoubleDivideExpression.java      |    2 +-
 .../expression/DoubleMultiplyExpression.java    |    2 +-
 .../expression/DoubleSubtractExpression.java    |    2 +-
 .../phoenix/expression/ExpressionType.java      |    4 +-
 .../phoenix/expression/InListExpression.java    |   12 +-
 .../IndexKeyValueColumnExpression.java          |   26 -
 .../expression/KeyValueColumnExpression.java    |   12 +-
 .../phoenix/expression/LikeExpression.java      |    4 +-
 .../phoenix/expression/LiteralExpression.java   |   43 +-
 .../phoenix/expression/LongAddExpression.java   |    2 +-
 .../expression/LongDivideExpression.java        |    2 +-
 .../expression/LongMultiplyExpression.java      |    2 +-
 .../expression/LongSubtractExpression.java      |    2 +-
 .../expression/ProjectedColumnExpression.java   |   22 +-
 .../expression/RowKeyColumnExpression.java      |    2 +-
 .../RowValueConstructorExpression.java          |    4 +-
 .../expression/StringConcatExpression.java      |    8 +-
 .../expression/TimestampAddExpression.java      |   12 +-
 .../expression/TimestampSubtractExpression.java |   12 +-
 .../expression/aggregator/BaseAggregator.java   |   12 +-
 .../aggregator/BaseDecimalStddevAggregator.java |    6 +-
 .../aggregator/BaseStddevAggregator.java        |    6 +-
 .../expression/aggregator/CountAggregator.java  |    4 +-
 .../aggregator/DecimalStddevPopAggregator.java  |    6 +-
 .../aggregator/DecimalStddevSampAggregator.java |    6 +-
 .../aggregator/DecimalSumAggregator.java        |    8 +-
 .../DistinctCountClientAggregator.java          |    7 +-
 .../DistinctValueWithCountClientAggregator.java |   20 +-
 .../DistinctValueWithCountServerAggregator.java |    3 +-
 .../aggregator/DoubleSumAggregator.java         |   10 +-
 .../expression/aggregator/IntSumAggregator.java |    6 +-
 .../aggregator/LongSumAggregator.java           |    6 +-
 .../expression/aggregator/MaxAggregator.java    |    6 +-
 .../expression/aggregator/MinAggregator.java    |    8 +-
 .../aggregator/NumberSumAggregator.java         |   14 +-
 .../aggregator/PercentRankClientAggregator.java |    6 +-
 .../aggregator/PercentileClientAggregator.java  |    6 +-
 .../PercentileDiscClientAggregator.java         |    6 +-
 .../aggregator/StddevPopAggregator.java         |    6 +-
 .../aggregator/StddevSampAggregator.java        |    6 +-
 .../aggregator/UnsignedIntSumAggregator.java    |    6 +-
 .../aggregator/UnsignedLongSumAggregator.java   |    6 +-
 .../expression/function/ArrayIndexFunction.java |    2 +-
 .../function/AvgAggregateFunction.java          |    6 +-
 .../function/CeilTimestampExpression.java       |    8 +-
 .../function/CountAggregateFunction.java        |    2 +-
 .../DistinctCountAggregateFunction.java         |    2 +-
 .../expression/function/InvertFunction.java     |    8 +-
 .../expression/function/LTrimFunction.java      |   12 +-
 .../expression/function/LengthFunction.java     |    2 +-
 .../expression/function/LowerFunction.java      |    2 +-
 .../function/MaxAggregateFunction.java          |   10 +-
 .../function/MinAggregateFunction.java          |   10 +-
 .../function/PercentRankAggregateFunction.java  |    2 +-
 .../PercentileContAggregateFunction.java        |    2 +-
 .../PercentileDiscAggregateFunction.java        |    2 +-
 .../expression/function/RTrimFunction.java      |   10 +-
 .../function/RegexpReplaceFunction.java         |    4 +-
 .../function/RegexpSubstrFunction.java          |    4 +-
 .../expression/function/ReverseFunction.java    |   10 +-
 .../function/RoundDateExpression.java           |    8 +-
 .../function/RoundDecimalExpression.java        |    2 +-
 .../function/RoundTimestampExpression.java      |    8 +-
 .../function/SqlTypeNameFunction.java           |    2 +-
 .../expression/function/StddevPopFunction.java  |    4 +-
 .../expression/function/StddevSampFunction.java |    4 +-
 .../expression/function/SubstrFunction.java     |   20 +-
 .../function/SumAggregateFunction.java          |   18 +-
 .../expression/function/ToCharFunction.java     |    2 +-
 .../expression/function/ToDateFunction.java     |    2 +-
 .../expression/function/ToNumberFunction.java   |    4 +-
 .../expression/function/TrimFunction.java       |   12 +-
 .../expression/function/UpperFunction.java      |    2 +-
 .../apache/phoenix/index/IndexMaintainer.java   |   81 +-
 .../apache/phoenix/iterate/ExplainTable.java    |    8 +-
 .../phoenix/iterate/ParallelIterators.java      |   10 +-
 .../phoenix/jdbc/PhoenixDatabaseMetaData.java   |   12 +-
 .../phoenix/jdbc/PhoenixParameterMetaData.java  |    6 +-
 .../apache/phoenix/jdbc/PhoenixStatement.java   |    6 +-
 .../org/apache/phoenix/parse/ColumnDef.java     |   19 +-
 .../phoenix/parse/IndexKeyConstraint.java       |   12 +-
 .../apache/phoenix/parse/ParseNodeFactory.java  |   14 +-
 .../phoenix/parse/PrimaryKeyConstraint.java     |   26 +-
 .../query/ConnectionQueryServicesImpl.java      |    7 +-
 .../java/org/apache/phoenix/query/KeyRange.java |    6 +-
 .../apache/phoenix/query/QueryConstants.java    |   18 +-
 .../org/apache/phoenix/schema/ColumnRef.java    |   36 +-
 .../apache/phoenix/schema/DelegateColumn.java   |    4 +-
 .../apache/phoenix/schema/DelegateDatum.java    |    4 +-
 .../apache/phoenix/schema/KeyValueSchema.java   |    2 +-
 .../apache/phoenix/schema/MetaDataClient.java   |   71 +-
 .../apache/phoenix/schema/PArrayDataType.java   |   18 +-
 .../org/apache/phoenix/schema/PColumnImpl.java  |   21 +-
 .../org/apache/phoenix/schema/PDataType.java    |  573 ++++---
 .../java/org/apache/phoenix/schema/PDatum.java  |    4 +-
 .../apache/phoenix/schema/PMetaDataImpl.java    |    2 +-
 .../org/apache/phoenix/schema/PTableImpl.java   |   12 +-
 .../org/apache/phoenix/schema/RowKeySchema.java |    4 +-
 .../org/apache/phoenix/schema/SaltingUtil.java  |    6 +-
 .../org/apache/phoenix/schema/Sequence.java     |   14 +-
 .../org/apache/phoenix/schema/SortOrder.java    |  142 ++
 .../org/apache/phoenix/schema/ValueSchema.java  |   29 +-
 .../java/org/apache/phoenix/util/ByteUtil.java  |   14 +-
 .../java/org/apache/phoenix/util/IndexUtil.java |   10 +-
 .../org/apache/phoenix/util/MetaDataUtil.java   |    3 +-
 .../org/apache/phoenix/util/PhoenixRuntime.java |  101 +-
 .../org/apache/phoenix/util/SchemaUtil.java     |   26 +-
 .../org/apache/phoenix/util/StringUtil.java     |   38 +-
 .../phoenix/compile/HavingClauseTest.java       |  194 ---
 .../phoenix/compile/HavingCompilerTest.java     |  199 +++
 .../phoenix/compile/JoinQueryCompileTest.java   |  146 --
 .../phoenix/compile/JoinQueryCompilerTest.java  |  146 ++
 .../apache/phoenix/compile/LimitClauseTest.java |  157 --
 .../phoenix/compile/LimitCompilerTest.java      |  157 ++
 .../phoenix/compile/QueryCompileTest.java       | 1298 --------------
 .../phoenix/compile/QueryCompilerTest.java      | 1313 ++++++++++++++
 .../apache/phoenix/compile/ScanRangesTest.java  |   14 +-
 .../apache/phoenix/compile/ViewCompileTest.java |  119 --
 .../phoenix/compile/ViewCompilerTest.java       |  119 ++
 .../phoenix/compile/WhereClauseCompileTest.java |  931 ----------
 .../compile/WhereClauseOptimizerTest.java       | 1620 ------------------
 .../phoenix/compile/WhereCompilerTest.java      |  931 ++++++++++
 .../phoenix/compile/WhereOptimizerTest.java     | 1620 ++++++++++++++++++
 .../apache/phoenix/end2end/AlterTableTest.java  |    9 +-
 .../org/apache/phoenix/end2end/ArrayTest.java   |  157 +-
 .../end2end/DescColumnSortOrderTest.java        |  555 ------
 .../phoenix/end2end/DynamicColumnTest.java      |    9 +-
 .../phoenix/end2end/DynamicFamilyTest.java      |   11 +-
 .../apache/phoenix/end2end/HashJoinTest.java    |   23 +-
 .../end2end/QueryDatabaseMetaDataTest.java      |    2 +-
 ...RangeParallelIteratorRegionSplitterTest.java |    8 +-
 .../apache/phoenix/end2end/SortOrderFTest.java  |  554 ++++++
 .../phoenix/end2end/index/IndexTestUtil.java    |    6 +-
 .../expression/ColumnExpressionTest.java        |    9 +-
 .../DescColumnSortOrderExpressionTest.java      |  325 ----
 .../expression/SortOrderExpressionTest.java     |  324 ++++
 .../filter/SkipScanFilterIntersectTest.java     |    8 +-
 .../phoenix/filter/SkipScanFilterTest.java      |    8 +-
 .../iterate/AggregateResultScannerTest.java     |    6 +-
 .../apache/phoenix/parse/QueryParserTest.java   |   14 +-
 .../query/BaseConnectionlessQueryTest.java      |   44 +-
 .../apache/phoenix/schema/PDataTypeTest.java    |  172 +-
 .../apache/phoenix/schema/RowKeySchemaTest.java |   12 +-
 .../phoenix/schema/RowKeyValueAccessorTest.java |    2 +-
 .../apache/phoenix/schema/SortOrderTest.java    |  113 ++
 .../apache/phoenix/schema/ValueBitSetTest.java  |    4 +-
 .../apache/phoenix/util/PhoenixRuntimeTest.java |   26 +
 .../org/apache/phoenix/util/ScanUtilTest.java   |   14 +-
 .../java/org/apache/phoenix/util/TestUtil.java  |    4 +-
 .../flume/serializer/BaseEventSerializer.java   |   48 +-
 180 files changed, 7385 insertions(+), 6551 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/9ee8d645/phoenix-core/src/main/antlr3/PhoenixSQL.g
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/9ee8d645/phoenix-core/src/main/java/org/apache/phoenix/compile/FromCompiler.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/9ee8d645/phoenix-core/src/main/java/org/apache/phoenix/compile/JoinCompiler.java
----------------------------------------------------------------------
diff --cc phoenix-core/src/main/java/org/apache/phoenix/compile/JoinCompiler.java
index e0b3704,0afbd3f..e7e0d56
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/JoinCompiler.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/JoinCompiler.java
@@@ -346,16 -341,24 +346,16 @@@ public class JoinCompiler 
          	String colName = sourceColumn.getName().getString();
              String fullName = getProjectedColumnName(schemaName, tableName, colName);
              String aliasedName = sourceTable.getTableAlias() == null ? fullName : getProjectedColumnName(null, sourceTable.getTableAlias(), colName);
 -            String displayName = aliasedName;
 -        	if (isRewrite) {
 -        	    String dataColName = IndexUtil.getDataColumnName(colName);
 -        	    displayName = sourceTable.getTableAlias() == null ? getProjectedColumnName(schemaName, table.getParentTableName().getString(), dataColName) : getProjectedColumnName(null, sourceTable.getTableAlias(), dataColName);
 -        	}
          	
 -            columnNameMap.put(colName, displayName);
 -        	if (!fullName.equals(displayName)) {
 -        		columnNameMap.put(fullName, displayName);
 -        	}
 -        	if (!aliasedName.equals(displayName) && !aliasedName.equals(fullName)) {
 -        	    columnNameMap.put(aliasedName, displayName);
 +            columnNameMap.put(colName, aliasedName);
 +        	if (!fullName.equals(aliasedName)) {
 +        		columnNameMap.put(fullName, aliasedName);
          	}
              
 -        	PName name = PNameFactory.newName(displayName);
 +        	PName name = PNameFactory.newName(aliasedName);
      		PColumnImpl column = new PColumnImpl(name, familyName, sourceColumn.getDataType(), 
      				sourceColumn.getMaxLength(), sourceColumn.getScale(), sourceColumn.isNullable(), 
-     				position, sourceColumn.getColumnModifier(), sourceColumn.getArraySize());
+     				position, sourceColumn.getSortOrder(), sourceColumn.getArraySize());
          	Expression sourceExpression = new ColumnRef(sourceTable, sourceColumn.getPosition()).newColumnExpression();
          	projectedColumns.add(column);
          	sourceExpressions.add(sourceExpression);

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/9ee8d645/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java
----------------------------------------------------------------------
diff --cc phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java
index 72f5c1a,2869a25..1fb6f5d
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java
@@@ -52,9 -57,8 +57,10 @@@ import org.apache.phoenix.parse.Functio
  import org.apache.phoenix.parse.ParseNode;
  import org.apache.phoenix.parse.SelectStatement;
  import org.apache.phoenix.parse.SequenceValueParseNode;
 +import org.apache.phoenix.parse.TableName;
 +import org.apache.phoenix.parse.TableWildcardParseNode;
  import org.apache.phoenix.parse.WildcardParseNode;
+ import org.apache.phoenix.query.QueryConstants;
  import org.apache.phoenix.schema.ArgumentTypeMismatchException;
  import org.apache.phoenix.schema.ColumnNotFoundException;
  import org.apache.phoenix.schema.ColumnRef;
@@@ -205,12 -196,13 +221,14 @@@ public class ProjectionCompiler 
       * @throws SQLException 
       */
      public static RowProjector compile(StatementContext context, SelectStatement statement, GroupBy groupBy, List<? extends PDatum> targetColumns) throws SQLException {
+         List<KeyValueColumnExpression> arrayKVRefs = new ArrayList<KeyValueColumnExpression>();
+         List<Expression> arrayKVFuncs = new ArrayList<Expression>();
          List<AliasedNode> aliasedNodes = statement.getSelect();
          // Setup projected columns in Scan
-         SelectClauseVisitor selectVisitor = new SelectClauseVisitor(context, groupBy);
+         SelectClauseVisitor selectVisitor = new SelectClauseVisitor(context, groupBy, arrayKVRefs, arrayKVFuncs, statement);
          List<ExpressionProjector> projectedColumns = new ArrayList<ExpressionProjector>();
 -        TableRef tableRef = context.getResolver().getTables().get(0);
 +        ColumnResolver resolver = context.getResolver();
 +        TableRef tableRef = context.getCurrentTable();
          PTable table = tableRef.getTable();
          boolean isWildcard = false;
          Scan scan = context.getScan();

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/9ee8d645/phoenix-core/src/main/java/org/apache/phoenix/parse/ParseNodeFactory.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/9ee8d645/phoenix-core/src/test/java/org/apache/phoenix/compile/JoinQueryCompilerTest.java
----------------------------------------------------------------------
diff --cc phoenix-core/src/test/java/org/apache/phoenix/compile/JoinQueryCompilerTest.java
index 0000000,2c1d1ab..7c52e55
mode 000000,100644..100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/compile/JoinQueryCompilerTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/compile/JoinQueryCompilerTest.java
@@@ -1,0 -1,146 +1,146 @@@
+ /*
+  * Copyright 2014 The Apache Software Foundation
+  *
+  * Licensed to the Apache Software Foundation (ASF) under one
+  * or more contributor license agreements.  See the NOTICE file
+  * distributed with this work for additional information
+  * regarding copyright ownership.  The ASF licenses this file
+  * to you under the Apache License, Version 2.0 (the
+  * "License"); you may not use this file except in compliance
+  * with the License.  You may obtain a copy of the License at
+  *
+  * http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ package org.apache.phoenix.compile;
+ 
 -import static org.apache.phoenix.util.TestUtil.JOIN_CUSTOMER_TABLE;
 -import static org.apache.phoenix.util.TestUtil.JOIN_CUSTOMER_TABLE_NORMALIZED;
 -import static org.apache.phoenix.util.TestUtil.JOIN_ITEM_TABLE;
 -import static org.apache.phoenix.util.TestUtil.JOIN_ITEM_TABLE_NORMALIZED;
 -import static org.apache.phoenix.util.TestUtil.JOIN_ORDER_TABLE;
 -import static org.apache.phoenix.util.TestUtil.JOIN_ORDER_TABLE_NORMALIZED;
 -import static org.apache.phoenix.util.TestUtil.JOIN_SUPPLIER_TABLE;
 -import static org.apache.phoenix.util.TestUtil.JOIN_SUPPLIER_TABLE_NORMALIZED;
++import static org.apache.phoenix.util.TestUtil.JOIN_CUSTOMER_TABLE_FULL_NAME;
++import static org.apache.phoenix.util.TestUtil.JOIN_CUSTOMER_TABLE_DISPLAY_NAME;
++import static org.apache.phoenix.util.TestUtil.JOIN_ITEM_TABLE_FULL_NAME;
++import static org.apache.phoenix.util.TestUtil.JOIN_ITEM_TABLE_DISPLAY_NAME;
++import static org.apache.phoenix.util.TestUtil.JOIN_ORDER_TABLE_FULL_NAME;
++import static org.apache.phoenix.util.TestUtil.JOIN_ORDER_TABLE_DISPLAY_NAME;
++import static org.apache.phoenix.util.TestUtil.JOIN_SUPPLIER_TABLE_FULL_NAME;
++import static org.apache.phoenix.util.TestUtil.JOIN_SUPPLIER_TABLE_DISPLAY_NAME;
+ import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES;
+ import static org.junit.Assert.assertEquals;
+ 
+ import java.sql.Connection;
+ import java.sql.DriverManager;
+ import java.sql.ResultSet;
+ import java.sql.SQLException;
+ import java.util.Collections;
+ import java.util.List;
+ 
+ import org.junit.Test;
+ import org.apache.hadoop.hbase.client.Scan;
+ import org.apache.phoenix.compile.JoinCompiler.JoinSpec;
+ import org.apache.phoenix.jdbc.PhoenixConnection;
+ import org.apache.phoenix.jdbc.PhoenixStatement;
+ import org.apache.phoenix.parse.SQLParser;
+ import org.apache.phoenix.parse.SelectStatement;
+ import org.apache.phoenix.query.BaseConnectionlessQueryTest;
+ import org.apache.phoenix.util.QueryUtil;
+ 
+ /**
+  * Test compilation of queries containing joins.
+  */
+ public class JoinQueryCompilerTest extends BaseConnectionlessQueryTest {
+     
+     @Test
+     public void testExplainPlan() throws Exception {
+         Connection conn = DriverManager.getConnection(getUrl());
 -        String query = "EXPLAIN SELECT s.\"supplier_id\", \"order_id\", c.name, i.name, quantity, o.date FROM " + JOIN_ORDER_TABLE + " o LEFT JOIN " 
 -    	+ JOIN_CUSTOMER_TABLE + " c ON o.\"customer_id\" = c.\"customer_id\" AND c.name LIKE 'C%' LEFT JOIN " 
 -    	+ JOIN_ITEM_TABLE + " i ON o.\"item_id\" = i.\"item_id\" RIGHT JOIN " 
 -    	+ JOIN_SUPPLIER_TABLE + " s ON s.\"supplier_id\" = i.\"supplier_id\" WHERE i.name LIKE 'T%'";
++        String query = "EXPLAIN SELECT s.\"supplier_id\", \"order_id\", c.name, i.name, quantity, o.date FROM " + JOIN_ORDER_TABLE_FULL_NAME + " o LEFT JOIN " 
++    	+ JOIN_CUSTOMER_TABLE_FULL_NAME + " c ON o.\"customer_id\" = c.\"customer_id\" AND c.name LIKE 'C%' LEFT JOIN " 
++    	+ JOIN_ITEM_TABLE_FULL_NAME + " i ON o.\"item_id\" = i.\"item_id\" RIGHT JOIN " 
++    	+ JOIN_SUPPLIER_TABLE_FULL_NAME + " s ON s.\"supplier_id\" = i.\"supplier_id\" WHERE i.name LIKE 'T%'";
+         ResultSet rs = conn.createStatement().executeQuery(query);
+         assertEquals(
 -        		"CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_SUPPLIER_TABLE_NORMALIZED + "\n" +
++        		"CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_SUPPLIER_TABLE_DISPLAY_NAME + "\n" +
+         		"    SERVER FILTER BY FIRST KEY ONLY\n" +
+         		"    PARALLEL EQUI-JOIN 1 HASH TABLES:\n" +
+         		"    BUILD HASH TABLE 0\n" +
 -        		"        CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_ORDER_TABLE_NORMALIZED + "\n" +
++        		"        CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_ORDER_TABLE_DISPLAY_NAME + "\n" +
+         		"            PARALLEL EQUI-JOIN 2 HASH TABLES:\n" +
+         		"            BUILD HASH TABLE 0\n" +
 -        		"                CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_CUSTOMER_TABLE_NORMALIZED + "\n" +
++        		"                CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_CUSTOMER_TABLE_DISPLAY_NAME + "\n" +
+         		"                    SERVER FILTER BY NAME LIKE 'C%'\n" +
+         		"            BUILD HASH TABLE 1\n" +
 -        		"                CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_ITEM_TABLE_NORMALIZED + "\n" +
++        		"                CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_ITEM_TABLE_DISPLAY_NAME + "\n" +
+         		"    AFTER-JOIN SERVER FILTER BY I.NAME LIKE 'T%'", QueryUtil.getExplainPlan(rs));
+     }
+ 
+     @Test
+     public void testWhereClauseOptimization() throws Exception {
+         PhoenixConnection pconn = DriverManager.getConnection(getUrl(), TEST_PROPERTIES).unwrap(PhoenixConnection.class);
 -        String queryTemplate = "SELECT t1.\"item_id\", t2.\"item_id\", t3.\"item_id\" FROM " + JOIN_ITEM_TABLE + " t1 " 
 -                + "%s JOIN " + JOIN_ITEM_TABLE + " t2 ON t1.\"item_id\" = t2.\"item_id\" " 
 -                + "%s JOIN " + JOIN_ITEM_TABLE + " t3 ON t1.\"item_id\" = t3.\"item_id\" " 
++        String queryTemplate = "SELECT t1.\"item_id\", t2.\"item_id\", t3.\"item_id\" FROM " + JOIN_ITEM_TABLE_FULL_NAME + " t1 " 
++                + "%s JOIN " + JOIN_ITEM_TABLE_FULL_NAME + " t2 ON t1.\"item_id\" = t2.\"item_id\" " 
++                + "%s JOIN " + JOIN_ITEM_TABLE_FULL_NAME + " t3 ON t1.\"item_id\" = t3.\"item_id\" " 
+                 + "WHERE t1.\"item_id\" = '0000000001' AND t2.\"item_id\" = '0000000002' AND t3.\"item_id\" = '0000000003'";
+ 
+         String query = String.format(queryTemplate, "INNER", "INNER");
+         JoinSpec joinSpec = getJoinSpec(query, pconn);
+         assertEquals(1, joinSpec.getPreFilters().size());
+         assertEquals(1, joinSpec.getJoinTables().get(0).getPreFilters().size());
+         assertEquals(1, joinSpec.getJoinTables().get(1).getPreFilters().size());
+ 
+         query = String.format(queryTemplate, "INNER", "LEFT");
+         joinSpec = getJoinSpec(query, pconn);
+         assertEquals(1, joinSpec.getPreFilters().size());
+         assertEquals(1, joinSpec.getJoinTables().get(0).getPreFilters().size());
+         assertEquals(0, joinSpec.getJoinTables().get(1).getPreFilters().size());
+ 
+         query = String.format(queryTemplate, "INNER", "RIGHT");
+         joinSpec = getJoinSpec(query, pconn);
+         assertEquals(0, joinSpec.getPreFilters().size());
+         assertEquals(0, joinSpec.getJoinTables().get(0).getPreFilters().size());
+         assertEquals(1, joinSpec.getJoinTables().get(1).getPreFilters().size());
+ 
+         query = String.format(queryTemplate, "LEFT", "INNER");
+         joinSpec = getJoinSpec(query, pconn);
+         assertEquals(1, joinSpec.getPreFilters().size());
+         assertEquals(0, joinSpec.getJoinTables().get(0).getPreFilters().size());
+         assertEquals(1, joinSpec.getJoinTables().get(1).getPreFilters().size());
+ 
+         query = String.format(queryTemplate, "LEFT", "LEFT");
+         joinSpec = getJoinSpec(query, pconn);
+         assertEquals(1, joinSpec.getPreFilters().size());
+         assertEquals(0, joinSpec.getJoinTables().get(0).getPreFilters().size());
+         assertEquals(0, joinSpec.getJoinTables().get(1).getPreFilters().size());
+ 
+         query = String.format(queryTemplate, "LEFT", "RIGHT");
+         joinSpec = getJoinSpec(query, pconn);
+         assertEquals(0, joinSpec.getPreFilters().size());
+         assertEquals(0, joinSpec.getJoinTables().get(0).getPreFilters().size());
+         assertEquals(1, joinSpec.getJoinTables().get(1).getPreFilters().size());
+ 
+         query = String.format(queryTemplate, "RIGHT", "INNER");
+         joinSpec = getJoinSpec(query, pconn);
+         assertEquals(0, joinSpec.getPreFilters().size());
+         assertEquals(1, joinSpec.getJoinTables().get(0).getPreFilters().size());
+         assertEquals(1, joinSpec.getJoinTables().get(1).getPreFilters().size());
+ 
+         query = String.format(queryTemplate, "RIGHT", "RIGHT");
+         joinSpec = getJoinSpec(query, pconn);
+         assertEquals(0, joinSpec.getPreFilters().size());
+         assertEquals(0, joinSpec.getJoinTables().get(0).getPreFilters().size());
+         assertEquals(1, joinSpec.getJoinTables().get(1).getPreFilters().size());
+     }
+     
+     private static JoinSpec getJoinSpec(String query, PhoenixConnection connection) throws SQLException {
+         Scan scan = new Scan();
+         List<Object> binds = Collections.emptyList();
+         SQLParser parser = new SQLParser(query);
+         SelectStatement select = parser.parseQuery();
+         ColumnResolver resolver = FromCompiler.getResolver(select, connection);
+         select = StatementNormalizer.normalize(select, resolver);
+         StatementContext context = new StatementContext(new PhoenixStatement(connection), resolver, binds, scan);
+         return JoinCompiler.getJoinSpec(context, select);        
+     }
+ }
+ 

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/9ee8d645/phoenix-core/src/test/java/org/apache/phoenix/end2end/HashJoinTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/9ee8d645/phoenix-core/src/test/java/org/apache/phoenix/end2end/SkipRangeParallelIteratorRegionSplitterTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/9ee8d645/phoenix-core/src/test/java/org/apache/phoenix/query/BaseConnectionlessQueryTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-phoenix/blob/9ee8d645/phoenix-core/src/test/java/org/apache/phoenix/util/TestUtil.java
----------------------------------------------------------------------