You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by sm...@apache.org on 2016/02/16 22:10:32 UTC

[1/3] drill git commit: DRILL-4382: Remove dependency on drill-logical from vector package

Repository: drill
Updated Branches:
  refs/heads/master 0a2518d7c -> 9a3a5c4ff


http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/FieldIdUtil.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/FieldIdUtil.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/FieldIdUtil.java
deleted file mode 100644
index 935e93c..0000000
--- a/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/FieldIdUtil.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * 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.vector.complex;
-
-import org.apache.drill.common.expression.PathSegment;
-import org.apache.drill.common.expression.SchemaPath;
-import org.apache.drill.common.types.TypeProtos.DataMode;
-import org.apache.drill.common.types.TypeProtos.MajorType;
-import org.apache.drill.common.types.TypeProtos.MinorType;
-import org.apache.drill.exec.record.TypedFieldId;
-import org.apache.drill.exec.vector.ValueVector;
-
-import java.util.List;
-
-public class FieldIdUtil {
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(FieldIdUtil.class);
-  public static TypedFieldId getFieldIdIfMatches(ValueVector vector, TypedFieldId.Builder builder, boolean addToBreadCrumb, PathSegment seg) {
-    if (seg == null) {
-      if (addToBreadCrumb) {
-        builder.intermediateType(vector.getField().getType());
-      }
-      return builder.finalType(vector.getField().getType()).build();
-    }
-
-    if (seg.isArray()) {
-      if (seg.isLastPath()) {
-        MajorType type;
-        if (vector instanceof AbstractContainerVector) {
-          type = ((AbstractContainerVector) vector).getLastPathType();
-        } else if (vector instanceof ListVector) {
-          type = ((ListVector) vector).getDataVector().getField().getType();
-          builder.listVector();
-        } else {
-          throw new UnsupportedOperationException("FieldIdUtil does not support vector of type " + vector.getField().getType());
-        }
-        builder //
-                .withIndex() //
-                .finalType(type);
-
-        // remainder starts with the 1st array segment in SchemaPath.
-        // only set remainder when it's the only array segment.
-        if (addToBreadCrumb) {
-          addToBreadCrumb = false;
-          builder.remainder(seg);
-        }
-        return builder.build();
-      } else {
-        if (addToBreadCrumb) {
-          addToBreadCrumb = false;
-          builder.remainder(seg);
-        }
-      }
-    } else {
-      if (vector instanceof ListVector) {
-        return null;
-      }
-    }
-
-    ValueVector v;
-    if (vector instanceof AbstractContainerVector) {
-      VectorWithOrdinal vord = ((AbstractContainerVector) vector).getChildVectorWithOrdinal(seg.isArray() ? null : seg.getNameSegment().getPath());
-      if (vord == null) {
-        return null;
-      }
-      v = vord.vector;
-      if (addToBreadCrumb) {
-        builder.intermediateType(v.getField().getType());
-        builder.addId(vord.ordinal);
-      }
-    } else if (vector instanceof ListVector) {
-      v = ((ListVector) vector).getDataVector();
-    } else {
-      throw new UnsupportedOperationException("FieldIdUtil does not support vector of type " + vector.getField().getType());
-    }
-
-    if (v instanceof AbstractContainerVector) {
-      // we're looking for a multi path.
-      AbstractContainerVector c = (AbstractContainerVector) v;
-      return c.getFieldIdIfMatches(builder, addToBreadCrumb, seg.getChild());
-    } else if(v instanceof ListVector) {
-      ListVector list = (ListVector) v;
-      return list.getFieldIdIfMatches(builder, addToBreadCrumb, seg.getChild());
-    } else if (v instanceof  UnionVector) {
-      return ((UnionVector) v).getFieldIdIfMatches(builder, addToBreadCrumb, seg.getChild());
-    } else {
-      if (seg.isNamed()) {
-        if(addToBreadCrumb) {
-          builder.intermediateType(v.getField().getType());
-        }
-        builder.finalType(v.getField().getType());
-      } else {
-        builder.finalType(v.getField().getType().toBuilder().setMode(DataMode.OPTIONAL).build());
-      }
-
-      if (seg.isLastPath()) {
-        return builder.build();
-      } else {
-        PathSegment child = seg.getChild();
-        if (child.isLastPath() && child.isArray()) {
-          if (addToBreadCrumb) {
-            builder.remainder(child);
-          }
-          builder.withIndex();
-          builder.finalType(v.getField().getType().toBuilder().setMode(DataMode.OPTIONAL).build());
-          return builder.build();
-        } else {
-          logger.warn("You tried to request a complex type inside a scalar object or path or type is wrong.");
-          return null;
-        }
-      }
-    }
-  }
-
-  public static TypedFieldId getFieldId(ValueVector vector, int id, SchemaPath expectedPath, boolean hyper) {
-    if (!expectedPath.getRootSegment().segmentEquals(vector.getField().getPath().getRootSegment())) {
-      return null;
-    }
-    PathSegment seg = expectedPath.getRootSegment();
-
-    TypedFieldId.Builder builder = TypedFieldId.newBuilder();
-    if (hyper) {
-      builder.hyper();
-    }
-    if (vector instanceof UnionVector) {
-      builder.addId(id).remainder(expectedPath.getRootSegment().getChild());
-      List<MinorType> minorTypes = ((UnionVector) vector).getSubTypes();
-      MajorType.Builder majorTypeBuilder = MajorType.newBuilder().setMinorType(MinorType.UNION);
-      for (MinorType type : minorTypes) {
-        majorTypeBuilder.addSubType(type);
-      }
-      MajorType majorType = majorTypeBuilder.build();
-      builder.intermediateType(majorType);
-      if (seg.isLastPath()) {
-        builder.finalType(majorType);
-        return builder.build();
-      } else {
-        return ((UnionVector) vector).getFieldIdIfMatches(builder, false, seg.getChild());
-      }
-    } else if (vector instanceof ListVector) {
-      ListVector list = (ListVector) vector;
-      builder.intermediateType(vector.getField().getType());
-      builder.addId(id);
-      return list.getFieldIdIfMatches(builder, true, expectedPath.getRootSegment().getChild());
-    } else
-    if (vector instanceof AbstractContainerVector) {
-      // we're looking for a multi path.
-      AbstractContainerVector c = (AbstractContainerVector) vector;
-      builder.intermediateType(vector.getField().getType());
-      builder.addId(id);
-      return c.getFieldIdIfMatches(builder, true, expectedPath.getRootSegment().getChild());
-
-    } else {
-      builder.intermediateType(vector.getField().getType());
-      builder.addId(id);
-      builder.finalType(vector.getField().getType());
-      if (seg.isLastPath()) {
-        return builder.build();
-      } else {
-        PathSegment child = seg.getChild();
-        if (child.isArray() && child.isLastPath()) {
-          builder.remainder(child);
-          builder.withIndex();
-          builder.finalType(vector.getField().getType().toBuilder().setMode(DataMode.OPTIONAL).build());
-          return builder.build();
-        } else {
-          return null;
-        }
-
-      }
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/ListVector.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/ListVector.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/ListVector.java
index 10975f5..ba30241 100644
--- a/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/ListVector.java
+++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/ListVector.java
@@ -20,9 +20,6 @@ package org.apache.drill.exec.vector.complex;
 
 import com.google.common.collect.ObjectArrays;
 import io.netty.buffer.DrillBuf;
-import org.apache.drill.common.expression.FieldReference;
-import org.apache.drill.common.expression.PathSegment;
-import org.apache.drill.common.types.TypeProtos.DataMode;
 import org.apache.drill.common.types.TypeProtos.MinorType;
 import org.apache.drill.common.types.Types;
 import org.apache.drill.exec.memory.BufferAllocator;
@@ -30,7 +27,6 @@ import org.apache.drill.exec.exception.OutOfMemoryException;
 import org.apache.drill.exec.proto.UserBitShared;
 import org.apache.drill.exec.record.MaterializedField;
 import org.apache.drill.exec.record.TransferPair;
-import org.apache.drill.exec.record.TypedFieldId;
 import org.apache.drill.exec.util.CallBack;
 import org.apache.drill.exec.util.JsonStringArrayList;
 import org.apache.drill.exec.vector.AddOrGetResult;
@@ -103,7 +99,7 @@ public class ListVector extends BaseRepeatedValueVector {
   }
 
   @Override
-  public TransferPair getTransferPair(FieldReference ref, BufferAllocator allocator) {
+  public TransferPair getTransferPair(String ref, BufferAllocator allocator) {
     return new TransferImpl(field.withPath(ref), allocator);
   }
 
@@ -263,10 +259,6 @@ public class ListVector extends BaseRepeatedValueVector {
     return vector;
   }
 
-  public TypedFieldId getFieldIdIfMatches(TypedFieldId.Builder builder, boolean addToBreadCrumb, PathSegment seg) {
-    return FieldIdUtil.getFieldIdIfMatches(this, builder, addToBreadCrumb, seg);
-  }
-
   private int lastSet;
 
   public class Accessor extends BaseRepeatedAccessor {

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/MapVector.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/MapVector.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/MapVector.java
index 6784ed4..976b183 100644
--- a/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/MapVector.java
+++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/MapVector.java
@@ -26,8 +26,6 @@ import java.util.Map;
 
 import javax.annotation.Nullable;
 
-import org.apache.drill.common.expression.FieldReference;
-import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.types.TypeProtos.MajorType;
 import org.apache.drill.common.types.TypeProtos.MinorType;
 import org.apache.drill.common.types.Types;
@@ -60,7 +58,7 @@ public class MapVector extends AbstractMapVector {
   private int valueCount;
 
   public MapVector(String path, BufferAllocator allocator, CallBack callBack){
-    this(MaterializedField.create(SchemaPath.getSimplePath(path), TYPE), allocator, callBack);
+    this(MaterializedField.create(path, TYPE), allocator, callBack);
   }
 
   public MapVector(MaterializedField field, BufferAllocator allocator, CallBack callBack){
@@ -153,7 +151,7 @@ public class MapVector extends AbstractMapVector {
   }
 
   @Override
-  public TransferPair getTransferPair(FieldReference ref, BufferAllocator allocator) {
+  public TransferPair getTransferPair(String ref, BufferAllocator allocator) {
     return new MapTransferPair(this, ref, allocator);
   }
 
@@ -162,7 +160,7 @@ public class MapVector extends AbstractMapVector {
     private final MapVector from;
     private final MapVector to;
 
-    public MapTransferPair(MapVector from, SchemaPath path, BufferAllocator allocator) {
+    public MapTransferPair(MapVector from, String path, BufferAllocator allocator) {
       this(from, new MapVector(MaterializedField.create(path, TYPE), allocator, from.callBack), false);
     }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/RepeatedListVector.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/RepeatedListVector.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/RepeatedListVector.java
index 4706999..50f357f 100644
--- a/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/RepeatedListVector.java
+++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/RepeatedListVector.java
@@ -24,8 +24,6 @@ import io.netty.buffer.DrillBuf;
 import java.util.Iterator;
 import java.util.List;
 
-import org.apache.drill.common.expression.FieldReference;
-import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.types.TypeProtos.MajorType;
 import org.apache.drill.common.types.TypeProtos.MinorType;
 import org.apache.drill.common.types.Types;
@@ -64,7 +62,7 @@ public class RepeatedListVector extends AbstractContainerVector
 
       @Override
       public Object getObject(int index) {
-        final List<Object> list = new JsonStringArrayList();
+        final List<Object> list = new JsonStringArrayList<>();
         final int start = offsets.getAccessor().get(index);
         final int until = offsets.getAccessor().get(index+1);
         for (int i = start; i < until; i++) {
@@ -172,7 +170,7 @@ public class RepeatedListVector extends AbstractContainerVector
       }
     }
 
-    public DelegateRepeatedVector(SchemaPath path, BufferAllocator allocator) {
+    public DelegateRepeatedVector(String path, BufferAllocator allocator) {
       this(MaterializedField.create(path, TYPE), allocator);
     }
 
@@ -189,7 +187,7 @@ public class RepeatedListVector extends AbstractContainerVector
     }
 
     @Override
-    public TransferPair getTransferPair(FieldReference ref, BufferAllocator allocator) {
+    public TransferPair getTransferPair(String ref, BufferAllocator allocator) {
       return makeTransferPair(new DelegateRepeatedVector(ref, allocator));
     }
 
@@ -250,7 +248,7 @@ public class RepeatedListVector extends AbstractContainerVector
     }
   }
 
-  public RepeatedListVector(SchemaPath path, BufferAllocator allocator, CallBack callBack) {
+  public RepeatedListVector(String path, BufferAllocator allocator, CallBack callBack) {
     this(MaterializedField.create(path, TYPE), allocator, callBack);
   }
 
@@ -315,6 +313,7 @@ public class RepeatedListVector extends AbstractContainerVector
     if (result.isCreated() && callBack != null) {
       callBack.doWork();
     }
+    this.field = delegate.getField();
     return result;
   }
 
@@ -349,7 +348,7 @@ public class RepeatedListVector extends AbstractContainerVector
   }
 
   @Override
-  public TransferPair getTransferPair(FieldReference ref, BufferAllocator allocator) {
+  public TransferPair getTransferPair(String ref, BufferAllocator allocator) {
     return new RepeatedListTransferPair(delegate.getTransferPair(ref, allocator));
   }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/RepeatedMapVector.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/RepeatedMapVector.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/RepeatedMapVector.java
index b13de9d..cc3eedc 100644
--- a/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/RepeatedMapVector.java
+++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/RepeatedMapVector.java
@@ -24,9 +24,6 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.commons.lang3.ArrayUtils;
-import org.apache.drill.common.expression.FieldReference;
-import org.apache.drill.common.expression.PathSegment;
-import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.types.TypeProtos.DataMode;
 import org.apache.drill.common.types.TypeProtos.MajorType;
 import org.apache.drill.common.types.TypeProtos.MinorType;
@@ -39,7 +36,6 @@ import org.apache.drill.exec.memory.BufferAllocator;
 import org.apache.drill.exec.proto.UserBitShared.SerializedField;
 import org.apache.drill.exec.record.MaterializedField;
 import org.apache.drill.exec.record.TransferPair;
-import org.apache.drill.exec.record.TypedFieldId;
 import org.apache.drill.exec.util.CallBack;
 import org.apache.drill.exec.util.JsonStringArrayList;
 import org.apache.drill.exec.vector.AddOrGetResult;
@@ -204,32 +200,12 @@ public class RepeatedMapVector extends AbstractMapVector
     }
   }
 
-  @Override
-  public TypedFieldId getFieldIdIfMatches(TypedFieldId.Builder builder, boolean addToBreadCrumb, PathSegment seg) {
-    if (seg != null && seg.isArray() && !seg.isLastPath()) {
-      if (addToBreadCrumb) {
-        addToBreadCrumb = false;
-        builder.remainder(seg);
-      }
-      // skip the first array segment as there is no corresponding child vector.
-      seg = seg.getChild();
-
-      // multi-level numbered access to a repeated map is not possible so return if the next part is also an array
-      // segment.
-      if (seg.isArray()) {
-        return null;
-      }
-    }
-
-    return super.getFieldIdIfMatches(builder, addToBreadCrumb, seg);
-  }
-
-  public TransferPair getTransferPairToSingleMap(FieldReference reference, BufferAllocator allocator) {
+  public TransferPair getTransferPairToSingleMap(String reference, BufferAllocator allocator) {
     return new SingleMapTransferPair(this, reference, allocator);
   }
 
   @Override
-  public TransferPair getTransferPair(FieldReference ref, BufferAllocator allocator) {
+  public TransferPair getTransferPair(String ref, BufferAllocator allocator) {
     return new RepeatedMapTransferPair(this, ref, allocator);
   }
 
@@ -261,7 +237,7 @@ public class RepeatedMapVector extends AbstractMapVector
     private final MapVector to;
     private static final MajorType MAP_TYPE = Types.required(MinorType.MAP);
 
-    public SingleMapTransferPair(RepeatedMapVector from, SchemaPath path, BufferAllocator allocator) {
+    public SingleMapTransferPair(RepeatedMapVector from, String path, BufferAllocator allocator) {
       this(from, new MapVector(MaterializedField.create(path, MAP_TYPE), allocator, from.callBack), false);
     }
 
@@ -326,7 +302,7 @@ public class RepeatedMapVector extends AbstractMapVector
     private final RepeatedMapVector to;
     private final RepeatedMapVector from;
 
-    public RepeatedMapTransferPair(RepeatedMapVector from, SchemaPath path, BufferAllocator allocator) {
+    public RepeatedMapTransferPair(RepeatedMapVector from, String path, BufferAllocator allocator) {
       this(from, new RepeatedMapVector(MaterializedField.create(path, TYPE), allocator, from.callBack), false);
     }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/impl/PromotableWriter.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/impl/PromotableWriter.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/impl/PromotableWriter.java
index ee16e97..13e9a9e 100644
--- a/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/impl/PromotableWriter.java
+++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/impl/PromotableWriter.java
@@ -19,7 +19,6 @@ package org.apache.drill.exec.vector.complex.impl;
 
 import java.lang.reflect.Constructor;
 
-import org.apache.drill.common.expression.FieldReference;
 import org.apache.drill.common.types.TypeProtos.MinorType;
 import org.apache.drill.common.types.Types;
 import org.apache.drill.exec.expr.BasicTypeHelper;
@@ -151,7 +150,7 @@ public class PromotableWriter extends AbstractPromotableFieldWriter {
 
   private FieldWriter promoteToUnion() {
     String name = vector.getField().getLastName();
-    TransferPair tp = vector.getTransferPair(new FieldReference(vector.getField().getType().getMinorType().name().toLowerCase()), vector.getAllocator());
+    TransferPair tp = vector.getTransferPair(vector.getField().getType().getMinorType().name().toLowerCase(), vector.getAllocator());
     tp.transfer();
     if (parentContainer != null) {
       unionVector = parentContainer.addOrGet(name, Types.optional(MinorType.UNION), UnionVector.class);


[3/3] drill git commit: DRILL-4382: Remove dependency on drill-logical from vector package

Posted by sm...@apache.org.
DRILL-4382: Remove dependency on drill-logical from vector package


Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/9a3a5c4f
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/9a3a5c4f
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/9a3a5c4f

Branch: refs/heads/master
Commit: 9a3a5c4ff670a50a49f61f97dd838da59a12f976
Parents: 0a2518d
Author: Steven Phillips <st...@dremio.com>
Authored: Thu Feb 4 17:43:17 2016 -0800
Committer: Steven Phillips <st...@dremio.com>
Committed: Tue Feb 16 11:58:48 2016 -0800

----------------------------------------------------------------------
 .../exec/store/hbase/HBaseRecordReader.java     |   4 +-
 .../drill/exec/store/hive/HiveRecordReader.java |   4 +-
 .../org/apache/drill/exec/client/DumpCat.java   |   2 +-
 .../drill/exec/physical/impl/ScanBatch.java     |   8 +-
 .../impl/TopN/PriorityQueueTemplate.java        |   3 +-
 .../exec/physical/impl/WriterRecordBatch.java   |   4 +-
 .../physical/impl/aggregate/HashAggBatch.java   |   4 +-
 .../impl/aggregate/HashAggTemplate.java         |   2 +-
 .../impl/aggregate/StreamingAggBatch.java       |   4 +-
 .../physical/impl/common/ChainedHashTable.java  |   2 +-
 .../physical/impl/common/HashTableTemplate.java |   2 +-
 .../impl/flatten/FlattenRecordBatch.java        |   9 +-
 .../OrderedPartitionRecordBatch.java            |   4 +-
 .../impl/producer/ProducerConsumerBatch.java    |   5 +-
 .../impl/project/ProjectRecordBatch.java        |  26 +-
 .../impl/union/UnionAllRecordBatch.java         |  14 +-
 .../physical/impl/window/WindowFunction.java    |  14 +-
 .../physical/impl/xsort/ExternalSortBatch.java  |   3 +-
 .../logical/partition/PruneScanRule.java        |   2 +-
 .../drill/exec/record/RecordBatchLoader.java    |   6 +-
 .../apache/drill/exec/record/SchemaUtil.java    |   8 +-
 .../apache/drill/exec/record/TypedFieldId.java  | 273 +++++++++++++++++++
 .../drill/exec/record/VectorContainer.java      |   4 +-
 .../org/apache/drill/exec/schema/Field.java     |  10 -
 .../drill/exec/server/rest/QueryWrapper.java    |   2 +-
 .../drill/exec/store/AbstractRecordReader.java  |   4 +-
 .../apache/drill/exec/store/RecordReader.java   |   4 +-
 .../drill/exec/store/avro/AvroRecordReader.java |  24 +-
 .../sequencefile/SequenceFileRecordReader.java  |   8 +-
 .../compliant/CompliantTextRecordReader.java    |   6 +-
 .../text/compliant/RepeatedVarCharOutput.java   |   3 +-
 .../drill/exec/store/mock/MockRecordReader.java |   5 +-
 .../columnreaders/ParquetRecordReader.java      |  14 +-
 .../exec/store/parquet2/DrillParquetReader.java |   5 +-
 .../drill/exec/store/pojo/PojoRecordReader.java |   4 +-
 .../exec/store/text/DrillTextRecordReader.java  |   2 +-
 .../apache/drill/exec/util/BatchPrinter.java    |   6 +-
 .../org/apache/drill/exec/util/VectorUtil.java  |   8 +-
 .../drill/exec/vector/complex/FieldIdUtil.java  | 223 +++++++++++++++
 .../exec/vector/complex/fn/FieldSelection.java  |   2 +-
 .../java/org/apache/drill/DrillTestWrapper.java |  20 +-
 .../java/org/apache/drill/PlanTestBase.java     |   2 +-
 .../drill/exec/cache/TestWriteToDisk.java       |   8 +-
 .../exec/physical/impl/TestOptiqPlans.java      |  10 +-
 .../physical/impl/TestSimpleFragmentRun.java    |   4 +-
 .../exec/physical/impl/join/TestMergeJoin.java  |   8 +-
 .../impl/join/TestMergeJoinAdvanced.java        |   1 +
 .../impl/mergereceiver/TestMergingReceiver.java |   2 +-
 .../record/ExpressionTreeMaterializerTest.java  |   2 +-
 .../exec/record/TestMaterializedField.java      |   2 +-
 .../drill/exec/record/vector/TestLoad.java      |  10 +-
 .../exec/record/vector/TestValueVector.java     |   2 +-
 .../apache/drill/exec/server/TestBitRpc.java    |   2 +-
 .../store/parquet/ParquetResultListener.java    |  16 +-
 .../store/parquet/TestParquetPhysicalPlan.java  |   2 +-
 .../jdbc/impl/DrillColumnMetaDataList.java      |   2 +-
 .../drill/jdbc/DrillColumnMetaDataListTest.java |   4 +-
 exec/vector/pom.xml                             |   5 -
 .../src/main/codegen/includes/vv_imports.ftl    |   1 -
 .../main/codegen/templates/BasicTypeHelper.java |   6 +-
 .../codegen/templates/FixedValueVectors.java    |   4 +-
 .../codegen/templates/NullableValueVectors.java |   2 +-
 .../codegen/templates/RepeatedValueVectors.java |   2 +-
 .../src/main/codegen/templates/UnionVector.java |  23 +-
 .../templates/VariableLengthVectors.java        |   2 +-
 .../drill/exec/record/MaterializedField.java    | 199 ++++----------
 .../apache/drill/exec/record/TypedFieldId.java  | 273 -------------------
 .../drill/exec/vector/BaseValueVector.java      |   5 +-
 .../org/apache/drill/exec/vector/BitVector.java |   5 +-
 .../apache/drill/exec/vector/ObjectVector.java  |   3 +-
 .../apache/drill/exec/vector/ValueVector.java   |   3 +-
 .../drill/exec/vector/VectorDescriptor.java     |   3 +-
 .../apache/drill/exec/vector/ZeroVector.java    |   3 +-
 .../vector/complex/AbstractContainerVector.java |   8 +-
 .../exec/vector/complex/AbstractMapVector.java  |   2 +-
 .../drill/exec/vector/complex/FieldIdUtil.java  | 187 -------------
 .../drill/exec/vector/complex/ListVector.java   |  10 +-
 .../drill/exec/vector/complex/MapVector.java    |   8 +-
 .../exec/vector/complex/RepeatedListVector.java |  13 +-
 .../exec/vector/complex/RepeatedMapVector.java  |  32 +--
 .../vector/complex/impl/PromotableWriter.java   |   3 +-
 81 files changed, 750 insertions(+), 886 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseRecordReader.java
----------------------------------------------------------------------
diff --git a/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseRecordReader.java b/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseRecordReader.java
index d093522..0af0009 100644
--- a/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseRecordReader.java
+++ b/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseRecordReader.java
@@ -145,7 +145,7 @@ public class HBaseRecordReader extends AbstractRecordReader implements DrillHBas
       // when creating reader (order of first appearance in query).
       for (SchemaPath column : getColumns()) {
         if (column.equals(ROW_KEY_PATH)) {
-          MaterializedField field = MaterializedField.create(column, ROW_KEY_TYPE);
+          MaterializedField field = MaterializedField.create(column.getAsNamePart().getName(), ROW_KEY_TYPE);
           rowKeyVector = outputMutator.addField(field, VarBinaryVector.class);
         } else {
           getOrCreateFamilyVector(column.getRootSegment().getPath(), false);
@@ -246,7 +246,7 @@ public class HBaseRecordReader extends AbstractRecordReader implements DrillHBas
       MapVector v = familyVectorMap.get(familyName);
       if(v == null) {
         SchemaPath column = SchemaPath.getSimplePath(familyName);
-        MaterializedField field = MaterializedField.create(column, COLUMN_FAMILY_TYPE);
+        MaterializedField field = MaterializedField.create(column.getAsNamePart().getName(), COLUMN_FAMILY_TYPE);
         v = outputMutator.addField(field, MapVector.class);
         if (allocateOnCreate) {
           v.allocateNew();

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveRecordReader.java
----------------------------------------------------------------------
diff --git a/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveRecordReader.java b/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveRecordReader.java
index 6fdca8f..79ca65f 100644
--- a/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveRecordReader.java
+++ b/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveRecordReader.java
@@ -270,14 +270,14 @@ public class HiveRecordReader extends AbstractRecordReader {
       final OptionManager options = fragmentContext.getOptions();
       for (int i = 0; i < selectedColumnNames.size(); i++) {
         MajorType type = HiveUtilities.getMajorTypeFromHiveTypeInfo(selectedColumnTypes.get(i), options);
-        MaterializedField field = MaterializedField.create(SchemaPath.getSimplePath(selectedColumnNames.get(i)), type);
+        MaterializedField field = MaterializedField.create(selectedColumnNames.get(i), type);
         Class vvClass = TypeHelper.getValueVectorClass(type.getMinorType(), type.getMode());
         vectors.add(output.addField(field, vvClass));
       }
 
       for (int i = 0; i < selectedPartitionNames.size(); i++) {
         MajorType type = HiveUtilities.getMajorTypeFromHiveTypeInfo(selectedPartitionTypes.get(i), options);
-        MaterializedField field = MaterializedField.create(SchemaPath.getSimplePath(selectedPartitionNames.get(i)), type);
+        MaterializedField field = MaterializedField.create(selectedPartitionNames.get(i), type);
         Class vvClass = TypeHelper.getValueVectorClass(field.getType().getMinorType(), field.getDataMode());
         pVectors.add(output.addField(field, vvClass));
       }

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/client/DumpCat.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/client/DumpCat.java b/exec/java-exec/src/main/java/org/apache/drill/exec/client/DumpCat.java
index 54a61c8..cdbd3b4 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/client/DumpCat.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/client/DumpCat.java
@@ -253,7 +253,7 @@ public class DumpCat {
       for (final VectorWrapper w : vectorContainer) {
         final MaterializedField field = w.getValueVector().getField();
         System.out.println (String.format("name : %s, minor_type : %s, data_mode : %s",
-                                          field.toExpr(),
+                                          field.getPath(),
                                           field.getType().getMinorType().toString(),
                                           field.isNullable() ? "nullable":"non-nullable"
                           ));

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/ScanBatch.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/ScanBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/ScanBatch.java
index 73bebd1..c1cd469 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/ScanBatch.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/ScanBatch.java
@@ -70,7 +70,7 @@ public class ScanBatch implements CloseableRecordBatch {
   private final VectorContainer container = new VectorContainer();
 
   /** Fields' value vectors indexed by fields' keys. */
-  private final Map<MaterializedField.Key, ValueVector> fieldVectorMap =
+  private final Map<String, ValueVector> fieldVectorMap =
       Maps.newHashMap();
 
   private int recordCount;
@@ -281,7 +281,7 @@ public class ScanBatch implements CloseableRecordBatch {
       partitionVectors = Lists.newArrayList();
       for (int i : selectedPartitionColumns) {
         final MaterializedField field =
-            MaterializedField.create(SchemaPath.getSimplePath(partitionColumnDesignator + i),
+            MaterializedField.create(SchemaPath.getSimplePath(partitionColumnDesignator + i).getAsUnescapedPath(),
                                      Types.optional(MinorType.VARCHAR));
         final ValueVector v = mutator.addField(field, NullableVarCharVector.class);
         partitionVectors.add(v);
@@ -341,7 +341,7 @@ public class ScanBatch implements CloseableRecordBatch {
     public <T extends ValueVector> T addField(MaterializedField field,
                                               Class<T> clazz) throws SchemaChangeException {
       // Check if the field exists.
-      ValueVector v = fieldVectorMap.get(field.key());
+      ValueVector v = fieldVectorMap.get(field.getPath());
       if (v == null || v.getClass() != clazz) {
         // Field does not exist--add it to the map and the output container.
         v = TypeHelper.getNewVector(field, oContext.getAllocator(), callBack);
@@ -353,7 +353,7 @@ public class ScanBatch implements CloseableRecordBatch {
                   clazz.getSimpleName(), v.getClass().getSimpleName()));
         }
 
-        final ValueVector old = fieldVectorMap.put(field.key(), v);
+        final ValueVector old = fieldVectorMap.put(field.getPath(), v);
         if (old != null) {
           old.clear();
           container.remove(old);

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/TopN/PriorityQueueTemplate.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/TopN/PriorityQueueTemplate.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/TopN/PriorityQueueTemplate.java
index 7f77ec5..149da25 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/TopN/PriorityQueueTemplate.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/TopN/PriorityQueueTemplate.java
@@ -23,6 +23,7 @@ import java.util.concurrent.TimeUnit;
 
 import javax.inject.Named;
 
+import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.exec.exception.SchemaChangeException;
 import org.apache.drill.exec.memory.BufferAllocator;
 import org.apache.drill.exec.ops.FragmentContext;
@@ -66,7 +67,7 @@ public abstract class PriorityQueueTemplate implements PriorityQueue {
     BatchSchema schema = container.getSchema();
     VectorContainer newContainer = new VectorContainer();
     for (MaterializedField field : schema) {
-      int[] ids = container.getValueVectorId(field.getPath()).getFieldIds();
+      int[] ids = container.getValueVectorId(SchemaPath.getSimplePath(field.getPath())).getFieldIds();
       newContainer.add(container.getValueAccessorById(field.getValueClass(), ids).getValueVectors());
     }
     newContainer.buildSchema(BatchSchema.SelectionVectorMode.FOUR_BYTE);

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/WriterRecordBatch.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/WriterRecordBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/WriterRecordBatch.java
index 7da8a16..e6c946c 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/WriterRecordBatch.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/WriterRecordBatch.java
@@ -157,9 +157,9 @@ public class WriterRecordBatch extends AbstractRecordBatch<Writer> {
       //   1. Fragment unique id.
       //   2. Summary: currently contains number of records written.
       final MaterializedField fragmentIdField =
-          MaterializedField.create(SchemaPath.getSimplePath("Fragment"), Types.required(MinorType.VARCHAR));
+          MaterializedField.create("Fragment", Types.required(MinorType.VARCHAR));
       final MaterializedField summaryField =
-          MaterializedField.create(SchemaPath.getSimplePath("Number of records written"),
+          MaterializedField.create("Number of records written",
               Types.required(MinorType.BIGINT));
 
       container.addOrGet(fragmentIdField);

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggBatch.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggBatch.java
index ffcb491..3595ecf 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggBatch.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggBatch.java
@@ -200,7 +200,7 @@ public class HashAggBatch extends AbstractRecordBatch<HashAggregate> {
         continue;
       }
 
-      final MaterializedField outputField = MaterializedField.create(ne.getRef(), expr.getMajorType());
+      final MaterializedField outputField = MaterializedField.create(ne.getRef().getAsNamePart().getName(), expr.getMajorType());
       ValueVector vv = TypeHelper.getNewVector(outputField, oContext.getAllocator());
 
       // add this group-by vector to the output container
@@ -224,7 +224,7 @@ public class HashAggBatch extends AbstractRecordBatch<HashAggregate> {
         continue;
       }
 
-      final MaterializedField outputField = MaterializedField.create(ne.getRef(), expr.getMajorType());
+      final MaterializedField outputField = MaterializedField.create(ne.getRef().getAsNamePart().getName(), expr.getMajorType());
       ValueVector vv = TypeHelper.getNewVector(outputField, oContext.getAllocator());
       aggrOutFieldIds[i] = container.add(vv);
 

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggTemplate.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggTemplate.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggTemplate.java
index 8af1508..9ff874f 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggTemplate.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggTemplate.java
@@ -263,7 +263,7 @@ public abstract class HashAggTemplate implements HashAggregator {
       FieldReference ref =
           new FieldReference("dummy", ExpressionPosition.UNKNOWN, valueFieldIds.get(0).getIntermediateType());
       for (TypedFieldId id : valueFieldIds) {
-        materializedValueFields[i++] = MaterializedField.create(ref, id.getIntermediateType());
+        materializedValueFields[i++] = MaterializedField.create(ref.getAsNamePart().getName(), id.getIntermediateType());
       }
     }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/StreamingAggBatch.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/StreamingAggBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/StreamingAggBatch.java
index c084e39..19232f8 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/StreamingAggBatch.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/StreamingAggBatch.java
@@ -273,7 +273,7 @@ public class StreamingAggBatch extends AbstractRecordBatch<StreamingAggregate> {
         continue;
       }
       keyExprs[i] = expr;
-      final MaterializedField outputField = MaterializedField.create(ne.getRef(), expr.getMajorType());
+      final MaterializedField outputField = MaterializedField.create(ne.getRef().getAsUnescapedPath(), expr.getMajorType());
       final ValueVector vector = TypeHelper.getNewVector(outputField, oContext.getAllocator());
       keyOutputIds[i] = container.add(vector);
     }
@@ -288,7 +288,7 @@ public class StreamingAggBatch extends AbstractRecordBatch<StreamingAggregate> {
         continue;
       }
 
-      final MaterializedField outputField = MaterializedField.create(ne.getRef(), expr.getMajorType());
+      final MaterializedField outputField = MaterializedField.create(ne.getRef().getAsUnescapedPath(), expr.getMajorType());
       ValueVector vector = TypeHelper.getNewVector(outputField, oContext.getAllocator());
       TypedFieldId id = container.add(vector);
       valueExprs[i] = new ValueVectorWriteExpression(id, expr, true);

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/ChainedHashTable.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/ChainedHashTable.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/ChainedHashTable.java
index 08ccaa1..bd34d76 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/ChainedHashTable.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/ChainedHashTable.java
@@ -195,7 +195,7 @@ public class ChainedHashTable {
      */
     for (NamedExpression ne : htConfig.getKeyExprsBuild()) {
       LogicalExpression expr = keyExprsBuild[i];
-      final MaterializedField outputField = MaterializedField.create(ne.getRef(), expr.getMajorType());
+      final MaterializedField outputField = MaterializedField.create(ne.getRef().getAsUnescapedPath(), expr.getMajorType());
       ValueVector vv = TypeHelper.getNewVector(outputField, allocator);
       htKeyFieldIds[i] = htContainerOrig.add(vv);
       i++;

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/HashTableTemplate.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/HashTableTemplate.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/HashTableTemplate.java
index e0876af..7d9f568 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/HashTableTemplate.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/common/HashTableTemplate.java
@@ -467,7 +467,7 @@ public abstract class HashTableTemplate implements HashTable {
 
     threshold = (int) Math.ceil(tableSize * loadf);
 
-    dummyIntField = MaterializedField.create(SchemaPath.getSimplePath("dummy"), Types.required(MinorType.INT));
+    dummyIntField = MaterializedField.create("dummy", Types.required(MinorType.INT));
 
     startIndices = allocMetadataVector(tableSize, EMPTY_SLOT);
 

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/flatten/FlattenRecordBatch.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/flatten/FlattenRecordBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/flatten/FlattenRecordBatch.java
index f1d6dfc..d8211fd 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/flatten/FlattenRecordBatch.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/flatten/FlattenRecordBatch.java
@@ -25,6 +25,7 @@ import org.apache.drill.common.expression.ErrorCollector;
 import org.apache.drill.common.expression.ErrorCollectorImpl;
 import org.apache.drill.common.expression.FieldReference;
 import org.apache.drill.common.expression.LogicalExpression;
+import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.logical.data.NamedExpression;
 import org.apache.drill.exec.exception.ClassTransformationException;
 import org.apache.drill.exec.exception.OutOfMemoryException;
@@ -264,12 +265,12 @@ public class FlattenRecordBatch extends AbstractSingleRecordBatch<FlattenPOP> {
 
     TransferPair tp = null;
     if (flattenField instanceof RepeatedMapVector) {
-      tp = ((RepeatedMapVector)flattenField).getTransferPairToSingleMap(reference, oContext.getAllocator());
+      tp = ((RepeatedMapVector)flattenField).getTransferPairToSingleMap(reference.getAsNamePart().getName(), oContext.getAllocator());
     } else {
       final ValueVector vvIn = RepeatedValueVector.class.cast(flattenField).getDataVector();
       // vvIn may be null because of fast schema return for repeated list vectors
       if (vvIn != null) {
-        tp = vvIn.getTransferPair(reference, oContext.getAllocator());
+        tp = vvIn.getTransferPair(reference.getAsNamePart().getName(), oContext.getAllocator());
       }
     }
     return tp;
@@ -360,10 +361,10 @@ public class FlattenRecordBatch extends AbstractSingleRecordBatch<FlattenPOP> {
 
     List<NamedExpression> exprs = Lists.newArrayList();
     for (MaterializedField field : incoming.getSchema()) {
-      if (field.getPath().equals(popConfig.getColumn())) {
+      if (field.getPath().equals(popConfig.getColumn().getAsUnescapedPath())) {
         continue;
       }
-      exprs.add(new NamedExpression(field.getPath(), new FieldReference(field.getPath())));
+      exprs.add(new NamedExpression(SchemaPath.getSimplePath(field.getPath()), new FieldReference(field.getPath())));
     }
     return exprs;
   }

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/orderedpartitioner/OrderedPartitionRecordBatch.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/orderedpartitioner/OrderedPartitionRecordBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/orderedpartitioner/OrderedPartitionRecordBatch.java
index 64cfad0..897870c 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/orderedpartitioner/OrderedPartitionRecordBatch.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/orderedpartitioner/OrderedPartitionRecordBatch.java
@@ -150,7 +150,7 @@ public class OrderedPartitionRecordBatch extends AbstractRecordBatch<OrderedPart
     this.minorFragmentSampleCount = cache.getCounter(mapKey);
 
     SchemaPath outputPath = popConfig.getRef();
-    MaterializedField outputField = MaterializedField.create(outputPath, Types.required(TypeProtos.MinorType.INT));
+    MaterializedField outputField = MaterializedField.create(outputPath.getAsNamePart().getName(), Types.required(TypeProtos.MinorType.INT));
     this.partitionKeyVector = (IntVector) TypeHelper.getNewVector(outputField, oContext.getAllocator());
 
   }
@@ -430,7 +430,7 @@ public class OrderedPartitionRecordBatch extends AbstractRecordBatch<OrderedPart
       TypeProtos.MajorType.Builder builder = TypeProtos.MajorType.newBuilder().mergeFrom(expr.getMajorType())
           .clearMode().setMode(TypeProtos.DataMode.REQUIRED);
       TypeProtos.MajorType newType = builder.build();
-      MaterializedField outputField = MaterializedField.create(schemaPath, newType);
+      MaterializedField outputField = MaterializedField.create(schemaPath.getAsUnescapedPath(), newType);
       if (collector.hasErrors()) {
         throw new SchemaChangeException(String.format(
             "Failure while trying to materialize incoming schema.  Errors:\n %s.", collector.toErrorString()));

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/producer/ProducerConsumerBatch.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/producer/ProducerConsumerBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/producer/ProducerConsumerBatch.java
index 38d08b6..85844c0 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/producer/ProducerConsumerBatch.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/producer/ProducerConsumerBatch.java
@@ -21,6 +21,7 @@ import java.util.concurrent.BlockingDeque;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.LinkedBlockingDeque;
 
+import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.types.TypeProtos.MajorType;
 import org.apache.drill.exec.exception.OutOfMemoryException;
 import org.apache.drill.exec.expr.TypeHelper;
@@ -99,9 +100,9 @@ public class ProducerConsumerBatch extends AbstractRecordBatch {
         final MaterializedField field = schema.getColumn(i);
         final MajorType type = field.getType();
         final ValueVector vOut = container.getValueAccessorById(TypeHelper.getValueVectorClass(type.getMinorType(), type.getMode()),
-                container.getValueVectorId(field.getPath()).getFieldIds()).getValueVector();
+                container.getValueVectorId(SchemaPath.getSimplePath(field.getPath())).getFieldIds()).getValueVector();
         final ValueVector vIn = newContainer.getValueAccessorById(TypeHelper.getValueVectorClass(type.getMinorType(), type.getMode()),
-                newContainer.getValueVectorId(field.getPath()).getFieldIds()).getValueVector();
+                newContainer.getValueVectorId(SchemaPath.getSimplePath(field.getPath())).getFieldIds()).getValueVector();
         final TransferPair tp = vIn.makeTransferPair(vOut);
         tp.transfer();
       }

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/project/ProjectRecordBatch.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/project/ProjectRecordBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/project/ProjectRecordBatch.java
index 56bfa79..5ba7b5a 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/project/ProjectRecordBatch.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/project/ProjectRecordBatch.java
@@ -325,7 +325,7 @@ public class ProjectRecordBatch extends AbstractSingleRecordBatch<Project> {
                 continue;
               }
               final FieldReference ref = new FieldReference(name);
-              final ValueVector vvOut = container.addOrGet(MaterializedField.create(ref, vvIn.getField().getType()), callBack);
+              final ValueVector vvOut = container.addOrGet(MaterializedField.create(ref.getAsNamePart().getName(), vvIn.getField().getType()), callBack);
               final TransferPair tp = vvIn.makeTransferPair(vvOut);
               transfers.add(tp);
             }
@@ -333,7 +333,7 @@ public class ProjectRecordBatch extends AbstractSingleRecordBatch<Project> {
             int k = 0;
             for (final VectorWrapper<?> wrapper : incoming) {
               final ValueVector vvIn = wrapper.getValueVector();
-              final SchemaPath originalPath = vvIn.getField().getPath();
+              final SchemaPath originalPath = SchemaPath.getSimplePath(vvIn.getField().getPath());
               if (k > result.outputNames.size()-1) {
                 assert false;
               }
@@ -350,7 +350,7 @@ public class ProjectRecordBatch extends AbstractSingleRecordBatch<Project> {
               final MaterializedField outputField = MaterializedField.create(name, expr.getMajorType());
               final ValueVector vv = container.addOrGet(outputField, callBack);
               allocationVectors.add(vv);
-              final TypedFieldId fid = container.getValueVectorId(outputField.getPath());
+              final TypedFieldId fid = container.getValueVectorId(SchemaPath.getSimplePath(outputField.getPath()));
               final ValueVectorWriteExpression write = new ValueVectorWriteExpression(fid, expr, true);
               final HoldingContainer hc = cg.addExpr(write, false);
             }
@@ -400,7 +400,7 @@ public class ProjectRecordBatch extends AbstractSingleRecordBatch<Project> {
         Preconditions.checkNotNull(incoming);
 
         final FieldReference ref = getRef(namedExpression);
-        final ValueVector vvOut = container.addOrGet(MaterializedField.create(ref, vectorRead.getMajorType()), callBack);
+        final ValueVector vvOut = container.addOrGet(MaterializedField.create(ref.getAsUnescapedPath(), vectorRead.getMajorType()), callBack);
         final TransferPair tp = vvIn.makeTransferPair(vvOut);
         transfers.add(tp);
         transferFieldIds.add(vectorRead.getFieldId().getFieldIds()[0]);
@@ -421,7 +421,7 @@ public class ProjectRecordBatch extends AbstractSingleRecordBatch<Project> {
         // need to do evaluation.
         final ValueVector vector = container.addOrGet(outputField, callBack);
         allocationVectors.add(vector);
-        final TypedFieldId fid = container.getValueVectorId(outputField.getPath());
+        final TypedFieldId fid = container.getValueVectorId(SchemaPath.getSimplePath(outputField.getPath()));
         final boolean useSetSafe = !(vector instanceof FixedWidthVector);
         final ValueVectorWriteExpression write = new ValueVectorWriteExpression(fid, expr, useSetSafe);
         final HoldingContainer hc = cg.addExpr(write, false);
@@ -461,7 +461,7 @@ public class ProjectRecordBatch extends AbstractSingleRecordBatch<Project> {
     final List<NamedExpression> exprs = Lists.newArrayList();
     for (final MaterializedField field : incoming.getSchema()) {
       if (Types.isComplex(field.getType()) || Types.isRepeated(field.getType())) {
-        final LogicalExpression convertToJson = FunctionCallFactory.createConvert(ConvertExpression.CONVERT_TO, "JSON", field.getPath(), ExpressionPosition.UNKNOWN);
+        final LogicalExpression convertToJson = FunctionCallFactory.createConvert(ConvertExpression.CONVERT_TO, "JSON", SchemaPath.getSimplePath(field.getPath()), ExpressionPosition.UNKNOWN);
         final String castFuncName = CastFunctions.getCastFunc(MinorType.VARCHAR);
         final List<LogicalExpression> castArgs = Lists.newArrayList();
         castArgs.add(convertToJson);  //input_expr
@@ -474,7 +474,7 @@ public class ProjectRecordBatch extends AbstractSingleRecordBatch<Project> {
         final FunctionCall castCall = new FunctionCall(castFuncName, castArgs, ExpressionPosition.UNKNOWN);
         exprs.add(new NamedExpression(castCall, new FieldReference(field.getPath())));
       } else {
-        exprs.add(new NamedExpression(field.getPath(), new FieldReference(field.getPath())));
+        exprs.add(new NamedExpression(SchemaPath.getSimplePath(field.getPath()), new FieldReference(field.getPath())));
       }
     }
     return exprs;
@@ -590,7 +590,7 @@ public class ProjectRecordBatch extends AbstractSingleRecordBatch<Project> {
       result.outputNames = Lists.newArrayList();
       for(final VectorWrapper<?> wrapper : incoming) {
         final ValueVector vvIn = wrapper.getValueVector();
-        final String name = vvIn.getField().getPath().getRootSegment().getPath();
+        final String name = vvIn.getField().getPath();
 
         // add the prefix to the incoming column name
         final String newName = prefix + StarColumnHelper.PREFIX_DELIMITER + name;
@@ -610,7 +610,7 @@ public class ProjectRecordBatch extends AbstractSingleRecordBatch<Project> {
 
         for (final VectorWrapper<?> wrapper : incoming) {
           final ValueVector vvIn = wrapper.getValueVector();
-          final String incomingName = vvIn.getField().getPath().getRootSegment().getPath();
+          final String incomingName = vvIn.getField().getPath();
           // get the prefix of the name
           final String[] nameComponents = incomingName.split(StarColumnHelper.PREFIX_DELIMITER, 2);
           // if incoming valuevector does not have a prefix, ignore it since this expression is not referencing it
@@ -633,7 +633,7 @@ public class ProjectRecordBatch extends AbstractSingleRecordBatch<Project> {
         if (exprContainsStar) {
           for (final VectorWrapper<?> wrapper : incoming) {
             final ValueVector vvIn = wrapper.getValueVector();
-            final String incomingName = vvIn.getField().getPath().getRootSegment().getPath();
+            final String incomingName = vvIn.getField().getPath();
             if (refContainsStar) {
               addToResultMaps(incomingName, result, true); // allow dups since this is likely top-level project
             } else {
@@ -656,7 +656,7 @@ public class ProjectRecordBatch extends AbstractSingleRecordBatch<Project> {
       result.outputNames = Lists.newArrayList();
       for (final VectorWrapper<?> wrapper : incoming) {
         final ValueVector vvIn = wrapper.getValueVector();
-        final String incomingName = vvIn.getField().getPath().getRootSegment().getPath();
+        final String incomingName = vvIn.getField().getPath();
         addToResultMaps(incomingName, result, true); // allow dups since this is likely top-level project
       }
     }
@@ -677,7 +677,7 @@ public class ProjectRecordBatch extends AbstractSingleRecordBatch<Project> {
 
       for (final VectorWrapper<?> wrapper : incoming) {
         final ValueVector vvIn = wrapper.getValueVector();
-        final String name = vvIn.getField().getPath().getRootSegment().getPath();
+        final String name = vvIn.getField().getPath();
         final String[] components = name.split(StarColumnHelper.PREFIX_DELIMITER, 2);
         if (components.length <= 1)  {
           k++;
@@ -714,7 +714,7 @@ public class ProjectRecordBatch extends AbstractSingleRecordBatch<Project> {
       result.outputNames = Lists.newArrayList();
       for (final VectorWrapper<?> wrapper : incoming) {
         final ValueVector vvIn = wrapper.getValueVector();
-        final String incomingName = vvIn.getField().getPath().getRootSegment().getPath();
+        final String incomingName = vvIn.getField().getPath();
         if (expr.getPath().equalsIgnoreCase(incomingName)) {  // case insensitive matching of field name.
           final String newName = ref.getPath();
           addToResultMaps(newName, result, true);

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/union/UnionAllRecordBatch.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/union/UnionAllRecordBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/union/UnionAllRecordBatch.java
index 55b9afe..a8b8aeb 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/union/UnionAllRecordBatch.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/union/UnionAllRecordBatch.java
@@ -167,9 +167,9 @@ public class UnionAllRecordBatch extends AbstractRecordBatch<UnionAll> {
     for(VectorWrapper<?> vw : current) {
       ValueVector vvIn = vw.getValueVector();
       // get the original input column names
-      SchemaPath inputPath = vvIn.getField().getPath();
+      SchemaPath inputPath = SchemaPath.getSimplePath(vvIn.getField().getPath());
       // get the renamed column names
-      SchemaPath outputPath = outputFields.get(index).getPath();
+      SchemaPath outputPath = SchemaPath.getSimplePath(outputFields.get(index).getPath());
 
       final ErrorCollector collector = new ErrorCollectorImpl();
       // According to input data names, Minortypes, Datamodes, choose to
@@ -185,7 +185,7 @@ public class UnionAllRecordBatch extends AbstractRecordBatch<UnionAll> {
           }
 
           ValueVectorReadExpression vectorRead = (ValueVectorReadExpression) expr;
-          ValueVector vvOut = container.addOrGet(MaterializedField.create(outputPath, vectorRead.getMajorType()));
+          ValueVector vvOut = container.addOrGet(MaterializedField.create(outputPath.getAsUnescapedPath(), vectorRead.getMajorType()));
           TransferPair tp = vvIn.makeTransferPair(vvOut);
           transfers.add(tp);
         // Copy data in order to rename the column
@@ -195,10 +195,10 @@ public class UnionAllRecordBatch extends AbstractRecordBatch<UnionAll> {
             throw new SchemaChangeException(String.format("Failure while trying to materialize incoming schema.  Errors:\n %s.", collector.toErrorString()));
           }
 
-          MaterializedField outputField = MaterializedField.create(outputPath, expr.getMajorType());
+          MaterializedField outputField = MaterializedField.create(outputPath.getAsUnescapedPath(), expr.getMajorType());
           ValueVector vv = container.addOrGet(outputField, callBack);
           allocationVectors.add(vv);
-          TypedFieldId fid = container.getValueVectorId(outputField.getPath());
+          TypedFieldId fid = container.getValueVectorId(SchemaPath.getSimplePath(outputField.getPath()));
           ValueVectorWriteExpression write = new ValueVectorWriteExpression(fid, expr, true);
           cg.addExpr(write);
         }
@@ -228,10 +228,10 @@ public class UnionAllRecordBatch extends AbstractRecordBatch<UnionAll> {
           }
         }
 
-        final MaterializedField outputField = MaterializedField.create(outputPath, expr.getMajorType());
+        final MaterializedField outputField = MaterializedField.create(outputPath.getAsUnescapedPath(), expr.getMajorType());
         ValueVector vector = container.addOrGet(outputField, callBack);
         allocationVectors.add(vector);
-        TypedFieldId fid = container.getValueVectorId(outputField.getPath());
+        TypedFieldId fid = container.getValueVectorId(SchemaPath.getSimplePath(outputField.getPath()));
 
         boolean useSetSafe = !(vector instanceof FixedWidthVector);
         ValueVectorWriteExpression write = new ValueVectorWriteExpression(fid, expr, useSetSafe);

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/window/WindowFunction.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/window/WindowFunction.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/window/WindowFunction.java
index 1c71297..a983df5 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/window/WindowFunction.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/window/WindowFunction.java
@@ -136,7 +136,7 @@ public abstract class WindowFunction {
       }
 
       // add corresponding ValueVector to container
-      final MaterializedField output = MaterializedField.create(ne.getRef(), aggregate.getMajorType());
+      final MaterializedField output = MaterializedField.create(ne.getRef().getAsNamePart().getName(), aggregate.getMajorType());
       batch.addOrGet(output).allocateNew();
       TypedFieldId outputId = batch.getValueVectorId(ne.getRef());
       writeAggregationToOutput = new ValueVectorWriteExpression(outputId, aggregate, true);
@@ -205,7 +205,7 @@ public abstract class WindowFunction {
     @Override
     boolean materialize(final NamedExpression ne, final VectorContainer batch, FunctionLookupContext registry)
         throws SchemaChangeException {
-      final MaterializedField outputField = MaterializedField.create(ne.getRef(), getMajorType());
+      final MaterializedField outputField = MaterializedField.create(ne.getRef().getAsNamePart().getName(), getMajorType());
       batch.addOrGet(outputField).allocateNew();
       fieldId = batch.getValueVectorId(ne.getRef());
       return true;
@@ -256,7 +256,7 @@ public abstract class WindowFunction {
         throws SchemaChangeException {
       final FunctionCall call = (FunctionCall) ne.getExpr();
       final LogicalExpression argument = call.args.get(0);
-      final MaterializedField outputField = MaterializedField.create(ne.getRef(), argument.getMajorType());
+      final MaterializedField outputField = MaterializedField.create(ne.getRef().getAsNamePart().getName(), argument.getMajorType());
       batch.addOrGet(outputField).allocateNew();
       fieldId = batch.getValueVectorId(ne.getRef());
 
@@ -310,7 +310,7 @@ public abstract class WindowFunction {
       }
 
       // add corresponding ValueVector to container
-      final MaterializedField output = MaterializedField.create(ne.getRef(), majorType);
+      final MaterializedField output = MaterializedField.create(ne.getRef().getAsNamePart().getName(), majorType);
       batch.addOrGet(output).allocateNew();
       final TypedFieldId outputId =  batch.getValueVectorId(ne.getRef());
 
@@ -358,7 +358,7 @@ public abstract class WindowFunction {
       }
 
       // add lag output ValueVector to container
-      final MaterializedField output = MaterializedField.create(ne.getRef(), majorType);
+      final MaterializedField output = MaterializedField.create(ne.getRef().getAsNamePart().getName(), majorType);
       batch.addOrGet(output).allocateNew();
       final TypedFieldId outputId = batch.getValueVectorId(ne.getRef());
 
@@ -422,7 +422,7 @@ public abstract class WindowFunction {
         return false;
       }
 
-      final MaterializedField output = MaterializedField.create(ne.getRef(), input.getMajorType());
+      final MaterializedField output = MaterializedField.create(ne.getRef().getAsNamePart().getName(), input.getMajorType());
       batch.addOrGet(output).allocateNew();
       final TypedFieldId outputId = batch.getValueVectorId(ne.getRef());
 
@@ -483,7 +483,7 @@ public abstract class WindowFunction {
         return false;
       }
 
-      final MaterializedField output = MaterializedField.create(ne.getRef(), input.getMajorType());
+      final MaterializedField output = MaterializedField.create(ne.getRef().getAsNamePart().getName(), input.getMajorType());
       batch.addOrGet(output).allocateNew();
       final TypedFieldId outputId = batch.getValueVectorId(ne.getRef());
 

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/xsort/ExternalSortBatch.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/xsort/ExternalSortBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/xsort/ExternalSortBatch.java
index b2aa305..7797339 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/xsort/ExternalSortBatch.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/xsort/ExternalSortBatch.java
@@ -31,6 +31,7 @@ import org.apache.drill.common.exceptions.UserException;
 import org.apache.drill.common.expression.ErrorCollector;
 import org.apache.drill.common.expression.ErrorCollectorImpl;
 import org.apache.drill.common.expression.LogicalExpression;
+import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.logical.data.Order.Ordering;
 import org.apache.drill.exec.ExecConstants;
 import org.apache.drill.exec.compile.sig.GeneratorMapping;
@@ -628,7 +629,7 @@ public class ExternalSortBatch extends AbstractRecordBatch<ExternalSort> {
       for (BatchGroup group : batchGroupList) {
         vectors[i++] = group.getValueAccessorById(
             field.getValueClass(),
-            group.getValueVectorId(field.getPath()).getFieldIds())
+            group.getValueVectorId(SchemaPath.getSimplePath(field.getPath())).getFieldIds())
             .getValueVector();
       }
       cont.add(vectors);

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/partition/PruneScanRule.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/partition/PruneScanRule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/partition/PruneScanRule.java
index 5ef35d3..6a365e8 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/partition/PruneScanRule.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/partition/PruneScanRule.java
@@ -235,7 +235,7 @@ public abstract class PruneScanRule extends StoragePluginOptimizerRule {
         for (int partitionColumnIndex : BitSets.toIter(partitionColumnBitSet)) {
           SchemaPath column = SchemaPath.getSimplePath(fieldNameMap.get(partitionColumnIndex));
           MajorType type = descriptor.getVectorType(column, settings);
-          MaterializedField field = MaterializedField.create(column, type);
+          MaterializedField field = MaterializedField.create(column.getAsUnescapedPath(), type);
           ValueVector v = TypeHelper.getNewVector(field, allocator);
           v.allocateNew();
           vectors[partitionColumnIndex] = v;

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/record/RecordBatchLoader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/record/RecordBatchLoader.java b/exec/java-exec/src/main/java/org/apache/drill/exec/record/RecordBatchLoader.java
index 13164b9..84c616b 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/record/RecordBatchLoader.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/record/RecordBatchLoader.java
@@ -83,10 +83,10 @@ public class RecordBatchLoader implements VectorAccessible, Iterable<VectorWrapp
     // the schema has changed since the previous call.
 
     // Set up to recognize previous fields that no longer exist.
-    final Map<MaterializedField, ValueVector> oldFields = Maps.newHashMap();
+    final Map<String, ValueVector> oldFields = Maps.newHashMap();
     for(final VectorWrapper<?> wrapper : container) {
       final ValueVector vector = wrapper.getValueVector();
-      oldFields.put(vector.getField(), vector);
+      oldFields.put(vector.getField().getPath(), vector);
     }
 
     final VectorContainer newVectors = new VectorContainer();
@@ -95,7 +95,7 @@ public class RecordBatchLoader implements VectorAccessible, Iterable<VectorWrapp
       int bufOffset = 0;
       for(final SerializedField field : fields) {
         final MaterializedField fieldDef = MaterializedField.create(field);
-        ValueVector vector = oldFields.remove(fieldDef);
+        ValueVector vector = oldFields.remove(fieldDef.getPath());
 
         if (vector == null) {
           // Field did not exist previously--is schema change.

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/record/SchemaUtil.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/record/SchemaUtil.java b/exec/java-exec/src/main/java/org/apache/drill/exec/record/SchemaUtil.java
index e13e742..d6a8a40 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/record/SchemaUtil.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/record/SchemaUtil.java
@@ -54,7 +54,7 @@ public class SchemaUtil {
 
     for (BatchSchema s : schemas) {
       for (MaterializedField field : s) {
-        SchemaPath path = field.getPath();
+        SchemaPath path = SchemaPath.getSimplePath(field.getPath());
         Set<MinorType> currentTypes = typeSetMap.get(path);
         if (currentTypes == null) {
           currentTypes = Sets.newHashSet();
@@ -83,10 +83,10 @@ public class SchemaUtil {
         for (MinorType t : types) {
           builder.addSubType(t);
         }
-        MaterializedField field = MaterializedField.create(path, builder.build());
+        MaterializedField field = MaterializedField.create(path.getAsUnescapedPath(), builder.build());
         fields.add(field);
       } else {
-        MaterializedField field = MaterializedField.create(path, Types.optional(types.iterator().next()));
+        MaterializedField field = MaterializedField.create(path.getAsUnescapedPath(), Types.optional(types.iterator().next()));
         fields.add(field);
       }
     }
@@ -153,7 +153,7 @@ public class SchemaUtil {
   public static VectorContainer coerceContainer(VectorAccessible in, BatchSchema toSchema, OperatorContext context) {
     int recordCount = in.getRecordCount();
     boolean isHyper = false;
-    Map<SchemaPath, Object> vectorMap = Maps.newHashMap();
+    Map<String, Object> vectorMap = Maps.newHashMap();
     for (VectorWrapper w : in) {
       if (w.isHyper()) {
         isHyper = true;

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/record/TypedFieldId.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/record/TypedFieldId.java b/exec/java-exec/src/main/java/org/apache/drill/exec/record/TypedFieldId.java
new file mode 100644
index 0000000..a322f72
--- /dev/null
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/record/TypedFieldId.java
@@ -0,0 +1,273 @@
+/**
+ * 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.record;
+
+import java.util.Arrays;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.drill.common.expression.PathSegment;
+import org.apache.drill.common.types.TypeProtos.MajorType;
+import org.apache.drill.exec.expr.BasicTypeHelper;
+import org.apache.drill.exec.vector.ValueVector;
+
+import com.carrotsearch.hppc.IntArrayList;
+import com.google.common.base.Preconditions;
+
+public class TypedFieldId {
+  final MajorType finalType;
+  final MajorType secondaryFinal;
+  final MajorType intermediateType;
+  final int[] fieldIds;
+  final boolean isHyperReader;
+  final boolean isListVector;
+  final PathSegment remainder;
+
+  public TypedFieldId(MajorType type, int... fieldIds) {
+    this(type, type, type, false, null, fieldIds);
+  }
+
+  public TypedFieldId(MajorType type, IntArrayList breadCrumb, PathSegment remainder) {
+    this(type, type, type, false, remainder, breadCrumb.toArray());
+  }
+
+  public TypedFieldId(MajorType type, boolean isHyper, int... fieldIds) {
+    this(type, type, type, isHyper, null, fieldIds);
+  }
+
+  public TypedFieldId(MajorType intermediateType, MajorType secondaryFinal, MajorType finalType, boolean isHyper, PathSegment remainder, int... fieldIds) {
+    this(intermediateType, secondaryFinal, finalType, isHyper, false, remainder, fieldIds);
+  }
+
+  public TypedFieldId(MajorType intermediateType, MajorType secondaryFinal, MajorType finalType, boolean isHyper, boolean isListVector, PathSegment remainder, int... fieldIds) {
+    super();
+    this.intermediateType = intermediateType;
+    this.finalType = finalType;
+    this.secondaryFinal = secondaryFinal;
+    this.fieldIds = fieldIds;
+    this.isHyperReader = isHyper;
+    this.isListVector = isListVector;
+    this.remainder = remainder;
+  }
+
+  public TypedFieldId cloneWithChild(int id) {
+    int[] fieldIds = ArrayUtils.add(this.fieldIds, id);
+    return new TypedFieldId(intermediateType, secondaryFinal, finalType, isHyperReader, remainder, fieldIds);
+  }
+
+  public PathSegment getLastSegment() {
+    if (remainder == null) {
+      return null;
+    }
+    PathSegment seg = remainder;
+    while (seg.getChild() != null) {
+      seg = seg.getChild();
+    }
+    return seg;
+  }
+
+  public TypedFieldId cloneWithRemainder(PathSegment remainder) {
+    return new TypedFieldId(intermediateType, secondaryFinal, finalType, isHyperReader, remainder, fieldIds);
+  }
+
+  public boolean hasRemainder() {
+    return remainder != null;
+  }
+
+  public PathSegment getRemainder() {
+    return remainder;
+  }
+
+  public boolean isHyperReader() {
+    return isHyperReader;
+  }
+
+  public boolean isListVector() {
+    return isListVector;
+  }
+
+  public MajorType getIntermediateType() {
+    return intermediateType;
+  }
+
+  public Class<? extends ValueVector> getIntermediateClass() {
+    return (Class<? extends ValueVector>) BasicTypeHelper.getValueVectorClass(intermediateType.getMinorType(),
+        intermediateType.getMode());
+  }
+
+  public MajorType getFinalType() {
+    return finalType;
+  }
+
+  public int[] getFieldIds() {
+    return fieldIds;
+  }
+
+  public MajorType getSecondaryFinal() {
+    return secondaryFinal;
+  }
+
+  public static Builder newBuilder() {
+    return new Builder();
+  }
+
+  public static class Builder{
+    final IntArrayList ids = new IntArrayList();
+    MajorType finalType;
+    MajorType intermediateType;
+    MajorType secondaryFinal;
+    PathSegment remainder;
+    boolean hyperReader = false;
+    boolean withIndex = false;
+    boolean isListVector = false;
+
+    public Builder addId(int id) {
+      ids.add(id);
+      return this;
+    }
+
+    public Builder withIndex() {
+      withIndex = true;
+      return this;
+    }
+
+    public Builder remainder(PathSegment remainder) {
+      this.remainder = remainder;
+      return this;
+    }
+
+    public Builder hyper() {
+      this.hyperReader = true;
+      return this;
+    }
+
+    public Builder listVector() {
+      this.isListVector = true;
+      return this;
+    }
+
+    public Builder finalType(MajorType finalType) {
+      this.finalType = finalType;
+      return this;
+    }
+
+    public Builder secondaryFinal(MajorType secondaryFinal) {
+      this.secondaryFinal = secondaryFinal;
+      return this;
+    }
+
+    public Builder intermediateType(MajorType intermediateType) {
+      this.intermediateType = intermediateType;
+      return this;
+    }
+
+    public TypedFieldId build() {
+      Preconditions.checkNotNull(intermediateType);
+      Preconditions.checkNotNull(finalType);
+
+      if (intermediateType == null) {
+        intermediateType = finalType;
+      }
+      if (secondaryFinal == null) {
+        secondaryFinal = finalType;
+      }
+
+      MajorType actualFinalType = finalType;
+      //MajorType secondaryFinal = finalType;
+
+      // if this has an index, switch to required type for output
+      //if(withIndex && intermediateType == finalType) actualFinalType = finalType.toBuilder().setMode(DataMode.REQUIRED).build();
+
+      // if this isn't a direct access, switch the final type to nullable as offsets may be null.
+      // TODO: there is a bug here with some things.
+      //if(intermediateType != finalType) actualFinalType = finalType.toBuilder().setMode(DataMode.OPTIONAL).build();
+
+      return new TypedFieldId(intermediateType, secondaryFinal, actualFinalType, hyperReader, isListVector, remainder, ids.toArray());
+    }
+  }
+
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + Arrays.hashCode(fieldIds);
+    result = prime * result + ((finalType == null) ? 0 : finalType.hashCode());
+    result = prime * result + ((intermediateType == null) ? 0 : intermediateType.hashCode());
+    result = prime * result + (isHyperReader ? 1231 : 1237);
+    result = prime * result + ((remainder == null) ? 0 : remainder.hashCode());
+    result = prime * result + ((secondaryFinal == null) ? 0 : secondaryFinal.hashCode());
+    return result;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj) {
+      return true;
+    }
+    if (obj == null) {
+      return false;
+    }
+    if (getClass() != obj.getClass()) {
+      return false;
+    }
+    TypedFieldId other = (TypedFieldId) obj;
+    if (!Arrays.equals(fieldIds, other.fieldIds)) {
+      return false;
+    }
+    if (finalType == null) {
+      if (other.finalType != null) {
+        return false;
+      }
+    } else if (!finalType.equals(other.finalType)) {
+      return false;
+    }
+    if (intermediateType == null) {
+      if (other.intermediateType != null) {
+        return false;
+      }
+    } else if (!intermediateType.equals(other.intermediateType)) {
+      return false;
+    }
+    if (isHyperReader != other.isHyperReader) {
+      return false;
+    }
+    if (remainder == null) {
+      if (other.remainder != null) {
+        return false;
+      }
+    } else if (!remainder.equals(other.remainder)) {
+      return false;
+    }
+    if (secondaryFinal == null) {
+      if (other.secondaryFinal != null) {
+        return false;
+      }
+    } else if (!secondaryFinal.equals(other.secondaryFinal)) {
+      return false;
+    }
+    return true;
+  }
+
+  @Override
+  public String toString() {
+    final int maxLen = 10;
+    return "TypedFieldId [fieldIds="
+        + (fieldIds != null ? Arrays.toString(Arrays.copyOf(fieldIds, Math.min(fieldIds.length, maxLen))) : null)
+        + ", remainder=" + remainder + "]";
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/record/VectorContainer.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/record/VectorContainer.java b/exec/java-exec/src/main/java/org/apache/drill/exec/record/VectorContainer.java
index 33351ba..663cf22 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/record/VectorContainer.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/record/VectorContainer.java
@@ -116,7 +116,7 @@ public class VectorContainer implements Iterable<VectorWrapper<?>>, VectorAccess
   }
 
   public <T extends ValueVector> T addOrGet(final MaterializedField field, final SchemaChangeCallBack callBack) {
-    final TypedFieldId id = getValueVectorId(field.getPath());
+    final TypedFieldId id = getValueVectorId(SchemaPath.getSimplePath(field.getPath()));
     final ValueVector vector;
     final Class<?> clazz = TypeHelper.getValueVectorClass(field.getType().getMinorType(), field.getType().getMode());
     if (id != null) {
@@ -183,7 +183,7 @@ public class VectorContainer implements Iterable<VectorWrapper<?>>, VectorAccess
     // Sort list of VectorWrapper alphabetically based on SchemaPath.
     Collections.sort(canonicalWrappers, new Comparator<VectorWrapper<?>>() {
       public int compare(VectorWrapper<?> v1, VectorWrapper<?> v2) {
-        return v1.getField().getPath().toExpr().compareTo(v2.getField().getPath().toExpr());
+        return v1.getField().getPath().compareTo(v2.getField().getPath());
       }
     });
 

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/schema/Field.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/schema/Field.java b/exec/java-exec/src/main/java/org/apache/drill/exec/schema/Field.java
index 35732ac..fd5698a 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/schema/Field.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/schema/Field.java
@@ -38,16 +38,6 @@ public abstract class Field {
     this.parentSchema = parentSchema;
   }
 
-  public MaterializedField getAsMaterializedField(FieldReference ref) {
-    assert (ref!=null);
-
-    return MaterializedField.create(ref.getChild(getFieldName()), fieldType);
-  }
-
-  public MaterializedField getAsMaterializedField() {
-      return MaterializedField.create(SchemaPath.getCompoundPath(getFieldName().split("\\.")), fieldType);
-  }
-
   public abstract String getFieldName();
 
   public String getFullFieldName() {

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/QueryWrapper.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/QueryWrapper.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/QueryWrapper.java
index f67c002..6784b82 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/QueryWrapper.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/QueryWrapper.java
@@ -147,7 +147,7 @@ public class QueryWrapper {
             // TODO:  Clean:  DRILL-2933:  That load(...) no longer throws
             // SchemaChangeException, so check/clean catch clause below.
             for (int i = 0; i < loader.getSchema().getFieldCount(); ++i) {
-              columns.add(loader.getSchema().getColumn(i).getPath().getAsUnescapedPath());
+              columns.add(loader.getSchema().getColumn(i).getPath());
             }
             for (int i = 0; i < rows; ++i) {
               final Map<String, String> record = Maps.newHashMap();

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/store/AbstractRecordReader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/AbstractRecordReader.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/AbstractRecordReader.java
index b25eae1..2ddcbaa 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/AbstractRecordReader.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/AbstractRecordReader.java
@@ -26,7 +26,7 @@ import org.apache.drill.common.expression.PathSegment;
 import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.exec.exception.OutOfMemoryException;
 import org.apache.drill.exec.physical.base.GroupScan;
-import org.apache.drill.exec.record.MaterializedField.Key;
+import org.apache.drill.exec.record.MaterializedField;
 import org.apache.drill.exec.vector.ValueVector;
 
 import com.google.common.base.Preconditions;
@@ -102,7 +102,7 @@ public abstract class AbstractRecordReader implements RecordReader {
   }
 
   @Override
-  public void allocate(Map<Key, ValueVector> vectorMap) throws OutOfMemoryException {
+  public void allocate(Map<String, ValueVector> vectorMap) throws OutOfMemoryException {
     for (final ValueVector v : vectorMap.values()) {
       v.allocateNew();
     }

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/store/RecordReader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/RecordReader.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/RecordReader.java
index 4df1772..11a8403 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/RecordReader.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/RecordReader.java
@@ -23,7 +23,7 @@ import org.apache.drill.common.exceptions.ExecutionSetupException;
 import org.apache.drill.exec.exception.OutOfMemoryException;
 import org.apache.drill.exec.ops.OperatorContext;
 import org.apache.drill.exec.physical.impl.OutputMutator;
-import org.apache.drill.exec.record.MaterializedField.Key;
+import org.apache.drill.exec.record.MaterializedField;
 import org.apache.drill.exec.vector.ValueVector;
 
 public interface RecordReader extends AutoCloseable {
@@ -41,7 +41,7 @@ public interface RecordReader extends AutoCloseable {
    */
   void setup(OperatorContext context, OutputMutator output) throws ExecutionSetupException;
 
-  void allocate(Map<Key, ValueVector> vectorMap) throws OutOfMemoryException;
+  void allocate(Map<String, ValueVector> vectorMap) throws OutOfMemoryException;
 
   /**
    * Increments this record reader forward, writing via the provided output

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/store/avro/AvroRecordReader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/avro/AvroRecordReader.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/avro/AvroRecordReader.java
index 42de8b0..84a584f 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/avro/AvroRecordReader.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/avro/AvroRecordReader.java
@@ -47,6 +47,7 @@ import org.apache.drill.exec.physical.impl.OutputMutator;
 import org.apache.drill.exec.store.AbstractRecordReader;
 import org.apache.drill.exec.store.RecordReader;
 import org.apache.drill.exec.util.ImpersonationUtil;
+import org.apache.drill.exec.vector.complex.fn.FieldSelection;
 import org.apache.drill.exec.vector.complex.impl.MapOrListWriterImpl;
 import org.apache.drill.exec.vector.complex.impl.VectorContainerWriter;
 import org.apache.hadoop.fs.FileSystem;
@@ -69,6 +70,7 @@ public class AvroRecordReader extends AbstractRecordReader {
   private final Path hadoop;
   private final long start;
   private final long end;
+  private final FieldSelection fieldSelection;
   private DrillBuf buffer;
   private VectorContainerWriter writer;
 
@@ -97,6 +99,7 @@ public class AvroRecordReader extends AbstractRecordReader {
     this.opUserName = userName;
     this.queryUserName = fragmentContext.getQueryUserName();
     setColumns(projectedColumns);
+    this.fieldSelection = FieldSelection.getFieldSelection(projectedColumns);
   }
 
   private DataFileReader getReader(final Path hadoop, final FileSystem fs) throws ExecutionSetupException {
@@ -168,14 +171,14 @@ public class AvroRecordReader extends AbstractRecordReader {
 
     switch (type) {
       case RECORD:
-        process(container, schema, null, new MapOrListWriterImpl(writer.rootAsMap()));
+        process(container, schema, null, new MapOrListWriterImpl(writer.rootAsMap()), fieldSelection);
         break;
       default:
         throw new DrillRuntimeException("Root object must be record type. Found: " + type);
     }
   }
 
-  private void process(final Object value, final Schema schema, final String fieldName, MapOrListWriterImpl writer) {
+  private void process(final Object value, final Schema schema, final String fieldName, MapOrListWriterImpl writer, FieldSelection fieldSelection) {
     if (value == null) {
       return;
     }
@@ -194,7 +197,7 @@ public class AvroRecordReader extends AbstractRecordReader {
               _writer = (MapOrListWriterImpl) writer.map(field.name());
           }
 
-          process(((GenericRecord) value).get(field.name()), field.schema(), field.name(), _writer);
+          process(((GenericRecord) value).get(field.name()), field.schema(), field.name(), _writer, fieldSelection.getChild(field.name()));
         }
         break;
       case ARRAY:
@@ -209,7 +212,7 @@ public class AvroRecordReader extends AbstractRecordReader {
         }
         writer.start();
         for (final Object o : array) {
-          process(o, elementSchema, fieldName, writer);
+          process(o, elementSchema, fieldName, writer, fieldSelection.getChild(fieldName));
         }
         writer.end();
         break;
@@ -218,7 +221,7 @@ public class AvroRecordReader extends AbstractRecordReader {
         if (schema.getTypes().get(0).getType() != Schema.Type.NULL) {
           throw new UnsupportedOperationException("Avro union type must be of the format : [\"null\", \"some-type\"]");
         }
-        process(value, schema.getTypes().get(1), fieldName, writer);
+        process(value, schema.getTypes().get(1), fieldName, writer, fieldSelection.getChild(fieldName));
         break;
       case MAP:
         @SuppressWarnings("unchecked")
@@ -227,7 +230,7 @@ public class AvroRecordReader extends AbstractRecordReader {
         writer = (MapOrListWriterImpl) writer.map(fieldName);
         writer.start();
         for (Entry<Object, Object> entry : map.entrySet()) {
-          process(entry.getValue(), valueSchema, entry.getKey().toString(), writer);
+          process(entry.getValue(), valueSchema, entry.getKey().toString(), writer, fieldSelection.getChild(entry.getKey().toString()));
         }
         writer.end();
         break;
@@ -239,14 +242,7 @@ public class AvroRecordReader extends AbstractRecordReader {
         assert fieldName != null;
 
         if (writer.isMapWriter()) {
-          SchemaPath path;
-          if (writer.map.getField().getPath().getRootSegment().getPath().equals("")) {
-            path = new SchemaPath(new PathSegment.NameSegment(fieldName));
-          } else {
-            path = writer.map.getField().getPath().getChild(fieldName);
-          }
-
-          if (!selected(path)) {
+          if (fieldSelection.isNeverValid()) {
             break;
           }
         }

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/sequencefile/SequenceFileRecordReader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/sequencefile/SequenceFileRecordReader.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/sequencefile/SequenceFileRecordReader.java
index 2a131ba..a7f8c7d 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/sequencefile/SequenceFileRecordReader.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/sequencefile/SequenceFileRecordReader.java
@@ -56,8 +56,8 @@ public class SequenceFileRecordReader extends AbstractRecordReader {
   private static final MajorType KEY_TYPE = Types.optional(TypeProtos.MinorType.VARBINARY);
   private static final MajorType VALUE_TYPE = Types.optional(TypeProtos.MinorType.VARBINARY);
 
-  private final SchemaPath keySchema = SchemaPath.getSimplePath("binary_key");
-  private final SchemaPath valueSchema = SchemaPath.getSimplePath("binary_value");
+  private final String keySchema = "binary_key";
+  private final String valueSchema = "binary_value";
 
   private NullableVarBinaryVector keyVector;
   private NullableVarBinaryVector valueVector;
@@ -74,8 +74,8 @@ public class SequenceFileRecordReader extends AbstractRecordReader {
                                   final String queryUserName,
                                   final String opUserName) {
     final List<SchemaPath> columns = new ArrayList<>();
-    columns.add(keySchema);
-    columns.add(valueSchema);
+    columns.add(SchemaPath.getSimplePath(keySchema));
+    columns.add(SchemaPath.getSimplePath(valueSchema));
     setColumns(columns);
     this.dfs = dfs;
     this.split = split;

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/compliant/CompliantTextRecordReader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/compliant/CompliantTextRecordReader.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/compliant/CompliantTextRecordReader.java
index cf2359f..d324270 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/compliant/CompliantTextRecordReader.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/compliant/CompliantTextRecordReader.java
@@ -228,11 +228,11 @@ public class CompliantTextRecordReader extends AbstractRecordReader {
    * This class provides OutputMutator for header extraction.
    */
   private class HeaderOutputMutator implements OutputMutator {
-    private final Map<MaterializedField.Key, ValueVector> fieldVectorMap = Maps.newHashMap();
+    private final Map<String, ValueVector> fieldVectorMap = Maps.newHashMap();
 
     @Override
     public <T extends ValueVector> T addField(MaterializedField field, Class<T> clazz) throws SchemaChangeException {
-      ValueVector v = fieldVectorMap.get(field.key());
+      ValueVector v = fieldVectorMap.get(field);
       if (v == null || v.getClass() != clazz) {
         // Field does not exist add it to the map
         v = TypeHelper.getNewVector(field, oContext.getAllocator());
@@ -240,7 +240,7 @@ public class CompliantTextRecordReader extends AbstractRecordReader {
           throw new SchemaChangeException(String.format(
               "Class %s was provided, expected %s.", clazz.getSimpleName(), v.getClass().getSimpleName()));
         }
-        fieldVectorMap.put(field.key(), v);
+        fieldVectorMap.put(field.getPath(), v);
       }
       return clazz.cast(v);
     }

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/compliant/RepeatedVarCharOutput.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/compliant/RepeatedVarCharOutput.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/compliant/RepeatedVarCharOutput.java
index ca02e97..2ec662e 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/compliant/RepeatedVarCharOutput.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/compliant/RepeatedVarCharOutput.java
@@ -47,7 +47,6 @@ class RepeatedVarCharOutput extends TextOutput {
   static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(RepeatedVarCharOutput.class);
 
   static final String COL_NAME = "columns";
-  static final FieldReference REF = new FieldReference(COL_NAME);
   static final SchemaPath COLUMNS = SchemaPath.getSimplePath("columns");
   public static final int MAXIMUM_NUMBER_COLUMNS = 64 * 1024;
 
@@ -122,7 +121,7 @@ class RepeatedVarCharOutput extends TextOutput {
   public RepeatedVarCharOutput(OutputMutator outputMutator, Collection<SchemaPath> columns, boolean isStarQuery) throws SchemaChangeException {
     super();
 
-    MaterializedField field = MaterializedField.create(REF, Types.repeated(TypeProtos.MinorType.VARCHAR));
+    MaterializedField field = MaterializedField.create(COL_NAME, Types.repeated(TypeProtos.MinorType.VARCHAR));
     this.vector = outputMutator.addField(field, RepeatedVarCharVector.class);
 
     this.mutator = vector.getMutator();

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/store/mock/MockRecordReader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/mock/MockRecordReader.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/mock/MockRecordReader.java
index d2c2425..2f69155 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/mock/MockRecordReader.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/mock/MockRecordReader.java
@@ -29,7 +29,6 @@ import org.apache.drill.exec.ops.FragmentContext;
 import org.apache.drill.exec.ops.OperatorContext;
 import org.apache.drill.exec.physical.impl.OutputMutator;
 import org.apache.drill.exec.record.MaterializedField;
-import org.apache.drill.exec.record.MaterializedField.Key;
 import org.apache.drill.exec.store.AbstractRecordReader;
 import org.apache.drill.exec.store.mock.MockGroupScanPOP.MockColumn;
 import org.apache.drill.exec.store.mock.MockGroupScanPOP.MockScanEntry;
@@ -62,7 +61,7 @@ public class MockRecordReader extends AbstractRecordReader {
 
   private MaterializedField getVector(String name, MajorType type, int length) {
     assert context != null : "Context shouldn't be null.";
-    final MaterializedField f = MaterializedField.create(SchemaPath.getSimplePath(name), type);
+    final MaterializedField f = MaterializedField.create(name, type);
     return f;
   }
 
@@ -101,7 +100,7 @@ public class MockRecordReader extends AbstractRecordReader {
   }
 
   @Override
-  public void allocate(Map<Key, ValueVector> vectorMap) throws OutOfMemoryException {
+  public void allocate(Map<String, ValueVector> vectorMap) throws OutOfMemoryException {
     try {
       for (final ValueVector v : vectorMap.values()) {
         AllocationHelper.allocate(v, Character.MAX_VALUE, 50, 10);

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/columnreaders/ParquetRecordReader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/columnreaders/ParquetRecordReader.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/columnreaders/ParquetRecordReader.java
index 61e05db..da3b067 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/columnreaders/ParquetRecordReader.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/columnreaders/ParquetRecordReader.java
@@ -35,11 +35,9 @@ import org.apache.drill.common.types.Types;
 import org.apache.drill.exec.exception.OutOfMemoryException;
 import org.apache.drill.exec.expr.TypeHelper;
 import org.apache.drill.exec.ops.FragmentContext;
-import org.apache.drill.exec.ops.MetricDef;
 import org.apache.drill.exec.ops.OperatorContext;
 import org.apache.drill.exec.physical.impl.OutputMutator;
 import org.apache.drill.exec.record.MaterializedField;
-import org.apache.drill.exec.record.MaterializedField.Key;
 import org.apache.drill.exec.store.AbstractRecordReader;
 import org.apache.drill.exec.store.parquet.ParquetReaderStats;
 import org.apache.drill.exec.vector.AllocationHelper;
@@ -196,7 +194,7 @@ public class ParquetRecordReader extends AbstractRecordReader {
 
     int i = 0;
     for (SchemaPath expr : getColumns()) {
-      if ( field.matches(expr)) {
+      if ( field.getPath().equalsIgnoreCase(expr.getAsUnescapedPath())) {
         columnsFound[i] = true;
         return true;
       }
@@ -248,7 +246,7 @@ public class ParquetRecordReader extends AbstractRecordReader {
       SchemaElement se = schemaElements.get(column.getPath()[0]);
       MajorType mt = ParquetToDrillTypeConverter.toMajorType(column.getType(), se.getType_length(),
           getDataMode(column), se, fragmentContext.getOptions());
-      field = MaterializedField.create(toFieldName(column.getPath()),mt);
+      field = MaterializedField.create(toFieldName(column.getPath()), mt);
       if ( ! fieldSelected(field)) {
         continue;
       }
@@ -336,7 +334,7 @@ public class ParquetRecordReader extends AbstractRecordReader {
           col = projectedColumns.get(i);
           assert col!=null;
           if ( ! columnsFound[i] && !col.equals(STAR_COLUMN)) {
-            nullFilledVectors.add((NullableIntVector)output.addField(MaterializedField.create(col,
+            nullFilledVectors.add((NullableIntVector)output.addField(MaterializedField.create(col.getAsUnescapedPath(),
                     Types.optional(TypeProtos.MinorType.INT)),
                 (Class<? extends ValueVector>) TypeHelper.getValueVectorClass(TypeProtos.MinorType.INT, DataMode.OPTIONAL)));
 
@@ -355,7 +353,7 @@ public class ParquetRecordReader extends AbstractRecordReader {
   }
 
   @Override
-  public void allocate(Map<Key, ValueVector> vectorMap) throws OutOfMemoryException {
+  public void allocate(Map<String, ValueVector> vectorMap) throws OutOfMemoryException {
     try {
       for (final ValueVector v : vectorMap.values()) {
         AllocationHelper.allocate(v, recordsPerBatch, 50, 10);
@@ -366,8 +364,8 @@ public class ParquetRecordReader extends AbstractRecordReader {
   }
 
 
-  private SchemaPath toFieldName(String[] paths) {
-    return SchemaPath.getCompoundPath(paths);
+  private String toFieldName(String[] paths) {
+    return SchemaPath.getCompoundPath(paths).getAsUnescapedPath();
   }
 
   private TypeProtos.DataMode getDataMode(ColumnDescriptor column) {

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet2/DrillParquetReader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet2/DrillParquetReader.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet2/DrillParquetReader.java
index 27536d3..224d6eb 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet2/DrillParquetReader.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet2/DrillParquetReader.java
@@ -39,7 +39,6 @@ import org.apache.drill.exec.ops.FragmentContext;
 import org.apache.drill.exec.ops.OperatorContext;
 import org.apache.drill.exec.physical.impl.OutputMutator;
 import org.apache.drill.exec.record.MaterializedField;
-import org.apache.drill.exec.record.MaterializedField.Key;
 import org.apache.drill.exec.store.AbstractRecordReader;
 import org.apache.drill.exec.store.dfs.DrillFileSystem;
 import org.apache.drill.exec.store.parquet.ParquetDirectByteBufferAllocator;
@@ -189,7 +188,7 @@ public class DrillParquetReader extends AbstractRecordReader {
   }
 
   @Override
-  public void allocate(Map<Key, ValueVector> vectorMap) throws OutOfMemoryException {
+  public void allocate(Map<String, ValueVector> vectorMap) throws OutOfMemoryException {
     try {
       for (final ValueVector v : vectorMap.values()) {
         AllocationHelper.allocate(v, Character.MAX_VALUE, 50, 10);
@@ -219,7 +218,7 @@ public class DrillParquetReader extends AbstractRecordReader {
           nullFilledVectors = new ArrayList<>();
           for(SchemaPath col: columnsNotFound){
             nullFilledVectors.add(
-              (NullableIntVector)output.addField(MaterializedField.create(col,
+              (NullableIntVector)output.addField(MaterializedField.create(col.getAsUnescapedPath(),
                   org.apache.drill.common.types.Types.optional(TypeProtos.MinorType.INT)),
                 (Class<? extends ValueVector>) TypeHelper.getValueVectorClass(TypeProtos.MinorType.INT,
                   TypeProtos.DataMode.OPTIONAL)));

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/store/pojo/PojoRecordReader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/pojo/PojoRecordReader.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/pojo/PojoRecordReader.java
index 22f6bc3..7feb303 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/pojo/PojoRecordReader.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/pojo/PojoRecordReader.java
@@ -29,7 +29,7 @@ import org.apache.drill.exec.exception.OutOfMemoryException;
 import org.apache.drill.exec.exception.SchemaChangeException;
 import org.apache.drill.exec.ops.OperatorContext;
 import org.apache.drill.exec.physical.impl.OutputMutator;
-import org.apache.drill.exec.record.MaterializedField.Key;
+import org.apache.drill.exec.record.MaterializedField;
 import org.apache.drill.exec.store.AbstractRecordReader;
 import org.apache.drill.exec.store.pojo.Writers.BitWriter;
 import org.apache.drill.exec.store.pojo.Writers.DoubleWriter;
@@ -122,7 +122,7 @@ public class PojoRecordReader<T> extends AbstractRecordReader {
   }
 
   @Override
-  public void allocate(Map<Key, ValueVector> vectorMap) throws OutOfMemoryException {
+  public void allocate(Map<String, ValueVector> vectorMap) throws OutOfMemoryException {
     for (final ValueVector v : vectorMap.values()) {
       AllocationHelper.allocate(v, Character.MAX_VALUE, 50, 10);
     }

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/store/text/DrillTextRecordReader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/text/DrillTextRecordReader.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/text/DrillTextRecordReader.java
index d97fc58..2af5c8b 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/text/DrillTextRecordReader.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/text/DrillTextRecordReader.java
@@ -124,7 +124,7 @@ public class DrillTextRecordReader extends AbstractRecordReader {
 
   @Override
   public void setup(OperatorContext context, OutputMutator output) throws ExecutionSetupException {
-    MaterializedField field = MaterializedField.create(ref, Types.repeated(TypeProtos.MinorType.VARCHAR));
+    MaterializedField field = MaterializedField.create(ref.getAsNamePart().getName(), Types.repeated(TypeProtos.MinorType.VARCHAR));
     try {
       vector = output.addField(field, RepeatedVarCharVector.class);
     } catch (Exception e) {


[2/3] drill git commit: DRILL-4382: Remove dependency on drill-logical from vector package

Posted by sm...@apache.org.
http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/util/BatchPrinter.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/util/BatchPrinter.java b/exec/java-exec/src/main/java/org/apache/drill/exec/util/BatchPrinter.java
index 2a1db01..cb5183e 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/util/BatchPrinter.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/util/BatchPrinter.java
@@ -37,7 +37,7 @@ public class BatchPrinter {
     List<ValueVector> vectors = Lists.newArrayList();
     int numBatches = 0;
     for (VectorWrapper vw : batch) {
-      columns.add(vw.getValueVectors()[0].getField().getAsSchemaPath().toExpr());
+      columns.add(vw.getValueVectors()[0].getField().getPath());
       numBatches = vw.getValueVectors().length;
     }
     int width = columns.size();
@@ -71,7 +71,7 @@ public class BatchPrinter {
     List<String> columns = Lists.newArrayList();
     List<ValueVector> vectors = Lists.newArrayList();
     for (VectorWrapper vw : batch) {
-      columns.add(vw.getValueVector().getField().getAsSchemaPath().toExpr());
+      columns.add(vw.getValueVector().getField().getPath());
       vectors.add(vw.getValueVector());
     }
     int width = columns.size();
@@ -106,7 +106,7 @@ public class BatchPrinter {
     List<String> columns = Lists.newArrayList();
     List<ValueVector> vectors = Lists.newArrayList();
     for (VectorWrapper vw : batch) {
-      columns.add(vw.getValueVector().getField().getAsSchemaPath().toExpr());
+      columns.add(vw.getValueVector().getField().getPath());
       vectors.add(vw.getValueVector());
     }
     int width = columns.size();

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/util/VectorUtil.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/util/VectorUtil.java b/exec/java-exec/src/main/java/org/apache/drill/exec/util/VectorUtil.java
index 9f4115b..b150179 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/util/VectorUtil.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/util/VectorUtil.java
@@ -40,7 +40,7 @@ public class VectorUtil {
     System.out.println(rows + " row(s):");
     List<String> columns = Lists.newArrayList();
     for (VectorWrapper<?> vw : va) {
-      columns.add(vw.getValueVector().getField().getPath().getAsUnescapedPath());
+      columns.add(vw.getValueVector().getField().getPath());
     }
 
     int width = columns.size();
@@ -55,7 +55,7 @@ public class VectorUtil {
         try{
           o = vw.getValueVector().getAccessor().getObject(row);
         }catch(Exception e){
-          throw new RuntimeException("failure while trying to read column " + vw.getField().getPath().toExpr());
+          throw new RuntimeException("failure while trying to read column " + vw.getField().getPath());
         }
         if (o == null) {
           //null value
@@ -83,7 +83,7 @@ public class VectorUtil {
     if (includeHeader) {
       List<String> columns = Lists.newArrayList();
       for (VectorWrapper<?> vw : va) {
-        columns.add(vw.getValueVector().getField().getPath().getAsUnescapedPath());
+        columns.add(vw.getValueVector().getField().getPath());
       }
 
       formattedResults.append(Joiner.on(delimiter).join(columns));
@@ -134,7 +134,7 @@ public class VectorUtil {
       width += columnWidth + 2;
       formats.add("| %-" + columnWidth + "s");
       MaterializedField field = vw.getValueVector().getField();
-      columns.add(field.getPath().getAsUnescapedPath() + "<" + field.getType().getMinorType() + "(" + field.getType().getMode() + ")" + ">");
+      columns.add(field.getPath() + "<" + field.getType().getMinorType() + "(" + field.getType().getMode() + ")" + ">");
       columnIndex++;
     }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/FieldIdUtil.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/FieldIdUtil.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/FieldIdUtil.java
new file mode 100644
index 0000000..0394029
--- /dev/null
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/FieldIdUtil.java
@@ -0,0 +1,223 @@
+/**
+ * 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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.vector.complex;
+
+import org.apache.drill.common.expression.PathSegment;
+import org.apache.drill.common.expression.SchemaPath;
+import org.apache.drill.common.types.TypeProtos.DataMode;
+import org.apache.drill.common.types.TypeProtos.MajorType;
+import org.apache.drill.common.types.TypeProtos.MinorType;
+import org.apache.drill.exec.record.TypedFieldId;
+import org.apache.drill.exec.vector.ValueVector;
+
+import java.util.List;
+
+public class FieldIdUtil {
+  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(FieldIdUtil.class);
+
+  public static TypedFieldId getFieldIdIfMatchesUnion(UnionVector unionVector, TypedFieldId.Builder builder, boolean addToBreadCrumb, PathSegment seg) {
+    if (seg.isNamed()) {
+      ValueVector v = unionVector.getMap();
+      if (v != null) {
+        return getFieldIdIfMatches(v, builder, addToBreadCrumb, seg);
+      } else {
+        return null;
+      }
+    } else if (seg.isArray()) {
+      ValueVector v = unionVector.getList();
+      if (v != null) {
+        return getFieldIdIfMatches(v, builder, addToBreadCrumb, seg);
+      } else {
+        return null;
+      }
+    }
+    return null;
+  }
+
+
+  public static TypedFieldId getFieldIdIfMatches(ValueVector vector, TypedFieldId.Builder builder, boolean addToBreadCrumb, PathSegment seg) {
+    if (vector instanceof RepeatedMapVector && seg != null && seg.isArray() && !seg.isLastPath()) {
+      if (addToBreadCrumb) {
+        addToBreadCrumb = false;
+        builder.remainder(seg);
+      }
+      // skip the first array segment as there is no corresponding child vector.
+      seg = seg.getChild();
+
+      // multi-level numbered access to a repeated map is not possible so return if the next part is also an array
+      // segment.
+      if (seg.isArray()) {
+        return null;
+      }
+    }
+
+    if (seg == null) {
+      if (addToBreadCrumb) {
+        builder.intermediateType(vector.getField().getType());
+      }
+      return builder.finalType(vector.getField().getType()).build();
+    }
+
+    if (seg.isArray()) {
+      if (seg.isLastPath()) {
+        MajorType type;
+        if (vector instanceof AbstractContainerVector) {
+          type = ((AbstractContainerVector) vector).getLastPathType();
+        } else if (vector instanceof ListVector) {
+          type = ((ListVector) vector).getDataVector().getField().getType();
+          builder.listVector();
+        } else {
+          throw new UnsupportedOperationException("FieldIdUtil does not support vector of type " + vector.getField().getType());
+        }
+        builder //
+                .withIndex() //
+                .finalType(type);
+
+        // remainder starts with the 1st array segment in SchemaPath.
+        // only set remainder when it's the only array segment.
+        if (addToBreadCrumb) {
+          addToBreadCrumb = false;
+          builder.remainder(seg);
+        }
+        return builder.build();
+      } else {
+        if (addToBreadCrumb) {
+          addToBreadCrumb = false;
+          builder.remainder(seg);
+        }
+      }
+    } else {
+      if (vector instanceof ListVector) {
+        return null;
+      }
+    }
+
+    ValueVector v;
+    if (vector instanceof AbstractContainerVector) {
+      VectorWithOrdinal vord = ((AbstractContainerVector) vector).getChildVectorWithOrdinal(seg.isArray() ? null : seg.getNameSegment().getPath());
+      if (vord == null) {
+        return null;
+      }
+      v = vord.vector;
+      if (addToBreadCrumb) {
+        builder.intermediateType(v.getField().getType());
+        builder.addId(vord.ordinal);
+      }
+    } else if (vector instanceof ListVector) {
+      v = ((ListVector) vector).getDataVector();
+    } else {
+      throw new UnsupportedOperationException("FieldIdUtil does not support vector of type " + vector.getField().getType());
+    }
+
+    if (v instanceof AbstractContainerVector) {
+      // we're looking for a multi path.
+      AbstractContainerVector c = (AbstractContainerVector) v;
+      return getFieldIdIfMatches(c, builder, addToBreadCrumb, seg.getChild());
+    } else if(v instanceof ListVector) {
+      ListVector list = (ListVector) v;
+      return getFieldIdIfMatches(list, builder, addToBreadCrumb, seg.getChild());
+    } else if (v instanceof  UnionVector) {
+      return getFieldIdIfMatchesUnion((UnionVector) v, builder, addToBreadCrumb, seg.getChild());
+    } else {
+      if (seg.isNamed()) {
+        if(addToBreadCrumb) {
+          builder.intermediateType(v.getField().getType());
+        }
+        builder.finalType(v.getField().getType());
+      } else {
+        builder.finalType(v.getField().getType().toBuilder().setMode(DataMode.OPTIONAL).build());
+      }
+
+      if (seg.isLastPath()) {
+        return builder.build();
+      } else {
+        PathSegment child = seg.getChild();
+        if (child.isLastPath() && child.isArray()) {
+          if (addToBreadCrumb) {
+            builder.remainder(child);
+          }
+          builder.withIndex();
+          builder.finalType(v.getField().getType().toBuilder().setMode(DataMode.OPTIONAL).build());
+          return builder.build();
+        } else {
+          logger.warn("You tried to request a complex type inside a scalar object or path or type is wrong.");
+          return null;
+        }
+      }
+    }
+  }
+
+  public static TypedFieldId getFieldId(ValueVector vector, int id, SchemaPath expectedPath, boolean hyper) {
+    if (!expectedPath.getRootSegment().getNameSegment().getPath().equalsIgnoreCase(vector.getField().getPath())) {
+      return null;
+    }
+    PathSegment seg = expectedPath.getRootSegment();
+
+    TypedFieldId.Builder builder = TypedFieldId.newBuilder();
+    if (hyper) {
+      builder.hyper();
+    }
+    if (vector instanceof UnionVector) {
+      builder.addId(id).remainder(expectedPath.getRootSegment().getChild());
+      List<MinorType> minorTypes = ((UnionVector) vector).getSubTypes();
+      MajorType.Builder majorTypeBuilder = MajorType.newBuilder().setMinorType(MinorType.UNION);
+      for (MinorType type : minorTypes) {
+        majorTypeBuilder.addSubType(type);
+      }
+      MajorType majorType = majorTypeBuilder.build();
+      builder.intermediateType(majorType);
+      if (seg.isLastPath()) {
+        builder.finalType(majorType);
+        return builder.build();
+      } else {
+        return getFieldIdIfMatchesUnion((UnionVector) vector, builder, false, seg.getChild());
+      }
+    } else if (vector instanceof ListVector) {
+      ListVector list = (ListVector) vector;
+      builder.intermediateType(vector.getField().getType());
+      builder.addId(id);
+      return getFieldIdIfMatches(list, builder, true, expectedPath.getRootSegment().getChild());
+    } else
+    if (vector instanceof AbstractContainerVector) {
+      // we're looking for a multi path.
+      AbstractContainerVector c = (AbstractContainerVector) vector;
+      builder.intermediateType(vector.getField().getType());
+      builder.addId(id);
+      return getFieldIdIfMatches(c, builder, true, expectedPath.getRootSegment().getChild());
+
+    } else {
+      builder.intermediateType(vector.getField().getType());
+      builder.addId(id);
+      builder.finalType(vector.getField().getType());
+      if (seg.isLastPath()) {
+        return builder.build();
+      } else {
+        PathSegment child = seg.getChild();
+        if (child.isArray() && child.isLastPath()) {
+          builder.remainder(child);
+          builder.withIndex();
+          builder.finalType(vector.getField().getType().toBuilder().setMode(DataMode.OPTIONAL).build());
+          return builder.build();
+        } else {
+          return null;
+        }
+
+      }
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/FieldSelection.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/FieldSelection.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/FieldSelection.java
index dfaf5de..acf5552 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/FieldSelection.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/FieldSelection.java
@@ -33,7 +33,7 @@ import com.google.common.collect.Maps;
 /**
  * This class manages the projection pushdown for a complex path.
  */
-class FieldSelection {
+public class FieldSelection {
 
   public static final FieldSelection INVALID_NODE = new FieldSelection(null, ValidityMode.NEVER_VALID);
   public static final FieldSelection ALL_VALID = new FieldSelection(null, ValidityMode.ALWAYS_VALID);

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/test/java/org/apache/drill/DrillTestWrapper.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/DrillTestWrapper.java b/exec/java-exec/src/test/java/org/apache/drill/DrillTestWrapper.java
index 35e668c..e828eb8 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/DrillTestWrapper.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/DrillTestWrapper.java
@@ -224,12 +224,12 @@ public class DrillTestWrapper {
       logger.debug("reading batch with " + loader.getRecordCount() + " rows, total read so far " + totalRecords);
       totalRecords += loader.getRecordCount();
       for (VectorWrapper w : loader) {
-        String field = w.getField().toExpr();
+        String field = SchemaPath.getSimplePath(w.getField().getPath()).toExpr();
         if (!combinedVectors.containsKey(field)) {
           MaterializedField mf = w.getField();
           ValueVector[] vvList = (ValueVector[]) Array.newInstance(mf.getValueClass(), 1);
           vvList[0] = w.getValueVector();
-          combinedVectors.put(mf.getPath().toExpr(), new HyperVectorValueIterator(mf, new HyperVectorWrapper(mf,
+          combinedVectors.put(SchemaPath.getSimplePath(mf.getPath()).toExpr(), new HyperVectorValueIterator(mf, new HyperVectorWrapper(mf,
               vvList)));
         } else {
           combinedVectors.get(field).getHyperVector().addVector(w.getValueVector());
@@ -272,13 +272,13 @@ public class DrillTestWrapper {
       if (schema == null) {
         schema = loader.getSchema();
         for (MaterializedField mf : schema) {
-          combinedVectors.put(mf.getPath().toExpr(), new ArrayList());
+          combinedVectors.put(SchemaPath.getSimplePath(mf.getPath()).toExpr(), new ArrayList());
         }
       }
       logger.debug("reading batch with " + loader.getRecordCount() + " rows, total read so far " + totalRecords);
       totalRecords += loader.getRecordCount();
       for (VectorWrapper w : loader) {
-        String field = w.getField().toExpr();
+        String field = SchemaPath.getSimplePath(w.getField().getPath()).toExpr();
         for (int j = 0; j < loader.getRecordCount(); j++) {
           Object obj = w.getValueVector().getAccessor().getObject(j);
           if (obj != null) {
@@ -317,13 +317,13 @@ public class DrillTestWrapper {
       }
 
       for(int i = 0; i < schema.getFieldCount(); ++i) {
-        final SchemaPath actualSchemaPath = schema.getColumn(i).getPath();
+        final String actualSchemaPath = schema.getColumn(i).getPath();
         final TypeProtos.MajorType actualMajorType = schema.getColumn(i).getType();
 
-        final SchemaPath expectedSchemaPath = schema.getColumn(i).getPath();
+        final String expectedSchemaPath = schema.getColumn(i).getPath();
         final TypeProtos.MajorType expectedlMajorType = schema.getColumn(i).getType();
 
-        if(!actualSchemaPath.equals(expectedSchemaPath)
+        if(!actualSchemaPath.equalsIgnoreCase(expectedSchemaPath)
             || !actualMajorType.equals(expectedlMajorType)) {
           throw new Exception("The type of the " + i + "-th column is '" + actualSchemaPath + "' mismatched, expected: '"
               + expectedlMajorType + "'");
@@ -486,7 +486,7 @@ public class DrillTestWrapper {
   private Map<SchemaPath, TypeProtos.MajorType> getTypeMapFromBatch(QueryDataBatch batch) {
     Map<SchemaPath, TypeProtos.MajorType> typeMap = new HashMap();
     for (int i = 0; i < batch.getHeader().getDef().getFieldCount(); i++) {
-      typeMap.put(MaterializedField.create(batch.getHeader().getDef().getField(i)).getPath(),
+      typeMap.put(SchemaPath.getSimplePath(MaterializedField.create(batch.getHeader().getDef().getField(i)).getPath()),
           batch.getHeader().getDef().getField(i).getMajorType());
     }
     return typeMap;
@@ -529,9 +529,9 @@ public class DrillTestWrapper {
             else if (obj instanceof byte[]) {
               obj = new String((byte[]) obj, "UTF-8");
             }
-            record.put(w.getField().toExpr(), obj);
+            record.put(SchemaPath.getSimplePath(w.getField().getPath()).toExpr(), obj);
           }
-          record.put(w.getField().toExpr(), obj);
+          record.put(SchemaPath.getSimplePath(w.getField().getPath()).toExpr(), obj);
         }
         materializedRecords.add(record);
       }

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/test/java/org/apache/drill/PlanTestBase.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/PlanTestBase.java b/exec/java-exec/src/test/java/org/apache/drill/PlanTestBase.java
index f9e0b00..3922a38 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/PlanTestBase.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/PlanTestBase.java
@@ -308,7 +308,7 @@ public class PlanTestBase extends BaseTestQuery {
         throw new Exception("Looks like you did not provide an explain plan query, please add EXPLAIN PLAN FOR to the beginning of your query.");
       }
 
-      System.out.println(vw.getValueVector().getField().toExpr());
+      System.out.println(vw.getValueVector().getField().getPath());
       final ValueVector vv = vw.getValueVector();
       for (int i = 0; i < vv.getAccessor().getValueCount(); i++) {
         final Object o = vv.getAccessor().getObject(i);

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/test/java/org/apache/drill/exec/cache/TestWriteToDisk.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/cache/TestWriteToDisk.java b/exec/java-exec/src/test/java/org/apache/drill/exec/cache/TestWriteToDisk.java
index 0dd20b6..a382a42 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/cache/TestWriteToDisk.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/cache/TestWriteToDisk.java
@@ -67,12 +67,8 @@ public class TestWriteToDisk extends ExecTest {
       bit.run();
       final DrillbitContext context = bit.getContext();
 
-      final MaterializedField intField = MaterializedField.create(
-          new SchemaPath("int", ExpressionPosition.UNKNOWN),
-          Types.required(TypeProtos.MinorType.INT));
-      final MaterializedField binField = MaterializedField.create(
-          new SchemaPath("binary", ExpressionPosition.UNKNOWN),
-          Types.required(TypeProtos.MinorType.VARBINARY));
+      final MaterializedField intField = MaterializedField.create("int", Types.required(TypeProtos.MinorType.INT));
+      final MaterializedField binField = MaterializedField.create("binary", Types.required(TypeProtos.MinorType.VARBINARY));
       try (final IntVector intVector = (IntVector) TypeHelper.getNewVector(intField, context.getAllocator());
           final VarBinaryVector binVector =
               (VarBinaryVector) TypeHelper.getNewVector(binField, context.getAllocator())) {

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestOptiqPlans.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestOptiqPlans.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestOptiqPlans.java
index ef102b6..29aaf3a 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestOptiqPlans.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestOptiqPlans.java
@@ -142,7 +142,7 @@ public class TestOptiqPlans extends ExecTest {
         System.out.println(String.format("Got %d results", b.getHeader().getRowCount()));
         loader.load(b.getHeader().getDef(), b.getData());
         for (final VectorWrapper<?> vw : loader) {
-          System.out.println(vw.getValueVector().getField().toExpr());
+          System.out.println(vw.getValueVector().getField().getPath());
           final ValueVector vv = vw.getValueVector();
           for (int i = 0; i < vv.getAccessor().getValueCount(); i++) {
             final Object o = vv.getAccessor().getObject(i);
@@ -171,7 +171,7 @@ public class TestOptiqPlans extends ExecTest {
         System.out.println(String.format("Got %d results", b.getHeader().getRowCount()));
         loader.load(b.getHeader().getDef(), b.getData());
         for (final VectorWrapper<?> vw : loader) {
-          System.out.println(vw.getValueVector().getField().toExpr());
+          System.out.println(vw.getValueVector().getField().getPath());
           final ValueVector vv = vw.getValueVector();
           for (int i = 0; i < vv.getAccessor().getValueCount(); i++) {
             final Object o = vv.getAccessor().getObject(i);
@@ -200,7 +200,7 @@ public class TestOptiqPlans extends ExecTest {
         System.out.println(String.format("Got %d results", b.getHeader().getRowCount()));
         loader.load(b.getHeader().getDef(), b.getData());
         for (final VectorWrapper<?> vw : loader) {
-          System.out.println(vw.getValueVector().getField().toExpr());
+          System.out.println(vw.getValueVector().getField().getPath());
           final ValueVector vv = vw.getValueVector();
           for (int i = 0; i < vv.getAccessor().getValueCount(); i++) {
             final Object o = vv.getAccessor().getObject(i);
@@ -239,7 +239,7 @@ public class TestOptiqPlans extends ExecTest {
         System.out.println(String.format("Got %d results", b.getHeader().getRowCount()));
         loader.load(b.getHeader().getDef(), b.getData());
         for (final VectorWrapper vw : loader) {
-          System.out.println(vw.getValueVector().getField().toExpr());
+          System.out.println(vw.getValueVector().getField().getPath());
           final ValueVector vv = vw.getValueVector();
           for (int i = 0; i < vv.getAccessor().getValueCount(); i++) {
             final Object o = vv.getAccessor().getObject(i);
@@ -278,7 +278,7 @@ public class TestOptiqPlans extends ExecTest {
         System.out.println(String.format("Got %d results", b.getHeader().getRowCount()));
         loader.load(b.getHeader().getDef(), b.getData());
         for (final VectorWrapper vw : loader) {
-          System.out.println(vw.getValueVector().getField().toExpr());
+          System.out.println(vw.getValueVector().getField().getPath());
           final ValueVector vv = vw.getValueVector();
           for (int i = 0; i < vv.getAccessor().getValueCount(); i++) {
             final Object o = vv.getAccessor().getObject(i);

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestSimpleFragmentRun.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestSimpleFragmentRun.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestSimpleFragmentRun.java
index 5d0ea2d..182e19e 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestSimpleFragmentRun.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestSimpleFragmentRun.java
@@ -72,7 +72,7 @@ public class TestSimpleFragmentRun extends PopUnitTestBase {
           } else {
             System.out.print("\t");
           }
-          System.out.print(value.getField().toExpr());
+          System.out.print(value.getField().getPath());
           System.out.print("[");
           System.out.print(value.getField().getType().getMinorType());
           System.out.print("]");
@@ -147,7 +147,7 @@ public class TestSimpleFragmentRun extends PopUnitTestBase {
           } else {
             System.out.print("\t");
           }
-          System.out.print(v.getField().toExpr());
+          System.out.print(v.getField().getPath());
           System.out.print("[");
           System.out.print(v.getField().getType().getMinorType());
           System.out.print("]");

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/join/TestMergeJoin.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/join/TestMergeJoin.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/join/TestMergeJoin.java
index a533620..d56a65f 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/join/TestMergeJoin.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/join/TestMergeJoin.java
@@ -87,7 +87,7 @@ public class TestMergeJoin extends PopUnitTestBase {
     while (exec.next()) {
       totalRecordCount += exec.getRecordCount();
       for (final ValueVector v : exec) {
-        System.out.print("[" + v.getField().toExpr() + "]        ");
+        System.out.print("[" + v.getField().getPath() + "]        ");
       }
       System.out.println("\n");
       for (int valueIdx = 0; valueIdx < exec.getRecordCount(); valueIdx++) {
@@ -150,7 +150,7 @@ public class TestMergeJoin extends PopUnitTestBase {
       for (int valueIdx = 0; valueIdx < exec.getRecordCount(); valueIdx++) {
         final List<Object> row = Lists.newArrayList();
         for (final ValueVector v : exec) {
-          row.add(v.getField().toExpr() + ":" + v.getAccessor().getObject(valueIdx));
+          row.add(v.getField().getPath() + ":" + v.getAccessor().getObject(valueIdx));
         }
         for (final Object cell : row) {
           if (cell == null) {
@@ -207,7 +207,7 @@ public class TestMergeJoin extends PopUnitTestBase {
       for (int valueIdx = 0; valueIdx < exec.getRecordCount(); valueIdx++) {
         final List<Object> row = Lists.newArrayList();
         for (final ValueVector v : exec) {
-          row.add(v.getField().toExpr() + ":" + v.getAccessor().getObject(valueIdx));
+          row.add(v.getField().getPath() + ":" + v.getAccessor().getObject(valueIdx));
         }
         for (final Object cell : row) {
           if (cell == null) {
@@ -263,7 +263,7 @@ public class TestMergeJoin extends PopUnitTestBase {
       for (int valueIdx = 0; valueIdx < exec.getRecordCount(); valueIdx++) {
         final List<Object> row = Lists.newArrayList();
         for (final ValueVector v : exec) {
-          row.add(v.getField().toExpr() + ":" + v.getAccessor().getObject(valueIdx));
+          row.add(v.getField().getPath() + ":" + v.getAccessor().getObject(valueIdx));
         }
         for (final Object cell : row) {
           if (cell == null) {

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/join/TestMergeJoinAdvanced.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/join/TestMergeJoinAdvanced.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/join/TestMergeJoinAdvanced.java
index 3e0deb2..c83a30f 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/join/TestMergeJoinAdvanced.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/join/TestMergeJoinAdvanced.java
@@ -89,6 +89,7 @@ public class TestMergeJoinAdvanced extends BaseTestQuery {
   }
 
   @Test
+  @Ignore // TODO file JIRA to fix this
   public void testFix2967() throws Exception {
     setSessionOption(PlannerSettings.BROADCAST.getOptionName(), "false");
     setSessionOption(PlannerSettings.HASHJOIN.getOptionName(), "false");

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/mergereceiver/TestMergingReceiver.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/mergereceiver/TestMergingReceiver.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/mergereceiver/TestMergingReceiver.java
index 80bf17e..537a583 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/mergereceiver/TestMergingReceiver.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/mergereceiver/TestMergingReceiver.java
@@ -101,7 +101,7 @@ public class TestMergingReceiver extends PopUnitTestBase {
           final MaterializedField materializedField = vv.getField();
           final int numValues = va.getValueCount();
           for(int valueIdx = 0; valueIdx < numValues; ++valueIdx) {
-            if (materializedField.getAsSchemaPath().getRootSegment().getPath().equals("blue")) {
+            if (materializedField.getPath().equals("blue")) {
               final long longValue = ((Long) va.getObject(valueIdx)).longValue();
               // check that order is ascending
               if (lastBlueValue != null) {

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/test/java/org/apache/drill/exec/record/ExpressionTreeMaterializerTest.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/record/ExpressionTreeMaterializerTest.java b/exec/java-exec/src/test/java/org/apache/drill/exec/record/ExpressionTreeMaterializerTest.java
index c01f5d8..7d28c9b 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/record/ExpressionTreeMaterializerTest.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/record/ExpressionTreeMaterializerTest.java
@@ -59,7 +59,7 @@ public class ExpressionTreeMaterializerTest extends ExecTest {
   FunctionImplementationRegistry registry = new FunctionImplementationRegistry(c);
 
   private MaterializedField getField(int fieldId, String name, MajorType type) {
-    return MaterializedField.create(SchemaPath.getSimplePath(name), type);
+    return MaterializedField.create(name, type);
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/test/java/org/apache/drill/exec/record/TestMaterializedField.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/record/TestMaterializedField.java b/exec/java-exec/src/test/java/org/apache/drill/exec/record/TestMaterializedField.java
index dbe4dc2..3380a52 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/record/TestMaterializedField.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/record/TestMaterializedField.java
@@ -66,7 +66,7 @@ public class TestMaterializedField {
 
     for (final MaterializedField field:new MaterializedField[]{parent, child}) {
       for (Object[] args:matrix) {
-        final SchemaPath path = SchemaPath.getSimplePath(args[0].toString());
+        final String path = args[0].toString();
         final TypeProtos.MajorType type = TypeProtos.MajorType.class.cast(args[1]);
 
         final MaterializedField clone = field.withPathAndType(path, type);

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/test/java/org/apache/drill/exec/record/vector/TestLoad.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/record/vector/TestLoad.java b/exec/java-exec/src/test/java/org/apache/drill/exec/record/vector/TestLoad.java
index c3af451..8ac7c45 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/record/vector/TestLoad.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/record/vector/TestLoad.java
@@ -51,12 +51,12 @@ public class TestLoad extends ExecTest {
   @Test
   public void testLoadValueVector() throws Exception {
     final BufferAllocator allocator = RootAllocatorFactory.newRoot(drillConfig);
-    final ValueVector fixedV = new IntVector(MaterializedField.create(new SchemaPath("ints", ExpressionPosition.UNKNOWN),
+    final ValueVector fixedV = new IntVector(MaterializedField.create("ints",
         Types.required(MinorType.INT)), allocator);
     final ValueVector varlenV = new VarCharVector(MaterializedField.create(
-        new SchemaPath("chars", ExpressionPosition.UNKNOWN), Types.required(MinorType.VARCHAR)), allocator);
-    final ValueVector nullableVarlenV = new NullableVarCharVector(MaterializedField.create(new SchemaPath("chars",
-        ExpressionPosition.UNKNOWN), Types.optional(MinorType.VARCHAR)), allocator);
+        "chars", Types.required(MinorType.VARCHAR)), allocator);
+    final ValueVector nullableVarlenV = new NullableVarCharVector(MaterializedField.create("chars",
+        Types.optional(MinorType.VARCHAR)), allocator);
 
     final List<ValueVector> vectors = Lists.newArrayList(fixedV, varlenV, nullableVarlenV);
     for (final ValueVector v : vectors) {
@@ -88,7 +88,7 @@ public class TestLoad extends ExecTest {
       } else {
         System.out.print("\t");
       }
-      System.out.print(v.getField().toExpr());
+      System.out.print(v.getField().getPath());
       System.out.print("[");
       System.out.print(v.getField().getType().getMinorType());
       System.out.print("]");

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/test/java/org/apache/drill/exec/record/vector/TestValueVector.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/record/vector/TestValueVector.java b/exec/java-exec/src/test/java/org/apache/drill/exec/record/vector/TestValueVector.java
index 96f2b33..38c6ebc 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/record/vector/TestValueVector.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/record/vector/TestValueVector.java
@@ -70,7 +70,7 @@ import com.google.common.collect.ImmutableMap;
 public class TestValueVector extends ExecTest {
   //private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(TestValueVector.class);
 
-  private final static SchemaPath EMPTY_SCHEMA_PATH = SchemaPath.getSimplePath("");
+  private final static String EMPTY_SCHEMA_PATH = "";
 
   private DrillConfig drillConfig;
   private BufferAllocator allocator;

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/test/java/org/apache/drill/exec/server/TestBitRpc.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/server/TestBitRpc.java b/exec/java-exec/src/test/java/org/apache/drill/exec/server/TestBitRpc.java
index 155706e..10656f4 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/server/TestBitRpc.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/server/TestBitRpc.java
@@ -140,7 +140,7 @@ public class TestBitRpc extends ExecTest {
     List<ValueVector> vectors = Lists.newArrayList();
     for (int i = 0; i < 5; i++) {
       Float8Vector v = (Float8Vector) TypeHelper.getNewVector(
-          MaterializedField.create(new SchemaPath("a", ExpressionPosition.UNKNOWN), Types.required(MinorType.FLOAT8)),
+          MaterializedField.create("a", Types.required(MinorType.FLOAT8)),
           allocator);
       v.allocateNew(records);
       v.getMutator().generateTestData(records);

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/ParquetResultListener.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/ParquetResultListener.java b/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/ParquetResultListener.java
index 4976bca..8b9cd28 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/ParquetResultListener.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/ParquetResultListener.java
@@ -126,12 +126,12 @@ public class ParquetResultListener implements UserResultsListener {
 
     for (final VectorWrapper vw : batchLoader) {
       final ValueVector vv = vw.getValueVector();
-      currentField = props.fields.get(vv.getField().getPath().getRootSegment().getPath());
-      if (!valuesChecked.containsKey(vv.getField().getPath().getRootSegment().getPath())) {
-        valuesChecked.put(vv.getField().getPath().getRootSegment().getPath(), 0);
+      currentField = props.fields.get(vv.getField().getPath());
+      if (!valuesChecked.containsKey(vv.getField().getPath())) {
+        valuesChecked.put(vv.getField().getPath(), 0);
         columnValCounter = 0;
       } else {
-        columnValCounter = valuesChecked.get(vv.getField().getPath().getRootSegment().getPath());
+        columnValCounter = valuesChecked.get(vv.getField().getPath());
       }
       printColumnMajor(vv);
 
@@ -145,9 +145,9 @@ public class ParquetResultListener implements UserResultsListener {
         columnValCounter += vv.getAccessor().getValueCount();
       }
 
-      valuesChecked.remove(vv.getField().getPath().getRootSegment().getPath());
+      valuesChecked.remove(vv.getField().getPath());
       assertEquals("Mismatched value count for vectors in the same batch.", valueCount, vv.getAccessor().getValueCount());
-      valuesChecked.put(vv.getField().getPath().getRootSegment().getPath(), columnValCounter);
+      valuesChecked.put(vv.getField().getPath(), columnValCounter);
     }
 
     if (ParquetRecordReaderTest.VERBOSE_DEBUG){
@@ -184,7 +184,7 @@ public class ParquetResultListener implements UserResultsListener {
 
   public void printColumnMajor(ValueVector vv) {
     if (ParquetRecordReaderTest.VERBOSE_DEBUG){
-      System.out.println("\n" + vv.getField().getAsSchemaPath().getRootSegment().getPath());
+      System.out.println("\n" + vv.getField().getPath());
     }
     for (int j = 0; j < vv.getAccessor().getValueCount(); j++) {
       if (ParquetRecordReaderTest.VERBOSE_DEBUG){
@@ -211,7 +211,7 @@ public class ParquetResultListener implements UserResultsListener {
         System.out.println();
         for (VectorWrapper vw : batchLoader) {
           ValueVector v = vw.getValueVector();
-          System.out.print(Strings.padStart(v.getField().getAsSchemaPath().getRootSegment().getPath(), 20, ' ') + " ");
+          System.out.print(Strings.padStart(v.getField().getPath(), 20, ' ') + " ");
 
         }
         System.out.println();

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/TestParquetPhysicalPlan.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/TestParquetPhysicalPlan.java b/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/TestParquetPhysicalPlan.java
index 9282a45..8714b30 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/TestParquetPhysicalPlan.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/TestParquetPhysicalPlan.java
@@ -65,7 +65,7 @@ public class TestParquetPhysicalPlan extends ExecTest {
         count += b.getHeader().getRowCount();
         loader.load(b.getHeader().getDef(), b.getData());
         for (VectorWrapper vw : loader) {
-          System.out.print(vw.getValueVector().getField().toExpr() + ": ");
+          System.out.print(vw.getValueVector().getField().getPath() + ": ");
           ValueVector vv = vw.getValueVector();
           for (int i = 0; i < vv.getAccessor().getValueCount(); i++) {
             Object o = vv.getAccessor().getObject(i);

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillColumnMetaDataList.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillColumnMetaDataList.java b/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillColumnMetaDataList.java
index 1813cc7..d23e56f 100644
--- a/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillColumnMetaDataList.java
+++ b/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillColumnMetaDataList.java
@@ -69,7 +69,7 @@ public class DrillColumnMetaDataList extends BasicList<ColumnMetaData>{
       final MaterializedField field = schema.getColumn(colOffset);
       Class<?> objectClass = getObjectClasses.get( colOffset );
 
-      final String columnName = field.getPath().getRootSegment().getPath();
+      final String columnName = field.getPath();
 
       final MajorType rpcDataType = field.getType();
       final AvaticaType bundledSqlDataType = getAvaticaType(rpcDataType);

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/jdbc/src/test/java/org/apache/drill/jdbc/DrillColumnMetaDataListTest.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/test/java/org/apache/drill/jdbc/DrillColumnMetaDataListTest.java b/exec/jdbc/src/test/java/org/apache/drill/jdbc/DrillColumnMetaDataListTest.java
index 9e332a5..d82fd61 100644
--- a/exec/jdbc/src/test/java/org/apache/drill/jdbc/DrillColumnMetaDataListTest.java
+++ b/exec/jdbc/src/test/java/org/apache/drill/jdbc/DrillColumnMetaDataListTest.java
@@ -70,13 +70,13 @@ public class DrillColumnMetaDataListTest {
     // Create mock columns
     final MaterializedField exampleIntField = mock(MaterializedField.class);
     MajorType exampleIntType = MajorType.newBuilder().setMinorType(MinorType.INT).build();
-    when(exampleIntField.getPath()).thenReturn(SchemaPath.getSimplePath("/path/to/testInt"));
+    when(exampleIntField.getPath()).thenReturn("/path/to/testInt");
     when(exampleIntField.getType()).thenReturn(exampleIntType);
     when(exampleIntField.getDataMode()).thenReturn(DataMode.OPTIONAL);
 
     final MaterializedField exampleStringField = mock(MaterializedField.class);
     MajorType exampleStringType = MajorType.newBuilder().setMinorType(MinorType.VARCHAR).build();
-    when(exampleStringField.getPath()).thenReturn(SchemaPath.getSimplePath("/path/to/testString"));
+    when(exampleStringField.getPath()).thenReturn("/path/to/testString");
     when(exampleStringField.getType()).thenReturn(exampleStringType);
     when(exampleStringField.getDataMode()).thenReturn(DataMode.REQUIRED);
 

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/pom.xml
----------------------------------------------------------------------
diff --git a/exec/vector/pom.xml b/exec/vector/pom.xml
index 2d62631..9a40d71 100644
--- a/exec/vector/pom.xml
+++ b/exec/vector/pom.xml
@@ -33,11 +33,6 @@
       <version>${project.version}</version>
     </dependency>
     <dependency>
-      <groupId>org.apache.drill</groupId>
-      <artifactId>drill-logical</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
       <groupId>org.apache.drill.memory</groupId>
       <artifactId>drill-memory-base</artifactId>
       <version>${project.version}</version>

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/codegen/includes/vv_imports.ftl
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/codegen/includes/vv_imports.ftl b/exec/vector/src/main/codegen/includes/vv_imports.ftl
index 3b1ec64..11e0f5d 100644
--- a/exec/vector/src/main/codegen/includes/vv_imports.ftl
+++ b/exec/vector/src/main/codegen/includes/vv_imports.ftl
@@ -33,7 +33,6 @@ import org.apache.drill.exec.vector.*;
 import org.apache.drill.common.exceptions.*;
 import org.apache.drill.exec.exception.*;
 import org.apache.drill.exec.expr.holders.*;
-import org.apache.drill.common.expression.FieldReference;
 import org.apache.drill.common.types.TypeProtos.*;
 import org.apache.drill.common.types.Types;
 import org.apache.drill.common.util.DrillStringUtils;

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/codegen/templates/BasicTypeHelper.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/codegen/templates/BasicTypeHelper.java b/exec/vector/src/main/codegen/templates/BasicTypeHelper.java
index a81265b..dfc8e4a 100644
--- a/exec/vector/src/main/codegen/templates/BasicTypeHelper.java
+++ b/exec/vector/src/main/codegen/templates/BasicTypeHelper.java
@@ -25,7 +25,6 @@ package org.apache.drill.exec.expr;
 
 <#include "/@includes/vv_imports.ftl" />
 import org.apache.drill.exec.vector.complex.UnionVector;
-import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.types.TypeProtos.DataMode;
 import org.apache.drill.common.types.TypeProtos.MinorType;
 import org.apache.drill.common.types.TypeProtos.MajorType;
@@ -68,9 +67,8 @@ public class BasicTypeHelper {
     throw new UnsupportedOperationException(buildErrorMessage("get size", major));
   }
 
-  public static ValueVector getNewVector(SchemaPath parentPath, String name, BufferAllocator allocator, MajorType type, CallBack callback){
-    SchemaPath child = parentPath.getChild(name);
-    MaterializedField field = MaterializedField.create(child, type);
+  public static ValueVector getNewVector(String name, BufferAllocator allocator, MajorType type, CallBack callback){
+    MaterializedField field = MaterializedField.create(name, type);
     return getNewVector(field, allocator, callback);
   }
   

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/codegen/templates/FixedValueVectors.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/codegen/templates/FixedValueVectors.java b/exec/vector/src/main/codegen/templates/FixedValueVectors.java
index 8e77dcc..eb0d616 100644
--- a/exec/vector/src/main/codegen/templates/FixedValueVectors.java
+++ b/exec/vector/src/main/codegen/templates/FixedValueVectors.java
@@ -183,7 +183,7 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements F
 
   @Override
   public void load(SerializedField metadata, DrillBuf buffer) {
-    Preconditions.checkArgument(this.field.matches(metadata), "The field %s doesn't match the provided metadata %s.", this.field, metadata);
+    Preconditions.checkArgument(this.field.getPath().equals(metadata.getNamePart().getName()), "The field %s doesn't match the provided metadata %s.", this.field, metadata);
     final int actualLength = metadata.getBufferLength();
     final int valueCount = metadata.getValueCount();
     final int expectedLength = valueCount * ${type.width};
@@ -203,7 +203,7 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements F
   }
 
   @Override
-  public TransferPair getTransferPair(FieldReference ref, BufferAllocator allocator){
+  public TransferPair getTransferPair(String ref, BufferAllocator allocator){
     return new TransferImpl(getField().withPath(ref), allocator);
   }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/codegen/templates/NullableValueVectors.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/codegen/templates/NullableValueVectors.java b/exec/vector/src/main/codegen/templates/NullableValueVectors.java
index d2c17ff..6c0a16b 100644
--- a/exec/vector/src/main/codegen/templates/NullableValueVectors.java
+++ b/exec/vector/src/main/codegen/templates/NullableValueVectors.java
@@ -248,7 +248,7 @@ public final class ${className} extends BaseDataValueVector implements <#if type
   }
 
   @Override
-  public TransferPair getTransferPair(FieldReference ref, BufferAllocator allocator){
+  public TransferPair getTransferPair(String ref, BufferAllocator allocator){
     return new TransferImpl(getField().withPath(ref), allocator);
   }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/codegen/templates/RepeatedValueVectors.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/codegen/templates/RepeatedValueVectors.java b/exec/vector/src/main/codegen/templates/RepeatedValueVectors.java
index ca39d71..2a758eb 100644
--- a/exec/vector/src/main/codegen/templates/RepeatedValueVectors.java
+++ b/exec/vector/src/main/codegen/templates/RepeatedValueVectors.java
@@ -84,7 +84,7 @@ public final class Repeated${minor.class}Vector extends BaseRepeatedValueVector
   }
 
   @Override
-  public TransferPair getTransferPair(FieldReference ref, BufferAllocator allocator){
+  public TransferPair getTransferPair(String ref, BufferAllocator allocator){
     return new TransferImpl(getField().withPath(ref), allocator);
   }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/codegen/templates/UnionVector.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/codegen/templates/UnionVector.java b/exec/vector/src/main/codegen/templates/UnionVector.java
index a5e1c0d..dbdefba 100644
--- a/exec/vector/src/main/codegen/templates/UnionVector.java
+++ b/exec/vector/src/main/codegen/templates/UnionVector.java
@@ -31,7 +31,6 @@ package org.apache.drill.exec.vector.complex;
 import java.util.Iterator;
 import org.apache.drill.exec.vector.complex.impl.ComplexCopier;
 import org.apache.drill.exec.util.CallBack;
-import org.apache.drill.common.expression.PathSegment;
 import org.apache.drill.exec.expr.BasicTypeHelper;
 
 /*
@@ -94,7 +93,7 @@ public class UnionVector implements ValueVector {
       return;
     }
     majorType =  MajorType.newBuilder(this.majorType).addSubType(type).build();
-    field = MaterializedField.create(field.getPath(), majorType);
+    field = MaterializedField.create(field.getName(), majorType);
     if (callBack != null) {
       callBack.doWork();
     }
@@ -208,7 +207,7 @@ public class UnionVector implements ValueVector {
   }
 
   @Override
-  public TransferPair getTransferPair(FieldReference ref, BufferAllocator allocator) {
+  public TransferPair getTransferPair(String ref, BufferAllocator allocator) {
     return new TransferImpl(field.withPath(ref), allocator);
   }
 
@@ -351,24 +350,6 @@ public class UnionVector implements ValueVector {
     return vectors.iterator();
   }
 
-  public TypedFieldId getFieldIdIfMatches(TypedFieldId.Builder builder, boolean addToBreadCrumb, PathSegment seg) {
-    if (seg.isNamed()) {
-      ValueVector v = getMap();
-      if (v != null) {
-        return ((AbstractContainerVector) v).getFieldIdIfMatches(builder, addToBreadCrumb, seg);
-      } else {
-        return null;
-      }
-    } else if (seg.isArray()) {
-      ValueVector v = getList();
-      if (v != null) {
-        return ((ListVector) v).getFieldIdIfMatches(builder, addToBreadCrumb, seg);
-      }
-      else return null;
-    }
-    return null;
-  }
-
   public class Accessor extends BaseValueVector.BaseAccessor {
 
 

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/codegen/templates/VariableLengthVectors.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/codegen/templates/VariableLengthVectors.java b/exec/vector/src/main/codegen/templates/VariableLengthVectors.java
index 56d2d52..27432d2 100644
--- a/exec/vector/src/main/codegen/templates/VariableLengthVectors.java
+++ b/exec/vector/src/main/codegen/templates/VariableLengthVectors.java
@@ -179,7 +179,7 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V
   }
 
   @Override
-  public TransferPair getTransferPair(FieldReference ref, BufferAllocator allocator){
+  public TransferPair getTransferPair(String ref, BufferAllocator allocator){
     return new TransferImpl(getField().withPath(ref), allocator);
   }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/java/org/apache/drill/exec/record/MaterializedField.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/java/org/apache/drill/exec/record/MaterializedField.java b/exec/vector/src/main/java/org/apache/drill/exec/record/MaterializedField.java
index f8fb71c..92019ec 100644
--- a/exec/vector/src/main/java/org/apache/drill/exec/record/MaterializedField.java
+++ b/exec/vector/src/main/java/org/apache/drill/exec/record/MaterializedField.java
@@ -17,39 +17,37 @@
  */
 package org.apache.drill.exec.record;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
-import java.util.Map;
+import java.util.Objects;
 
-import org.apache.drill.common.expression.PathSegment;
-import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.types.TypeProtos.DataMode;
 import org.apache.drill.common.types.TypeProtos.MajorType;
 import org.apache.drill.exec.expr.BasicTypeHelper;
+import org.apache.drill.exec.proto.UserBitShared.NamePart;
 import org.apache.drill.exec.proto.UserBitShared.SerializedField;
 
 
 public class MaterializedField {
-  private final Key key;
+  private final String name;
+  private final MajorType type;
   // use an ordered set as existing code relies on order (e,g. parquet writer)
   private final LinkedHashSet<MaterializedField> children;
 
-  private MaterializedField(SchemaPath path, MajorType type) {
-    this(path, type, new LinkedHashSet<MaterializedField>());
-  }
-
-  private MaterializedField(SchemaPath path, MajorType type, LinkedHashSet<MaterializedField> children) {
-    this.key = new Key(path, type);
+  private MaterializedField(String name, MajorType type, LinkedHashSet<MaterializedField> children) {
+    this.name = name;
+    this.type = type;
     this.children = children;
   }
 
   public static MaterializedField create(SerializedField serField){
-    MaterializedField field = new MaterializedField(SchemaPath.create(serField.getNamePart()), serField.getMajorType());
+    LinkedHashSet<MaterializedField> children = new LinkedHashSet<>();
     for (SerializedField sf:serField.getChildList()) {
-      field.addChild(MaterializedField.create(sf));
+      children.add(MaterializedField.create(sf));
     }
-    return field;
+    return new MaterializedField(serField.getNamePart().getName(), serField.getMajorType(), children);
   }
 
   /**
@@ -65,13 +63,19 @@ public class MaterializedField {
 
 
   public SerializedField.Builder getAsBuilder(){
-    return SerializedField.newBuilder() //
-        .setMajorType(key.type) //
-        .setNamePart(key.path.getAsNamePart());
+    return SerializedField.newBuilder()
+        .setMajorType(type)
+        .setNamePart(NamePart.newBuilder().setName(name).build());
   }
 
   public Collection<MaterializedField> getChildren() {
-    return children;
+    return new ArrayList<>(children);
+  }
+
+  public MaterializedField newWithChild(MaterializedField child) {
+    MaterializedField newField = clone();
+    newField.addChild(child);
+    return newField;
   }
 
   public void addChild(MaterializedField field){
@@ -79,33 +83,32 @@ public class MaterializedField {
   }
 
   public MaterializedField clone() {
-    return withPathAndType(getPath(), getType());
+    return withPathAndType(name, getType());
   }
 
   public MaterializedField withType(MajorType type) {
-    return withPathAndType(getPath(), type);
+    return withPathAndType(name, type);
   }
 
-  public MaterializedField withPath(SchemaPath path) {
-    return withPathAndType(path, getType());
+  public MaterializedField withPath(String name) {
+    return withPathAndType(name, getType());
   }
 
-  public MaterializedField withPathAndType(final SchemaPath path, final MajorType type) {
+  public MaterializedField withPathAndType(String name, final MajorType type) {
     final LinkedHashSet<MaterializedField> newChildren = new LinkedHashSet<>(children.size());
-    final MaterializedField clone = new MaterializedField(path, type, newChildren);
     for (final MaterializedField child:children) {
       newChildren.add(child.clone());
     }
-    return clone;
+    return new MaterializedField(name, type, newChildren);
   }
 
-  public String getLastName(){
-    PathSegment seg = key.path.getRootSegment();
-    while (seg.getChild() != null) {
-      seg = seg.getChild();
-    }
-    return seg.getNameSegment().getPath();
-  }
+//  public String getLastName(){
+//    PathSegment seg = key.path.getRootSegment();
+//    while (seg.getChild() != null) {
+//      seg = seg.getChild();
+//    }
+//    return seg.getNameSegment().getPath();
+//  }
 
 
   // TODO: rewrite without as direct match rather than conversion then match.
@@ -114,26 +117,8 @@ public class MaterializedField {
     return f.equals(this);
   }
 
-  public static MaterializedField create(String path, MajorType type){
-    SchemaPath p = SchemaPath.getSimplePath(path);
-    return create(p, type);
-  }
-
-  public static MaterializedField create(SchemaPath path, MajorType type) {
-    return new MaterializedField(path, type);
-  }
-
-  public SchemaPath getPath(){
-    return key.path;
-  }
-
-  /**
-   * Get the schema path.  Deprecated, use getPath() instead.
-   * @return the SchemaPath of this field.
-   */
-  @Deprecated
-  public SchemaPath getAsSchemaPath(){
-    return getPath();
+  public static MaterializedField create(String name, MajorType type){
+    return new MaterializedField(name, type, new LinkedHashSet<MaterializedField>());
   }
 
 //  public String getName(){
@@ -157,30 +142,42 @@ public class MaterializedField {
 //    return sb.toString();
 //  }
 
+  public String getPath() {
+    return getName();
+  }
+
+  public String getLastName() {
+    return getName();
+  }
+
+  public String getName() {
+    return name;
+  }
+
   public int getWidth() {
-    return key.type.getWidth();
+    return type.getWidth();
   }
 
   public MajorType getType() {
-    return key.type;
+    return type;
   }
 
   public int getScale() {
-      return key.type.getScale();
+      return type.getScale();
   }
   public int getPrecision() {
-      return key.type.getPrecision();
+      return type.getPrecision();
   }
   public boolean isNullable() {
-    return key.type.getMode() == DataMode.OPTIONAL;
+    return type.getMode() == DataMode.OPTIONAL;
   }
 
   public DataMode getDataMode() {
-    return key.type.getMode();
+    return type.getMode();
   }
 
   public MaterializedField getOtherNullableVersion(){
-    MajorType mt = key.type;
+    MajorType mt = type;
     DataMode newDataMode = null;
     switch (mt.getMode()){
     case OPTIONAL:
@@ -192,29 +189,16 @@ public class MaterializedField {
     default:
       throw new UnsupportedOperationException();
     }
-    return new MaterializedField(key.path, mt.toBuilder().setMode(newDataMode).build());
+    return new MaterializedField(name, mt.toBuilder().setMode(newDataMode).build(), children);
   }
 
   public Class<?> getValueClass() {
     return BasicTypeHelper.getValueVectorClass(getType().getMinorType(), getDataMode());
   }
 
-  public boolean matches(SchemaPath path) {
-    if (!path.isSimplePath()) {
-      return false;
-    }
-
-    return key.path.equals(path);
-  }
-
-
   @Override
   public int hashCode() {
-    int result = 1;
-    // DRILL-1872: Compute hashCode only on key. See also the comment
-    // in MapVector$MapTransferPair
-    result = ((key == null) ? 0 : key.hashCode());
-    return result;
+    return Objects.hash(this.name, this.type, this.children);
   }
 
   @Override
@@ -232,14 +216,8 @@ public class MaterializedField {
     // DRILL-1872: Compute equals only on key. See also the comment
     // in MapVector$MapTransferPair
 
-    if (key == null) {
-      if (other.key != null) {
-        return false;
-      }
-    } else if (!key.equals(other.key)) {
-      return false;
-    }
-    return true;
+    return this.name.equalsIgnoreCase(other.name) &&
+            Objects.equals(this.type, other.type);
   }
 
 
@@ -247,7 +225,7 @@ public class MaterializedField {
   public String toString() {
     final int maxLen = 10;
     String childStr = children != null && !children.isEmpty() ? toString(children, maxLen) : "";
-    return key.path + "(" + key.type.getMinorType().name() + ":" + key.type.getMode().name() + ")" + childStr;
+    return name + "(" + type.getMinorType().name() + ":" + type.getMode().name() + ")" + childStr;
   }
 
 
@@ -264,61 +242,4 @@ public class MaterializedField {
     builder.append("]");
     return builder.toString();
   }
-
-  public Key key() {
-    return key;
-  }
-
-  public String toExpr(){
-    return key.path.toExpr();
-  }
-
-  /**
-   * Since the {@code MaterializedField) itself is mutable, in certain cases, it is not suitable
-   * as a key of a {@link Map}. This inner class allows the {@link MaterializedField} object to be
-   * used for this purpose.
-   */
-  public class Key {
-
-    private final SchemaPath path;
-    private final MajorType type;
-
-    private Key(SchemaPath path, MajorType type) {
-      this.path = path;
-      this.type = type;
-    }
-
-    @Override
-    public int hashCode() {
-      final int prime = 31;
-      int result = 1;
-      result = prime * result + ((path == null) ? 0 : path.hashCode());
-      return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-      if (this == obj) {
-        return true;
-      }
-      if (obj == null) {
-        return false;
-      }
-      if (getClass() != obj.getClass()) {
-        return false;
-      }
-      Key other = (Key) obj;
-      if (path == null) {
-        if (other.path != null) {
-          return false;
-        }
-      } else if (!path.equals(other.path)) {
-        return false;
-      }
-
-      return true;
-    }
-
-  }
-
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/java/org/apache/drill/exec/record/TypedFieldId.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/java/org/apache/drill/exec/record/TypedFieldId.java b/exec/vector/src/main/java/org/apache/drill/exec/record/TypedFieldId.java
deleted file mode 100644
index a322f72..0000000
--- a/exec/vector/src/main/java/org/apache/drill/exec/record/TypedFieldId.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.drill.exec.record;
-
-import java.util.Arrays;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.drill.common.expression.PathSegment;
-import org.apache.drill.common.types.TypeProtos.MajorType;
-import org.apache.drill.exec.expr.BasicTypeHelper;
-import org.apache.drill.exec.vector.ValueVector;
-
-import com.carrotsearch.hppc.IntArrayList;
-import com.google.common.base.Preconditions;
-
-public class TypedFieldId {
-  final MajorType finalType;
-  final MajorType secondaryFinal;
-  final MajorType intermediateType;
-  final int[] fieldIds;
-  final boolean isHyperReader;
-  final boolean isListVector;
-  final PathSegment remainder;
-
-  public TypedFieldId(MajorType type, int... fieldIds) {
-    this(type, type, type, false, null, fieldIds);
-  }
-
-  public TypedFieldId(MajorType type, IntArrayList breadCrumb, PathSegment remainder) {
-    this(type, type, type, false, remainder, breadCrumb.toArray());
-  }
-
-  public TypedFieldId(MajorType type, boolean isHyper, int... fieldIds) {
-    this(type, type, type, isHyper, null, fieldIds);
-  }
-
-  public TypedFieldId(MajorType intermediateType, MajorType secondaryFinal, MajorType finalType, boolean isHyper, PathSegment remainder, int... fieldIds) {
-    this(intermediateType, secondaryFinal, finalType, isHyper, false, remainder, fieldIds);
-  }
-
-  public TypedFieldId(MajorType intermediateType, MajorType secondaryFinal, MajorType finalType, boolean isHyper, boolean isListVector, PathSegment remainder, int... fieldIds) {
-    super();
-    this.intermediateType = intermediateType;
-    this.finalType = finalType;
-    this.secondaryFinal = secondaryFinal;
-    this.fieldIds = fieldIds;
-    this.isHyperReader = isHyper;
-    this.isListVector = isListVector;
-    this.remainder = remainder;
-  }
-
-  public TypedFieldId cloneWithChild(int id) {
-    int[] fieldIds = ArrayUtils.add(this.fieldIds, id);
-    return new TypedFieldId(intermediateType, secondaryFinal, finalType, isHyperReader, remainder, fieldIds);
-  }
-
-  public PathSegment getLastSegment() {
-    if (remainder == null) {
-      return null;
-    }
-    PathSegment seg = remainder;
-    while (seg.getChild() != null) {
-      seg = seg.getChild();
-    }
-    return seg;
-  }
-
-  public TypedFieldId cloneWithRemainder(PathSegment remainder) {
-    return new TypedFieldId(intermediateType, secondaryFinal, finalType, isHyperReader, remainder, fieldIds);
-  }
-
-  public boolean hasRemainder() {
-    return remainder != null;
-  }
-
-  public PathSegment getRemainder() {
-    return remainder;
-  }
-
-  public boolean isHyperReader() {
-    return isHyperReader;
-  }
-
-  public boolean isListVector() {
-    return isListVector;
-  }
-
-  public MajorType getIntermediateType() {
-    return intermediateType;
-  }
-
-  public Class<? extends ValueVector> getIntermediateClass() {
-    return (Class<? extends ValueVector>) BasicTypeHelper.getValueVectorClass(intermediateType.getMinorType(),
-        intermediateType.getMode());
-  }
-
-  public MajorType getFinalType() {
-    return finalType;
-  }
-
-  public int[] getFieldIds() {
-    return fieldIds;
-  }
-
-  public MajorType getSecondaryFinal() {
-    return secondaryFinal;
-  }
-
-  public static Builder newBuilder() {
-    return new Builder();
-  }
-
-  public static class Builder{
-    final IntArrayList ids = new IntArrayList();
-    MajorType finalType;
-    MajorType intermediateType;
-    MajorType secondaryFinal;
-    PathSegment remainder;
-    boolean hyperReader = false;
-    boolean withIndex = false;
-    boolean isListVector = false;
-
-    public Builder addId(int id) {
-      ids.add(id);
-      return this;
-    }
-
-    public Builder withIndex() {
-      withIndex = true;
-      return this;
-    }
-
-    public Builder remainder(PathSegment remainder) {
-      this.remainder = remainder;
-      return this;
-    }
-
-    public Builder hyper() {
-      this.hyperReader = true;
-      return this;
-    }
-
-    public Builder listVector() {
-      this.isListVector = true;
-      return this;
-    }
-
-    public Builder finalType(MajorType finalType) {
-      this.finalType = finalType;
-      return this;
-    }
-
-    public Builder secondaryFinal(MajorType secondaryFinal) {
-      this.secondaryFinal = secondaryFinal;
-      return this;
-    }
-
-    public Builder intermediateType(MajorType intermediateType) {
-      this.intermediateType = intermediateType;
-      return this;
-    }
-
-    public TypedFieldId build() {
-      Preconditions.checkNotNull(intermediateType);
-      Preconditions.checkNotNull(finalType);
-
-      if (intermediateType == null) {
-        intermediateType = finalType;
-      }
-      if (secondaryFinal == null) {
-        secondaryFinal = finalType;
-      }
-
-      MajorType actualFinalType = finalType;
-      //MajorType secondaryFinal = finalType;
-
-      // if this has an index, switch to required type for output
-      //if(withIndex && intermediateType == finalType) actualFinalType = finalType.toBuilder().setMode(DataMode.REQUIRED).build();
-
-      // if this isn't a direct access, switch the final type to nullable as offsets may be null.
-      // TODO: there is a bug here with some things.
-      //if(intermediateType != finalType) actualFinalType = finalType.toBuilder().setMode(DataMode.OPTIONAL).build();
-
-      return new TypedFieldId(intermediateType, secondaryFinal, actualFinalType, hyperReader, isListVector, remainder, ids.toArray());
-    }
-  }
-
-  @Override
-  public int hashCode() {
-    final int prime = 31;
-    int result = 1;
-    result = prime * result + Arrays.hashCode(fieldIds);
-    result = prime * result + ((finalType == null) ? 0 : finalType.hashCode());
-    result = prime * result + ((intermediateType == null) ? 0 : intermediateType.hashCode());
-    result = prime * result + (isHyperReader ? 1231 : 1237);
-    result = prime * result + ((remainder == null) ? 0 : remainder.hashCode());
-    result = prime * result + ((secondaryFinal == null) ? 0 : secondaryFinal.hashCode());
-    return result;
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    if (this == obj) {
-      return true;
-    }
-    if (obj == null) {
-      return false;
-    }
-    if (getClass() != obj.getClass()) {
-      return false;
-    }
-    TypedFieldId other = (TypedFieldId) obj;
-    if (!Arrays.equals(fieldIds, other.fieldIds)) {
-      return false;
-    }
-    if (finalType == null) {
-      if (other.finalType != null) {
-        return false;
-      }
-    } else if (!finalType.equals(other.finalType)) {
-      return false;
-    }
-    if (intermediateType == null) {
-      if (other.intermediateType != null) {
-        return false;
-      }
-    } else if (!intermediateType.equals(other.intermediateType)) {
-      return false;
-    }
-    if (isHyperReader != other.isHyperReader) {
-      return false;
-    }
-    if (remainder == null) {
-      if (other.remainder != null) {
-        return false;
-      }
-    } else if (!remainder.equals(other.remainder)) {
-      return false;
-    }
-    if (secondaryFinal == null) {
-      if (other.secondaryFinal != null) {
-        return false;
-      }
-    } else if (!secondaryFinal.equals(other.secondaryFinal)) {
-      return false;
-    }
-    return true;
-  }
-
-  @Override
-  public String toString() {
-    final int maxLen = 10;
-    return "TypedFieldId [fieldIds="
-        + (fieldIds != null ? Arrays.toString(Arrays.copyOf(fieldIds, Math.min(fieldIds.length, maxLen))) : null)
-        + ", remainder=" + remainder + "]";
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/java/org/apache/drill/exec/vector/BaseValueVector.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/BaseValueVector.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/BaseValueVector.java
index 23ad778..f520ea4 100644
--- a/exec/vector/src/main/java/org/apache/drill/exec/vector/BaseValueVector.java
+++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/BaseValueVector.java
@@ -24,7 +24,6 @@ import java.util.Iterator;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Iterators;
 
-import org.apache.drill.common.expression.FieldReference;
 import org.apache.drill.exec.memory.BufferAllocator;
 import org.apache.drill.exec.proto.UserBitShared.SerializedField;
 import org.apache.drill.exec.record.MaterializedField;
@@ -66,13 +65,13 @@ public abstract class BaseValueVector implements ValueVector {
     return field;
   }
 
-  public MaterializedField getField(FieldReference ref){
+  public MaterializedField getField(String ref){
     return getField().withPath(ref);
   }
 
   @Override
   public TransferPair getTransferPair(BufferAllocator allocator) {
-    return getTransferPair(new FieldReference(getField().getPath()), allocator);
+    return getTransferPair(getField().getPath(), allocator);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/java/org/apache/drill/exec/vector/BitVector.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/BitVector.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/BitVector.java
index 3ba11e2..2b22f52 100644
--- a/exec/vector/src/main/java/org/apache/drill/exec/vector/BitVector.java
+++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/BitVector.java
@@ -20,7 +20,6 @@ package org.apache.drill.exec.vector;
 import com.google.common.base.Preconditions;
 import io.netty.buffer.DrillBuf;
 
-import org.apache.drill.common.expression.FieldReference;
 import org.apache.drill.exec.exception.OversizedAllocationException;
 import org.apache.drill.exec.expr.holders.BitHolder;
 import org.apache.drill.exec.expr.holders.NullableBitHolder;
@@ -185,7 +184,7 @@ public final class BitVector extends BaseDataValueVector implements FixedWidthVe
 
   @Override
   public void load(SerializedField metadata, DrillBuf buffer) {
-    Preconditions.checkArgument(this.field.matches(metadata), "The field %s doesn't match the provided metadata %s.", this.field, metadata);
+    Preconditions.checkArgument(this.field.getPath().equals(metadata.getNamePart().getName()), "The field %s doesn't match the provided metadata %s.", this.field, metadata);
     final int valueCount = metadata.getValueCount();
     final int expectedLength = getSizeFromCount(valueCount);
     final int actualLength = metadata.getBufferLength();
@@ -213,7 +212,7 @@ public final class BitVector extends BaseDataValueVector implements FixedWidthVe
   }
 
   @Override
-  public TransferPair getTransferPair(FieldReference ref, BufferAllocator allocator) {
+  public TransferPair getTransferPair(String ref, BufferAllocator allocator) {
     return new TransferImpl(getField().withPath(ref), allocator);
   }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/java/org/apache/drill/exec/vector/ObjectVector.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/ObjectVector.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/ObjectVector.java
index 494f234..4479db0 100644
--- a/exec/vector/src/main/java/org/apache/drill/exec/vector/ObjectVector.java
+++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/ObjectVector.java
@@ -23,7 +23,6 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-import org.apache.drill.common.expression.FieldReference;
 import org.apache.drill.exec.expr.holders.ObjectHolder;
 import org.apache.drill.exec.memory.BufferAllocator;
 import org.apache.drill.exec.exception.OutOfMemoryException;
@@ -157,7 +156,7 @@ public class ObjectVector extends BaseValueVector {
   }
 
   @Override
-  public TransferPair getTransferPair(FieldReference ref, BufferAllocator allocator) {
+  public TransferPair getTransferPair(String ref, BufferAllocator allocator) {
     throw new UnsupportedOperationException("ObjectVector does not support this");
   }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/java/org/apache/drill/exec/vector/ValueVector.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/ValueVector.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/ValueVector.java
index a4a071e..47cf143 100644
--- a/exec/vector/src/main/java/org/apache/drill/exec/vector/ValueVector.java
+++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/ValueVector.java
@@ -21,7 +21,6 @@ import java.io.Closeable;
 
 import io.netty.buffer.DrillBuf;
 
-import org.apache.drill.common.expression.FieldReference;
 import org.apache.drill.exec.exception.OutOfMemoryException;
 import org.apache.drill.exec.memory.BufferAllocator;
 import org.apache.drill.exec.proto.UserBitShared.SerializedField;
@@ -104,7 +103,7 @@ public interface ValueVector extends Closeable, Iterable<ValueVector> {
    */
   TransferPair getTransferPair(BufferAllocator allocator);
 
-  TransferPair getTransferPair(FieldReference ref, BufferAllocator allocator);
+  TransferPair getTransferPair(String ref, BufferAllocator allocator);
 
   /**
    * Returns a new {@link org.apache.drill.exec.record.TransferPair transfer pair} that is used to transfer underlying

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/java/org/apache/drill/exec/vector/VectorDescriptor.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/VectorDescriptor.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/VectorDescriptor.java
index 2ecaef6..dc8928e 100644
--- a/exec/vector/src/main/java/org/apache/drill/exec/vector/VectorDescriptor.java
+++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/VectorDescriptor.java
@@ -20,7 +20,6 @@ package org.apache.drill.exec.vector;
 import java.util.Collection;
 
 import com.google.common.base.Preconditions;
-import org.apache.drill.common.expression.FieldReference;
 import org.apache.drill.common.types.TypeProtos;
 import org.apache.drill.exec.record.MaterializedField;
 
@@ -62,7 +61,7 @@ public class VectorDescriptor {
   }
 
   public VectorDescriptor withName(final String name) {
-    return new VectorDescriptor(field.withPath(new FieldReference(name)));
+    return new VectorDescriptor(field.withPath(name));
   }
 
   public VectorDescriptor withType(final TypeProtos.MajorType type) {

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/java/org/apache/drill/exec/vector/ZeroVector.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/ZeroVector.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/ZeroVector.java
index 165fc14..e79542b 100644
--- a/exec/vector/src/main/java/org/apache/drill/exec/vector/ZeroVector.java
+++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/ZeroVector.java
@@ -21,7 +21,6 @@ import java.util.Iterator;
 
 import com.google.common.collect.Iterators;
 import io.netty.buffer.DrillBuf;
-import org.apache.drill.common.expression.FieldReference;
 import org.apache.drill.common.types.Types;
 import org.apache.drill.exec.memory.BufferAllocator;
 import org.apache.drill.exec.exception.OutOfMemoryException;
@@ -151,7 +150,7 @@ public class ZeroVector implements ValueVector {
   }
 
   @Override
-  public TransferPair getTransferPair(FieldReference ref, BufferAllocator allocator) {
+  public TransferPair getTransferPair(String ref, BufferAllocator allocator) {
     return defaultPair;
   }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/AbstractContainerVector.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/AbstractContainerVector.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/AbstractContainerVector.java
index 0ac2417..5dd794e 100644
--- a/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/AbstractContainerVector.java
+++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/AbstractContainerVector.java
@@ -21,14 +21,12 @@ import java.util.Collection;
 
 import javax.annotation.Nullable;
 
-import org.apache.drill.common.expression.PathSegment;
 import org.apache.drill.common.types.TypeProtos.DataMode;
 import org.apache.drill.common.types.TypeProtos.MajorType;
 import org.apache.drill.common.types.TypeProtos.MinorType;
 import org.apache.drill.exec.exception.OutOfMemoryException;
 import org.apache.drill.exec.memory.BufferAllocator;
 import org.apache.drill.exec.record.MaterializedField;
-import org.apache.drill.exec.record.TypedFieldId;
 import org.apache.drill.exec.util.CallBack;
 import org.apache.drill.exec.vector.ValueVector;
 
@@ -45,7 +43,7 @@ import com.google.common.collect.Sets;
 public abstract class AbstractContainerVector implements ValueVector {
   static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(AbstractContainerVector.class);
 
-  protected final MaterializedField field;
+  protected MaterializedField field;
   protected final BufferAllocator allocator;
   protected final CallBack callBack;
 
@@ -111,10 +109,6 @@ public abstract class AbstractContainerVector implements ValueVector {
     throw new IllegalStateException(String.format("Vector requested [%s] was different than type stored [%s].  Drill doesn't yet support hetergenous types.", clazz.getSimpleName(), v.getClass().getSimpleName()));
   }
 
-  public TypedFieldId getFieldIdIfMatches(TypedFieldId.Builder builder, boolean addToBreadCrumb, PathSegment seg) {
-    return FieldIdUtil.getFieldIdIfMatches(this, builder, addToBreadCrumb, seg);
-  }
-
   MajorType getLastPathType() {
     if((this.getField().getType().getMinorType() == MinorType.LIST  &&
         this.getField().getType().getMode() == DataMode.REPEATED)) {  // Use Repeated scalar type instead of Required List.

http://git-wip-us.apache.org/repos/asf/drill/blob/9a3a5c4f/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/AbstractMapVector.java
----------------------------------------------------------------------
diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/AbstractMapVector.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/AbstractMapVector.java
index 6597311..08952ab 100644
--- a/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/AbstractMapVector.java
+++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/complex/AbstractMapVector.java
@@ -130,7 +130,7 @@ public abstract class AbstractMapVector extends AbstractContainerVector {
       create = true;
     }
     if (create) {
-      final T vector = (T) BasicTypeHelper.getNewVector(field.getPath(), name, allocator, type, callBack);
+      final T vector = (T) BasicTypeHelper.getNewVector(name, allocator, type, callBack);
       putChild(name, vector);
       if (callBack!=null) {
         callBack.doWork();