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/06/19 20:13:01 UTC
git commit: Added Visitor for logical plan graph and accompanying
accept methods in each of the LogicalOperator classes. Created basic
optimizer for logical to physical plan coversion.
Updated Branches:
refs/heads/execwork 01278ae56 -> 1be6bd489
Added Visitor for logical plan graph and accompanying accept methods in each of the LogicalOperator classes. Created basic optimizer for logical to physical plan coversion.
Signed-off-by: Jacques Nadeau <ja...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/1be6bd48
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/1be6bd48
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/1be6bd48
Branch: refs/heads/execwork
Commit: 1be6bd489827aae45155e45bc23ee7179d140897
Parents: 01278ae
Author: Jason Altekruse <al...@gmial.com>
Authored: Thu Jun 13 16:39:51 2013 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Wed Jun 19 11:11:03 2013 -0700
----------------------------------------------------------------------
.gitignore | 1 +
.../org/apache/drill/common/JSONOptions.java | 17 ++-
.../apache/drill/common/graph/GraphAlgos.java | 20 ++-
.../drill/common/logical/LogicalPlan.java | 8 +-
.../logical/data/CollapsingAggregate.java | 14 ++
.../drill/common/logical/data/Filter.java | 14 ++
.../drill/common/logical/data/Flatten.java | 14 ++
.../apache/drill/common/logical/data/Join.java | 16 ++-
.../apache/drill/common/logical/data/Limit.java | 18 ++-
.../common/logical/data/LogicalOperator.java | 21 +--
.../logical/data/LogicalOperatorBase.java | 25 ++--
.../apache/drill/common/logical/data/Order.java | 17 ++-
.../drill/common/logical/data/Project.java | 15 +++
.../common/logical/data/RunningAggregate.java | 14 ++
.../apache/drill/common/logical/data/Scan.java | 19 ++-
.../drill/common/logical/data/Segment.java | 17 ++-
.../drill/common/logical/data/Sequence.java | 16 ++-
.../apache/drill/common/logical/data/Store.java | 18 ++-
.../drill/common/logical/data/Transform.java | 15 +++
.../apache/drill/common/logical/data/Union.java | 25 +++-
.../drill/common/logical/data/WindowFrame.java | 17 ++-
.../data/visitors/AbstractLogicalVisitor.java | 94 ++++++++++++++
.../logical/data/visitors/LogicalVisitor.java | 35 +++++
.../java/org/apache/drill/storage/Simple.java | 2 +-
.../common/src/test/resources/jdbc_plan.json | 33 +++++
.../apache/drill/exec/client/DrillClient.java | 2 +-
.../exec/exception/OptimizerException.java | 14 ++
.../apache/drill/exec/opt/BasicOptimizer.java | 127 +++++++++++++++++++
.../drill/exec/physical/base/AbstractStore.java | 2 +-
.../drill/exec/physical/config/Screen.java | 2 +-
.../apache/drill/exec/work/foreman/Foreman.java | 5 +-
.../exec/client/DrillClientSystemTest.java | 2 +
.../drill/exec/opt/BasicOptimizerTest.java | 24 ++++
.../impl/TestDistributedFragmentRun.java | 18 +++
.../physical/impl/TestSimpleFragmentRun.java | 92 +++++++-------
.../src/test/resources/scan_screen_logical.json | 46 +++++++
.../apache/drill/exec/ref/RecordPointer.java | 18 +++
37 files changed, 752 insertions(+), 105 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index 628a4e3..6bda406 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,4 +5,5 @@
.idea/
*.iml
target/
+*.DS_Store
*~
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/JSONOptions.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/JSONOptions.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/JSONOptions.java
index ad4926b..e309c60 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/JSONOptions.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/JSONOptions.java
@@ -18,7 +18,12 @@
package org.apache.drill.common;
import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import com.fasterxml.jackson.core.*;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.drill.common.JSONOptions.De;
import org.apache.drill.common.JSONOptions.Se;
import org.apache.drill.common.config.DrillConfig;
@@ -26,12 +31,6 @@ import org.apache.drill.common.exceptions.LogicalPlanParsingException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.fasterxml.jackson.core.JsonGenerationException;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.core.JsonLocation;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.TreeNode;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.SerializerProvider;
@@ -62,6 +61,12 @@ public class JSONOptions {
throw new LogicalPlanParsingException(String.format("Failure while trying to convert late bound json options to type of %s. Reference was originally located at line %d, column %d.", c.getCanonicalName(), location.getLineNr(), location.getColumnNr()), e);
}
}
+
+ public <T> T getListWith(DrillConfig config, TypeReference<T> t) throws IOException {
+ ObjectMapper mapper = config.getMapper();
+ return mapper.treeAsTokens(root).readValueAs(t);
+ // return mapper.treeToValue(root, mapper.getTypeFactory().constructCollectionType(List.class, c));
+ }
public JsonNode path(String name){
return root.path(name);
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/graph/GraphAlgos.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/graph/GraphAlgos.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/graph/GraphAlgos.java
index b83f1bd..692fd1b 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/graph/GraphAlgos.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/graph/GraphAlgos.java
@@ -32,10 +32,15 @@ public class GraphAlgos {
final List<AdjacencyList<V>.Node> sorted = new LinkedList<AdjacencyList<V>.Node>();
final AdjacencyList<V> rGraph;
- private TopoSorter(AdjacencyList<V> graph) {
+ private TopoSorter(AdjacencyList<V> graph, boolean reverse) {
graph.clearVisited();
- this.rGraph = graph.getReversedList();
+ if (reverse){
+ this.rGraph = graph.getReversedList();
+ }
+ else{
+ this.rGraph = graph;
+ }
Collection<AdjacencyList<V>.Node> sourceNodes = rGraph.getInternalRootNodes();
for (AdjacencyList<V>.Node n : sourceNodes) {
@@ -67,15 +72,20 @@ public class GraphAlgos {
* List of nodes that
* @return
*/
- static <V extends GraphValue<V>> List<AdjacencyList<V>.Node> sortInternal(AdjacencyList<V> graph) {
- TopoSorter<V> ts = new TopoSorter<V>(graph);
+ static <V extends GraphValue<V>> List<AdjacencyList<V>.Node> sortInternal(AdjacencyList<V> graph, boolean reverse) {
+ TopoSorter<V> ts = new TopoSorter<V>(graph, reverse);
return ts.sorted;
}
public static <V extends GraphValue<V>> List<V> sort(Graph<V, ?, ?> graph) {
AdjacencyList<V> l = graph.getAdjList();
- return l.convert(sortInternal(l));
+ return l.convert(sortInternal(l, true));
}
+
+ public static <V extends GraphValue<V>> List<V> sortLogical(Graph<V, ?, ?> graph) {
+ AdjacencyList<V> l = graph.getAdjList();
+ return l.convert(sortInternal(l, false));
+ }
}
static <V extends GraphValue<V>> List<List<AdjacencyList<V>.Node>> checkDirected(AdjacencyList<V> graph) {
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/LogicalPlan.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/LogicalPlan.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/LogicalPlan.java
index a2f2499..cf15f48 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/LogicalPlan.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/LogicalPlan.java
@@ -47,7 +47,7 @@ public class LogicalPlan {
private final PlanProperties properties;
private final Map<String, StorageEngineConfig> storageEngineMap;
- private final Graph<LogicalOperator, SourceOperator, SinkOperator> graph;
+ private final Graph<LogicalOperator, SinkOperator, SourceOperator> graph;
@JsonCreator
public LogicalPlan(@JsonProperty("head") PlanProperties head,
@@ -55,12 +55,12 @@ public class LogicalPlan {
@JsonProperty("query") List<LogicalOperator> operators) {
this.storageEngineMap = storageEngineMap;
this.properties = head;
- this.graph = Graph.newGraph(operators, SourceOperator.class, SinkOperator.class);
+ this.graph = Graph.newGraph(operators, SinkOperator.class, SourceOperator.class);
}
@JsonProperty("query")
public List<LogicalOperator> getSortedOperators() {
- return GraphAlgos.TopoSorter.sort(graph);
+ return GraphAlgos.TopoSorter.sortLogical(graph);
}
public StorageEngineConfig getStorageEngine(String name) {
@@ -68,7 +68,7 @@ public class LogicalPlan {
}
@JsonIgnore
- public Graph<LogicalOperator, SourceOperator, SinkOperator> getGraph() {
+ public Graph<LogicalOperator, SinkOperator, SourceOperator> getGraph() {
return graph;
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/CollapsingAggregate.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/CollapsingAggregate.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/CollapsingAggregate.java
index 6c10444..49015ec 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/CollapsingAggregate.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/CollapsingAggregate.java
@@ -17,11 +17,16 @@
******************************************************************************/
package org.apache.drill.common.logical.data;
+import com.google.common.collect.Iterators;
import org.apache.drill.common.expression.FieldReference;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.apache.drill.common.logical.data.visitors.LogicalVisitor;
+
+import java.util.Iterator;
+import java.util.List;
@JsonTypeName("collapsingaggregate")
public class CollapsingAggregate extends SingleInputOperator{
@@ -56,4 +61,13 @@ public class CollapsingAggregate extends SingleInputOperator{
return aggregations;
}
+ @Override
+ public <T, X, E extends Throwable> T accept(LogicalVisitor<T, X, E> logicalVisitor, X value) throws E {
+ return logicalVisitor.visitCollapsingAggregate(this, value);
+ }
+
+ @Override
+ public Iterator<LogicalOperator> iterator() {
+ return Iterators.singletonIterator(getInput());
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Filter.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Filter.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Filter.java
index 21422d2..e23f9ff 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Filter.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Filter.java
@@ -17,11 +17,15 @@
******************************************************************************/
package org.apache.drill.common.logical.data;
+import com.google.common.collect.Iterators;
import org.apache.drill.common.expression.LogicalExpression;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.apache.drill.common.logical.data.visitors.LogicalVisitor;
+
+import java.util.Iterator;
@JsonTypeName("filter")
public class Filter extends SingleInputOperator{
@@ -36,6 +40,16 @@ public class Filter extends SingleInputOperator{
return expr;
}
+ @Override
+ public <T, X, E extends Throwable> T accept(LogicalVisitor<T, X, E> logicalVisitor, X value) throws E {
+ return logicalVisitor.visitFilter(this, value);
+ }
+
+ @Override
+ public Iterator<LogicalOperator> iterator() {
+ return Iterators.singletonIterator(getInput());
+ }
+
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Flatten.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Flatten.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Flatten.java
index 9c8b060..114ba0a 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Flatten.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Flatten.java
@@ -17,12 +17,16 @@
******************************************************************************/
package org.apache.drill.common.logical.data;
+import com.google.common.collect.Iterators;
import org.apache.drill.common.expression.FieldReference;
import org.apache.drill.common.expression.LogicalExpression;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.apache.drill.common.logical.data.visitors.LogicalVisitor;
+
+import java.util.Iterator;
@JsonTypeName("flatten")
public class Flatten extends SingleInputOperator{
@@ -48,6 +52,16 @@ public class Flatten extends SingleInputOperator{
public boolean isDrop() {
return drop;
}
+
+ @Override
+ public <T, X, E extends Throwable> T accept(LogicalVisitor<T, X, E> logicalVisitor, X value) throws E {
+ return logicalVisitor.visitFlatten(this, value);
+ }
+
+ @Override
+ public Iterator<LogicalOperator> iterator() {
+ return Iterators.singletonIterator(getInput());
+ }
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Join.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Join.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Join.java
index 9742cd7..865c78e 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Join.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Join.java
@@ -17,12 +17,16 @@
******************************************************************************/
package org.apache.drill.common.logical.data;
+import com.google.common.collect.Iterators;
import org.apache.drill.common.exceptions.ExpressionParsingException;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.apache.drill.common.logical.data.visitors.LogicalVisitor;
+
+import java.util.Iterator;
@JsonTypeName("join")
public class Join extends LogicalOperatorBase {
@@ -48,9 +52,9 @@ public class Join extends LogicalOperatorBase {
this.conditions = conditions;
this.left = left;
this.right = right;
- this.type = JoinType.resolve(type);
left.registerAsSubscriber(this);
right.registerAsSubscriber(this);
+ this.type = JoinType.resolve(type);
}
@@ -74,4 +78,14 @@ public class Join extends LogicalOperatorBase {
public String getType(){
return type.name();
}
+
+ @Override
+ public <T, X, E extends Throwable> T accept(LogicalVisitor<T, X, E> logicalVisitor, X value) throws E {
+ return logicalVisitor.visitJoin(this, value);
+ }
+
+ @Override
+ public Iterator<LogicalOperator> iterator() {
+ return Iterators.forArray(getLeft(), getRight());
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Limit.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Limit.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Limit.java
index d4162f1..1774790 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Limit.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Limit.java
@@ -20,6 +20,10 @@ package org.apache.drill.common.logical.data;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.google.common.collect.Iterators;
+import org.apache.drill.common.logical.data.visitors.LogicalVisitor;
+
+import java.util.Iterator;
@JsonTypeName("limit")
public class Limit extends SingleInputOperator{
@@ -41,6 +45,16 @@ public class Limit extends SingleInputOperator{
public int getLast() {
return last;
}
-
-
+
+ @Override
+ public <T, X, E extends Throwable> T accept(LogicalVisitor<T, X, E> logicalVisitor, X value) throws E {
+ return logicalVisitor.visitLimit(this, value);
+ }
+
+ @Override
+ public Iterator<LogicalOperator> iterator() {
+ return Iterators.singletonIterator(getInput());
+ }
+
+
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/LogicalOperator.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/LogicalOperator.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/LogicalOperator.java
index a5301bb..3bed4d2 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/LogicalOperator.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/LogicalOperator.java
@@ -20,22 +20,27 @@ package org.apache.drill.common.logical.data;
import java.util.Collection;
import java.util.List;
+import com.fasterxml.jackson.annotation.*;
import org.apache.drill.common.graph.GraphValue;
import org.apache.drill.common.logical.ValidationError;
-import com.fasterxml.jackson.annotation.JsonIdentityInfo;
-import com.fasterxml.jackson.annotation.JsonPropertyOrder;
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import com.fasterxml.jackson.annotation.ObjectIdGenerators;
+import org.apache.drill.common.logical.data.visitors.LogicalVisitor;
@JsonPropertyOrder({"@id", "memo", "input"}) // op will always be first since it is wrapped.
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property="op")
public interface LogicalOperator extends GraphValue<LogicalOperator>{
-
- public void registerAsSubscriber(LogicalOperator operator);
+
public void setupAndValidate(List<LogicalOperator> operators, Collection<ValidationError> errors);
-
-
+
+ /**
+ * Provides capability to build a set of output based on traversing a query graph tree.
+ *
+ * @param logicalVisitor
+ * @return
+ */
+ public <T, X, E extends Throwable> T accept(LogicalVisitor<T, X, E> logicalVisitor, X value) throws E;
+
+ public void registerAsSubscriber(LogicalOperator operator);
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/LogicalOperatorBase.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/LogicalOperatorBase.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/LogicalOperatorBase.java
index 5802056..23d3c6e 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/LogicalOperatorBase.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/LogicalOperatorBase.java
@@ -34,8 +34,8 @@ import com.fasterxml.jackson.annotation.JsonProperty;
public abstract class LogicalOperatorBase implements LogicalOperator{
static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(LogicalOperatorBase.class);
-
- private List<LogicalOperator> children = new ArrayList<LogicalOperator>();
+
+ private List<LogicalOperator> children = new ArrayList<LogicalOperator>();
private String memo;
public final int hashCode(){
@@ -48,25 +48,20 @@ public abstract class LogicalOperatorBase implements LogicalOperator{
}
@Override
- public void registerAsSubscriber(LogicalOperator operator) {
- if(operator == null) throw new IllegalArgumentException("You attempted to register a null operators.");
- children.add(operator);
- }
-
- @Override
public void accept(GraphVisitor<LogicalOperator> visitor) {
if(visitor.enter(this)){
- for(LogicalOperator o : children){
- o.accept(visitor);
- }
+ for(LogicalOperator o : children){
+ o.accept(visitor);
+ }
}
visitor.leave(this);
}
- @Override
- public Iterator<LogicalOperator> iterator() {
- return children.iterator();
- }
+ @Override
+ public void registerAsSubscriber(LogicalOperator operator) {
+ if(operator == null) throw new IllegalArgumentException("You attempted to register a null operators.");
+ children.add(operator);
+ }
@Override
public String toString() {
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Order.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Order.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Order.java
index 36ebbd3..a9355de 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Order.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Order.java
@@ -17,6 +17,7 @@
******************************************************************************/
package org.apache.drill.common.logical.data;
+import com.google.common.collect.Iterators;
import org.apache.drill.common.expression.FieldReference;
import org.apache.drill.common.expression.LogicalExpression;
@@ -24,6 +25,9 @@ import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.apache.drill.common.logical.data.visitors.LogicalVisitor;
+
+import java.util.Iterator;
@JsonTypeName("order")
public class Order extends SingleInputOperator {
@@ -45,7 +49,18 @@ public class Order extends SingleInputOperator {
return within;
}
- public static class Ordering {
+ @Override
+ public <T, X, E extends Throwable> T accept(LogicalVisitor<T, X, E> logicalVisitor, X value) throws E {
+ return logicalVisitor.visitOrder(this, value);
+ }
+
+ @Override
+ public Iterator<LogicalOperator> iterator() {
+ return Iterators.singletonIterator(getInput());
+ }
+
+
+ public static class Ordering {
private final Direction direction;
private final LogicalExpression expr;
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Project.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Project.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Project.java
index 84c8104..aca114f 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Project.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Project.java
@@ -17,12 +17,16 @@
******************************************************************************/
package org.apache.drill.common.logical.data;
+import com.google.common.collect.Iterators;
import org.apache.drill.common.exceptions.ExpressionParsingException;
import org.apache.drill.common.expression.PathSegment;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.apache.drill.common.logical.data.visitors.LogicalVisitor;
+
+import java.util.Iterator;
@JsonTypeName("project")
public class Project extends SingleInputOperator {
@@ -48,4 +52,15 @@ public class Project extends SingleInputOperator {
return selections;
}
+ @Override
+ public <T, X, E extends Throwable> T accept(LogicalVisitor<T, X, E> logicalVisitor, X value) throws E {
+ return logicalVisitor.visitProject(this, value);
+ }
+
+ @Override
+ public Iterator<LogicalOperator> iterator() {
+ return Iterators.singletonIterator(getInput());
+ }
+
+
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/RunningAggregate.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/RunningAggregate.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/RunningAggregate.java
index 01df9a0..a649e9d 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/RunningAggregate.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/RunningAggregate.java
@@ -17,11 +17,15 @@
******************************************************************************/
package org.apache.drill.common.logical.data;
+import com.google.common.collect.Iterators;
import org.apache.drill.common.expression.FieldReference;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.apache.drill.common.logical.data.visitors.LogicalVisitor;
+
+import java.util.Iterator;
@JsonTypeName("runningaggregate")
public class RunningAggregate extends SingleInputOperator{
@@ -44,6 +48,16 @@ public class RunningAggregate extends SingleInputOperator{
return aggregations;
}
+ @Override
+ public <T, X, E extends Throwable> T accept(LogicalVisitor<T, X, E> logicalVisitor, X value) throws E {
+ return logicalVisitor.visitRunningAggregate(this, value);
+ }
+
+ @Override
+ public Iterator<LogicalOperator> iterator() {
+ return Iterators.singletonIterator(getInput());
+ }
+
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Scan.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Scan.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Scan.java
index 7933e40..14f44b4 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Scan.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Scan.java
@@ -17,12 +17,16 @@
******************************************************************************/
package org.apache.drill.common.logical.data;
+import com.google.common.collect.Iterators;
import org.apache.drill.common.JSONOptions;
import org.apache.drill.common.expression.FieldReference;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.apache.drill.common.logical.data.visitors.LogicalVisitor;
+
+import java.util.Iterator;
@JsonTypeName("scan")
public class Scan extends SourceOperator{
@@ -51,7 +55,18 @@ public class Scan extends SourceOperator{
public FieldReference getOutputReference() {
return outputReference;
}
-
-
+
+ @Override
+ public <T, X, E extends Throwable> T accept(LogicalVisitor<T, X, E> logicalVisitor, X value) throws E {
+ return logicalVisitor.visitScan(this, value);
+ }
+
+ @Override
+ public Iterator<LogicalOperator> iterator() {
+ return Iterators.emptyIterator();
+ }
+
+
+
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Segment.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Segment.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Segment.java
index 5b10e07..8177dc3 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Segment.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Segment.java
@@ -17,12 +17,16 @@
******************************************************************************/
package org.apache.drill.common.logical.data;
+import com.google.common.collect.Iterators;
import org.apache.drill.common.expression.FieldReference;
import org.apache.drill.common.expression.LogicalExpression;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.apache.drill.common.logical.data.visitors.LogicalVisitor;
+
+import java.util.Iterator;
@JsonTypeName("segment")
public class Segment extends SingleInputOperator{
@@ -43,5 +47,16 @@ public class Segment extends SingleInputOperator{
public FieldReference getName() {
return name;
}
-
+
+ @Override
+ public <T, X, E extends Throwable> T accept(LogicalVisitor<T, X, E> logicalVisitor, X value) throws E {
+ return logicalVisitor.visitSegment(this, value);
+ }
+
+ @Override
+ public Iterator<LogicalOperator> iterator() {
+ return Iterators.singletonIterator(getInput());
+ }
+
+
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Sequence.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Sequence.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Sequence.java
index 12c7c08..86337da 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Sequence.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Sequence.java
@@ -18,8 +18,11 @@
package org.apache.drill.common.logical.data;
import java.io.IOException;
+import java.util.Iterator;
+import com.google.common.collect.Iterators;
import org.apache.drill.common.logical.data.Sequence.De;
+import org.apache.drill.common.logical.data.visitors.LogicalVisitor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -56,7 +59,18 @@ public class Sequence extends LogicalOperatorBase {
@JsonProperty("do")
public LogicalOperator[] stream;
- public static class De extends StdDeserializer<LogicalOperator> {
+ @Override
+ public <T, X, E extends Throwable> T accept(LogicalVisitor<T, X, E> logicalVisitor, X value) throws E {
+ return logicalVisitor.visitSequence(this, value);
+ }
+
+ @Override
+ public Iterator<LogicalOperator> iterator() {
+ return Iterators.singletonIterator(stream[stream.length - 1]);
+ }
+
+
+ public static class De extends StdDeserializer<LogicalOperator> {
protected De() {
super(Sequence.class);
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Store.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Store.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Store.java
index 0569b8a..78b5d41 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Store.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Store.java
@@ -17,12 +17,16 @@
******************************************************************************/
package org.apache.drill.common.logical.data;
+import com.google.common.collect.Iterators;
import org.apache.drill.common.JSONOptions;
import org.apache.drill.common.defs.PartitionDef;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.apache.drill.common.logical.data.visitors.LogicalVisitor;
+
+import java.util.Iterator;
@JsonTypeName("store")
public class Store extends SinkOperator{
@@ -52,6 +56,16 @@ public class Store extends SinkOperator{
return partition;
}
-
-
+ @Override
+ public <T, X, E extends Throwable> T accept(LogicalVisitor<T, X, E> logicalVisitor, X value) throws E {
+ return logicalVisitor.visitStore(this, value);
+ }
+
+ @Override
+ public Iterator<LogicalOperator> iterator() {
+ return Iterators.singletonIterator(getInput());
+ }
+
+
+
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Transform.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Transform.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Transform.java
index 7396d6b..3cd69b6 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Transform.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Transform.java
@@ -20,6 +20,10 @@ package org.apache.drill.common.logical.data;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.google.common.collect.Iterators;
+import org.apache.drill.common.logical.data.visitors.LogicalVisitor;
+
+import java.util.Iterator;
@JsonTypeName("transform")
public class Transform extends SingleInputOperator{
@@ -36,4 +40,15 @@ public class Transform extends SingleInputOperator{
return transforms;
}
+ @Override
+ public <T, X, E extends Throwable> T accept(LogicalVisitor<T, X, E> logicalVisitor, X value) throws E {
+ return logicalVisitor.visitTransform(this, value);
+ }
+
+ @Override
+ public Iterator<LogicalOperator> iterator() {
+ return Iterators.singletonIterator(getInput());
+ }
+
+
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Union.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Union.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Union.java
index 487401b..3cb2c54 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Union.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/Union.java
@@ -20,6 +20,10 @@ package org.apache.drill.common.logical.data;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.google.common.collect.Iterators;
+import org.apache.drill.common.logical.data.visitors.LogicalVisitor;
+
+import java.util.Iterator;
@JsonTypeName("union")
public class Union extends LogicalOperatorBase {
@@ -34,9 +38,9 @@ public class Union extends LogicalOperatorBase {
@JsonCreator
public Union(@JsonProperty("inputs") LogicalOperator[] inputs, @JsonProperty("distinct") Boolean distinct){
this.inputs = inputs;
- for (LogicalOperator o : inputs) {
- o.registerAsSubscriber(this);
- }
+ for (LogicalOperator o : inputs) {
+ o.registerAsSubscriber(this);
+ }
this.distinct = distinct == null ? false : distinct;
}
@@ -48,6 +52,17 @@ public class Union extends LogicalOperatorBase {
return distinct;
}
-
-
+ @Override
+ public <T, X, E extends Throwable> T accept(LogicalVisitor<T, X, E> logicalVisitor, X value) throws E {
+ return logicalVisitor.visitUnion(this, value);
+ }
+
+ @Override
+ public Iterator<LogicalOperator> iterator() {
+ return Iterators.forArray(inputs);
+ }
+
+
+
+
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/WindowFrame.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/WindowFrame.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/WindowFrame.java
index ec14663..4cd7967 100644
--- a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/WindowFrame.java
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/WindowFrame.java
@@ -17,11 +17,15 @@
******************************************************************************/
package org.apache.drill.common.logical.data;
+import com.google.common.collect.Iterators;
import org.apache.drill.common.expression.FieldReference;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.apache.drill.common.logical.data.visitors.LogicalVisitor;
+
+import java.util.Iterator;
@JsonTypeName("windowframe")
public class WindowFrame extends SingleInputOperator{
@@ -60,7 +64,18 @@ public class WindowFrame extends SingleInputOperator{
return end;
}
- public static class FrameRef{
+ @Override
+ public <T, X, E extends Throwable> T accept(LogicalVisitor<T, X, E> logicalVisitor, X value) throws E {
+ return logicalVisitor.visitWindowFrame(this, value);
+ }
+
+ @Override
+ public Iterator<LogicalOperator> iterator() {
+ return Iterators.singletonIterator(getInput());
+ }
+
+
+ public static class FrameRef{
private final FieldReference segment;
private final FieldReference position;
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/visitors/AbstractLogicalVisitor.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/visitors/AbstractLogicalVisitor.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/visitors/AbstractLogicalVisitor.java
new file mode 100644
index 0000000..a293d0b
--- /dev/null
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/visitors/AbstractLogicalVisitor.java
@@ -0,0 +1,94 @@
+package org.apache.drill.common.logical.data.visitors;
+
+import org.apache.drill.common.logical.data.*;
+
+/**
+ * Created with IntelliJ IDEA.
+ * User: jaltekruse
+ * Date: 6/10/13
+ * Time: 1:55 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public abstract class AbstractLogicalVisitor<T, X, E extends Throwable> implements LogicalVisitor<T, X, E> {
+
+ public T visitOp(LogicalOperator op, X value) throws E{
+ throw new UnsupportedOperationException(String.format(
+ "The LogicalVisitor of type %s does not currently support visiting the PhysicalOperator type %s.", this
+ .getClass().getCanonicalName(), op.getClass().getCanonicalName()));
+ }
+
+ @Override
+ public T visitScan(Scan scan, X value) throws E {
+ return visitOp(scan, value);
+ }
+
+ @Override
+ public T visitStore(Store store, X value) throws E {
+ return visitOp(store, value);
+ }
+
+ @Override
+ public T visitFilter(Filter filter, X value) throws E {
+ return visitOp(filter, value);
+ }
+
+ @Override
+ public T visitFlatten(Flatten flatten, X value) throws E {
+ return visitOp(flatten, value);
+ }
+
+ @Override
+ public T visitProject(Project project, X value) throws E {
+ return visitOp(project, value);
+ }
+
+ @Override
+ public T visitOrder(Order order, X value) throws E {
+ return visitOp(order, value);
+ }
+
+ @Override
+ public T visitJoin(Join join, X value) throws E {
+ return visitOp(join, value);
+ }
+
+ @Override
+ public T visitLimit(Limit limit, X value) throws E {
+ return visitOp(limit, value);
+ }
+
+ @Override
+ public T visitRunningAggregate(RunningAggregate runningAggregate, X value) throws E {
+ return visitOp(runningAggregate, value);
+ }
+
+ @Override
+ public T visitSegment(Segment segment, X value) throws E {
+ return visitOp(segment, value);
+ }
+
+ @Override
+ public T visitSequence(Sequence sequence, X value) throws E {
+ return visitOp(sequence, value);
+ }
+
+ @Override
+ public T visitTransform(Transform transform, X value) throws E {
+ return visitOp(transform, value);
+ }
+
+ @Override
+ public T visitUnion(Union union, X value) throws E {
+ return visitOp(union, value);
+ }
+
+ @Override
+ public T visitCollapsingAggregate(CollapsingAggregate collapsingAggregate, X value) throws E {
+ return visitOp(collapsingAggregate, value);
+ }
+
+ @Override
+ public T visitWindowFrame(WindowFrame windowFrame, X value) throws E {
+ return visitOp(windowFrame, value);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/visitors/LogicalVisitor.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/visitors/LogicalVisitor.java b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/visitors/LogicalVisitor.java
new file mode 100644
index 0000000..1f08913
--- /dev/null
+++ b/sandbox/prototype/common/src/main/java/org/apache/drill/common/logical/data/visitors/LogicalVisitor.java
@@ -0,0 +1,35 @@
+package org.apache.drill.common.logical.data.visitors;
+
+
+import org.apache.drill.common.graph.GraphVisitor;
+import org.apache.drill.common.logical.data.*;
+
+/**
+ * Visitor class designed to traversal of a operator tree. Basis for a number of operator manipulations including fragmentation and materialization.
+ * @param <RETURN> The class associated with the return of each visit method.
+ * @param <EXTRA> The class object associated with additional data required for a particular operator modification.
+ * @param <EXCEP> An optional exception class that can be thrown when a portion of a modification or traversal fails. Must extend Throwable. In the case where the visitor does not throw any caught exception, this can be set as RuntimeException.
+ */
+public interface LogicalVisitor<RETURN, EXTRA, EXCEP extends Throwable> {
+ static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(LogicalVisitor.class);
+
+
+ //public RETURN visitExchange(Exchange exchange, EXTRA value) throws EXCEP;
+ public RETURN visitScan(Scan scan, EXTRA value) throws EXCEP;
+ public RETURN visitStore(Store store, EXTRA value) throws EXCEP;
+ public RETURN visitCollapsingAggregate(CollapsingAggregate collapsingAggregate, EXTRA value) throws EXCEP;
+
+ public RETURN visitFilter(Filter filter, EXTRA value) throws EXCEP;
+ public RETURN visitFlatten(Flatten flatten, EXTRA value) throws EXCEP;
+
+ public RETURN visitProject(Project project, EXTRA value) throws EXCEP;
+ public RETURN visitOrder(Order order, EXTRA value) throws EXCEP;
+ public RETURN visitJoin(Join join, EXTRA value) throws EXCEP;
+ public RETURN visitLimit(Limit limit, EXTRA value) throws EXCEP;
+ public RETURN visitRunningAggregate(RunningAggregate runningAggregate, EXTRA value) throws EXCEP;
+ public RETURN visitSegment(Segment segment, EXTRA value) throws EXCEP;
+ public RETURN visitSequence(Sequence sequence, EXTRA value) throws EXCEP;
+ public RETURN visitTransform(Transform transform, EXTRA value) throws EXCEP;
+ public RETURN visitUnion(Union union, EXTRA value) throws EXCEP;
+ public RETURN visitWindowFrame(WindowFrame windowFrame, EXTRA value) throws EXCEP;
+}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/test/java/org/apache/drill/storage/Simple.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/test/java/org/apache/drill/storage/Simple.java b/sandbox/prototype/common/src/test/java/org/apache/drill/storage/Simple.java
index a821b59..4748cc1 100644
--- a/sandbox/prototype/common/src/test/java/org/apache/drill/storage/Simple.java
+++ b/sandbox/prototype/common/src/test/java/org/apache/drill/storage/Simple.java
@@ -26,7 +26,7 @@ public class Simple {
public static void main(String[] args) throws Exception {
DrillConfig c = DrillConfig.create();
- LogicalPlan plan = LogicalPlan.parse(c, FileUtils.getResourceAsString("/simple_plan.json"));
+ LogicalPlan plan = LogicalPlan.parse(c, FileUtils.getResourceAsString("/jdbc_plan.json"));
System.out.println(plan.toJsonString(c));
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/common/src/test/resources/jdbc_plan.json
----------------------------------------------------------------------
diff --git a/sandbox/prototype/common/src/test/resources/jdbc_plan.json b/sandbox/prototype/common/src/test/resources/jdbc_plan.json
new file mode 100644
index 0000000..2d3b9d2
--- /dev/null
+++ b/sandbox/prototype/common/src/test/resources/jdbc_plan.json
@@ -0,0 +1,33 @@
+{
+ "head":{"type":"APACHE_DRILL_LOGICAL",
+ "version":"1",
+ "generator":{"type":"manual","info":"na"}
+ },
+ "storage":{
+ "donuts-json":{"type":"classpath"},
+ "queue":{"type":"queue"}
+ },
+ "query":[
+ {"op":"sequence",
+ "do":[
+ {
+ "op":"scan",
+ "memo":"initial_scan",
+ "ref":"_MAP",
+ "storageengine":"donuts-json"
+ ,"selection":{"path":"/donuts.json","type":"JSON"}
+ },
+ {
+ "op":"filter",
+ "expr":"(3 < 4)"
+ },
+ {
+ "op":"store",
+ "storageengine":"queue",
+ "memo":"output sink",
+ "target":{"number":0}
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillClient.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillClient.java b/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillClient.java
index c35e834..5d80ee4 100644
--- a/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillClient.java
+++ b/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillClient.java
@@ -90,7 +90,7 @@ public class DrillClient implements Closeable{
Collection<DrillbitEndpoint> endpoints = clusterCoordinator.getAvailableEndpoints();
checkState(!endpoints.isEmpty(), "No DrillbitEndpoint can be found");
// just use the first endpoint for now
- DrillbitEndpoint endpoint = get(endpoints, 0);
+ DrillbitEndpoint endpoint = endpoints.iterator().next();
ByteBufAllocator bb = new PooledByteBufAllocator(true);
this.client = new UserClient(bb, new NioEventLoopGroup(1, new NamedThreadFactory("Client-")));
try {
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/exception/OptimizerException.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/exception/OptimizerException.java b/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/exception/OptimizerException.java
new file mode 100644
index 0000000..c57ce4a
--- /dev/null
+++ b/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/exception/OptimizerException.java
@@ -0,0 +1,14 @@
+package org.apache.drill.exec.exception;
+
+/**
+ * Created with IntelliJ IDEA.
+ * User: jaltekruse
+ * Date: 6/11/13
+ * Time: 5:37 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class OptimizerException extends Exception{
+ public OptimizerException(String s) {
+ super(s);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/opt/BasicOptimizer.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/opt/BasicOptimizer.java b/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/opt/BasicOptimizer.java
new file mode 100644
index 0000000..98ef05f
--- /dev/null
+++ b/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/opt/BasicOptimizer.java
@@ -0,0 +1,127 @@
+package org.apache.drill.exec.opt;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.drill.common.JSONOptions;
+import org.apache.drill.common.PlanProperties;
+import org.apache.drill.common.config.DrillConfig;
+import org.apache.drill.common.logical.LogicalPlan;
+import org.apache.drill.common.logical.data.*;
+import org.apache.drill.common.logical.data.visitors.AbstractLogicalVisitor;
+import org.apache.drill.common.logical.data.visitors.LogicalVisitor;
+import org.apache.drill.exec.exception.OptimizerException;
+import org.apache.drill.exec.ops.QueryContext;
+import org.apache.drill.exec.physical.PhysicalPlan;
+import org.apache.drill.exec.physical.base.PhysicalOperator;
+import org.apache.drill.exec.physical.config.MockScanPOP;
+import org.apache.drill.exec.physical.config.MockStorePOP;
+import org.apache.drill.exec.physical.config.Screen;
+import org.apache.drill.exec.proto.SchemaDefProtos;
+import org.apache.drill.exec.server.DrillbitContext;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Created with IntelliJ IDEA.
+ * User: jaltekruse
+ * Date: 6/11/13
+ * Time: 5:32 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class BasicOptimizer extends Optimizer{
+
+ private DrillConfig config;
+ private QueryContext context;
+
+ public BasicOptimizer(DrillConfig config, QueryContext context){
+ this.config = config;
+ this.context = context;
+ }
+
+ @Override
+ public void init(DrillConfig config) {
+
+ }
+
+ @Override
+ public PhysicalPlan optimize(OptimizationContext context, LogicalPlan plan) {
+ Object obj = new Object();
+ Collection<SinkOperator> roots = plan.getGraph().getRoots();
+ List<PhysicalOperator> physOps = new ArrayList<PhysicalOperator>(roots.size());
+ LogicalConverter converter = new LogicalConverter();
+ for ( SinkOperator op : roots){
+ try {
+ PhysicalOperator pop = op.accept(converter, obj);
+ System.out.println(pop);
+ physOps.add(pop);
+ } catch (OptimizerException e) {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ } catch (Throwable throwable) {
+ throwable.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+
+ PlanProperties props = new PlanProperties();
+ props.type = PlanProperties.PlanType.APACHE_DRILL_PHYSICAL;
+ props.version = plan.getProperties().version;
+ props.generator = plan.getProperties().generator;
+ return new PhysicalPlan(props, physOps);
+ }
+
+ @Override
+ public void close() {
+
+ }
+
+ public static class BasicOptimizationContext implements OptimizationContext {
+
+ @Override
+ public int getPriority() {
+ return 1;
+ }
+ }
+
+
+ private class LogicalConverter extends AbstractLogicalVisitor<PhysicalOperator, Object, OptimizerException> {
+
+ @Override
+ public MockScanPOP visitScan(Scan scan, Object obj) throws OptimizerException {
+ List<MockScanPOP.MockScanEntry> myObjects;
+
+ try {
+ if ( scan.getStorageEngine().equals("local-logs")){
+ myObjects = scan.getSelection().getListWith(config,
+ new TypeReference<ArrayList<MockScanPOP.MockScanEntry>>() {
+ });
+ }
+ else{
+ myObjects = new ArrayList<>();
+ MockScanPOP.MockColumn[] cols = { new MockScanPOP.MockColumn("blah", SchemaDefProtos.MinorType.INT, SchemaDefProtos.DataMode.REQUIRED,4,4,4),
+ new MockScanPOP.MockColumn("blah_2", SchemaDefProtos.MinorType.INT, SchemaDefProtos.DataMode.REQUIRED,4,4,4)};
+ myObjects.add(new MockScanPOP.MockScanEntry(50, cols));
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ throw new OptimizerException("Error reading selection attribute of Scan node in Logical to Physical plan conversion.");
+ }
+
+ return new MockScanPOP("http://apache.org", myObjects);
+ }
+
+ @Override
+ public Screen visitStore(Store store, Object obj) throws OptimizerException {
+ if ( ! store.iterator().hasNext()){
+ throw new OptimizerException("Store node in logical plan does not have a child.");
+ }
+ return new Screen(store.iterator().next().accept(this, obj), context.getCurrentEndpoint());
+ }
+
+ @Override
+ public PhysicalOperator visitProject(Project project, Object obj) throws OptimizerException {
+ return project.getInput().accept(this, obj);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/AbstractStore.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/AbstractStore.java b/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/AbstractStore.java
index a833a4e..2f25d99 100644
--- a/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/AbstractStore.java
+++ b/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/AbstractStore.java
@@ -20,7 +20,7 @@ package org.apache.drill.exec.physical.base;
-public abstract class AbstractStore extends AbstractSingle implements Store{
+public abstract class AbstractStore extends AbstractSingle implements Store, Root{
static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(AbstractStore.class);
public AbstractStore(PhysicalOperator child) {
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Screen.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Screen.java b/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Screen.java
index 688c6b5..b51f7a3 100644
--- a/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Screen.java
+++ b/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/physical/config/Screen.java
@@ -38,7 +38,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
import com.google.common.base.Preconditions;
@JsonTypeName("screen")
-public class Screen extends AbstractStore implements Root{
+public class Screen extends AbstractStore {
static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(Screen.class);
private final DrillbitEndpoint endpoint;
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/work/foreman/Foreman.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/work/foreman/Foreman.java b/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/work/foreman/Foreman.java
index f86c4fb..ba103ed 100644
--- a/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/work/foreman/Foreman.java
+++ b/sandbox/prototype/exec/java-exec/src/main/java/org/apache/drill/exec/work/foreman/Foreman.java
@@ -21,10 +21,12 @@ import java.io.Closeable;
import java.io.IOException;
import java.util.List;
+import org.apache.drill.common.config.DrillConfig;
import org.apache.drill.common.exceptions.ExecutionSetupException;
import org.apache.drill.common.logical.LogicalPlan;
import org.apache.drill.exec.exception.FragmentSetupException;
import org.apache.drill.exec.ops.QueryContext;
+import org.apache.drill.exec.opt.BasicOptimizer;
import org.apache.drill.exec.physical.PhysicalPlan;
import org.apache.drill.exec.physical.base.PhysicalOperator;
import org.apache.drill.exec.physical.impl.materialize.QueryWritableBatch;
@@ -33,7 +35,6 @@ import org.apache.drill.exec.planner.fragment.MakeFragmentsVisitor;
import org.apache.drill.exec.planner.fragment.PlanningSet;
import org.apache.drill.exec.planner.fragment.SimpleParallelizer;
import org.apache.drill.exec.planner.fragment.StatsCollector;
-import org.apache.drill.exec.proto.ExecProtos.FragmentHandle;
import org.apache.drill.exec.proto.ExecProtos.PlanFragment;
import org.apache.drill.exec.proto.GeneralRPCProtos.Ack;
import org.apache.drill.exec.proto.UserBitShared.DrillPBError;
@@ -225,7 +226,7 @@ public class Foreman implements Runnable, Closeable, Comparable<Object>{
}
private PhysicalPlan convert(LogicalPlan plan) {
- throw new UnsupportedOperationException();
+ return new BasicOptimizer(DrillConfig.create(), context).optimize(new BasicOptimizer.BasicOptimizationContext(), plan);
}
public QueryResult getResult(UserClientConnection connection, RequestResults req) {
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/exec/java-exec/src/test/java/org/apache/drill/exec/client/DrillClientSystemTest.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/exec/java-exec/src/test/java/org/apache/drill/exec/client/DrillClientSystemTest.java b/sandbox/prototype/exec/java-exec/src/test/java/org/apache/drill/exec/client/DrillClientSystemTest.java
index dc463e3..bcd13e9 100644
--- a/sandbox/prototype/exec/java-exec/src/test/java/org/apache/drill/exec/client/DrillClientSystemTest.java
+++ b/sandbox/prototype/exec/java-exec/src/test/java/org/apache/drill/exec/client/DrillClientSystemTest.java
@@ -21,8 +21,10 @@ public class DrillClientSystemTest extends DrillSystemTestBase {
@BeforeClass
public static void setUp() throws Exception {
+
DrillSystemTestBase.setUp();
plan = Resources.toString(Resources.getResource("simple_plan.json"), Charsets.UTF_8);
+
}
@After
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/exec/java-exec/src/test/java/org/apache/drill/exec/opt/BasicOptimizerTest.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/exec/java-exec/src/test/java/org/apache/drill/exec/opt/BasicOptimizerTest.java b/sandbox/prototype/exec/java-exec/src/test/java/org/apache/drill/exec/opt/BasicOptimizerTest.java
new file mode 100644
index 0000000..30602e6
--- /dev/null
+++ b/sandbox/prototype/exec/java-exec/src/test/java/org/apache/drill/exec/opt/BasicOptimizerTest.java
@@ -0,0 +1,24 @@
+package org.apache.drill.exec.opt;
+
+import org.apache.drill.common.config.DrillConfig;
+import org.apache.drill.common.logical.LogicalPlan;
+import org.apache.drill.common.util.FileUtils;
+import org.junit.Test;
+
+/**
+ * Created with IntelliJ IDEA.
+ * User: jaltekruse
+ * Date: 6/12/13
+ * Time: 12:09 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class BasicOptimizerTest {
+
+ @Test
+ public void parseSimplePlan() throws Exception{
+ DrillConfig c = DrillConfig.create();
+ LogicalPlan plan = LogicalPlan.parse(c, FileUtils.getResourceAsString("/scan_screen_logical.json"));
+ System.out.println(plan.unparse(c));
+ //System.out.println( new BasicOptimizer(DrillConfig.create()).convert(plan).unparse(c.getMapper().writer()));
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestDistributedFragmentRun.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestDistributedFragmentRun.java b/sandbox/prototype/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestDistributedFragmentRun.java
index 9bcd84f..1513c99 100644
--- a/sandbox/prototype/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestDistributedFragmentRun.java
+++ b/sandbox/prototype/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestDistributedFragmentRun.java
@@ -75,6 +75,24 @@ public class TestDistributedFragmentRun extends PopUnitTestBase{
}
+ @Test
+ public void oneBitOneExchangeTwoEntryRunLogical() throws Exception{
+ RemoteServiceSet serviceSet = RemoteServiceSet.getLocalServiceSet();
+
+ try(Drillbit bit1 = new Drillbit(CONFIG, serviceSet); DrillClient client = new DrillClient(CONFIG, serviceSet.getCoordinator());){
+ bit1.run();
+ client.connect();
+ List<QueryResultBatch> results = client.runQuery(QueryType.LOGICAL, Files.toString(FileUtils.getResourceAsFile("/scan_screen_logical.json"), Charsets.UTF_8));
+ int count = 0;
+ for(QueryResultBatch b : results){
+ count += b.getHeader().getRowCount();
+ }
+ assertEquals(100, count);
+ }
+
+
+ }
+
@Test
public void twoBitOneExchangeTwoEntryRun() throws Exception{
RemoteServiceSet serviceSet = RemoteServiceSet.getLocalServiceSet();
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestSimpleFragmentRun.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestSimpleFragmentRun.java b/sandbox/prototype/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestSimpleFragmentRun.java
index 9f9d502..594a3a2 100644
--- a/sandbox/prototype/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestSimpleFragmentRun.java
+++ b/sandbox/prototype/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestSimpleFragmentRun.java
@@ -42,59 +42,61 @@ public class TestSimpleFragmentRun extends PopUnitTestBase {
@Test
public void runNoExchangeFragment() throws Exception {
try(RemoteServiceSet serviceSet = RemoteServiceSet.getLocalServiceSet();
- Drillbit bit = new Drillbit(CONFIG, serviceSet);
- DrillClient client = new DrillClient(CONFIG, serviceSet.getCoordinator());){
+ Drillbit bit = new Drillbit(CONFIG, serviceSet);
+ DrillClient client = new DrillClient(CONFIG, serviceSet.getCoordinator());){
- // run query.
- bit.run();
- client.connect();
- List<QueryResultBatch> results = client.runQuery(QueryType.PHYSICAL, Files.toString(FileUtils.getResourceAsFile("/physical_test2.json"), Charsets.UTF_8));
-
- // look at records
- RecordBatchLoader batchLoader = new RecordBatchLoader(bit.getContext().getAllocator());
- int recordCount = 0;
- for (QueryResultBatch batch : results) {
- if(!batch.hasData()) continue;
- boolean schemaChanged = batchLoader.load(batch.getHeader().getDef(), batch.getData());
- boolean firstColumn = true;
+ // run query.
+ bit.run();
+ client.connect();
+ List<QueryResultBatch> results = client.runQuery(QueryType.PHYSICAL, Files.toString(FileUtils.getResourceAsFile("/physical_test2.json"), Charsets.UTF_8));
+
+ // look at records
+ RecordBatchLoader batchLoader = new RecordBatchLoader(bit.getContext().getAllocator());
+ int recordCount = 0;
+ for (QueryResultBatch batch : results) {
+ if(!batch.hasData()) continue;
+ boolean schemaChanged = batchLoader.load(batch.getHeader().getDef(), batch.getData());
+ boolean firstColumn = true;
- // print headers.
- if (schemaChanged) {
- System.out.println("\n\n========NEW SCHEMA=========\n\n");
- for (IntObjectCursor<ValueVector<?>> v : batchLoader) {
+ // print headers.
+ if (schemaChanged) {
+ System.out.println("\n\n========NEW SCHEMA=========\n\n");
+ for (IntObjectCursor<ValueVector<?>> v : batchLoader) {
- if (firstColumn) {
- firstColumn = false;
- } else {
- System.out.print("\t");
+ if (firstColumn) {
+ firstColumn = false;
+ } else {
+ System.out.print("\t");
+ }
+ System.out.print(v.value.getField().getName());
+ System.out.print("[");
+ System.out.print(v.value.getField().getType().getMinorType());
+ System.out.print("]");
+ }
+ System.out.println();
}
- System.out.print(v.value.getField().getName());
- System.out.print("[");
- System.out.print(v.value.getField().getType().getMinorType());
- System.out.print("]");
- }
- System.out.println();
- }
- for (int i = 0; i < batchLoader.getRecordCount(); i++) {
- boolean first = true;
- recordCount++;
- for (IntObjectCursor<ValueVector<?>> v : batchLoader) {
- if (first) {
- first = false;
- } else {
- System.out.print("\t");
+ for (int i = 0; i < batchLoader.getRecordCount(); i++) {
+ boolean first = true;
+ recordCount++;
+ for (IntObjectCursor<ValueVector<?>> v : batchLoader) {
+ if (first) {
+ first = false;
+ } else {
+ System.out.print("\t");
+ }
+ System.out.print(v.value.getObject(i));
+ }
+ if(!first) System.out.println();
}
- System.out.print(v.value.getObject(i));
- }
- if(!first) System.out.println();
- }
- }
- logger.debug("Received results {}", results);
- assertEquals(recordCount, 200);
- }
+ }
+ logger.debug("Received results {}", results);
+ assertEquals(recordCount, 200);
+ }
}
+
+
}
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/exec/java-exec/src/test/resources/scan_screen_logical.json
----------------------------------------------------------------------
diff --git a/sandbox/prototype/exec/java-exec/src/test/resources/scan_screen_logical.json b/sandbox/prototype/exec/java-exec/src/test/resources/scan_screen_logical.json
new file mode 100644
index 0000000..3e5ebd7
--- /dev/null
+++ b/sandbox/prototype/exec/java-exec/src/test/resources/scan_screen_logical.json
@@ -0,0 +1,46 @@
+{
+ head:{
+ type:"APACHE_DRILL_LOGICAL",
+ version:"1",
+ generator:{
+ type:"manual",
+ info:"na"
+ }
+ },
+ query:[
+ {
+ @id:"1",
+ op:"scan",
+ memo:"initial_scan",
+ storageengine:"local-logs",
+ selection: [
+ {
+ records : 100,
+ types : [
+
+ {
+ name : "superhero_name",
+ type : "VARCHAR1",
+ mode : "REQUIRED",
+ width : 100,
+ precision : 1,
+ scale : 2
+
+ }
+ ]
+ }
+ ]
+ },
+ {
+ @id:"2",
+ input: 1,
+ op: "store",
+ memo: "output sink",
+ target: {
+ file: "console:///stdout"
+ }
+
+ }
+
+ ]
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1be6bd48/sandbox/prototype/exec/ref/src/main/java/org/apache/drill/exec/ref/RecordPointer.java
----------------------------------------------------------------------
diff --git a/sandbox/prototype/exec/ref/src/main/java/org/apache/drill/exec/ref/RecordPointer.java b/sandbox/prototype/exec/ref/src/main/java/org/apache/drill/exec/ref/RecordPointer.java
index b7c523b..56283b2 100644
--- a/sandbox/prototype/exec/ref/src/main/java/org/apache/drill/exec/ref/RecordPointer.java
+++ b/sandbox/prototype/exec/ref/src/main/java/org/apache/drill/exec/ref/RecordPointer.java
@@ -1,3 +1,21 @@
+/*******************************************************************************
+ * 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.exec.ref;
import java.io.IOException;