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);