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/09/30 22:22:41 UTC

phoenix git commit: PHOENIX-3264 Allow TRUE and FALSE to be used as literal constants (Eric Lomore)

Repository: phoenix
Updated Branches:
  refs/heads/calcite 3b4b62383 -> 1ef5a298f


PHOENIX-3264 Allow TRUE and FALSE to be used as literal constants (Eric Lomore)


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

Branch: refs/heads/calcite
Commit: 1ef5a298ff19035767360e822a9a27cd2f43005d
Parents: 3b4b623
Author: maryannxue <ma...@gmail.com>
Authored: Fri Sep 30 15:00:25 2016 -0700
Committer: maryannxue <ma...@gmail.com>
Committed: Fri Sep 30 15:00:25 2016 -0700

----------------------------------------------------------------------
 .../org/apache/calcite/sql/SqlOptionNode.java   | 16 +++---
 .../apache/phoenix/calcite/CalciteUtils.java    | 54 +++++++++++++++++++-
 .../phoenix/calcite/rel/PhoenixTableScan.java   |  3 +-
 .../apache/phoenix/execute/RuntimeContext.java  | 21 ++++++++
 .../phoenix/calcite/ToExpressionTest.java       |  5 +-
 5 files changed, 88 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/1ef5a298/phoenix-core/src/main/java/org/apache/calcite/sql/SqlOptionNode.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/calcite/sql/SqlOptionNode.java b/phoenix-core/src/main/java/org/apache/calcite/sql/SqlOptionNode.java
index dc2274e..47654f3 100644
--- a/phoenix-core/src/main/java/org/apache/calcite/sql/SqlOptionNode.java
+++ b/phoenix-core/src/main/java/org/apache/calcite/sql/SqlOptionNode.java
@@ -22,7 +22,11 @@ import org.apache.calcite.sql.util.SqlVisitor;
 import org.apache.calcite.sql.validate.SqlValidator;
 import org.apache.calcite.sql.validate.SqlValidatorScope;
 import org.apache.calcite.util.Litmus;
