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;