You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@drill.apache.org by ja...@apache.org on 2013/07/20 03:58:05 UTC
[44/53] [abbrv] git commit: Types transition
Types transition
Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/ce0da88d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/ce0da88d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/ce0da88d
Branch: refs/heads/master
Commit: ce0da88d2df38d079a11d2b269fad9e964e1c14a
Parents: e68bba2
Author: Jacques Nadeau <ja...@apache.org>
Authored: Mon Jun 24 08:06:43 2013 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Fri Jul 19 14:53:11 2013 -0700
----------------------------------------------------------------------
sandbox/prototype/common/pom.xml | 216 ++---
.../drill/common/expression/parser/ExprParser.g | 64 +-
.../org/apache/drill/common/expression/Arg.java | 44 +-
.../common/expression/ArgumentValidator.java | 2 +-
.../common/expression/ArgumentValidators.java | 62 +-
.../expression/BasicArgumentValidator.java | 8 +-
.../drill/common/expression/ErrorCollector.java | 18 +-
.../common/expression/ErrorCollectorImpl.java | 40 +-
.../common/expression/ExpressionPosition.java | 27 +
.../expression/ExpressionStringBuilder.java | 102 +++
.../common/expression/ExpressionValidator.java | 86 ++
.../drill/common/expression/FieldReference.java | 18 +-
.../drill/common/expression/FunctionBase.java | 94 --
.../drill/common/expression/FunctionCall.java | 55 +-
.../common/expression/FunctionDefinition.java | 8 +-
.../common/expression/FunctionRegistry.java | 13 +-
.../drill/common/expression/IfExpression.java | 65 +-
.../common/expression/LogicalExpression.java | 98 +-
.../expression/LogicalExpressionBase.java | 56 +-
.../common/expression/OutputTypeDeterminer.java | 34 +-
.../drill/common/expression/PathSegment.java | 26 +
.../drill/common/expression/SchemaPath.java | 176 ++--
.../common/expression/ValueExpressions.java | 320 ++++---
.../common/expression/fn/BooleanFunctions.java | 6 +-
.../common/expression/fn/MathFunctions.java | 10 +-
.../common/expression/fn/StringFunctions.java | 7 +-
.../common/expression/fn/UnaryFunctions.java | 6 +-
.../drill/common/expression/types/AtomType.java | 67 ++
.../drill/common/expression/types/DataType.java | 2 +-
.../visitors/AbstractExprVisitor.java | 56 ++
.../expression/visitors/AggregateChecker.java | 25 +-
.../expression/visitors/ConstantChecker.java | 21 +-
.../common/expression/visitors/ExprVisitor.java | 18 +-
.../expression/visitors/SimpleExprVisitor.java | 56 ++
.../org/apache/drill/common/types/Types.java | 134 +++
.../common/src/main/protobuf/Types.proto | 64 ++
sandbox/prototype/exec/java-exec/pom.xml | 360 ++++----
.../org/apache/drill/exec/ExecConstants.java | 1 +
.../drill/exec/compile/ClassTransformer.java | 1 +
.../drill/exec/compile/CodeModelTools.java | 31 +
.../apache/drill/exec/expr/CodeGenerator.java | 201 +++++
.../apache/drill/exec/expr/DrillAggrFunc.java | 9 +
.../org/apache/drill/exec/expr/DrillFunc.java | 9 +
.../drill/exec/expr/EvaluationVisitor.java | 201 +++++
.../exec/expr/ExpressionTreeMaterializer.java | 128 +++
.../exec/expr/SingleClassStringWriter.java | 40 +
.../exec/expr/ValueVectorReadExpression.java | 41 +
.../exec/expr/ValueVectorWriteExpression.java | 45 +
.../exec/expr/annotations/FunctionTemplate.java | 25 +
.../drill/exec/expr/annotations/Output.java | 18 +
.../drill/exec/expr/annotations/Param.java | 18 +
.../drill/exec/expr/annotations/WorkSpace.java | 14 +
.../drill/exec/expr/fn/FunctionConverter.java | 186 ++++
.../drill/exec/expr/fn/FunctionHolder.java | 158 ++++
.../expr/fn/FunctionImplementationRegistry.java | 43 +
.../exec/expr/fn/MethodGrabbingVisitor.java | 52 ++
.../exec/expr/fn/ModifiedUnparseVisitor.java | 891 +++++++++++++++++++
.../drill/exec/expr/fn/impl/MathFunctions.java | 48 +
.../drill/exec/expr/holders/ValueHolder.java | 4 +
.../holders/ValueHolderImplmenetations.java | 44 +
.../exec/expr/holders/VarBinaryHolder.java | 12 +
.../apache/drill/exec/ops/FragmentContext.java | 26 +-
.../apache/drill/exec/opt/BasicOptimizer.java | 28 +-
.../apache/drill/exec/physical/RecordField.java | 8 +-
.../exec/physical/config/MockRecordReader.java | 19 +-
.../drill/exec/physical/config/MockScanPOP.java | 8 +-
.../exec/physical/impl/FilterRecordBatch.java | 34 +
.../drill/exec/physical/impl/OutputMutator.java | 9 +
.../drill/exec/physical/impl/ScanBatch.java | 72 +-
.../drill/exec/physical/impl/VectorHolder.java | 39 +
.../exec/physical/impl/WireRecordBatch.java | 32 +-
.../impl/filter/EvalSetupException.java | 5 +
.../impl/filter/EvaluationPredicate.java | 13 +
.../physical/impl/filter/ExampleFilter.java | 113 +++
.../physical/impl/project/ProjectEvaluator.java | 12 +
.../impl/project/ProjectRecordBatch.java | 218 +++++
.../exec/physical/impl/project/Projector.java | 20 +
.../impl/project/ProjectorTemplate.java | 101 +++
.../physical/impl/project/TransferPairing.java | 35 +
.../drill/exec/planner/PhysicalPlanReader.java | 2 +-
.../apache/drill/exec/record/BatchSchema.java | 36 +-
.../exec/record/ExpressionTreeMaterializer.java | 138 ---
.../drill/exec/record/MajorTypeSerDe.java | 6 +-
.../drill/exec/record/MaterializedField.java | 58 +-
.../drill/exec/record/NullExpression.java | 32 +
.../apache/drill/exec/record/RecordBatch.java | 67 +-
.../drill/exec/record/RecordBatchLoader.java | 84 +-
.../apache/drill/exec/record/SchemaBuilder.java | 75 +-
.../apache/drill/exec/record/WritableBatch.java | 43 +-
.../exec/record/vector/NullableFixed8.java | 36 +
.../exec/record/vector/SelectionVector.java | 8 +
.../exec/record/vector/SelectionVector2.java | 46 +
.../exec/record/vector/SelectionVector4.java | 41 +
.../org/apache/drill/exec/schema/Field.java | 31 +-
.../apache/drill/exec/schema/ListSchema.java | 17 +-
.../apache/drill/exec/schema/NamedField.java | 19 +-
.../apache/drill/exec/schema/OrderedField.java | 9 +-
.../exec/schema/json/jackson/JacksonHelper.java | 26 +-
.../drill/exec/store/JSONRecordReader.java | 84 +-
.../exec/work/batch/BitComHandlerImpl.java | 3 +-
.../work/foreman/RunningFragmentManager.java | 3 +-
.../work/fragment/RemoteFragmentHandler.java | 3 +-
.../java-exec/src/main/protobuf/SchemaDef.proto | 63 +-
.../src/main/resources/drill-module.conf | 13 +-
.../java/org/apache/drill/exec/SortTest.java | 61 ++
.../apache/drill/exec/expr/ExpressionTest.java | 108 +++
.../exec/physical/impl/PerformanceTests.java | 32 +
.../impl/TestExecutionAbstractions.java | 226 +++++
.../physical/impl/TestSimpleFragmentRun.java | 51 +-
.../record/ExpressionTreeMaterializerTest.java | 297 ++++---
.../drill/exec/store/JSONRecordReaderTest.java | 469 +++++-----
.../org/apache/drill/exec/ref/RunOutcome.java | 1 +
.../exec/ref/eval/BasicEvaluatorFactory.java | 11 +-
.../apache/drill/exec/ref/eval/IfEvaluator.java | 10 +-
.../exec/ref/eval/SimpleEvaluationVisitor.java | 24 +-
.../drill/exec/ref/eval/fn/MathEvaluators.java | 5 +-
.../exec/ref/rops/CollapsingAggregateROP.java | 4 +-
.../apache/drill/exec/ref/rops/ConstantROP.java | 3 -
.../apache/drill/exec/ref/rops/FlattenROP.java | 7 +-
.../drill/exec/ref/rops/WindowFrameROP.java | 5 +-
.../drill/exec/ref/values/BaseArrayValue.java | 21 +-
.../drill/exec/ref/values/BaseMapValue.java | 9 +-
.../apache/drill/exec/ref/values/DataValue.java | 4 +-
.../drill/exec/ref/values/NumericValue.java | 17 +-
.../drill/exec/ref/values/ScalarValues.java | 66 +-
.../drill/exec/ref/values/SimpleArrayValue.java | 4 +-
.../drill/exec/ref/values/SimpleMapValue.java | 5 +-
.../drill/exec/ref/values/ValueReader.java | 14 +-
.../drill/exec/ref/values/ValueUtils.java | 17 +-
.../apache/drill/exec/ref/RunSimplePlan.java | 14 +-
.../org/apache/drill/exec/ref/TestUtils.java | 3 +-
.../exec/ref/rops/CollapsingAggregateTest.java | 5 +-
.../drill/exec/ref/rops/ConstantROPTest.java | 5 +-
.../drill/exec/ref/rops/OrderROPTest.java | 5 +-
.../drill/exec/ref/rops/WindowFrameROPTest.java | 12 +-
sandbox/prototype/pom.xml | 381 ++++----
136 files changed, 6212 insertions(+), 2103 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/pom.xml
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/pom.xml b/sandbox/prototype/common/pom.xml
index 4a8c5d8..4891191 100644
--- a/sandbox/prototype/common/pom.xml
+++ b/sandbox/prototype/common/pom.xml
@@ -1,103 +1,119 @@
<?xml version="1.0"?>
<project
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
- xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <artifactId>prototype-parent</artifactId>
- <groupId>org.apache.drill</groupId>
- <version>1.0-SNAPSHOT</version>
- </parent>
-
- <artifactId>common</artifactId>
- <packaging>jar</packaging>
- <name>common</name>
-
- <dependencies>
-
- <dependency>
- <groupId>com.google.protobuf</groupId>
- <artifactId>protobuf-java</artifactId>
- <version>2.5.0</version>
- </dependency>
-
- <dependency>
- <groupId>com.typesafe</groupId>
- <artifactId>config</artifactId>
- <version>1.0.0</version>
- </dependency>
-
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-lang3</artifactId>
- <version>3.1</version>
- </dependency>
-
- <dependency>
- <groupId>org.msgpack</groupId>
- <artifactId>msgpack</artifactId>
- <version>0.6.6</version>
- </dependency>
-
- <dependency>
- <groupId>org.reflections</groupId>
- <artifactId>reflections</artifactId>
- <version>0.9.8</version>
- </dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-annotations</artifactId>
- <version>2.1.1</version>
- </dependency>
- <dependency>
- <groupId>org.hibernate</groupId>
- <artifactId>hibernate-validator</artifactId>
- <version>4.3.1.Final</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>2.1.1</version>
- </dependency>
- <dependency>
- <groupId>org.antlr</groupId>
- <artifactId>antlr-runtime</artifactId>
- <version>3.4</version>
- </dependency>
-
-
- </dependencies>
-
-
- <build>
- <plugins>
- <plugin>
- <artifactId>maven-jar-plugin</artifactId>
- <executions>
- <execution>
- <id>test-jar</id>
- <goals>
- <goal>test-jar</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.antlr</groupId>
- <artifactId>antlr3-maven-plugin</artifactId>
- <version>3.4</version>
- <configuration>
-
- </configuration>
- <executions>
- <execution>
- <goals>
- <goal>antlr</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+ xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <artifactId>prototype-parent</artifactId>
+ <groupId>org.apache.drill</groupId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>common</artifactId>
+ <packaging>jar</packaging>
+ <name>common</name>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>com.google.protobuf</groupId>
+ <artifactId>protobuf-java</artifactId>
+ <version>2.5.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.typesafe</groupId>
+ <artifactId>config</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-lang3</artifactId>
+ <version>3.1</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.msgpack</groupId>
+ <artifactId>msgpack</artifactId>
+ <version>0.6.6</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.reflections</groupId>
+ <artifactId>reflections</artifactId>
+ <version>0.9.8</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-annotations</artifactId>
+ <version>2.1.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-validator</artifactId>
+ <version>4.3.1.Final</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ <version>2.1.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.antlr</groupId>
+ <artifactId>antlr-runtime</artifactId>
+ <version>3.4</version>
+ </dependency>
+
+
+ </dependencies>
+
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-jar-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>test-jar</id>
+ <goals>
+ <goal>test-jar</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.antlr</groupId>
+ <artifactId>antlr3-maven-plugin</artifactId>
+ <version>3.4</version>
+ <configuration>
+
+ </configuration>
+ <executions>
+ <execution>
+ <goals>
+ <goal>antlr</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+
+ <plugin>
+ <groupId>com.github.igor-petruk.protobuf</groupId>
+ <artifactId>protobuf-maven-plugin</artifactId>
+ <version>0.6.3</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+
+ </build>
</project>
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/antlr3/org/apache/drill/common/expression/parser/ExprParser.g
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/antlr3/org/apache/drill/common/expression/parser/ExprParser.g b/sandbox/prototype/common/src/main/antlr3/org/apache/drill/common/expression/parser/ExprParser.g
index f8eb725..6cf041c 100644
--- a/sandbox/prototype/common/src/main/antlr3/org/apache/drill/common/expression/parser/ExprParser.g
+++ b/sandbox/prototype/common/src/main/antlr3/org/apache/drill/common/expression/parser/ExprParser.g
@@ -40,7 +40,8 @@ import org.apache.drill.common.expression.*;
@members{
private FunctionRegistry registry;
-
+ private String fullExpression;
+ private int tokenPos;
public void setRegistry(FunctionRegistry registry){
this.registry = registry;
}
@@ -48,14 +49,22 @@ import org.apache.drill.common.expression.*;
public static void p(String s){
System.out.println(s);
}
+
+ public ExpressionPosition pos(Token token){
+ return new ExpressionPosition(fullExpression, token.getTokenIndex());
+ }
}
parse returns [LogicalExpression e]
- : expression EOF {$e = $expression.e; }
+ : expression EOF {
+ $e = $expression.e;
+ if(fullExpression == null) fullExpression = $expression.text;
+ tokenPos = $expression.start.getTokenIndex();
+ }
;
functionCall returns [LogicalExpression e]
- : Identifier OParen exprList? CParen {$e = registry.createExpression($Identifier.text, $exprList.listE); }
+ : Identifier OParen exprList? CParen {$e = registry.createExpression($Identifier.text, pos($Identifier), $exprList.listE); }
;
ifStatement returns [LogicalExpression e]
@@ -65,7 +74,7 @@ ifStatement returns [LogicalExpression e]
@after {
$e = s.build();
}
- : i1=ifStat {s.addCondition($i1.i); } (elseIfStat { s.addCondition($elseIfStat.i); } )* Else expression { s.setElse($expression.e); }End
+ : i1=ifStat {s.addCondition($i1.i); s.setPosition(pos($i1.start)); } (elseIfStat { s.addCondition($elseIfStat.i); } )* Else expression { s.setElse($expression.e); }End
;
ifStat returns [IfExpression.IfCondition i]
@@ -113,96 +122,103 @@ condExpr returns [LogicalExpression e]
orExpr returns [LogicalExpression e]
@init{
List<LogicalExpression> exprs = new ArrayList<LogicalExpression>();
+ ExpressionPosition p = null;
}
@after{
if(exprs.size() == 1){
$e = exprs.get(0);
}else{
- $e = registry.createExpression("||", exprs);
+ $e = registry.createExpression("||", p, exprs);
}
}
- : a1=andExpr { exprs.add($a1.e); } (Or^ a2=andExpr { exprs.add($a2.e); })*
+ : a1=andExpr { exprs.add($a1.e); p = pos( $a1.start );} (Or^ a2=andExpr { exprs.add($a2.e); })*
;
andExpr returns [LogicalExpression e]
@init{
List<LogicalExpression> exprs = new ArrayList<LogicalExpression>();
+ ExpressionPosition p = null;
}
@after{
if(exprs.size() == 1){
$e = exprs.get(0);
}else{
- $e = registry.createExpression("&&", exprs);
+ $e = registry.createExpression("&&", p, exprs);
}
}
- : e1=equExpr { exprs.add($e1.e); } (And^ e2=equExpr { exprs.add($e2.e); })*
+ : e1=equExpr { exprs.add($e1.e); p = pos( $e1.start ); } (And^ e2=equExpr { exprs.add($e2.e); })*
;
equExpr returns [LogicalExpression e]
@init{
List<LogicalExpression> exprs = new ArrayList<LogicalExpression>();
List<String> cmps = new ArrayList();
+ ExpressionPosition p = null;
}
@after{
- $e = registry.createByOp(exprs, cmps);
+ $e = registry.createByOp(exprs, p, cmps);
}
- : r1=relExpr {exprs.add($r1.e);} ( cmpr= (Equals | NEquals ) r2=relExpr {exprs.add($r2.e); cmps.add($cmpr.text); })*
+ : r1=relExpr { exprs.add($r1.e); p = pos( $r1.start );
+ } ( cmpr= (Equals | NEquals ) r2=relExpr {exprs.add($r2.e); cmps.add($cmpr.text); })*
;
relExpr returns [LogicalExpression e]
- : left=addExpr {$e = $left.e; } (cmpr = (GTEquals | LTEquals | GT | LT) right=addExpr {$e = registry.createExpression($cmpr.text, $left.e, $right.e); } )?
+ : left=addExpr {$e = $left.e; } (cmpr = (GTEquals | LTEquals | GT | LT) right=addExpr {$e = registry.createExpression($cmpr.text, pos($left.start), $left.e, $right.e); } )?
;
addExpr returns [LogicalExpression e]
@init{
List<LogicalExpression> exprs = new ArrayList<LogicalExpression>();
List<String> ops = new ArrayList();
+ ExpressionPosition p = null;
}
@after{
- $e = registry.createByOp(exprs, ops);
+ $e = registry.createByOp(exprs, p, ops);
}
- : m1=mulExpr {exprs.add($m1.e);} ( op=(Plus|Minus) m2=mulExpr {exprs.add($m2.e); ops.add($op.text); })*
+ : m1=mulExpr {exprs.add($m1.e); p = pos($m1.start); } ( op=(Plus|Minus) m2=mulExpr {exprs.add($m2.e); ops.add($op.text); })*
;
mulExpr returns [LogicalExpression e]
@init{
List<LogicalExpression> exprs = new ArrayList<LogicalExpression>();
List<String> ops = new ArrayList();
+ ExpressionPosition p = null;
}
@after{
- $e = registry.createByOp(exprs, ops);
+ $e = registry.createByOp(exprs, p, ops);
}
- : p1=powExpr {exprs.add($p1.e);} (op=(Asterisk|ForwardSlash|Percent) p2=powExpr {exprs.add($p2.e); ops.add($op.text); } )*
+ : p1=powExpr {exprs.add($p1.e); p = pos($p1.start);} (op=(Asterisk|ForwardSlash|Percent) p2=powExpr {exprs.add($p2.e); ops.add($op.text); } )*
;
powExpr returns [LogicalExpression e]
@init{
List<LogicalExpression> exprs = new ArrayList<LogicalExpression>();
List<String> ops = new ArrayList();
+ ExpressionPosition p = null;
}
@after{
- $e = registry.createByOp(exprs, ops);
+ $e = registry.createByOp(exprs, p, ops);
}
- : u1=unaryExpr {exprs.add($u1.e);} (Caret u2=unaryExpr {exprs.add($u2.e); ops.add($Caret.text);} )*
+ : u1=unaryExpr {exprs.add($u1.e); p = pos($u1.start);} (Caret u2=unaryExpr {exprs.add($u2.e); ops.add($Caret.text);} )*
;
unaryExpr returns [LogicalExpression e]
- : Minus atom {$e = registry.createExpression("u-", $atom.e); }
- | Excl atom {$e= registry.createExpression("!", $atom.e); }
+ : Minus atom {$e = registry.createExpression("u-", pos($atom.start), $atom.e); }
+ | Excl atom {$e= registry.createExpression("!", pos($atom.start), $atom.e); }
| atom {$e = $atom.e; }
;
atom returns [LogicalExpression e]
- : Number {$e = ValueExpressions.getNumericExpression($Number.text); }
- | Bool {$e = new ValueExpressions.BooleanExpression( $Bool.text ); }
+ : Number {$e = ValueExpressions.getNumericExpression($Number.text, pos($atom.start)); }
+ | Bool {$e = new ValueExpressions.BooleanExpression( $Bool.text, pos($atom.start)); }
| lookup {$e = $lookup.e; }
;
lookup returns [LogicalExpression e]
: functionCall {$e = $functionCall.e ;}
- | Identifier {$e = new SchemaPath($Identifier.text); }
- | String {$e = new ValueExpressions.QuotedString($String.text); }
+ | Identifier {$e = new SchemaPath($Identifier.text, pos($Identifier) ); }
+ | String {$e = new ValueExpressions.QuotedString($String.text, pos($String) ); }
| OParen expression CParen {$e = $expression.e; }
- | SingleQuote Identifier SingleQuote {$e = new SchemaPath($Identifier.text); }
+ | SingleQuote Identifier SingleQuote {$e = new SchemaPath($Identifier.text, pos($Identifier) ); }
;
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/Arg.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/Arg.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/Arg.java
index de9057b..64ec351 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/Arg.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/Arg.java
@@ -17,24 +17,41 @@
******************************************************************************/
package org.apache.drill.common.expression;
-import org.apache.drill.common.expression.types.DataType;
+import java.util.List;
+
import org.apache.drill.common.expression.visitors.ConstantChecker;
+import org.apache.drill.common.types.TypeProtos.DataMode;
+import org.apache.drill.common.types.TypeProtos.MajorType;
+import org.apache.drill.common.types.TypeProtos.MinorType;
+
+import com.google.common.collect.Lists;
public class Arg {
private final String name;
- private final DataType[] allowedTypes;
+ private final MajorType[] allowedTypes;
private final boolean constantsOnly;
- public Arg(DataType... allowedTypes){
+
+ /**
+ * Create an arg that supports any of the listed minor types using opt or req. Does not allow repeated types.
+ * @param name
+ * @param constantsOnly
+ * @param types
+ */
+ public Arg(boolean constantsOnly, boolean allowNulls, String name, MinorType... types){
+ this(constantsOnly, name, getMajorTypes(allowNulls, types));
+ }
+
+ public Arg(MajorType... allowedTypes){
this(false, null, allowedTypes);
}
- public Arg(String name, DataType... allowedTypes) {
+ public Arg(String name, MajorType... allowedTypes) {
this(false, name, allowedTypes);
}
- public Arg(boolean constantsOnly, String name, DataType... allowedTypes) {
+ public Arg(boolean constantsOnly, String name, MajorType... allowedTypes) {
this.name = name;
this.allowedTypes = allowedTypes;
this.constantsOnly = constantsOnly;
@@ -44,15 +61,15 @@ public class Arg {
return name;
}
- public void confirmDataType(String expr, int argIndex, LogicalExpression e, ErrorCollector errors){
+ public void confirmDataType(ExpressionPosition expr, int argIndex, LogicalExpression e, ErrorCollector errors){
if(constantsOnly){
if(ConstantChecker.onlyIncludesConstants(e)) errors.addExpectedConstantValue(expr, argIndex, name);
}
- DataType dt = e.getDataType();
- if(dt.isLateBind()){
+ MajorType dt = e.getMajorType();
+ if(dt.getMinorType() == MinorType.LATE){
// change among allowed types.
- for(DataType a : allowedTypes){
+ for(MajorType a : allowedTypes){
if(dt == a) return;
}
@@ -63,4 +80,13 @@ public class Arg {
}
+
+ private static MajorType[] getMajorTypes(boolean allowNulls, MinorType... types){
+ List<MajorType> mts = Lists.newArrayList();
+ for(MinorType t : types){
+ if(allowNulls) mts.add(MajorType.newBuilder().setMinorType(t).setMode(DataMode.OPTIONAL).build());
+ mts.add(MajorType.newBuilder().setMinorType(t).setMode(DataMode.REQUIRED).build());
+ }
+ return mts.toArray(new MajorType[mts.size()]);
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidator.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidator.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidator.java
index dc22045..765dc3f 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidator.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidator.java
@@ -23,6 +23,6 @@ import java.util.List;
* Validates whether the set of arguments are acceptable
*/
public interface ArgumentValidator {
- public void validateArguments(String expr, List<LogicalExpression> expressions, ErrorCollector errors);
+ public void validateArguments(ExpressionPosition expr, List<LogicalExpression> expressions, ErrorCollector errors);
public String[] getArgumentNamesByPosition();
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java
index 25cb887..f30733d 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java
@@ -20,8 +20,8 @@ package org.apache.drill.common.expression;
import java.util.List;
import org.apache.commons.lang3.ArrayUtils;
-import org.apache.drill.common.expression.types.DataType;
-import org.apache.drill.common.expression.types.DataType.Comparability;
+import org.apache.drill.common.types.TypeProtos.MajorType;
+import org.apache.drill.common.types.Types;
import com.google.common.base.Predicate;
import com.google.common.collect.Range;
@@ -46,7 +46,7 @@ public class ArgumentValidators {
}
@Override
- public void validateArguments(String expr, List<LogicalExpression> expressions, ErrorCollector errors) {
+ public void validateArguments(ExpressionPosition expr, List<LogicalExpression> expressions, ErrorCollector errors) {
// only need to check argument count since any type is allowed.
if (!argumentCount.contains(expressions.size()))
errors.addUnexpectedArgumentCount(expr, expressions.size(), argumentCount);
@@ -61,17 +61,17 @@ public class ArgumentValidators {
private static class PredicateValidator implements ArgumentValidator {
private final Range<Integer> argumentCount;
- private Predicate<DataType> predicate;
+ private Predicate<MajorType> predicate;
private boolean allSame;
- public PredicateValidator(int argCount, Predicate<DataType> predicate, boolean allSame) {
+ public PredicateValidator(int argCount, Predicate<MajorType> predicate, boolean allSame) {
super();
this.argumentCount = Ranges.singleton(argCount);
this.predicate = predicate;
this.allSame = allSame;
}
- public PredicateValidator(int minArguments, int maxArguments, Predicate<DataType> predicate, boolean allSame) {
+ public PredicateValidator(int minArguments, int maxArguments, Predicate<MajorType> predicate, boolean allSame) {
super();
this.argumentCount = Ranges.closedOpen(minArguments, maxArguments);
this.predicate = predicate;
@@ -79,21 +79,21 @@ public class ArgumentValidators {
}
@Override
- public void validateArguments(String expr, List<LogicalExpression> expressions, ErrorCollector errors) {
+ public void validateArguments(ExpressionPosition expr, List<LogicalExpression> expressions, ErrorCollector errors) {
int i = -1;
- DataType t = null;
+ MajorType t = null;
for (LogicalExpression le : expressions) {
i++;
- DataType dataType = le.getDataType();
- if (t == null) t = dataType;
+ MajorType majorType = le.getMajorType();
+ if (t == null) t = majorType;
- if (!predicate.apply(dataType)) {
- errors.addUnexpectedType(expr, i, dataType);
+ if (!predicate.apply(majorType)) {
+ errors.addUnexpectedType(expr, i, majorType);
continue;
}
- if (allSame && t != DataType.LATEBIND && dataType != DataType.LATEBIND && t != dataType) {
- errors.addUnexpectedType(expr, i, dataType);
+ if (allSame && !Types.isLateBind(t) && !Types.isLateBind(majorType) && !Types.softEquals(t, majorType, true)) {
+ errors.addUnexpectedType(expr, i, majorType);
}
}
@@ -109,50 +109,50 @@ public class ArgumentValidators {
public static class ComparableArguments extends PredicateValidator {
- public ComparableArguments(int argCount, DataType... allowedTypes) {
+ public ComparableArguments(int argCount, MajorType... allowedTypes) {
super(argCount, new ComparableChecker(), true);
}
- public ComparableArguments(int minArguments, int maxArguments, DataType... allowedTypes) {
+ public ComparableArguments(int minArguments, int maxArguments, MajorType... allowedTypes) {
super(minArguments, maxArguments, new ComparableChecker(), true);
}
- public static class ComparableChecker implements Predicate<DataType> {
+ public static class ComparableChecker implements Predicate<MajorType> {
- public boolean apply(DataType dt) {
- Comparability comparability = dt.getComparability();
- return comparability.equals(Comparability.ORDERED) || comparability.equals(Comparability.UNKNOWN);
+ public boolean apply(MajorType dt) {
+ Types.Comparability comparability = Types.getComparability(dt);
+ return comparability.equals(Types.Comparability.ORDERED) || comparability.equals(Types.Comparability.UNKNOWN);
}
}
}
public static class AllowedTypeList extends PredicateValidator {
- public AllowedTypeList(int argCount, DataType... allowedTypes) {
+ public AllowedTypeList(int argCount, MajorType... allowedTypes) {
super(argCount, new AllowedTypeChecker(allowedTypes), false);
}
- public AllowedTypeList(int minArguments, int maxArguments, DataType... allowedTypes) {
+ public AllowedTypeList(int minArguments, int maxArguments, MajorType... allowedTypes) {
super(minArguments, maxArguments, new AllowedTypeChecker(allowedTypes), false);
}
- public AllowedTypeList(int argCount, boolean allSame, DataType... allowedTypes) {
+ public AllowedTypeList(int argCount, boolean allSame, MajorType... allowedTypes) {
super(argCount, new AllowedTypeChecker(allowedTypes), allSame);
}
- public AllowedTypeList(int minArguments, int maxArguments, boolean allSame, DataType... allowedTypes) {
+ public AllowedTypeList(int minArguments, int maxArguments, boolean allSame, MajorType... allowedTypes) {
super(minArguments, maxArguments, new AllowedTypeChecker(allowedTypes), allSame);
}
- public static class AllowedTypeChecker implements Predicate<DataType> {
+ public static class AllowedTypeChecker implements Predicate<MajorType> {
- private DataType[] allowedTypes;
+ private MajorType[] allowedTypes;
- public AllowedTypeChecker(DataType... allowedTypes) {
+ public AllowedTypeChecker(MajorType... allowedTypes) {
this.allowedTypes = allowedTypes;
}
- public boolean apply(DataType dt) {
+ public boolean apply(MajorType dt) {
return ArrayUtils.contains(allowedTypes, dt);
}
}
@@ -170,10 +170,10 @@ public class ArgumentValidators {
super(minArguments, maxArguments, new NumericTypeChecker(), allSame);
}
- public static class NumericTypeChecker implements Predicate<DataType> {
+ public static class NumericTypeChecker implements Predicate<MajorType> {
- public boolean apply(DataType dt) {
- return dt.isNumericType();
+ public boolean apply(MajorType dt) {
+ return Types.isNumericType(dt);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/BasicArgumentValidator.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/BasicArgumentValidator.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/BasicArgumentValidator.java
index eed49d3..26b7cf6 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/BasicArgumentValidator.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/BasicArgumentValidator.java
@@ -19,13 +19,13 @@ package org.apache.drill.common.expression;
import java.util.List;
-import org.apache.drill.common.expression.types.DataType;
+import org.apache.drill.common.types.TypeProtos.MajorType;
public class BasicArgumentValidator implements ArgumentValidator {
private final Arg[] args;
- public BasicArgumentValidator(DataType... types) {
+ public BasicArgumentValidator(MajorType... types) {
this.args = new Arg[] { new Arg("single", types) };
}
@@ -34,7 +34,7 @@ public class BasicArgumentValidator implements ArgumentValidator {
}
@Override
- public void validateArguments(String expr, List<LogicalExpression> expressions, ErrorCollector errors) {
+ public void validateArguments(ExpressionPosition expr, List<LogicalExpression> expressions, ErrorCollector errors) {
if (expressions.size() != args.length) errors.addUnexpectedArgumentCount(expr, expressions.size(), args.length);
int i = 0;
@@ -45,7 +45,7 @@ public class BasicArgumentValidator implements ArgumentValidator {
}
}
- public Arg arg(String name, DataType... allowedTypes) {
+ public Arg arg(String name, MajorType... allowedTypes) {
return new Arg(name, allowedTypes);
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollector.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollector.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollector.java
index 21ecec4..b322345 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollector.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollector.java
@@ -17,27 +17,29 @@
******************************************************************************/
package org.apache.drill.common.expression;
-import org.apache.drill.common.expression.types.DataType;
+import org.apache.drill.common.types.TypeProtos.MajorType;
import com.google.common.collect.Range;
public interface ErrorCollector {
- public void addGeneralError(String expr, String s);
+ public void addGeneralError(ExpressionPosition expr, String s);
- public void addUnexpectedArgumentType(String expr, String name, DataType actual, DataType[] expected, int argumentIndex);
+ public void addUnexpectedArgumentType(ExpressionPosition expr, String name, MajorType actual, MajorType[] expected, int argumentIndex);
- public void addUnexpectedArgumentCount(String expr, int actual, Range<Integer> expected);
+ public void addUnexpectedArgumentCount(ExpressionPosition expr, int actual, Range<Integer> expected);
- public void addUnexpectedArgumentCount(String expr, int actual, int expected);
+ public void addUnexpectedArgumentCount(ExpressionPosition expr, int actual, int expected);
- public void addNonNumericType(String expr, DataType actual);
+ public void addNonNumericType(ExpressionPosition expr, MajorType actual);
- public void addUnexpectedType(String expr, int index, DataType actual);
+ public void addUnexpectedType(ExpressionPosition expr, int index, MajorType actual);
- public void addExpectedConstantValue(String expr, int actual, String s);
+ public void addExpectedConstantValue(ExpressionPosition expr, int actual, String s);
boolean hasErrors();
+
+ public int getErrorCount();
String toErrorString();
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollectorImpl.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollectorImpl.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollectorImpl.java
index cc90b82..054e067 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollectorImpl.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollectorImpl.java
@@ -1,12 +1,13 @@
package org.apache.drill.common.expression;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.drill.common.types.TypeProtos.MajorType;
+
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.google.common.collect.Range;
-import org.apache.drill.common.expression.types.DataType;
-
-import java.util.Arrays;
-import java.util.List;
public class ErrorCollectorImpl implements ErrorCollector {
List<ExpressionValidationError> errors;
@@ -15,17 +16,17 @@ public class ErrorCollectorImpl implements ErrorCollector {
errors = Lists.newArrayList();
}
- private String addExpr(String expr, String message) {
- return "Expression: [" + expr + "]. Error: " + message;
+ private String addExpr(ExpressionPosition expr, String message) {
+ return String.format("Error in expression at index %d. Error: %s. Full expression: %s.", expr.getCharIndex(), message, expr.getExpression());
}
@Override
- public void addGeneralError(String expr, String s) {
+ public void addGeneralError(ExpressionPosition expr, String s) {
errors.add(new ExpressionValidationError(addExpr(expr, s)));
}
@Override
- public void addUnexpectedArgumentType(String expr, String name, DataType actual, DataType[] expected, int argumentIndex) {
+ public void addUnexpectedArgumentType(ExpressionPosition expr, String name, MajorType actual, MajorType[] expected, int argumentIndex) {
errors.add(
new ExpressionValidationError(
addExpr(expr, String.format(
@@ -37,35 +38,35 @@ public class ErrorCollectorImpl implements ErrorCollector {
}
@Override
- public void addUnexpectedArgumentCount(String expr, int actual, Range<Integer> expected) {
+ public void addUnexpectedArgumentCount(ExpressionPosition expr, int actual, Range<Integer> expected) {
errors.add(new ExpressionValidationError(
addExpr(expr, String.format("Unexpected argument count. Actual argument count: %d, Expected range: %s", actual, expected))
));
}
@Override
- public void addUnexpectedArgumentCount(String expr, int actual, int expected) {
+ public void addUnexpectedArgumentCount(ExpressionPosition expr, int actual, int expected) {
errors.add(new ExpressionValidationError(
addExpr(expr, String.format("Unexpected argument count. Actual argument count: %d, Expected count: %d", actual, expected))
));
}
@Override
- public void addNonNumericType(String expr, DataType actual) {
+ public void addNonNumericType(ExpressionPosition expr, MajorType actual) {
errors.add(new ExpressionValidationError(
addExpr(expr, String.format("Unexpected numeric type. Actual type: %s", actual))
));
}
@Override
- public void addUnexpectedType(String expr, int index, DataType actual) {
+ public void addUnexpectedType(ExpressionPosition expr, int index, MajorType actual) {
errors.add(new ExpressionValidationError(
addExpr(expr, String.format("Unexpected argument type. Actual type: %s, Index: %d", actual, index))
));
}
@Override
- public void addExpectedConstantValue(String expr, int actual, String s) {
+ public void addExpectedConstantValue(ExpressionPosition expr, int actual, String s) {
errors.add(new ExpressionValidationError(
addExpr(expr, String.format("Unexpected constant value. Name: %s, Actual: %s", s, actual))
));
@@ -76,8 +77,21 @@ public class ErrorCollectorImpl implements ErrorCollector {
return !errors.isEmpty();
}
+
+ @Override
+ public int getErrorCount() {
+ return errors.size();
+ }
+
@Override
public String toErrorString() {
return "\n" + Joiner.on("\n").join(errors);
}
+
+ @Override
+ public String toString() {
+ return toErrorString();
+ }
+
+
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionPosition.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionPosition.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionPosition.java
new file mode 100644
index 0000000..2e8b529
--- /dev/null
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionPosition.java
@@ -0,0 +1,27 @@
+package org.apache.drill.common.expression;
+
+public class ExpressionPosition {
+ static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ExpressionPosition.class);
+
+ public static final ExpressionPosition UNKNOWN = new ExpressionPosition("--UNKNOWN EXPRESSION--", -1);
+
+ private final String expression;
+ private final int charIndex;
+
+ public ExpressionPosition(String expression, int charIndex) {
+ super();
+ this.expression = expression;
+ this.charIndex = charIndex;
+ }
+
+ public String getExpression() {
+ return expression;
+ }
+
+ public int getCharIndex() {
+ return charIndex;
+ }
+
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionStringBuilder.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionStringBuilder.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionStringBuilder.java
new file mode 100644
index 0000000..09a7d57
--- /dev/null
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionStringBuilder.java
@@ -0,0 +1,102 @@
+package org.apache.drill.common.expression;
+
+import org.apache.drill.common.expression.IfExpression.IfCondition;
+import org.apache.drill.common.expression.ValueExpressions.BooleanExpression;
+import org.apache.drill.common.expression.ValueExpressions.DoubleExpression;
+import org.apache.drill.common.expression.ValueExpressions.LongExpression;
+import org.apache.drill.common.expression.ValueExpressions.QuotedString;
+import org.apache.drill.common.expression.visitors.AbstractExprVisitor;
+
+import com.google.common.collect.ImmutableList;
+
+public class ExpressionStringBuilder extends AbstractExprVisitor<Void, StringBuilder, RuntimeException>{
+ static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ExpressionStringBuilder.class);
+
+ @Override
+ public Void visitFunctionCall(FunctionCall call, StringBuilder sb) throws RuntimeException {
+ FunctionDefinition func = call.getDefinition();
+ ImmutableList<LogicalExpression> args = call.args;
+ if (func.isOperator()) {
+ if (args.size() == 1) { // unary
+ func.addRegisteredName(sb);
+ sb.append("(");
+ args.get(0).accept(this, sb);
+ sb.append(")");
+ } else {
+ for (int i = 0; i < args.size(); i++) {
+ if (i != 0) {
+ sb.append(" ");
+ func.addRegisteredName(sb);
+ }
+ sb.append(" (");
+ args.get(i).accept(this, sb);
+ sb.append(") ");
+ }
+ }
+ } else { // normal function
+
+ func.addRegisteredName(sb);
+ sb.append("(");
+ for (int i = 0; i < args.size(); i++) {
+ if (i != 0) sb.append(", ");
+ args.get(i).accept(this, sb);
+ }
+ sb.append(") ");
+ }
+ return null;
+ }
+
+ @Override
+ public Void visitIfExpression(IfExpression ifExpr, StringBuilder sb) throws RuntimeException {
+ ImmutableList<IfCondition> conditions = ifExpr.conditions;
+ sb.append(" ( ");
+ for(int i =0; i < conditions.size(); i++){
+ IfCondition c = conditions.get(i);
+ if(i !=0) sb.append(" else ");
+ sb.append("if (");
+ c.condition.accept(this, sb);
+ sb.append(" ) then (");
+ c.expression.accept(this, sb);
+ sb.append(" ) ");
+ }
+ sb.append(" end ");
+ sb.append(" ) ");
+ return null;
+ }
+
+ @Override
+ public Void visitSchemaPath(SchemaPath path, StringBuilder sb) throws RuntimeException {
+ sb.append("'");
+ sb.append(path.getPath());
+ sb.append("'");
+ return null;
+ }
+
+ @Override
+ public Void visitLongConstant(LongExpression lExpr, StringBuilder sb) throws RuntimeException {
+ sb.append(lExpr.getLong());
+ return null;
+ }
+
+ @Override
+ public Void visitDoubleConstant(DoubleExpression dExpr, StringBuilder sb) throws RuntimeException {
+ sb.append(dExpr.getDouble());
+ return null;
+ }
+
+ @Override
+ public Void visitBooleanConstant(BooleanExpression e, StringBuilder sb) throws RuntimeException {
+ sb.append(e.getBoolean());
+ return null;
+ }
+
+ @Override
+ public Void visitQuotedStringConstant(QuotedString e, StringBuilder sb) throws RuntimeException {
+ sb.append("\"");
+ sb.append(e.value);
+ sb.append("\"");
+ return null;
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionValidator.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionValidator.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionValidator.java
new file mode 100644
index 0000000..98a9075
--- /dev/null
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionValidator.java
@@ -0,0 +1,86 @@
+package org.apache.drill.common.expression;
+
+import org.apache.drill.common.expression.IfExpression.IfCondition;
+import org.apache.drill.common.expression.ValueExpressions.BooleanExpression;
+import org.apache.drill.common.expression.ValueExpressions.DoubleExpression;
+import org.apache.drill.common.expression.ValueExpressions.LongExpression;
+import org.apache.drill.common.expression.ValueExpressions.QuotedString;
+import org.apache.drill.common.expression.visitors.ExprVisitor;
+import org.apache.drill.common.types.TypeProtos.DataMode;
+import org.apache.drill.common.types.TypeProtos.MajorType;
+import org.apache.drill.common.types.TypeProtos.MinorType;
+
+public class ExpressionValidator implements ExprVisitor<Void, ErrorCollector, RuntimeException> {
+ static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ExpressionValidator.class);
+
+ @Override
+ public Void visitFunctionCall(FunctionCall call, ErrorCollector errors) throws RuntimeException {
+ call.getDefinition().getArgumentValidator()
+ .validateArguments(call.getPosition(), call.args, errors);
+ return null;
+ }
+
+ @Override
+ public Void visitIfExpression(IfExpression ifExpr, ErrorCollector errors) throws RuntimeException {
+ // confirm that all conditions are required boolean values.
+ int i = 0;
+ for (IfCondition c : ifExpr.conditions) {
+ MajorType mt = c.condition.getMajorType();
+ if (mt.getMode() != DataMode.REQUIRED || mt.getMinorType() != MinorType.BOOLEAN){
+ errors.addGeneralError(c.condition.getPosition(),String.format(
+ "Failure composing If Expression. All conditions must return a required value and be of type boolean. Condition %d was DatMode %s and Type %s.",
+ i, mt.getMode(), mt.getMinorType()));
+ }
+ i++;
+ }
+
+ // confirm that all outcomes are the same type.
+ final MajorType mt = ifExpr.elseExpression.getMajorType();
+ i = 0;
+ for (IfCondition c : ifExpr.conditions) {
+ MajorType innerT = c.expression.getMajorType();
+ if (
+ (innerT.getMode() == DataMode.REPEATED && mt.getMode() != DataMode.REPEATED) || //
+ (innerT.getMinorType() != mt.getMinorType())
+ ) {
+ errors.addGeneralError(c.condition.getPosition(),String.format(
+ "Failure composing If Expression. All expressions must return the same MajorType as the else expression. The %d if condition returned type type %s but the else expression was of type %s",
+ i, innerT, mt));
+ }
+ i++;
+ }
+ return null;
+ }
+
+ @Override
+ public Void visitSchemaPath(SchemaPath path, ErrorCollector errors) throws RuntimeException {
+ return null;
+ }
+
+ @Override
+ public Void visitLongConstant(LongExpression intExpr, ErrorCollector errors) throws RuntimeException {
+ return null;
+ }
+
+ @Override
+ public Void visitDoubleConstant(DoubleExpression dExpr, ErrorCollector errors) throws RuntimeException {
+ return null;
+ }
+
+ @Override
+ public Void visitBooleanConstant(BooleanExpression e, ErrorCollector errors) throws RuntimeException {
+ return null;
+ }
+
+ @Override
+ public Void visitQuotedStringConstant(QuotedString e, ErrorCollector errors) throws RuntimeException {
+ return null;
+ }
+
+ @Override
+ public Void visitUnknown(LogicalExpression e, ErrorCollector value) throws RuntimeException {
+ return null;
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FieldReference.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FieldReference.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FieldReference.java
index 94800ba..f611614 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FieldReference.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FieldReference.java
@@ -21,6 +21,7 @@ import java.io.IOException;
import org.apache.drill.common.expression.FieldReference.De;
import org.apache.drill.common.expression.FieldReference.Se;
+import org.apache.drill.common.types.TypeProtos.MajorType;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonGenerator;
@@ -32,26 +33,25 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
-import org.apache.drill.common.expression.types.DataType;
@JsonSerialize(using = Se.class)
@JsonDeserialize(using = De.class)
public class FieldReference extends SchemaPath {
- DataType overrideType;
+ MajorType overrideType;
- public FieldReference(String value) {
- super(value);
+ public FieldReference(String value, ExpressionPosition pos) {
+ super(value, pos);
}
- public FieldReference(String value, DataType dataType) {
- super(value);
+ public FieldReference(String value, ExpressionPosition pos, MajorType dataType) {
+ super(value, pos);
this.overrideType = dataType;
}
@Override
- public DataType getDataType() {
+ public MajorType getMajorType() {
if(overrideType == null) {
- return super.getDataType();
+ return super.getMajorType();
} else {
return overrideType;
}
@@ -66,7 +66,7 @@ public class FieldReference extends SchemaPath {
@Override
public FieldReference deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException,
JsonProcessingException {
- return new FieldReference(this._parseString(jp, ctxt));
+ return new FieldReference(this._parseString(jp, ctxt), ExpressionPosition.UNKNOWN);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionBase.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionBase.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionBase.java
deleted file mode 100644
index fd8ae18..0000000
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionBase.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * 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.drill.common.expression;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.drill.common.expression.types.DataType;
-import org.apache.drill.common.expression.visitors.ExprVisitor;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.google.common.collect.ImmutableList;
-
-
-public abstract class FunctionBase extends LogicalExpressionBase implements Iterable<LogicalExpression>{
- public final ImmutableList<LogicalExpression> expressions;
-
-
- protected void funcToString(StringBuilder sb, String functionName) {
- sb.append(" ");
- sb.append(functionName);
- sb.append("( ");
- for(int i= 0; i < expressions.size(); i++){
- if(i != 0) sb.append(", ");
- expressions.get(i).addToString(sb);
- }
- sb.append(" ) ");
- }
-
- protected void opToString(StringBuilder sb, String operator) {
- sb.append(" ( ");
- expressions.get(0).addToString(sb);
- for(int i =1; i < expressions.size(); i++){
- sb.append(operator);
- expressions.get(i).addToString(sb);
- }
- sb.append(" ) ");
- }
-
- public FunctionBase(List<LogicalExpression> expressions){
- if( !(expressions instanceof ImmutableList)){
- expressions = ImmutableList.copyOf(expressions);
- }
- this.expressions = (ImmutableList<LogicalExpression>) expressions;
- }
-
-// public static DataType getJointType(String parentName, LogicalExpression expr1, LogicalExpression expr2) throws ExpressionValidationException{
-// DataType dt = DataType.getCombinedCast(expr1.getDataType(), expr2.getDataType());
-// if(dt == null) throw new ExpressionValidationException();
-//
-// return dt;
-// }
-//
-// public LogicalExpression wrapWithCastIfNecessary(DataType dt) throws ExpressionValidationException{
-// if(this.getDataType() != dt) return new Cast(this, dt);
-// return this;
-// }
-
-
-
-
- @Override
- public Iterator<LogicalExpression> iterator() {
- return expressions.iterator();
- }
-
- @Override
- @JsonIgnore
- public DataType getDataType() {
- throw new UnsupportedOperationException();
- }
-
-
-
-
-
-
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionCall.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionCall.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionCall.java
index ee76a5c..e13e87e 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionCall.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionCall.java
@@ -20,26 +20,34 @@ package org.apache.drill.common.expression;
import java.util.Iterator;
import java.util.List;
-import org.apache.drill.common.expression.types.DataType;
import org.apache.drill.common.expression.visitors.ExprVisitor;
+import org.apache.drill.common.types.TypeProtos.MajorType;
import com.google.common.collect.ImmutableList;
public class FunctionCall extends LogicalExpressionBase implements Iterable<LogicalExpression> {
private final FunctionDefinition func;
public final ImmutableList<LogicalExpression> args;
+ private final ExpressionPosition pos;
- public FunctionCall(FunctionDefinition func, List<LogicalExpression> args) {
+ public FunctionCall(FunctionDefinition func, List<LogicalExpression> args, ExpressionPosition pos) {
+ super(pos);
this.func = func;
if (!(args instanceof ImmutableList)) {
args = ImmutableList.copyOf(args);
}
this.args = (ImmutableList<LogicalExpression>) args;
+ this.pos = pos;
}
@Override
- public <T> T accept(ExprVisitor<T> visitor) {
- return visitor.visitFunctionCall(this);
+ public ExpressionPosition getPosition() {
+ return pos;
+ }
+
+ @Override
+ public <T, V, E extends Exception> T accept(ExprVisitor<T, V, E> visitor, V value) throws E{
+ return visitor.visitFunctionCall(this, value);
}
@Override
@@ -52,43 +60,16 @@ public class FunctionCall extends LogicalExpressionBase implements Iterable<Logi
}
@Override
- public DataType getDataType() {
+ public MajorType getMajorType() {
return func.getDataType(this.args);
}
@Override
- public void addToString(StringBuilder sb) {
- if (func.isOperator()) {
- if (args.size() == 1) { // unary
- func.addRegisteredName(sb);
- sb.append("(");
- args.get(0).addToString(sb);
- sb.append(")");
- } else {
- for (int i = 0; i < args.size(); i++) {
- if (i != 0) {
- sb.append(" ");
- func.addRegisteredName(sb);
- }
- sb.append(" (");
- args.get(i).addToString(sb);
- sb.append(") ");
- }
- }
- } else { // normal function
-
- func.addRegisteredName(sb);
- sb.append("(");
- for (int i = 0; i < args.size(); i++) {
- if (i != 0) sb.append(", ");
- args.get(i).addToString(sb);
- }
- sb.append(") ");
- }
+ public String toString() {
+ final int maxLen = 10;
+ return "FunctionCall [func=" + func + ", args="
+ + (args != null ? args.subList(0, Math.min(args.size(), maxLen)) : null) + ", pos=" + pos + "]";
}
- @Override
- public void resolveAndValidate(String expr, ErrorCollector errors) {
- func.getArgumentValidator().validateArguments(expr, args, errors);
- }
+
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java
index 9d21763..4cbab6a 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java
@@ -21,7 +21,7 @@ import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang3.ArrayUtils;
-import org.apache.drill.common.expression.types.DataType;
+import org.apache.drill.common.types.TypeProtos.MajorType;
public class FunctionDefinition {
@@ -42,7 +42,7 @@ public class FunctionDefinition {
this.isOperator = isOperator;
}
- public DataType getDataType(List<LogicalExpression> args){
+ public MajorType getDataType(List<LogicalExpression> args){
return outputType.getOutputType(args);
}
@@ -82,8 +82,8 @@ public class FunctionDefinition {
return this.name;
}
- public FunctionCall newCall(List<LogicalExpression> args){
- return new FunctionCall(this, args);
+ public FunctionCall newCall(List<LogicalExpression> args, ExpressionPosition pos){
+ return new FunctionCall(this, args, pos);
}
public void addRegisteredName(StringBuilder sb){
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionRegistry.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionRegistry.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionRegistry.java
index c22e448..ed2c63e 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionRegistry.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionRegistry.java
@@ -57,17 +57,18 @@ public class FunctionRegistry {
}
}
- public LogicalExpression createExpression(String functionName, List<LogicalExpression> args){
+
+ public LogicalExpression createExpression(String functionName, ExpressionPosition ep, List<LogicalExpression> args){
FunctionDefinition d = funcMap.get(functionName);
if(d == null) throw new ExpressionParsingException(String.format("Unable to find function definition for function named '%s'", functionName));
- return d.newCall(args);
+ return d.newCall(args, ep);
}
- public LogicalExpression createExpression(String unaryName, LogicalExpression... e){
- return funcMap.get(unaryName).newCall(Lists.newArrayList(e));
+ public LogicalExpression createExpression(String unaryName, ExpressionPosition ep, LogicalExpression... e){
+ return funcMap.get(unaryName).newCall(Lists.newArrayList(e), ep);
}
- public LogicalExpression createByOp(List<LogicalExpression> args, List<String> opTypes) {
+ public LogicalExpression createByOp(List<LogicalExpression> args, ExpressionPosition ep, List<String> opTypes) {
// logger.debug("Generating new comparison expressions.");
if (args.size() == 1) {
return args.get(0);
@@ -81,7 +82,7 @@ public class FunctionRegistry {
List<LogicalExpression> l2 = new ArrayList<LogicalExpression>();
l2.add(first);
l2.add(args.get(i + 1));
- first = createExpression(opTypes.get(i), args);
+ first = createExpression(opTypes.get(i), ep, args);
}
return first;
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/IfExpression.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/IfExpression.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/IfExpression.java
index a553f4c..6f2e4a8 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/IfExpression.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/IfExpression.java
@@ -21,11 +21,12 @@ import java.util.ArrayList;
import java.util.List;
import org.apache.drill.common.expression.IfExpression.IfCondition;
-import org.apache.drill.common.expression.types.DataType;
import org.apache.drill.common.expression.visitors.ExprVisitor;
+import org.apache.drill.common.types.TypeProtos.MajorType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.UnmodifiableIterator;
@@ -35,7 +36,8 @@ public class IfExpression extends LogicalExpressionBase implements Iterable<IfCo
public final ImmutableList<IfCondition> conditions;
public final LogicalExpression elseExpression;
- private IfExpression(List<IfCondition> conditions, LogicalExpression elseExpression){
+ private IfExpression(ExpressionPosition pos, List<IfCondition> conditions, LogicalExpression elseExpression){
+ super(pos);
this.conditions = ImmutableList.copyOf(conditions);
this.elseExpression = elseExpression;
}
@@ -53,28 +55,32 @@ public class IfExpression extends LogicalExpressionBase implements Iterable<IfCo
}
-
@Override
- public <T> T accept(ExprVisitor<T> visitor) {
- return visitor.visitIfExpression(this);
+ public <T, V, E extends Exception> T accept(ExprVisitor<T, V, E> visitor, V value) throws E{
+ return visitor.visitIfExpression(this, value);
}
-
public static class Builder{
List<IfCondition> conditions = new ArrayList<IfCondition>();
private LogicalExpression elseExpression;
+ private ExpressionPosition pos = ExpressionPosition.UNKNOWN;
+
+ public Builder setPosition(ExpressionPosition pos){
+ this.pos = pos;
+ return this;
+ }
public Builder addCondition(IfCondition condition){
conditions.add(condition);
return this;
}
- public Builder addConditions(Iterable<IfCondition> conditions) {
- for(IfCondition condition : conditions) {
- addCondition(condition);
- }
- return this;
- }
+ public Builder addConditions(Iterable<IfCondition> conditions) {
+ for (IfCondition condition : conditions) {
+ addCondition(condition);
+ }
+ return this;
+ }
public Builder setElse(LogicalExpression elseExpression) {
this.elseExpression = elseExpression;
@@ -82,39 +88,20 @@ public class IfExpression extends LogicalExpressionBase implements Iterable<IfCo
}
public IfExpression build(){
- return new IfExpression(conditions, elseExpression);
+ Preconditions.checkNotNull(pos);
+ Preconditions.checkNotNull(conditions);
+ Preconditions.checkNotNull(conditions);
+ return new IfExpression(pos, conditions, elseExpression);
}
}
-
- @Override
- public DataType getDataType() {
- return DataType.BOOLEAN;
- }
-
- @Override
- public void addToString(StringBuilder sb) {
- sb.append(" ( ");
- for(int i =0; i < conditions.size(); i++){
- IfCondition c = conditions.get(i);
- if(i !=0) sb.append(" else ");
- sb.append("if (");
- c.condition.addToString(sb);
- sb.append(" ) then (");
- c.expression.addToString(sb);
- sb.append(" ) ");
- }
- sb.append(" end ");
- sb.append(" ) ");
+ @Override
+ public MajorType getMajorType() {
+ return this.elseExpression.getMajorType();
}
- @Override
- public void resolveAndValidate(String expr, ErrorCollector errors) {
- }
-
-
- public static Builder newBuilder(){
+ public static Builder newBuilder(){
return new Builder();
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpression.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpression.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpression.java
index 3df33a0..165f409 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpression.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpression.java
@@ -26,8 +26,8 @@ import org.apache.drill.common.config.DrillConfig;
import org.apache.drill.common.expression.parser.ExprLexer;
import org.apache.drill.common.expression.parser.ExprParser;
import org.apache.drill.common.expression.parser.ExprParser.parse_return;
-import org.apache.drill.common.expression.types.DataType;
import org.apache.drill.common.expression.visitors.ExprVisitor;
+import org.apache.drill.common.types.TypeProtos.MajorType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -44,65 +44,65 @@ import com.fasterxml.jackson.databind.ser.std.StdSerializer;
//@JsonDeserialize(using = LogicalExpression.De.class) // Excluded as we need to register this with the DrillConfig.
@JsonSerialize(using = LogicalExpression.Se.class)
public interface LogicalExpression {
- static final Logger logger = LoggerFactory.getLogger(LogicalExpression.class);
+ static final Logger logger = LoggerFactory.getLogger(LogicalExpression.class);
- public abstract DataType getDataType();
+ public abstract MajorType getMajorType();
- public void addToString(StringBuilder sb);
+ public <T, V, E extends Exception> T accept(ExprVisitor<T, V, E> visitor, V value) throws E;
- public void resolveAndValidate(String expr, ErrorCollector errors);
+ public ExpressionPosition getPosition();
- public <T> T accept(ExprVisitor<T> visitor);
+ public static class De extends StdDeserializer<LogicalExpression> {
+ DrillConfig config;
- public static class De extends StdDeserializer<LogicalExpression> {
- DrillConfig config;
- ErrorCollector errorCollector;
-
- public De(DrillConfig config) {
- super(LogicalExpression.class);
- this.config = config;
- this.errorCollector = config.getErrorCollector();
- }
-
- @Override
- public LogicalExpression deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException,
- JsonProcessingException {
- String expr = jp.getText();
-
- if (expr == null || expr.isEmpty())
- return null;
- try {
- // logger.debug("Parsing expression string '{}'", expr);
- ExprLexer lexer = new ExprLexer(new ANTLRStringStream(expr));
-
- CommonTokenStream tokens = new CommonTokenStream(lexer);
- ExprParser parser = new ExprParser(tokens);
- parser.setRegistry(new FunctionRegistry(config));
- parse_return ret = parser.parse();
- // logger.debug("Found expression '{}'", ret.e);
- ret.e.resolveAndValidate(expr, errorCollector);
- return ret.e;
- } catch (RecognitionException e) {
- throw new RuntimeException(e);
- }
- }
+ public De(DrillConfig config) {
+ super(LogicalExpression.class);
+ this.config = config;
+ }
+ @Override
+ public LogicalExpression deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException,
+ JsonProcessingException {
+ String expr = jp.getText();
+
+ if (expr == null || expr.isEmpty())
+ return null;
+ try {
+ // logger.debug("Parsing expression string '{}'", expr);
+ ExprLexer lexer = new ExprLexer(new ANTLRStringStream(expr));
+ CommonTokenStream tokens = new CommonTokenStream(lexer);
+ ExprParser parser = new ExprParser(tokens);
+
+ //TODO: move functionregistry and error collector to injectables.
+ //ctxt.findInjectableValue(valueId, forProperty, beanInstance)
+
+ parser.setRegistry(new FunctionRegistry(config));
+ parse_return ret = parser.parse();
+
+ // ret.e.resolveAndValidate(expr, errorCollector);
+ return ret.e;
+ } catch (RecognitionException e) {
+ throw new RuntimeException(e);
+ }
}
- public static class Se extends StdSerializer<LogicalExpression> {
+ }
- protected Se() {
- super(LogicalExpression.class);
- }
+ public static class Se extends StdSerializer<LogicalExpression> {
- @Override
- public void serialize(LogicalExpression value, JsonGenerator jgen, SerializerProvider provider) throws IOException,
- JsonGenerationException {
- StringBuilder sb = new StringBuilder();
- value.addToString(sb);
- jgen.writeString(sb.toString());
- }
+ protected Se() {
+ super(LogicalExpression.class);
+ }
+ @Override
+ public void serialize(LogicalExpression value, JsonGenerator jgen, SerializerProvider provider) throws IOException,
+ JsonGenerationException {
+ StringBuilder sb = new StringBuilder();
+ ExpressionStringBuilder esb = new ExpressionStringBuilder();
+ value.accept(esb, sb);
+ jgen.writeString(sb.toString());
}
+ }
+
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpressionBase.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpressionBase.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpressionBase.java
index e973df7..aa8885f 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpressionBase.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpressionBase.java
@@ -6,9 +6,9 @@
* 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.
@@ -17,40 +17,44 @@
******************************************************************************/
package org.apache.drill.common.expression;
-import org.apache.drill.common.expression.types.DataType;
-import org.apache.drill.common.expression.visitors.ExprVisitor;
+import org.apache.drill.common.types.TypeProtos.MajorType;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
-@JsonPropertyOrder({"type"})
-public abstract class LogicalExpressionBase implements LogicalExpression {
+@JsonPropertyOrder({ "type" })
+public abstract class LogicalExpressionBase implements LogicalExpression{
+ private final ExpressionPosition pos;
-// public static DataType getJointType(String parentName, LogicalExpression expr1, LogicalExpression expr2) throws ExpressionValidationException{
-// DataType dt = DataType.getCombinedCast(expr1.getDataType(), expr2.getDataType());
-// if(dt == null) throw new ExpressionValidationException();
-//
-// return dt;
-// }
+ protected LogicalExpressionBase(ExpressionPosition pos) {
+ super();
+ this.pos = pos;
+ }
+ @Override
+ public ExpressionPosition getPosition() {
+ return pos;
+ }
- protected void i(StringBuilder sb, int indent) {
- for (int i = 0; i < indent; i++) {
- sb.append(" ");
- }
- }
+ protected void i(StringBuilder sb, int indent){
+ for(int i = 0; i < indent; i++){
+ sb.append(" ");
+ }
+ }
+
+ @Override
+ public MajorType getMajorType() {
+ throw new UnsupportedOperationException(String.format("The type of %s doesn't currently support LogicalExpression.getDataType().", this.getClass().getCanonicalName()));
+ }
-// @Override
-// public <T> T accept(ExprVisitor<T> visitor) {
-// return visitor.visit(this);
-// }
-
- @JsonProperty("type")
- public String getDescription() {
- return this.getClass().getSimpleName();
- }
+ @JsonProperty("type")
+ public String getDescription(){
+ return this.getClass().getSimpleName();
+ }
+
+
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/OutputTypeDeterminer.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/OutputTypeDeterminer.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/OutputTypeDeterminer.java
index 67402e2..0bec184 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/OutputTypeDeterminer.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/OutputTypeDeterminer.java
@@ -19,37 +19,51 @@ package org.apache.drill.common.expression;
import java.util.List;
-import org.apache.drill.common.expression.types.DataType;
+import org.apache.drill.common.types.TypeProtos.DataMode;
+import org.apache.drill.common.types.TypeProtos.MajorType;
+import org.apache.drill.common.types.TypeProtos.MinorType;
public interface OutputTypeDeterminer {
- public static OutputTypeDeterminer FIXED_BOOLEAN = new FixedType(DataType.BOOLEAN);
+ public static OutputTypeDeterminer FIXED_BOOLEAN = new FixedType(MajorType.newBuilder().setMinorType(MinorType.BOOLEAN).setMode(DataMode.REQUIRED).build());
- public DataType getOutputType(List<LogicalExpression> expressions);
+ public MajorType getOutputType(List<LogicalExpression> expressions);
public static class FixedType implements OutputTypeDeterminer{
- public DataType outputType;
+ public MajorType outputType;
- public FixedType(DataType outputType) {
+ public FixedType(MajorType outputType) {
super();
this.outputType = outputType;
}
@Override
- public DataType getOutputType(List<LogicalExpression> expressions) {
- return null;
+ public MajorType getOutputType(List<LogicalExpression> expressions) {
+ return outputType;
}
}
public static class SameAsFirstInput implements OutputTypeDeterminer{
-
@Override
- public DataType getOutputType(List<LogicalExpression> expressions) {
- return expressions.get(0).getDataType();
+ public MajorType getOutputType(List<LogicalExpression> expressions) {
+ return expressions.get(0).getMajorType();
+ }
+ }
+
+ public static class SameAsAnySoft implements OutputTypeDeterminer{
+ @Override
+ public MajorType getOutputType(List<LogicalExpression> expressions) {
+ for(LogicalExpression e : expressions){
+ if(e.getMajorType().getMode() == DataMode.OPTIONAL){
+ return e.getMajorType();
+ }
+ }
+ return expressions.get(0).getMajorType();
}
}
+
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/PathSegment.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/PathSegment.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/PathSegment.java
index c06426e..554c0ca 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/PathSegment.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/PathSegment.java
@@ -98,6 +98,32 @@ public abstract class PathSegment{
return "NameSegment [path=" + path + ", getCollisionBehavior()=" + getCollisionBehavior() + ", getChild()="
+ getChild() + "]";
}
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((path == null) ? 0 : path.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ NameSegment other = (NameSegment) obj;
+ if (path == null) {
+ if (other.path != null)
+ return false;
+ } else if (!path.equals(other.path))
+ return false;
+ return true;
+ }
+
}
Re: [44/53] [abbrv] git commit: Types transition
Posted by Ted Dunning <te...@gmail.com>.
On Fri, Jul 19, 2013 at 6:58 PM, <ja...@apache.org> wrote:
> Types transition
>
>
> Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
> Commit:
> http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/ce0da88d
> Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/ce0da88d
> Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/ce0da88d
>
> Branch: refs/heads/master
> Commit: ce0da88d2df38d079a11d2b269fad9e964e1c14a
> Parents: e68bba2
> Author: Jacques Nadeau <ja...@apache.org>
> Authored: Mon Jun 24 08:06:43 2013 -0700
> Committer: Jacques Nadeau <ja...@apache.org>
> Committed: Fri Jul 19 14:53:11 2013 -0700
>
> ----------------------------------------------------------------------
> sandbox/prototype/common/pom.xml | 216 ++---
> .../drill/common/expression/parser/ExprParser.g | 64 +-
> .../org/apache/drill/common/expression/Arg.java | 44 +-
> .../common/expression/ArgumentValidator.java | 2 +-
> .../common/expression/ArgumentValidators.java | 62 +-
> .../expression/BasicArgumentValidator.java | 8 +-
> .../drill/common/expression/ErrorCollector.java | 18 +-
> .../common/expression/ErrorCollectorImpl.java | 40 +-
> .../common/expression/ExpressionPosition.java | 27 +
> .../expression/ExpressionStringBuilder.java | 102 +++
> .../common/expression/ExpressionValidator.java | 86 ++
> .../drill/common/expression/FieldReference.java | 18 +-
> .../drill/common/expression/FunctionBase.java | 94 --
> .../drill/common/expression/FunctionCall.java | 55 +-
> .../common/expression/FunctionDefinition.java | 8 +-
> .../common/expression/FunctionRegistry.java | 13 +-
> .../drill/common/expression/IfExpression.java | 65 +-
> .../common/expression/LogicalExpression.java | 98 +-
> .../expression/LogicalExpressionBase.java | 56 +-
> .../common/expression/OutputTypeDeterminer.java | 34 +-
> .../drill/common/expression/PathSegment.java | 26 +
> .../drill/common/expression/SchemaPath.java | 176 ++--
> .../common/expression/ValueExpressions.java | 320 ++++---
> .../common/expression/fn/BooleanFunctions.java | 6 +-
> .../common/expression/fn/MathFunctions.java | 10 +-
> .../common/expression/fn/StringFunctions.java | 7 +-
> .../common/expression/fn/UnaryFunctions.java | 6 +-
> .../drill/common/expression/types/AtomType.java | 67 ++
> .../drill/common/expression/types/DataType.java | 2 +-
> .../visitors/AbstractExprVisitor.java | 56 ++
> .../expression/visitors/AggregateChecker.java | 25 +-
> .../expression/visitors/ConstantChecker.java | 21 +-
> .../common/expression/visitors/ExprVisitor.java | 18 +-
> .../expression/visitors/SimpleExprVisitor.java | 56 ++
> .../org/apache/drill/common/types/Types.java | 134 +++
> .../common/src/main/protobuf/Types.proto | 64 ++
> sandbox/prototype/exec/java-exec/pom.xml | 360 ++++----
> .../org/apache/drill/exec/ExecConstants.java | 1 +
> .../drill/exec/compile/ClassTransformer.java | 1 +
> .../drill/exec/compile/CodeModelTools.java | 31 +
> .../apache/drill/exec/expr/CodeGenerator.java | 201 +++++
> .../apache/drill/exec/expr/DrillAggrFunc.java | 9 +
> .../org/apache/drill/exec/expr/DrillFunc.java | 9 +
> .../drill/exec/expr/EvaluationVisitor.java | 201 +++++
> .../exec/expr/ExpressionTreeMaterializer.java | 128 +++
> .../exec/expr/SingleClassStringWriter.java | 40 +
> .../exec/expr/ValueVectorReadExpression.java | 41 +
> .../exec/expr/ValueVectorWriteExpression.java | 45 +
> .../exec/expr/annotations/FunctionTemplate.java | 25 +
> .../drill/exec/expr/annotations/Output.java | 18 +
> .../drill/exec/expr/annotations/Param.java | 18 +
> .../drill/exec/expr/annotations/WorkSpace.java | 14 +
> .../drill/exec/expr/fn/FunctionConverter.java | 186 ++++
> .../drill/exec/expr/fn/FunctionHolder.java | 158 ++++
> .../expr/fn/FunctionImplementationRegistry.java | 43 +
> .../exec/expr/fn/MethodGrabbingVisitor.java | 52 ++
> .../exec/expr/fn/ModifiedUnparseVisitor.java | 891 +++++++++++++++++++
> .../drill/exec/expr/fn/impl/MathFunctions.java | 48 +
> .../drill/exec/expr/holders/ValueHolder.java | 4 +
> .../holders/ValueHolderImplmenetations.java | 44 +
> .../exec/expr/holders/VarBinaryHolder.java | 12 +
> .../apache/drill/exec/ops/FragmentContext.java | 26 +-
> .../apache/drill/exec/opt/BasicOptimizer.java | 28 +-
> .../apache/drill/exec/physical/RecordField.java | 8 +-
> .../exec/physical/config/MockRecordReader.java | 19 +-
> .../drill/exec/physical/config/MockScanPOP.java | 8 +-
> .../exec/physical/impl/FilterRecordBatch.java | 34 +
> .../drill/exec/physical/impl/OutputMutator.java | 9 +
> .../drill/exec/physical/impl/ScanBatch.java | 72 +-
> .../drill/exec/physical/impl/VectorHolder.java | 39 +
> .../exec/physical/impl/WireRecordBatch.java | 32 +-
> .../impl/filter/EvalSetupException.java | 5 +
> .../impl/filter/EvaluationPredicate.java | 13 +
> .../physical/impl/filter/ExampleFilter.java | 113 +++
> .../physical/impl/project/ProjectEvaluator.java | 12 +
> .../impl/project/ProjectRecordBatch.java | 218 +++++
> .../exec/physical/impl/project/Projector.java | 20 +
> .../impl/project/ProjectorTemplate.java | 101 +++
> .../physical/impl/project/TransferPairing.java | 35 +
> .../drill/exec/planner/PhysicalPlanReader.java | 2 +-
> .../apache/drill/exec/record/BatchSchema.java | 36 +-
> .../exec/record/ExpressionTreeMaterializer.java | 138 ---
> .../drill/exec/record/MajorTypeSerDe.java | 6 +-
> .../drill/exec/record/MaterializedField.java | 58 +-
> .../drill/exec/record/NullExpression.java | 32 +
> .../apache/drill/exec/record/RecordBatch.java | 67 +-
> .../drill/exec/record/RecordBatchLoader.java | 84 +-
> .../apache/drill/exec/record/SchemaBuilder.java | 75 +-
> .../apache/drill/exec/record/WritableBatch.java | 43 +-
> .../exec/record/vector/NullableFixed8.java | 36 +
> .../exec/record/vector/SelectionVector.java | 8 +
> .../exec/record/vector/SelectionVector2.java | 46 +
> .../exec/record/vector/SelectionVector4.java | 41 +
> .../org/apache/drill/exec/schema/Field.java | 31 +-
> .../apache/drill/exec/schema/ListSchema.java | 17 +-
> .../apache/drill/exec/schema/NamedField.java | 19 +-
> .../apache/drill/exec/schema/OrderedField.java | 9 +-
> .../exec/schema/json/jackson/JacksonHelper.java | 26 +-
> .../drill/exec/store/JSONRecordReader.java | 84 +-
> .../exec/work/batch/BitComHandlerImpl.java | 3 +-
> .../work/foreman/RunningFragmentManager.java | 3 +-
> .../work/fragment/RemoteFragmentHandler.java | 3 +-
> .../java-exec/src/main/protobuf/SchemaDef.proto | 63 +-
> .../src/main/resources/drill-module.conf | 13 +-
> .../java/org/apache/drill/exec/SortTest.java | 61 ++
> .../apache/drill/exec/expr/ExpressionTest.java | 108 +++
> .../exec/physical/impl/PerformanceTests.java | 32 +
> .../impl/TestExecutionAbstractions.java | 226 +++++
> .../physical/impl/TestSimpleFragmentRun.java | 51 +-
> .../record/ExpressionTreeMaterializerTest.java | 297 ++++---
> .../drill/exec/store/JSONRecordReaderTest.java | 469 +++++-----
> .../org/apache/drill/exec/ref/RunOutcome.java | 1 +
> .../exec/ref/eval/BasicEvaluatorFactory.java | 11 +-
> .../apache/drill/exec/ref/eval/IfEvaluator.java | 10 +-
> .../exec/ref/eval/SimpleEvaluationVisitor.java | 24 +-
> .../drill/exec/ref/eval/fn/MathEvaluators.java | 5 +-
> .../exec/ref/rops/CollapsingAggregateROP.java | 4 +-
> .../apache/drill/exec/ref/rops/ConstantROP.java | 3 -
> .../apache/drill/exec/ref/rops/FlattenROP.java | 7 +-
> .../drill/exec/ref/rops/WindowFrameROP.java | 5 +-
> .../drill/exec/ref/values/BaseArrayValue.java | 21 +-
> .../drill/exec/ref/values/BaseMapValue.java | 9 +-
> .../apache/drill/exec/ref/values/DataValue.java | 4 +-
> .../drill/exec/ref/values/NumericValue.java | 17 +-
> .../drill/exec/ref/values/ScalarValues.java | 66 +-
> .../drill/exec/ref/values/SimpleArrayValue.java | 4 +-
> .../drill/exec/ref/values/SimpleMapValue.java | 5 +-
> .../drill/exec/ref/values/ValueReader.java | 14 +-
> .../drill/exec/ref/values/ValueUtils.java | 17 +-
> .../apache/drill/exec/ref/RunSimplePlan.java | 14 +-
> .../org/apache/drill/exec/ref/TestUtils.java | 3 +-
> .../exec/ref/rops/CollapsingAggregateTest.java | 5 +-
> .../drill/exec/ref/rops/ConstantROPTest.java | 5 +-
> .../drill/exec/ref/rops/OrderROPTest.java | 5 +-
> .../drill/exec/ref/rops/WindowFrameROPTest.java | 12 +-
> sandbox/prototype/pom.xml | 381 ++++----
> 136 files changed, 6212 insertions(+), 2103 deletions(-)
> ----------------------------------------------------------------------
>
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/pom.xml
> ----------------------------------------------------------------------
> diff --git a/sandbox/prototype/common/pom.xml
> b/sandbox/prototype/common/pom.xml
> index 4a8c5d8..4891191 100644
> --- a/sandbox/prototype/common/pom.xml
> +++ b/sandbox/prototype/common/pom.xml
> @@ -1,103 +1,119 @@
> <?xml version="1.0"?>
> <project
> - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
> http://maven.apache.org/xsd/maven-4.0.0.xsd"
> - xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
> http://www.w3.org/2001/XMLSchema-instance">
> - <modelVersion>4.0.0</modelVersion>
> - <parent>
> - <artifactId>prototype-parent</artifactId>
> - <groupId>org.apache.drill</groupId>
> - <version>1.0-SNAPSHOT</version>
> - </parent>
> -
> - <artifactId>common</artifactId>
> - <packaging>jar</packaging>
> - <name>common</name>
> -
> - <dependencies>
> -
> - <dependency>
> - <groupId>com.google.protobuf</groupId>
> - <artifactId>protobuf-java</artifactId>
> - <version>2.5.0</version>
> - </dependency>
> -
> - <dependency>
> - <groupId>com.typesafe</groupId>
> - <artifactId>config</artifactId>
> - <version>1.0.0</version>
> - </dependency>
> -
> - <dependency>
> - <groupId>org.apache.commons</groupId>
> - <artifactId>commons-lang3</artifactId>
> - <version>3.1</version>
> - </dependency>
> -
> - <dependency>
> - <groupId>org.msgpack</groupId>
> - <artifactId>msgpack</artifactId>
> - <version>0.6.6</version>
> - </dependency>
> -
> - <dependency>
> - <groupId>org.reflections</groupId>
> - <artifactId>reflections</artifactId>
> - <version>0.9.8</version>
> - </dependency>
> -
> - <dependency>
> - <groupId>com.fasterxml.jackson.core</groupId>
> - <artifactId>jackson-annotations</artifactId>
> - <version>2.1.1</version>
> - </dependency>
> - <dependency>
> - <groupId>org.hibernate</groupId>
> - <artifactId>hibernate-validator</artifactId>
> - <version>4.3.1.Final</version>
> - </dependency>
> - <dependency>
> - <groupId>com.fasterxml.jackson.core</groupId>
> - <artifactId>jackson-databind</artifactId>
> - <version>2.1.1</version>
> - </dependency>
> - <dependency>
> - <groupId>org.antlr</groupId>
> - <artifactId>antlr-runtime</artifactId>
> - <version>3.4</version>
> - </dependency>
> -
> -
> - </dependencies>
> -
> -
> - <build>
> - <plugins>
> - <plugin>
> - <artifactId>maven-jar-plugin</artifactId>
> - <executions>
> - <execution>
> - <id>test-jar</id>
> - <goals>
> - <goal>test-jar</goal>
> - </goals>
> - </execution>
> - </executions>
> - </plugin>
> - <plugin>
> - <groupId>org.antlr</groupId>
> - <artifactId>antlr3-maven-plugin</artifactId>
> - <version>3.4</version>
> - <configuration>
> -
> - </configuration>
> - <executions>
> - <execution>
> - <goals>
> - <goal>antlr</goal>
> - </goals>
> - </execution>
> - </executions>
> - </plugin>
> - </plugins>
> - </build>
> + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
> http://maven.apache.org/xsd/maven-4.0.0.xsd"
> + xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
> http://www.w3.org/2001/XMLSchema-instance">
> + <modelVersion>4.0.0</modelVersion>
> +
> + <parent>
> + <artifactId>prototype-parent</artifactId>
> + <groupId>org.apache.drill</groupId>
> + <version>1.0-SNAPSHOT</version>
> + </parent>
> +
> + <artifactId>common</artifactId>
> + <packaging>jar</packaging>
> + <name>common</name>
> +
> + <dependencies>
> +
> + <dependency>
> + <groupId>com.google.protobuf</groupId>
> + <artifactId>protobuf-java</artifactId>
> + <version>2.5.0</version>
> + </dependency>
> +
> + <dependency>
> + <groupId>com.typesafe</groupId>
> + <artifactId>config</artifactId>
> + <version>1.0.0</version>
> + </dependency>
> +
> + <dependency>
> + <groupId>org.apache.commons</groupId>
> + <artifactId>commons-lang3</artifactId>
> + <version>3.1</version>
> + </dependency>
> +
> + <dependency>
> + <groupId>org.msgpack</groupId>
> + <artifactId>msgpack</artifactId>
> + <version>0.6.6</version>
> + </dependency>
> +
> + <dependency>
> + <groupId>org.reflections</groupId>
> + <artifactId>reflections</artifactId>
> + <version>0.9.8</version>
> + </dependency>
> +
> + <dependency>
> + <groupId>com.fasterxml.jackson.core</groupId>
> + <artifactId>jackson-annotations</artifactId>
> + <version>2.1.1</version>
> + </dependency>
> + <dependency>
> + <groupId>org.hibernate</groupId>
> + <artifactId>hibernate-validator</artifactId>
> + <version>4.3.1.Final</version>
> + </dependency>
> + <dependency>
> + <groupId>com.fasterxml.jackson.core</groupId>
> + <artifactId>jackson-databind</artifactId>
> + <version>2.1.1</version>
> + </dependency>
> + <dependency>
> + <groupId>org.antlr</groupId>
> + <artifactId>antlr-runtime</artifactId>
> + <version>3.4</version>
> + </dependency>
> +
> +
> + </dependencies>
> +
> +
> + <build>
> + <plugins>
> + <plugin>
> + <artifactId>maven-jar-plugin</artifactId>
> + <executions>
> + <execution>
> + <id>test-jar</id>
> + <goals>
> + <goal>test-jar</goal>
> + </goals>
> + </execution>
> + </executions>
> + </plugin>
> + <plugin>
> + <groupId>org.antlr</groupId>
> + <artifactId>antlr3-maven-plugin</artifactId>
> + <version>3.4</version>
> + <configuration>
> +
> + </configuration>
> + <executions>
> + <execution>
> + <goals>
> + <goal>antlr</goal>
> + </goals>
> + </execution>
> + </executions>
> + </plugin>
> +
> +
> + <plugin>
> + <groupId>com.github.igor-petruk.protobuf</groupId>
> + <artifactId>protobuf-maven-plugin</artifactId>
> + <version>0.6.3</version>
> + <executions>
> + <execution>
> + <goals>
> + <goal>run</goal>
> + </goals>
> + </execution>
> + </executions>
> + </plugin>
> + </plugins>
> +
> + </build>
> </project>
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/antlr3/org/apache/drill/common/expression/parser/ExprParser.g
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/antlr3/org/apache/drill/common/expression/parser/ExprParser.g
> b/sandbox/prototype/common/src/main/antlr3/org/apache/drill/common/expression/parser/ExprParser.g
> index f8eb725..6cf041c 100644
> ---
> a/sandbox/prototype/common/src/main/antlr3/org/apache/drill/common/expression/parser/ExprParser.g
> +++
> b/sandbox/prototype/common/src/main/antlr3/org/apache/drill/common/expression/parser/ExprParser.g
> @@ -40,7 +40,8 @@ import org.apache.drill.common.expression.*;
>
> @members{
> private FunctionRegistry registry;
> -
> + private String fullExpression;
> + private int tokenPos;
> public void setRegistry(FunctionRegistry registry){
> this.registry = registry;
> }
> @@ -48,14 +49,22 @@ import org.apache.drill.common.expression.*;
> public static void p(String s){
> System.out.println(s);
> }
> +
> + public ExpressionPosition pos(Token token){
> + return new ExpressionPosition(fullExpression, token.getTokenIndex());
> + }
> }
>
> parse returns [LogicalExpression e]
> - : expression EOF {$e = $expression.e; }
> + : expression EOF {
> + $e = $expression.e;
> + if(fullExpression == null) fullExpression = $expression.text;
> + tokenPos = $expression.start.getTokenIndex();
> + }
> ;
>
> functionCall returns [LogicalExpression e]
> - : Identifier OParen exprList? CParen {$e =
> registry.createExpression($Identifier.text, $exprList.listE); }
> + : Identifier OParen exprList? CParen {$e =
> registry.createExpression($Identifier.text, pos($Identifier),
> $exprList.listE); }
> ;
>
> ifStatement returns [LogicalExpression e]
> @@ -65,7 +74,7 @@ ifStatement returns [LogicalExpression e]
> @after {
> $e = s.build();
> }
> - : i1=ifStat {s.addCondition($i1.i); } (elseIfStat {
> s.addCondition($elseIfStat.i); } )* Else expression {
> s.setElse($expression.e); }End
> + : i1=ifStat {s.addCondition($i1.i); s.setPosition(pos($i1.start)); }
> (elseIfStat { s.addCondition($elseIfStat.i); } )* Else expression {
> s.setElse($expression.e); }End
> ;
>
> ifStat returns [IfExpression.IfCondition i]
> @@ -113,96 +122,103 @@ condExpr returns [LogicalExpression e]
> orExpr returns [LogicalExpression e]
> @init{
> List<LogicalExpression> exprs = new
> ArrayList<LogicalExpression>();
> + ExpressionPosition p = null;
> }
> @after{
> if(exprs.size() == 1){
> $e = exprs.get(0);
> }else{
> - $e = registry.createExpression("||", exprs);
> + $e = registry.createExpression("||", p, exprs);
> }
> }
> - : a1=andExpr { exprs.add($a1.e); } (Or^ a2=andExpr { exprs.add($a2.e);
> })*
> + : a1=andExpr { exprs.add($a1.e); p = pos( $a1.start );} (Or^
> a2=andExpr { exprs.add($a2.e); })*
> ;
>
> andExpr returns [LogicalExpression e]
> @init{
> List<LogicalExpression> exprs = new
> ArrayList<LogicalExpression>();
> + ExpressionPosition p = null;
> }
> @after{
> if(exprs.size() == 1){
> $e = exprs.get(0);
> }else{
> - $e = registry.createExpression("&&", exprs);
> + $e = registry.createExpression("&&", p, exprs);
> }
> }
> - : e1=equExpr { exprs.add($e1.e); } (And^ e2=equExpr {
> exprs.add($e2.e); })*
> + : e1=equExpr { exprs.add($e1.e); p = pos( $e1.start ); } (And^
> e2=equExpr { exprs.add($e2.e); })*
> ;
>
> equExpr returns [LogicalExpression e]
> @init{
> List<LogicalExpression> exprs = new
> ArrayList<LogicalExpression>();
> List<String> cmps = new ArrayList();
> + ExpressionPosition p = null;
> }
> @after{
> - $e = registry.createByOp(exprs, cmps);
> + $e = registry.createByOp(exprs, p, cmps);
> }
> - : r1=relExpr {exprs.add($r1.e);} ( cmpr= (Equals | NEquals )
> r2=relExpr {exprs.add($r2.e); cmps.add($cmpr.text); })*
> + : r1=relExpr { exprs.add($r1.e); p = pos( $r1.start );
> + } ( cmpr= (Equals | NEquals ) r2=relExpr {exprs.add($r2.e);
> cmps.add($cmpr.text); })*
> ;
>
> relExpr returns [LogicalExpression e]
> - : left=addExpr {$e = $left.e; } (cmpr = (GTEquals | LTEquals | GT |
> LT) right=addExpr {$e = registry.createExpression($cmpr.text, $left.e,
> $right.e); } )?
> + : left=addExpr {$e = $left.e; } (cmpr = (GTEquals | LTEquals | GT |
> LT) right=addExpr {$e = registry.createExpression($cmpr.text,
> pos($left.start), $left.e, $right.e); } )?
> ;
>
> addExpr returns [LogicalExpression e]
> @init{
> List<LogicalExpression> exprs = new
> ArrayList<LogicalExpression>();
> List<String> ops = new ArrayList();
> + ExpressionPosition p = null;
> }
> @after{
> - $e = registry.createByOp(exprs, ops);
> + $e = registry.createByOp(exprs, p, ops);
> }
> - : m1=mulExpr {exprs.add($m1.e);} ( op=(Plus|Minus) m2=mulExpr
> {exprs.add($m2.e); ops.add($op.text); })*
> + : m1=mulExpr {exprs.add($m1.e); p = pos($m1.start); } (
> op=(Plus|Minus) m2=mulExpr {exprs.add($m2.e); ops.add($op.text); })*
> ;
>
> mulExpr returns [LogicalExpression e]
> @init{
> List<LogicalExpression> exprs = new
> ArrayList<LogicalExpression>();
> List<String> ops = new ArrayList();
> + ExpressionPosition p = null;
> }
> @after{
> - $e = registry.createByOp(exprs, ops);
> + $e = registry.createByOp(exprs, p, ops);
> }
> - : p1=powExpr {exprs.add($p1.e);} (op=(Asterisk|ForwardSlash|Percent)
> p2=powExpr {exprs.add($p2.e); ops.add($op.text); } )*
> + : p1=powExpr {exprs.add($p1.e); p = pos($p1.start);}
> (op=(Asterisk|ForwardSlash|Percent) p2=powExpr {exprs.add($p2.e);
> ops.add($op.text); } )*
> ;
>
> powExpr returns [LogicalExpression e]
> @init{
> List<LogicalExpression> exprs = new
> ArrayList<LogicalExpression>();
> List<String> ops = new ArrayList();
> + ExpressionPosition p = null;
> }
> @after{
> - $e = registry.createByOp(exprs, ops);
> + $e = registry.createByOp(exprs, p, ops);
> }
> - : u1=unaryExpr {exprs.add($u1.e);} (Caret u2=unaryExpr
> {exprs.add($u2.e); ops.add($Caret.text);} )*
> + : u1=unaryExpr {exprs.add($u1.e); p = pos($u1.start);} (Caret
> u2=unaryExpr {exprs.add($u2.e); ops.add($Caret.text);} )*
> ;
>
> unaryExpr returns [LogicalExpression e]
> - : Minus atom {$e = registry.createExpression("u-", $atom.e); }
> - | Excl atom {$e= registry.createExpression("!", $atom.e); }
> + : Minus atom {$e = registry.createExpression("u-", pos($atom.start),
> $atom.e); }
> + | Excl atom {$e= registry.createExpression("!", pos($atom.start),
> $atom.e); }
> | atom {$e = $atom.e; }
> ;
>
> atom returns [LogicalExpression e]
> - : Number {$e = ValueExpressions.getNumericExpression($Number.text); }
> - | Bool {$e = new ValueExpressions.BooleanExpression( $Bool.text ); }
> + : Number {$e = ValueExpressions.getNumericExpression($Number.text,
> pos($atom.start)); }
> + | Bool {$e = new ValueExpressions.BooleanExpression( $Bool.text,
> pos($atom.start)); }
> | lookup {$e = $lookup.e; }
> ;
>
>
> lookup returns [LogicalExpression e]
> : functionCall {$e = $functionCall.e ;}
> - | Identifier {$e = new SchemaPath($Identifier.text); }
> - | String {$e = new ValueExpressions.QuotedString($String.text); }
> + | Identifier {$e = new SchemaPath($Identifier.text, pos($Identifier) );
> }
> + | String {$e = new ValueExpressions.QuotedString($String.text,
> pos($String) ); }
> | OParen expression CParen {$e = $expression.e; }
> - | SingleQuote Identifier SingleQuote {$e = new
> SchemaPath($Identifier.text); }
> + | SingleQuote Identifier SingleQuote {$e = new
> SchemaPath($Identifier.text, pos($Identifier) ); }
> ;
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/Arg.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/Arg.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/Arg.java
> index de9057b..64ec351 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/Arg.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/Arg.java
> @@ -17,24 +17,41 @@
>
> ******************************************************************************/
> package org.apache.drill.common.expression;
>
> -import org.apache.drill.common.expression.types.DataType;
> +import java.util.List;
> +
> import org.apache.drill.common.expression.visitors.ConstantChecker;
> +import org.apache.drill.common.types.TypeProtos.DataMode;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
> +import org.apache.drill.common.types.TypeProtos.MinorType;
> +
> +import com.google.common.collect.Lists;
>
>
> public class Arg {
> private final String name;
> - private final DataType[] allowedTypes;
> + private final MajorType[] allowedTypes;
> private final boolean constantsOnly;
>
> - public Arg(DataType... allowedTypes){
> +
> + /**
> + * Create an arg that supports any of the listed minor types using opt
> or req. Does not allow repeated types.
> + * @param name
> + * @param constantsOnly
> + * @param types
> + */
> + public Arg(boolean constantsOnly, boolean allowNulls, String name,
> MinorType... types){
> + this(constantsOnly, name, getMajorTypes(allowNulls, types));
> + }
> +
> + public Arg(MajorType... allowedTypes){
> this(false, null, allowedTypes);
> }
>
> - public Arg(String name, DataType... allowedTypes) {
> + public Arg(String name, MajorType... allowedTypes) {
> this(false, name, allowedTypes);
> }
>
> - public Arg(boolean constantsOnly, String name, DataType...
> allowedTypes) {
> + public Arg(boolean constantsOnly, String name, MajorType...
> allowedTypes) {
> this.name = name;
> this.allowedTypes = allowedTypes;
> this.constantsOnly = constantsOnly;
> @@ -44,15 +61,15 @@ public class Arg {
> return name;
> }
>
> - public void confirmDataType(String expr, int argIndex,
> LogicalExpression e, ErrorCollector errors){
> + public void confirmDataType(ExpressionPosition expr, int argIndex,
> LogicalExpression e, ErrorCollector errors){
> if(constantsOnly){
> if(ConstantChecker.onlyIncludesConstants(e))
> errors.addExpectedConstantValue(expr, argIndex, name);
> }
> - DataType dt = e.getDataType();
> - if(dt.isLateBind()){
> + MajorType dt = e.getMajorType();
> + if(dt.getMinorType() == MinorType.LATE){
>
> // change among allowed types.
> - for(DataType a : allowedTypes){
> + for(MajorType a : allowedTypes){
> if(dt == a) return;
> }
>
> @@ -63,4 +80,13 @@ public class Arg {
>
>
> }
> +
> + private static MajorType[] getMajorTypes(boolean allowNulls,
> MinorType... types){
> + List<MajorType> mts = Lists.newArrayList();
> + for(MinorType t : types){
> + if(allowNulls)
> mts.add(MajorType.newBuilder().setMinorType(t).setMode(DataMode.OPTIONAL).build());
> +
> mts.add(MajorType.newBuilder().setMinorType(t).setMode(DataMode.REQUIRED).build());
> + }
> + return mts.toArray(new MajorType[mts.size()]);
> + }
> }
> \ No newline at end of file
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidator.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidator.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidator.java
> index dc22045..765dc3f 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidator.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidator.java
> @@ -23,6 +23,6 @@ import java.util.List;
> * Validates whether the set of arguments are acceptable
> */
> public interface ArgumentValidator {
> - public void validateArguments(String expr, List<LogicalExpression>
> expressions, ErrorCollector errors);
> + public void validateArguments(ExpressionPosition expr,
> List<LogicalExpression> expressions, ErrorCollector errors);
> public String[] getArgumentNamesByPosition();
> }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java
> index 25cb887..f30733d 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java
> @@ -20,8 +20,8 @@ package org.apache.drill.common.expression;
> import java.util.List;
>
> import org.apache.commons.lang3.ArrayUtils;
> -import org.apache.drill.common.expression.types.DataType;
> -import org.apache.drill.common.expression.types.DataType.Comparability;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
> +import org.apache.drill.common.types.Types;
>
> import com.google.common.base.Predicate;
> import com.google.common.collect.Range;
> @@ -46,7 +46,7 @@ public class ArgumentValidators {
> }
>
> @Override
> - public void validateArguments(String expr, List<LogicalExpression>
> expressions, ErrorCollector errors) {
> + public void validateArguments(ExpressionPosition expr,
> List<LogicalExpression> expressions, ErrorCollector errors) {
> // only need to check argument count since any type is allowed.
> if (!argumentCount.contains(expressions.size()))
> errors.addUnexpectedArgumentCount(expr, expressions.size(),
> argumentCount);
> @@ -61,17 +61,17 @@ public class ArgumentValidators {
>
> private static class PredicateValidator implements ArgumentValidator {
> private final Range<Integer> argumentCount;
> - private Predicate<DataType> predicate;
> + private Predicate<MajorType> predicate;
> private boolean allSame;
>
> - public PredicateValidator(int argCount, Predicate<DataType>
> predicate, boolean allSame) {
> + public PredicateValidator(int argCount, Predicate<MajorType>
> predicate, boolean allSame) {
> super();
> this.argumentCount = Ranges.singleton(argCount);
> this.predicate = predicate;
> this.allSame = allSame;
> }
>
> - public PredicateValidator(int minArguments, int maxArguments,
> Predicate<DataType> predicate, boolean allSame) {
> + public PredicateValidator(int minArguments, int maxArguments,
> Predicate<MajorType> predicate, boolean allSame) {
> super();
> this.argumentCount = Ranges.closedOpen(minArguments, maxArguments);
> this.predicate = predicate;
> @@ -79,21 +79,21 @@ public class ArgumentValidators {
> }
>
> @Override
> - public void validateArguments(String expr, List<LogicalExpression>
> expressions, ErrorCollector errors) {
> + public void validateArguments(ExpressionPosition expr,
> List<LogicalExpression> expressions, ErrorCollector errors) {
> int i = -1;
> - DataType t = null;
> + MajorType t = null;
> for (LogicalExpression le : expressions) {
> i++;
> - DataType dataType = le.getDataType();
> - if (t == null) t = dataType;
> + MajorType majorType = le.getMajorType();
> + if (t == null) t = majorType;
>
> - if (!predicate.apply(dataType)) {
> - errors.addUnexpectedType(expr, i, dataType);
> + if (!predicate.apply(majorType)) {
> + errors.addUnexpectedType(expr, i, majorType);
> continue;
> }
>
> - if (allSame && t != DataType.LATEBIND && dataType !=
> DataType.LATEBIND && t != dataType) {
> - errors.addUnexpectedType(expr, i, dataType);
> + if (allSame && !Types.isLateBind(t) &&
> !Types.isLateBind(majorType) && !Types.softEquals(t, majorType, true)) {
> + errors.addUnexpectedType(expr, i, majorType);
> }
>
> }
> @@ -109,50 +109,50 @@ public class ArgumentValidators {
>
> public static class ComparableArguments extends PredicateValidator {
>
> - public ComparableArguments(int argCount, DataType... allowedTypes) {
> + public ComparableArguments(int argCount, MajorType... allowedTypes) {
> super(argCount, new ComparableChecker(), true);
> }
>
> - public ComparableArguments(int minArguments, int maxArguments,
> DataType... allowedTypes) {
> + public ComparableArguments(int minArguments, int maxArguments,
> MajorType... allowedTypes) {
> super(minArguments, maxArguments, new ComparableChecker(), true);
> }
>
> - public static class ComparableChecker implements Predicate<DataType> {
> + public static class ComparableChecker implements Predicate<MajorType>
> {
>
> - public boolean apply(DataType dt) {
> - Comparability comparability = dt.getComparability();
> - return comparability.equals(Comparability.ORDERED) ||
> comparability.equals(Comparability.UNKNOWN);
> + public boolean apply(MajorType dt) {
> + Types.Comparability comparability = Types.getComparability(dt);
> + return comparability.equals(Types.Comparability.ORDERED) ||
> comparability.equals(Types.Comparability.UNKNOWN);
> }
> }
> }
>
> public static class AllowedTypeList extends PredicateValidator {
>
> - public AllowedTypeList(int argCount, DataType... allowedTypes) {
> + public AllowedTypeList(int argCount, MajorType... allowedTypes) {
> super(argCount, new AllowedTypeChecker(allowedTypes), false);
> }
>
> - public AllowedTypeList(int minArguments, int maxArguments,
> DataType... allowedTypes) {
> + public AllowedTypeList(int minArguments, int maxArguments,
> MajorType... allowedTypes) {
> super(minArguments, maxArguments, new
> AllowedTypeChecker(allowedTypes), false);
> }
>
> - public AllowedTypeList(int argCount, boolean allSame, DataType...
> allowedTypes) {
> + public AllowedTypeList(int argCount, boolean allSame, MajorType...
> allowedTypes) {
> super(argCount, new AllowedTypeChecker(allowedTypes), allSame);
> }
>
> - public AllowedTypeList(int minArguments, int maxArguments, boolean
> allSame, DataType... allowedTypes) {
> + public AllowedTypeList(int minArguments, int maxArguments, boolean
> allSame, MajorType... allowedTypes) {
> super(minArguments, maxArguments, new
> AllowedTypeChecker(allowedTypes), allSame);
> }
>
> - public static class AllowedTypeChecker implements Predicate<DataType>
> {
> + public static class AllowedTypeChecker implements
> Predicate<MajorType> {
>
> - private DataType[] allowedTypes;
> + private MajorType[] allowedTypes;
>
> - public AllowedTypeChecker(DataType... allowedTypes) {
> + public AllowedTypeChecker(MajorType... allowedTypes) {
> this.allowedTypes = allowedTypes;
> }
>
> - public boolean apply(DataType dt) {
> + public boolean apply(MajorType dt) {
> return ArrayUtils.contains(allowedTypes, dt);
> }
> }
> @@ -170,10 +170,10 @@ public class ArgumentValidators {
> super(minArguments, maxArguments, new NumericTypeChecker(),
> allSame);
> }
>
> - public static class NumericTypeChecker implements Predicate<DataType>
> {
> + public static class NumericTypeChecker implements
> Predicate<MajorType> {
>
> - public boolean apply(DataType dt) {
> - return dt.isNumericType();
> + public boolean apply(MajorType dt) {
> + return Types.isNumericType(dt);
> }
> }
>
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/BasicArgumentValidator.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/BasicArgumentValidator.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/BasicArgumentValidator.java
> index eed49d3..26b7cf6 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/BasicArgumentValidator.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/BasicArgumentValidator.java
> @@ -19,13 +19,13 @@ package org.apache.drill.common.expression;
>
> import java.util.List;
>
> -import org.apache.drill.common.expression.types.DataType;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
>
> public class BasicArgumentValidator implements ArgumentValidator {
>
> private final Arg[] args;
>
> - public BasicArgumentValidator(DataType... types) {
> + public BasicArgumentValidator(MajorType... types) {
> this.args = new Arg[] { new Arg("single", types) };
> }
>
> @@ -34,7 +34,7 @@ public class BasicArgumentValidator implements
> ArgumentValidator {
> }
>
> @Override
> - public void validateArguments(String expr, List<LogicalExpression>
> expressions, ErrorCollector errors) {
> + public void validateArguments(ExpressionPosition expr,
> List<LogicalExpression> expressions, ErrorCollector errors) {
> if (expressions.size() != args.length)
> errors.addUnexpectedArgumentCount(expr, expressions.size(), args.length);
>
> int i = 0;
> @@ -45,7 +45,7 @@ public class BasicArgumentValidator implements
> ArgumentValidator {
> }
> }
>
> - public Arg arg(String name, DataType... allowedTypes) {
> + public Arg arg(String name, MajorType... allowedTypes) {
> return new Arg(name, allowedTypes);
> }
>
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollector.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollector.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollector.java
> index 21ecec4..b322345 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollector.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollector.java
> @@ -17,27 +17,29 @@
>
> ******************************************************************************/
> package org.apache.drill.common.expression;
>
> -import org.apache.drill.common.expression.types.DataType;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
>
> import com.google.common.collect.Range;
>
> public interface ErrorCollector {
>
> - public void addGeneralError(String expr, String s);
> + public void addGeneralError(ExpressionPosition expr, String s);
>
> - public void addUnexpectedArgumentType(String expr, String name,
> DataType actual, DataType[] expected, int argumentIndex);
> + public void addUnexpectedArgumentType(ExpressionPosition expr, String
> name, MajorType actual, MajorType[] expected, int argumentIndex);
>
> - public void addUnexpectedArgumentCount(String expr, int actual,
> Range<Integer> expected);
> + public void addUnexpectedArgumentCount(ExpressionPosition expr, int
> actual, Range<Integer> expected);
>
> - public void addUnexpectedArgumentCount(String expr, int actual, int
> expected);
> + public void addUnexpectedArgumentCount(ExpressionPosition expr, int
> actual, int expected);
>
> - public void addNonNumericType(String expr, DataType actual);
> + public void addNonNumericType(ExpressionPosition expr, MajorType
> actual);
>
> - public void addUnexpectedType(String expr, int index, DataType
> actual);
> + public void addUnexpectedType(ExpressionPosition expr, int index,
> MajorType actual);
>
> - public void addExpectedConstantValue(String expr, int actual, String
> s);
> + public void addExpectedConstantValue(ExpressionPosition expr, int
> actual, String s);
>
> boolean hasErrors();
> +
> + public int getErrorCount();
>
> String toErrorString();
> }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollectorImpl.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollectorImpl.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollectorImpl.java
> index cc90b82..054e067 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollectorImpl.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ErrorCollectorImpl.java
> @@ -1,12 +1,13 @@
> package org.apache.drill.common.expression;
>
> +import java.util.Arrays;
> +import java.util.List;
> +
> +import org.apache.drill.common.types.TypeProtos.MajorType;
> +
> import com.google.common.base.Joiner;
> import com.google.common.collect.Lists;
> import com.google.common.collect.Range;
> -import org.apache.drill.common.expression.types.DataType;
> -
> -import java.util.Arrays;
> -import java.util.List;
>
> public class ErrorCollectorImpl implements ErrorCollector {
> List<ExpressionValidationError> errors;
> @@ -15,17 +16,17 @@ public class ErrorCollectorImpl implements
> ErrorCollector {
> errors = Lists.newArrayList();
> }
>
> - private String addExpr(String expr, String message) {
> - return "Expression: [" + expr + "]. Error: " + message;
> + private String addExpr(ExpressionPosition expr, String message) {
> + return String.format("Error in expression at index %d. Error:
> %s. Full expression: %s.", expr.getCharIndex(), message,
> expr.getExpression());
> }
>
> @Override
> - public void addGeneralError(String expr, String s) {
> + public void addGeneralError(ExpressionPosition expr, String s) {
> errors.add(new ExpressionValidationError(addExpr(expr, s)));
> }
>
> @Override
> - public void addUnexpectedArgumentType(String expr, String name,
> DataType actual, DataType[] expected, int argumentIndex) {
> + public void addUnexpectedArgumentType(ExpressionPosition expr, String
> name, MajorType actual, MajorType[] expected, int argumentIndex) {
> errors.add(
> new ExpressionValidationError(
> addExpr(expr, String.format(
> @@ -37,35 +38,35 @@ public class ErrorCollectorImpl implements
> ErrorCollector {
> }
>
> @Override
> - public void addUnexpectedArgumentCount(String expr, int actual,
> Range<Integer> expected) {
> + public void addUnexpectedArgumentCount(ExpressionPosition expr, int
> actual, Range<Integer> expected) {
> errors.add(new ExpressionValidationError(
> addExpr(expr, String.format("Unexpected argument count.
> Actual argument count: %d, Expected range: %s", actual, expected))
> ));
> }
>
> @Override
> - public void addUnexpectedArgumentCount(String expr, int actual, int
> expected) {
> + public void addUnexpectedArgumentCount(ExpressionPosition expr, int
> actual, int expected) {
> errors.add(new ExpressionValidationError(
> addExpr(expr, String.format("Unexpected argument count.
> Actual argument count: %d, Expected count: %d", actual, expected))
> ));
> }
>
> @Override
> - public void addNonNumericType(String expr, DataType actual) {
> + public void addNonNumericType(ExpressionPosition expr, MajorType
> actual) {
> errors.add(new ExpressionValidationError(
> addExpr(expr, String.format("Unexpected numeric type.
> Actual type: %s", actual))
> ));
> }
>
> @Override
> - public void addUnexpectedType(String expr, int index, DataType
> actual) {
> + public void addUnexpectedType(ExpressionPosition expr, int index,
> MajorType actual) {
> errors.add(new ExpressionValidationError(
> addExpr(expr, String.format("Unexpected argument type.
> Actual type: %s, Index: %d", actual, index))
> ));
> }
>
> @Override
> - public void addExpectedConstantValue(String expr, int actual, String
> s) {
> + public void addExpectedConstantValue(ExpressionPosition expr, int
> actual, String s) {
> errors.add(new ExpressionValidationError(
> addExpr(expr, String.format("Unexpected constant value.
> Name: %s, Actual: %s", s, actual))
> ));
> @@ -76,8 +77,21 @@ public class ErrorCollectorImpl implements
> ErrorCollector {
> return !errors.isEmpty();
> }
>
> +
> + @Override
> + public int getErrorCount() {
> + return errors.size();
> + }
> +
> @Override
> public String toErrorString() {
> return "\n" + Joiner.on("\n").join(errors);
> }
> +
> + @Override
> + public String toString() {
> + return toErrorString();
> + }
> +
> +
> }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionPosition.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionPosition.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionPosition.java
> new file mode 100644
> index 0000000..2e8b529
> --- /dev/null
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionPosition.java
> @@ -0,0 +1,27 @@
> +package org.apache.drill.common.expression;
> +
> +public class ExpressionPosition {
> + static final org.slf4j.Logger logger =
> org.slf4j.LoggerFactory.getLogger(ExpressionPosition.class);
> +
> + public static final ExpressionPosition UNKNOWN = new
> ExpressionPosition("--UNKNOWN EXPRESSION--", -1);
> +
> + private final String expression;
> + private final int charIndex;
> +
> + public ExpressionPosition(String expression, int charIndex) {
> + super();
> + this.expression = expression;
> + this.charIndex = charIndex;
> + }
> +
> + public String getExpression() {
> + return expression;
> + }
> +
> + public int getCharIndex() {
> + return charIndex;
> + }
> +
> +
> +
> +}
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionStringBuilder.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionStringBuilder.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionStringBuilder.java
> new file mode 100644
> index 0000000..09a7d57
> --- /dev/null
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionStringBuilder.java
> @@ -0,0 +1,102 @@
> +package org.apache.drill.common.expression;
> +
> +import org.apache.drill.common.expression.IfExpression.IfCondition;
> +import
> org.apache.drill.common.expression.ValueExpressions.BooleanExpression;
> +import
> org.apache.drill.common.expression.ValueExpressions.DoubleExpression;
> +import org.apache.drill.common.expression.ValueExpressions.LongExpression;
> +import org.apache.drill.common.expression.ValueExpressions.QuotedString;
> +import org.apache.drill.common.expression.visitors.AbstractExprVisitor;
> +
> +import com.google.common.collect.ImmutableList;
> +
> +public class ExpressionStringBuilder extends AbstractExprVisitor<Void,
> StringBuilder, RuntimeException>{
> + static final org.slf4j.Logger logger =
> org.slf4j.LoggerFactory.getLogger(ExpressionStringBuilder.class);
> +
> + @Override
> + public Void visitFunctionCall(FunctionCall call, StringBuilder sb)
> throws RuntimeException {
> + FunctionDefinition func = call.getDefinition();
> + ImmutableList<LogicalExpression> args = call.args;
> + if (func.isOperator()) {
> + if (args.size() == 1) { // unary
> + func.addRegisteredName(sb);
> + sb.append("(");
> + args.get(0).accept(this, sb);
> + sb.append(")");
> + } else {
> + for (int i = 0; i < args.size(); i++) {
> + if (i != 0) {
> + sb.append(" ");
> + func.addRegisteredName(sb);
> + }
> + sb.append(" (");
> + args.get(i).accept(this, sb);
> + sb.append(") ");
> + }
> + }
> + } else { // normal function
> +
> + func.addRegisteredName(sb);
> + sb.append("(");
> + for (int i = 0; i < args.size(); i++) {
> + if (i != 0) sb.append(", ");
> + args.get(i).accept(this, sb);
> + }
> + sb.append(") ");
> + }
> + return null;
> + }
> +
> + @Override
> + public Void visitIfExpression(IfExpression ifExpr, StringBuilder sb)
> throws RuntimeException {
> + ImmutableList<IfCondition> conditions = ifExpr.conditions;
> + sb.append(" ( ");
> + for(int i =0; i < conditions.size(); i++){
> + IfCondition c = conditions.get(i);
> + if(i !=0) sb.append(" else ");
> + sb.append("if (");
> + c.condition.accept(this, sb);
> + sb.append(" ) then (");
> + c.expression.accept(this, sb);
> + sb.append(" ) ");
> + }
> + sb.append(" end ");
> + sb.append(" ) ");
> + return null;
> + }
> +
> + @Override
> + public Void visitSchemaPath(SchemaPath path, StringBuilder sb) throws
> RuntimeException {
> + sb.append("'");
> + sb.append(path.getPath());
> + sb.append("'");
> + return null;
> + }
> +
> + @Override
> + public Void visitLongConstant(LongExpression lExpr, StringBuilder sb)
> throws RuntimeException {
> + sb.append(lExpr.getLong());
> + return null;
> + }
> +
> + @Override
> + public Void visitDoubleConstant(DoubleExpression dExpr, StringBuilder
> sb) throws RuntimeException {
> + sb.append(dExpr.getDouble());
> + return null;
> + }
> +
> + @Override
> + public Void visitBooleanConstant(BooleanExpression e, StringBuilder sb)
> throws RuntimeException {
> + sb.append(e.getBoolean());
> + return null;
> + }
> +
> + @Override
> + public Void visitQuotedStringConstant(QuotedString e, StringBuilder sb)
> throws RuntimeException {
> + sb.append("\"");
> + sb.append(e.value);
> + sb.append("\"");
> + return null;
> + }
> +
> +
> +}
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionValidator.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionValidator.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionValidator.java
> new file mode 100644
> index 0000000..98a9075
> --- /dev/null
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/ExpressionValidator.java
> @@ -0,0 +1,86 @@
> +package org.apache.drill.common.expression;
> +
> +import org.apache.drill.common.expression.IfExpression.IfCondition;
> +import
> org.apache.drill.common.expression.ValueExpressions.BooleanExpression;
> +import
> org.apache.drill.common.expression.ValueExpressions.DoubleExpression;
> +import org.apache.drill.common.expression.ValueExpressions.LongExpression;
> +import org.apache.drill.common.expression.ValueExpressions.QuotedString;
> +import org.apache.drill.common.expression.visitors.ExprVisitor;
> +import org.apache.drill.common.types.TypeProtos.DataMode;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
> +import org.apache.drill.common.types.TypeProtos.MinorType;
> +
> +public class ExpressionValidator implements ExprVisitor<Void,
> ErrorCollector, RuntimeException> {
> + static final org.slf4j.Logger logger =
> org.slf4j.LoggerFactory.getLogger(ExpressionValidator.class);
> +
> + @Override
> + public Void visitFunctionCall(FunctionCall call, ErrorCollector errors)
> throws RuntimeException {
> + call.getDefinition().getArgumentValidator()
> + .validateArguments(call.getPosition(), call.args, errors);
> + return null;
> + }
> +
> + @Override
> + public Void visitIfExpression(IfExpression ifExpr, ErrorCollector
> errors) throws RuntimeException {
> + // confirm that all conditions are required boolean values.
> + int i = 0;
> + for (IfCondition c : ifExpr.conditions) {
> + MajorType mt = c.condition.getMajorType();
> + if (mt.getMode() != DataMode.REQUIRED || mt.getMinorType() !=
> MinorType.BOOLEAN){
> + errors.addGeneralError(c.condition.getPosition(),String.format(
> + "Failure composing If Expression. All conditions
> must return a required value and be of type boolean. Condition %d was
> DatMode %s and Type %s.",
> + i, mt.getMode(), mt.getMinorType()));
> + }
> + i++;
> + }
> +
> + // confirm that all outcomes are the same type.
> + final MajorType mt = ifExpr.elseExpression.getMajorType();
> + i = 0;
> + for (IfCondition c : ifExpr.conditions) {
> + MajorType innerT = c.expression.getMajorType();
> + if (
> + (innerT.getMode() == DataMode.REPEATED && mt.getMode() !=
> DataMode.REPEATED) || //
> + (innerT.getMinorType() != mt.getMinorType())
> + ) {
> + errors.addGeneralError(c.condition.getPosition(),String.format(
> + "Failure composing If Expression. All expressions must
> return the same MajorType as the else expression. The %d if condition
> returned type type %s but the else expression was of type %s",
> + i, innerT, mt));
> + }
> + i++;
> + }
> + return null;
> + }
> +
> + @Override
> + public Void visitSchemaPath(SchemaPath path, ErrorCollector errors)
> throws RuntimeException {
> + return null;
> + }
> +
> + @Override
> + public Void visitLongConstant(LongExpression intExpr, ErrorCollector
> errors) throws RuntimeException {
> + return null;
> + }
> +
> + @Override
> + public Void visitDoubleConstant(DoubleExpression dExpr, ErrorCollector
> errors) throws RuntimeException {
> + return null;
> + }
> +
> + @Override
> + public Void visitBooleanConstant(BooleanExpression e, ErrorCollector
> errors) throws RuntimeException {
> + return null;
> + }
> +
> + @Override
> + public Void visitQuotedStringConstant(QuotedString e, ErrorCollector
> errors) throws RuntimeException {
> + return null;
> + }
> +
> + @Override
> + public Void visitUnknown(LogicalExpression e, ErrorCollector value)
> throws RuntimeException {
> + return null;
> + }
> +
> +
> +}
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FieldReference.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FieldReference.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FieldReference.java
> index 94800ba..f611614 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FieldReference.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FieldReference.java
> @@ -21,6 +21,7 @@ import java.io.IOException;
>
> import org.apache.drill.common.expression.FieldReference.De;
> import org.apache.drill.common.expression.FieldReference.Se;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
>
> import com.fasterxml.jackson.core.JsonGenerationException;
> import com.fasterxml.jackson.core.JsonGenerator;
> @@ -32,26 +33,25 @@ import
> com.fasterxml.jackson.databind.annotation.JsonDeserialize;
> import com.fasterxml.jackson.databind.annotation.JsonSerialize;
> import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
> import com.fasterxml.jackson.databind.ser.std.StdSerializer;
> -import org.apache.drill.common.expression.types.DataType;
>
> @JsonSerialize(using = Se.class)
> @JsonDeserialize(using = De.class)
> public class FieldReference extends SchemaPath {
> - DataType overrideType;
> + MajorType overrideType;
>
> - public FieldReference(String value) {
> - super(value);
> + public FieldReference(String value, ExpressionPosition pos) {
> + super(value, pos);
> }
>
> - public FieldReference(String value, DataType dataType) {
> - super(value);
> + public FieldReference(String value, ExpressionPosition pos, MajorType
> dataType) {
> + super(value, pos);
> this.overrideType = dataType;
> }
>
> @Override
> - public DataType getDataType() {
> + public MajorType getMajorType() {
> if(overrideType == null) {
> - return super.getDataType();
> + return super.getMajorType();
> } else {
> return overrideType;
> }
> @@ -66,7 +66,7 @@ public class FieldReference extends SchemaPath {
> @Override
> public FieldReference deserialize(JsonParser jp,
> DeserializationContext ctxt) throws IOException,
> JsonProcessingException {
> - return new FieldReference(this._parseString(jp, ctxt));
> + return new FieldReference(this._parseString(jp, ctxt),
> ExpressionPosition.UNKNOWN);
> }
>
> }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionBase.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionBase.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionBase.java
> deleted file mode 100644
> index fd8ae18..0000000
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionBase.java
> +++ /dev/null
> @@ -1,94 +0,0 @@
>
> -/*******************************************************************************
> - * 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.drill.common.expression;
> -
> -import java.util.Iterator;
> -import java.util.List;
> -
> -import org.apache.drill.common.expression.types.DataType;
> -import org.apache.drill.common.expression.visitors.ExprVisitor;
> -
> -import com.fasterxml.jackson.annotation.JsonIgnore;
> -import com.google.common.collect.ImmutableList;
> -
> -
> -public abstract class FunctionBase extends LogicalExpressionBase
> implements Iterable<LogicalExpression>{
> - public final ImmutableList<LogicalExpression> expressions;
> -
> -
> - protected void funcToString(StringBuilder sb, String functionName) {
> - sb.append(" ");
> - sb.append(functionName);
> - sb.append("( ");
> - for(int i= 0; i < expressions.size(); i++){
> - if(i != 0) sb.append(", ");
> - expressions.get(i).addToString(sb);
> - }
> - sb.append(" ) ");
> - }
> -
> - protected void opToString(StringBuilder sb, String operator) {
> - sb.append(" ( ");
> - expressions.get(0).addToString(sb);
> - for(int i =1; i < expressions.size(); i++){
> - sb.append(operator);
> - expressions.get(i).addToString(sb);
> - }
> - sb.append(" ) ");
> - }
> -
> - public FunctionBase(List<LogicalExpression> expressions){
> - if( !(expressions instanceof ImmutableList)){
> - expressions = ImmutableList.copyOf(expressions);
> - }
> - this.expressions = (ImmutableList<LogicalExpression>)
> expressions;
> - }
> -
> -// public static DataType getJointType(String parentName,
> LogicalExpression expr1, LogicalExpression expr2) throws
> ExpressionValidationException{
> -// DataType dt =
> DataType.getCombinedCast(expr1.getDataType(), expr2.getDataType());
> -// if(dt == null) throw new ExpressionValidationException();
> -//
> -// return dt;
> -// }
> -//
> -// public LogicalExpression wrapWithCastIfNecessary(DataType dt)
> throws ExpressionValidationException{
> -// if(this.getDataType() != dt) return new Cast(this, dt);
> -// return this;
> -// }
> -
> -
> -
> -
> - @Override
> - public Iterator<LogicalExpression> iterator() {
> - return expressions.iterator();
> - }
> -
> - @Override
> - @JsonIgnore
> - public DataType getDataType() {
> - throw new UnsupportedOperationException();
> - }
> -
> -
> -
> -
> -
> -
> -
> -}
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionCall.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionCall.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionCall.java
> index ee76a5c..e13e87e 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionCall.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionCall.java
> @@ -20,26 +20,34 @@ package org.apache.drill.common.expression;
> import java.util.Iterator;
> import java.util.List;
>
> -import org.apache.drill.common.expression.types.DataType;
> import org.apache.drill.common.expression.visitors.ExprVisitor;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
>
> import com.google.common.collect.ImmutableList;
>
> public class FunctionCall extends LogicalExpressionBase implements
> Iterable<LogicalExpression> {
> private final FunctionDefinition func;
> public final ImmutableList<LogicalExpression> args;
> + private final ExpressionPosition pos;
>
> - public FunctionCall(FunctionDefinition func, List<LogicalExpression>
> args) {
> + public FunctionCall(FunctionDefinition func, List<LogicalExpression>
> args, ExpressionPosition pos) {
> + super(pos);
> this.func = func;
> if (!(args instanceof ImmutableList)) {
> args = ImmutableList.copyOf(args);
> }
> this.args = (ImmutableList<LogicalExpression>) args;
> + this.pos = pos;
> }
>
> @Override
> - public <T> T accept(ExprVisitor<T> visitor) {
> - return visitor.visitFunctionCall(this);
> + public ExpressionPosition getPosition() {
> + return pos;
> + }
> +
> + @Override
> + public <T, V, E extends Exception> T accept(ExprVisitor<T, V, E>
> visitor, V value) throws E{
> + return visitor.visitFunctionCall(this, value);
> }
>
> @Override
> @@ -52,43 +60,16 @@ public class FunctionCall extends
> LogicalExpressionBase implements Iterable<Logi
> }
>
> @Override
> - public DataType getDataType() {
> + public MajorType getMajorType() {
> return func.getDataType(this.args);
> }
>
> @Override
> - public void addToString(StringBuilder sb) {
> - if (func.isOperator()) {
> - if (args.size() == 1) { // unary
> - func.addRegisteredName(sb);
> - sb.append("(");
> - args.get(0).addToString(sb);
> - sb.append(")");
> - } else {
> - for (int i = 0; i < args.size(); i++) {
> - if (i != 0) {
> - sb.append(" ");
> - func.addRegisteredName(sb);
> - }
> - sb.append(" (");
> - args.get(i).addToString(sb);
> - sb.append(") ");
> - }
> - }
> - } else { // normal function
> -
> - func.addRegisteredName(sb);
> - sb.append("(");
> - for (int i = 0; i < args.size(); i++) {
> - if (i != 0) sb.append(", ");
> - args.get(i).addToString(sb);
> - }
> - sb.append(") ");
> - }
> + public String toString() {
> + final int maxLen = 10;
> + return "FunctionCall [func=" + func + ", args="
> + + (args != null ? args.subList(0, Math.min(args.size(), maxLen))
> : null) + ", pos=" + pos + "]";
> }
>
> - @Override
> - public void resolveAndValidate(String expr, ErrorCollector errors) {
> - func.getArgumentValidator().validateArguments(expr, args, errors);
> - }
> +
> }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java
> index 9d21763..4cbab6a 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java
> @@ -21,7 +21,7 @@ import java.util.Arrays;
> import java.util.List;
>
> import org.apache.commons.lang3.ArrayUtils;
> -import org.apache.drill.common.expression.types.DataType;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
>
> public class FunctionDefinition {
>
> @@ -42,7 +42,7 @@ public class FunctionDefinition {
> this.isOperator = isOperator;
> }
>
> - public DataType getDataType(List<LogicalExpression> args){
> + public MajorType getDataType(List<LogicalExpression> args){
> return outputType.getOutputType(args);
> }
>
> @@ -82,8 +82,8 @@ public class FunctionDefinition {
> return this.name;
> }
>
> - public FunctionCall newCall(List<LogicalExpression> args){
> - return new FunctionCall(this, args);
> + public FunctionCall newCall(List<LogicalExpression> args,
> ExpressionPosition pos){
> + return new FunctionCall(this, args, pos);
> }
>
> public void addRegisteredName(StringBuilder sb){
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionRegistry.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionRegistry.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionRegistry.java
> index c22e448..ed2c63e 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionRegistry.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/FunctionRegistry.java
> @@ -57,17 +57,18 @@ public class FunctionRegistry {
> }
> }
>
> - public LogicalExpression createExpression(String functionName,
> List<LogicalExpression> args){
> +
> + public LogicalExpression createExpression(String functionName,
> ExpressionPosition ep, List<LogicalExpression> args){
> FunctionDefinition d = funcMap.get(functionName);
> if(d == null) throw new
> ExpressionParsingException(String.format("Unable to find function
> definition for function named '%s'", functionName));
> - return d.newCall(args);
> + return d.newCall(args, ep);
> }
>
> - public LogicalExpression createExpression(String unaryName,
> LogicalExpression... e){
> - return funcMap.get(unaryName).newCall(Lists.newArrayList(e));
> + public LogicalExpression createExpression(String unaryName,
> ExpressionPosition ep, LogicalExpression... e){
> + return funcMap.get(unaryName).newCall(Lists.newArrayList(e), ep);
> }
>
> - public LogicalExpression createByOp(List<LogicalExpression> args,
> List<String> opTypes) {
> + public LogicalExpression createByOp(List<LogicalExpression> args,
> ExpressionPosition ep, List<String> opTypes) {
> // logger.debug("Generating new comparison expressions.");
> if (args.size() == 1) {
> return args.get(0);
> @@ -81,7 +82,7 @@ public class FunctionRegistry {
> List<LogicalExpression> l2 = new ArrayList<LogicalExpression>();
> l2.add(first);
> l2.add(args.get(i + 1));
> - first = createExpression(opTypes.get(i), args);
> + first = createExpression(opTypes.get(i), ep, args);
> }
> return first;
> }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/IfExpression.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/IfExpression.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/IfExpression.java
> index a553f4c..6f2e4a8 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/IfExpression.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/IfExpression.java
> @@ -21,11 +21,12 @@ import java.util.ArrayList;
> import java.util.List;
>
> import org.apache.drill.common.expression.IfExpression.IfCondition;
> -import org.apache.drill.common.expression.types.DataType;
> import org.apache.drill.common.expression.visitors.ExprVisitor;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
> import org.slf4j.Logger;
> import org.slf4j.LoggerFactory;
>
> +import com.google.common.base.Preconditions;
> import com.google.common.collect.ImmutableList;
> import com.google.common.collect.UnmodifiableIterator;
>
> @@ -35,7 +36,8 @@ public class IfExpression extends LogicalExpressionBase
> implements Iterable<IfCo
> public final ImmutableList<IfCondition> conditions;
> public final LogicalExpression elseExpression;
>
> - private IfExpression(List<IfCondition> conditions,
> LogicalExpression elseExpression){
> + private IfExpression(ExpressionPosition pos, List<IfCondition>
> conditions, LogicalExpression elseExpression){
> + super(pos);
> this.conditions = ImmutableList.copyOf(conditions);
> this.elseExpression = elseExpression;
> }
> @@ -53,28 +55,32 @@ public class IfExpression extends
> LogicalExpressionBase implements Iterable<IfCo
>
> }
>
> -
> @Override
> - public <T> T accept(ExprVisitor<T> visitor) {
> - return visitor.visitIfExpression(this);
> + public <T, V, E extends Exception> T accept(ExprVisitor<T, V, E>
> visitor, V value) throws E{
> + return visitor.visitIfExpression(this, value);
> }
>
> -
> public static class Builder{
> List<IfCondition> conditions = new
> ArrayList<IfCondition>();
> private LogicalExpression elseExpression;
> + private ExpressionPosition pos =
> ExpressionPosition.UNKNOWN;
> +
> + public Builder setPosition(ExpressionPosition pos){
> + this.pos = pos;
> + return this;
> + }
>
> public Builder addCondition(IfCondition condition){
> conditions.add(condition);
> return this;
> }
>
> - public Builder addConditions(Iterable<IfCondition> conditions) {
> - for(IfCondition condition : conditions) {
> - addCondition(condition);
> - }
> - return this;
> - }
> + public Builder addConditions(Iterable<IfCondition> conditions) {
> + for (IfCondition condition : conditions) {
> + addCondition(condition);
> + }
> + return this;
> + }
>
> public Builder setElse(LogicalExpression elseExpression) {
> this.elseExpression = elseExpression;
> @@ -82,39 +88,20 @@ public class IfExpression extends
> LogicalExpressionBase implements Iterable<IfCo
> }
>
> public IfExpression build(){
> - return new IfExpression(conditions,
> elseExpression);
> + Preconditions.checkNotNull(pos);
> + Preconditions.checkNotNull(conditions);
> + Preconditions.checkNotNull(conditions);
> + return new IfExpression(pos, conditions,
> elseExpression);
> }
>
> }
>
> -
> - @Override
> - public DataType getDataType() {
> - return DataType.BOOLEAN;
> - }
> -
> - @Override
> - public void addToString(StringBuilder sb) {
> - sb.append(" ( ");
> - for(int i =0; i < conditions.size(); i++){
> - IfCondition c = conditions.get(i);
> - if(i !=0) sb.append(" else ");
> - sb.append("if (");
> - c.condition.addToString(sb);
> - sb.append(" ) then (");
> - c.expression.addToString(sb);
> - sb.append(" ) ");
> - }
> - sb.append(" end ");
> - sb.append(" ) ");
> + @Override
> + public MajorType getMajorType() {
> + return this.elseExpression.getMajorType();
> }
>
> - @Override
> - public void resolveAndValidate(String expr, ErrorCollector errors) {
> - }
> -
> -
> - public static Builder newBuilder(){
> + public static Builder newBuilder(){
> return new Builder();
> }
>
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpression.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpression.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpression.java
> index 3df33a0..165f409 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpression.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpression.java
> @@ -26,8 +26,8 @@ import org.apache.drill.common.config.DrillConfig;
> import org.apache.drill.common.expression.parser.ExprLexer;
> import org.apache.drill.common.expression.parser.ExprParser;
> import org.apache.drill.common.expression.parser.ExprParser.parse_return;
> -import org.apache.drill.common.expression.types.DataType;
> import org.apache.drill.common.expression.visitors.ExprVisitor;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
> import org.slf4j.Logger;
> import org.slf4j.LoggerFactory;
>
> @@ -44,65 +44,65 @@ import
> com.fasterxml.jackson.databind.ser.std.StdSerializer;
> //@JsonDeserialize(using = LogicalExpression.De.class) // Excluded as we
> need to register this with the DrillConfig.
> @JsonSerialize(using = LogicalExpression.Se.class)
> public interface LogicalExpression {
> - static final Logger logger =
> LoggerFactory.getLogger(LogicalExpression.class);
> + static final Logger logger =
> LoggerFactory.getLogger(LogicalExpression.class);
>
> - public abstract DataType getDataType();
> + public abstract MajorType getMajorType();
>
> - public void addToString(StringBuilder sb);
> + public <T, V, E extends Exception> T accept(ExprVisitor<T, V, E>
> visitor, V value) throws E;
>
> - public void resolveAndValidate(String expr, ErrorCollector errors);
> + public ExpressionPosition getPosition();
>
> - public <T> T accept(ExprVisitor<T> visitor);
> + public static class De extends StdDeserializer<LogicalExpression> {
> + DrillConfig config;
>
> - public static class De extends StdDeserializer<LogicalExpression> {
> - DrillConfig config;
> - ErrorCollector errorCollector;
> -
> - public De(DrillConfig config) {
> - super(LogicalExpression.class);
> - this.config = config;
> - this.errorCollector = config.getErrorCollector();
> - }
> -
> - @Override
> - public LogicalExpression deserialize(JsonParser jp,
> DeserializationContext ctxt) throws IOException,
> - JsonProcessingException {
> - String expr = jp.getText();
> -
> - if (expr == null || expr.isEmpty())
> - return null;
> - try {
> - // logger.debug("Parsing expression string '{}'", expr);
> - ExprLexer lexer = new ExprLexer(new
> ANTLRStringStream(expr));
> -
> - CommonTokenStream tokens = new CommonTokenStream(lexer);
> - ExprParser parser = new ExprParser(tokens);
> - parser.setRegistry(new FunctionRegistry(config));
> - parse_return ret = parser.parse();
> - // logger.debug("Found expression '{}'", ret.e);
> - ret.e.resolveAndValidate(expr, errorCollector);
> - return ret.e;
> - } catch (RecognitionException e) {
> - throw new RuntimeException(e);
> - }
> - }
> + public De(DrillConfig config) {
> + super(LogicalExpression.class);
> + this.config = config;
> + }
>
> + @Override
> + public LogicalExpression deserialize(JsonParser jp,
> DeserializationContext ctxt) throws IOException,
> + JsonProcessingException {
> + String expr = jp.getText();
> +
> + if (expr == null || expr.isEmpty())
> + return null;
> + try {
> + // logger.debug("Parsing expression string '{}'", expr);
> + ExprLexer lexer = new ExprLexer(new ANTLRStringStream(expr));
> + CommonTokenStream tokens = new CommonTokenStream(lexer);
> + ExprParser parser = new ExprParser(tokens);
> +
> + //TODO: move functionregistry and error collector to injectables.
> + //ctxt.findInjectableValue(valueId, forProperty, beanInstance)
> +
> + parser.setRegistry(new FunctionRegistry(config));
> + parse_return ret = parser.parse();
> +
> + // ret.e.resolveAndValidate(expr, errorCollector);
> + return ret.e;
> + } catch (RecognitionException e) {
> + throw new RuntimeException(e);
> + }
> }
>
> - public static class Se extends StdSerializer<LogicalExpression> {
> + }
>
> - protected Se() {
> - super(LogicalExpression.class);
> - }
> + public static class Se extends StdSerializer<LogicalExpression> {
>
> - @Override
> - public void serialize(LogicalExpression value, JsonGenerator
> jgen, SerializerProvider provider) throws IOException,
> - JsonGenerationException {
> - StringBuilder sb = new StringBuilder();
> - value.addToString(sb);
> - jgen.writeString(sb.toString());
> - }
> + protected Se() {
> + super(LogicalExpression.class);
> + }
>
> + @Override
> + public void serialize(LogicalExpression value, JsonGenerator jgen,
> SerializerProvider provider) throws IOException,
> + JsonGenerationException {
> + StringBuilder sb = new StringBuilder();
> + ExpressionStringBuilder esb = new ExpressionStringBuilder();
> + value.accept(esb, sb);
> + jgen.writeString(sb.toString());
> }
>
> + }
> +
> }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpressionBase.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpressionBase.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpressionBase.java
> index e973df7..aa8885f 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpressionBase.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/LogicalExpressionBase.java
> @@ -6,9 +6,9 @@
> * 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.
> @@ -17,40 +17,44 @@
>
> ******************************************************************************/
> package org.apache.drill.common.expression;
>
> -import org.apache.drill.common.expression.types.DataType;
> -import org.apache.drill.common.expression.visitors.ExprVisitor;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
>
> import com.fasterxml.jackson.annotation.JsonProperty;
> import com.fasterxml.jackson.annotation.JsonPropertyOrder;
>
>
> -@JsonPropertyOrder({"type"})
> -public abstract class LogicalExpressionBase implements LogicalExpression {
> +@JsonPropertyOrder({ "type" })
> +public abstract class LogicalExpressionBase implements LogicalExpression{
>
> + private final ExpressionPosition pos;
>
> -// public static DataType getJointType(String parentName,
> LogicalExpression expr1, LogicalExpression expr2) throws
> ExpressionValidationException{
> -// DataType dt =
> DataType.getCombinedCast(expr1.getDataType(), expr2.getDataType());
> -// if(dt == null) throw new ExpressionValidationException();
> -//
> -// return dt;
> -// }
> + protected LogicalExpressionBase(ExpressionPosition pos) {
> + super();
> + this.pos = pos;
> + }
>
> + @Override
> + public ExpressionPosition getPosition() {
> + return pos;
> + }
>
> - protected void i(StringBuilder sb, int indent) {
> - for (int i = 0; i < indent; i++) {
> - sb.append(" ");
> - }
> - }
> + protected void i(StringBuilder sb, int indent){
> + for(int i = 0; i < indent; i++){
> + sb.append(" ");
> + }
> + }
> +
> + @Override
> + public MajorType getMajorType() {
> + throw new UnsupportedOperationException(String.format("The
> type of %s doesn't currently support LogicalExpression.getDataType().",
> this.getClass().getCanonicalName()));
> + }
>
> -// @Override
> -// public <T> T accept(ExprVisitor<T> visitor) {
> -// return visitor.visit(this);
> -// }
> -
> - @JsonProperty("type")
> - public String getDescription() {
> - return this.getClass().getSimpleName();
> - }
> + @JsonProperty("type")
> + public String getDescription(){
> + return this.getClass().getSimpleName();
> + }
> +
>
> +
>
> }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/OutputTypeDeterminer.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/OutputTypeDeterminer.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/OutputTypeDeterminer.java
> index 67402e2..0bec184 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/OutputTypeDeterminer.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/OutputTypeDeterminer.java
> @@ -19,37 +19,51 @@ package org.apache.drill.common.expression;
>
> import java.util.List;
>
> -import org.apache.drill.common.expression.types.DataType;
> +import org.apache.drill.common.types.TypeProtos.DataMode;
> +import org.apache.drill.common.types.TypeProtos.MajorType;
> +import org.apache.drill.common.types.TypeProtos.MinorType;
>
> public interface OutputTypeDeterminer {
>
> - public static OutputTypeDeterminer FIXED_BOOLEAN = new
> FixedType(DataType.BOOLEAN);
> + public static OutputTypeDeterminer FIXED_BOOLEAN = new
> FixedType(MajorType.newBuilder().setMinorType(MinorType.BOOLEAN).setMode(DataMode.REQUIRED).build());
>
> - public DataType getOutputType(List<LogicalExpression> expressions);
> + public MajorType getOutputType(List<LogicalExpression> expressions);
>
>
> public static class FixedType implements OutputTypeDeterminer{
> - public DataType outputType;
> + public MajorType outputType;
>
>
> - public FixedType(DataType outputType) {
> + public FixedType(MajorType outputType) {
> super();
> this.outputType = outputType;
> }
>
>
> @Override
> - public DataType getOutputType(List<LogicalExpression> expressions) {
> - return null;
> + public MajorType getOutputType(List<LogicalExpression> expressions) {
> + return outputType;
> }
>
> }
>
> public static class SameAsFirstInput implements OutputTypeDeterminer{
> -
> @Override
> - public DataType getOutputType(List<LogicalExpression> expressions) {
> - return expressions.get(0).getDataType();
> + public MajorType getOutputType(List<LogicalExpression> expressions) {
> + return expressions.get(0).getMajorType();
> + }
> + }
> +
> + public static class SameAsAnySoft implements OutputTypeDeterminer{
> + @Override
> + public MajorType getOutputType(List<LogicalExpression> expressions) {
> + for(LogicalExpression e : expressions){
> + if(e.getMajorType().getMode() == DataMode.OPTIONAL){
> + return e.getMajorType();
> + }
> + }
> + return expressions.get(0).getMajorType();
> }
> }
> +
> }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ce0da88d/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/PathSegment.java
> ----------------------------------------------------------------------
> diff --git
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/PathSegment.java
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/PathSegment.java
> index c06426e..554c0ca 100644
> ---
> a/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/PathSegment.java
> +++
> b/sandbox/prototype/common/src/main/java/org/apache/drill/common/expression/PathSegment.java
> @@ -98,6 +98,32 @@ public abstract class PathSegment{
> return "NameSegment [path=" + path + ", getCollisionBehavior()=" +
> getCollisionBehavior() + ", getChild()="
> + getChild() + "]";
> }
> +
> + @Override
> + public int hashCode() {
> + final int prime = 31;
> + int result = 1;
> + result = prime * result + ((path == null) ? 0 : path.hashCode());
> + return result;
> + }
> +
> + @Override
> + public boolean equals(Object obj) {
> + if (this == obj)
> + return true;
> + if (obj == null)
> + return false;
> + if (getClass() != obj.getClass())
> + return false;
> + NameSegment other = (NameSegment) obj;
> + if (path == null) {
> + if (other.path != null)
> + return false;
> + } else if (!path.equals(other.path))
> + return false;
> + return true;
> + }
> +
>
>
> }
>
>