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:57:50 UTC

[29/53] [abbrv] 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.

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/master
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;