-import org.apache.calcite.util.NlsString;
+import org.apache.phoenix.calcite.CalciteUtils;
+import org.apache.phoenix.calcite.rel.PhoenixRelImplementor;
+import org.apache.phoenix.calcite.rel.PhoenixRelImplementorImpl;
+import org.apache.phoenix.execute.RuntimeContext;
+import org.apache.phoenix.execute.RuntimeContextImpl;
 
 public class SqlOptionNode extends SqlNode {
     public final String familyName;
@@ -38,12 +42,10 @@ public class SqlOptionNode extends SqlNode {
             familyName = key.names.get(0);
             propertyName = key.names.get(1);
         }
-        final Object v = SqlLiteral.value(literal);
-        if (v instanceof NlsString) {
-            value = ((NlsString) v).toString();
-        } else {
-            value = v;
-        }
+
+        PhoenixRelImplementor
+                implementor = new PhoenixRelImplementorImpl(RuntimeContext.EMPTY_CONTEXT);
+        this.value = CalciteUtils.convertSqlLiteral(literal, implementor);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/phoenix/blob/1ef5a298/phoenix-core/src/main/java/org/apache/phoenix/calcite/CalciteUtils.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/CalciteUtils.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/CalciteUtils.java
index 668da12..df348c9 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/CalciteUtils.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/CalciteUtils.java
@@ -6,6 +6,7 @@ import java.util.Arrays;
 import java.util.GregorianCalendar;
 import java.util.List;
 import java.util.Map;
+import java.util.Collections;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.calcite.avatica.util.ByteString;
@@ -16,6 +17,7 @@ import org.apache.calcite.rel.RelCollations;
 import org.apache.calcite.rel.RelFieldCollation;
 import org.apache.calcite.rel.RelFieldCollation.Direction;
 import org.apache.calcite.rel.RelFieldCollation.NullDirection;
+import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.JoinRelType;
 import org.apache.calcite.rel.core.Project;
 import org.apache.calcite.rel.type.RelDataType;
@@ -27,14 +29,24 @@ import org.apache.calcite.rex.RexInputRef;
 import org.apache.calcite.rex.RexLiteral;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexVisitorImpl;
+import org.apache.calcite.schema.SchemaPlus;
 import org.apache.calcite.sql.SemiJoinType;
 import org.apache.calcite.sql.SqlAggFunction;
 import org.apache.calcite.sql.SqlFunction;
 import org.apache.calcite.sql.SqlKind;
 import org.apache.calcite.sql.SqlOperator;
+import org.apache.calcite.sql.SqlLiteral;
+import org.apache.calcite.sql.SqlSelect;
+import org.apache.calcite.sql.SqlNode;
+import org.apache.calcite.sql.SqlNodeList;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
+import org.apache.calcite.sql.parser.SqlParser;
+import org.apache.calcite.sql.parser.SqlParserPos;
 import org.apache.calcite.sql.type.ArraySqlType;
 import org.apache.calcite.sql.type.SqlTypeName;
+import org.apache.calcite.tools.FrameworkConfig;
+import org.apache.calcite.tools.Frameworks;
+import org.apache.calcite.tools.Planner;
 import org.apache.calcite.util.NlsString;
 import org.apache.calcite.util.Util;
 import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
@@ -110,6 +122,7 @@ import org.apache.phoenix.schema.types.PUnsignedTimestamp;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+import org.apache.phoenix.util.ExpressionUtil;
 
 /**
  * Utilities for interacting with Calcite.
@@ -118,7 +131,14 @@ public class CalciteUtils {
     private CalciteUtils() {}
     
     private static AtomicInteger tempAliasCounter = new AtomicInteger(0);
-  
+    private static final FrameworkConfig config;
+    static {
+        SchemaPlus rootSchema = Frameworks.createRootSchema(true);
+        config = Frameworks.newConfigBuilder()
+            .parserConfig(SqlParser.Config.DEFAULT)
+            .defaultSchema(rootSchema).build();
+    }
+    
     public static String createTempAlias() {
         return "$" + tempAliasCounter.incrementAndGet();
     }
@@ -1036,4 +1056,36 @@ public class CalciteUtils {
             return null;
         }
     }
+
+    public static Object convertSqlLiteral(SqlLiteral literal, PhoenixRelImplementor implementor) {
+        try {
+            final Planner planner = Frameworks.getPlanner(config);
+
+            SqlParserPos POS = SqlParserPos.ZERO;
+            final SqlNodeList selectList =
+                    new SqlNodeList(
+                            Collections.singletonList(literal),
+                            SqlParserPos.ZERO);
+
+
+            String sql = new SqlSelect(POS, SqlNodeList.EMPTY, selectList, null, null, null, null,
+                    SqlNodeList.EMPTY, null, null, null).toString();
+            SqlNode sqlNode = planner.parse(sql);
+            sqlNode = planner.validate(sqlNode);
+            RelNode relNode = planner.rel(sqlNode).rel;
+
+            assert relNode instanceof Project;
+            Project proj = (Project) relNode;
+            assert proj.getChildExps().size() == 1;
+            RexNode rex = proj.getChildExps().get(0);
+
+            Expression e = CalciteUtils.toExpression(rex, implementor);
+            ImmutableBytesWritable ptr = new ImmutableBytesWritable();
+            e = ExpressionUtil.getConstantExpression(e, ptr);
+            return e.getDataType().toObject(ptr);
+        } catch (Exception ex){
+            throw new RuntimeException("Could not convert literal " + literal.getValue()
+                    + " to its object type.", ex);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/1ef5a298/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 253b368..c02b533 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
@@ -33,6 +33,7 @@ import org.apache.phoenix.compile.SequenceManager;
 import org.apache.phoenix.compile.StatementContext;
 import org.apache.phoenix.compile.WhereCompiler;
 import org.apache.phoenix.compile.WhereOptimizer;
+import org.apache.phoenix.execute.RuntimeContext;
 import org.apache.phoenix.execute.ScanPlan;
 import org.apache.phoenix.execute.TupleProjector;
 import org.apache.phoenix.expression.Expression;
@@ -127,7 +128,7 @@ public class PhoenixTableScan extends TableScan implements PhoenixQueryRel {
                 //    TODO instead of getting a random sample value, we'd better get it from
                 //    existing guidepost bytes.
                 // 3) test whether this dynamic filter is worth a recompile at runtime.
-                PhoenixRelImplementor tmpImplementor = new PhoenixRelImplementorImpl(null) {                    
+                PhoenixRelImplementor tmpImplementor = new PhoenixRelImplementorImpl(RuntimeContext.EMPTY_CONTEXT) {                    
                     @SuppressWarnings("rawtypes")
                     @Override
                     public Expression newBindParameterExpression(int index, PDataType type, Integer maxLength) {

http://git-wip-us.apache.org/repos/asf/phoenix/blob/1ef5a298/phoenix-core/src/main/java/org/apache/phoenix/execute/RuntimeContext.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/RuntimeContext.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/RuntimeContext.java
index 4063c0a..34568d4 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/RuntimeContext.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/RuntimeContext.java
@@ -32,6 +32,27 @@ public interface RuntimeContext {
         }
     };
     
+    public static RuntimeContext EMPTY_CONTEXT = new RuntimeContext() {
+
+        @Override
+        public void defineCorrelateVariable(String variableId, CorrelateVariable def) {
+        }
+
+        @Override
+        public CorrelateVariable getCorrelateVariable(String variableId) {
+            return null;
+        }
+
+        @Override
+        public void setBindParameterValues(Map<String, Object> values) {
+        }
+
+        @Override
+        public Object getBindParameterValue(String name) {
+            return null;
+        }       
+    };
+    
     public interface CorrelateVariable {
         public Expression newExpression(int index);        
         public Tuple getValue();        

http://git-wip-us.apache.org/repos/asf/phoenix/blob/1ef5a298/phoenix-core/src/test/java/org/apache/phoenix/calcite/ToExpressionTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/calcite/ToExpressionTest.java b/phoenix-core/src/test/java/org/apache/phoenix/calcite/ToExpressionTest.java
index 5917617..ed1abd3 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/calcite/ToExpressionTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/calcite/ToExpressionTest.java
@@ -29,6 +29,7 @@ import org.apache.phoenix.compile.ColumnResolver;
 import org.apache.phoenix.compile.ExpressionCompiler;
 import org.apache.phoenix.compile.FromCompiler;
 import org.apache.phoenix.compile.StatementContext;
+import org.apache.phoenix.execute.RuntimeContext;
 import org.apache.phoenix.execute.RuntimeContextImpl;
 import org.apache.phoenix.expression.Expression;
 import org.apache.phoenix.jdbc.PhoenixConnection;
@@ -63,7 +64,7 @@ public class ToExpressionTest extends BaseConnectionlessQueryTest {
 	    private final RexNode calciteExpr;
 
 	    public ExpressionChecker(String tableName, String ddl, String sql, ExpressionGetter getter) throws Exception {
-	        Connection conn = DriverManager.getConnection(getUrl());
+	        Connection conn = DriverManager.getConnection(getOldUrl());
 	        PhoenixConnection pc = conn.unwrap(PhoenixConnection.class);
 	        PhoenixStatement stmt = conn.createStatement().unwrap(PhoenixStatement.class);
 
@@ -81,7 +82,7 @@ public class ToExpressionTest extends BaseConnectionlessQueryTest {
 	    }
 
 	    public ExpressionChecker checkExpressionEquality() {        
-	        PhoenixRelImplementor implementor = new PhoenixRelImplementorImpl(new RuntimeContextImpl());
+	        PhoenixRelImplementor implementor = new PhoenixRelImplementorImpl(RuntimeContext.EMPTY_CONTEXT);
 	        implementor.setTableMapping(new TableMapping(table));
 	        Expression e = CalciteUtils.toExpression(this.calciteExpr, implementor);
 	        assertEquals(this.phoenixExpr,e);