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 2014/09/30 09:26:16 UTC

[14/21] git commit: DRILL-1465: Enhance push partition filter rule to handle Filters appearing above a Project. Modify group scans' digests to include number of files being considered.

DRILL-1465: Enhance push partition filter rule to handle Filters appearing above a Project. Modify group scans' digests to include number of files being considered.

Resource files for testing partition filter pushdown.


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

Branch: refs/heads/master
Commit: 1959ec667658b7d3cbcea57cc66341b531e00658
Parents: f1fd9a9
Author: Aman Sinha <as...@maprtech.com>
Authored: Sun Sep 28 17:37:42 2014 -0700
Committer: Steven Phillips <sp...@maprtech.com>
Committed: Mon Sep 29 18:21:45 2014 -0700

----------------------------------------------------------------------
 .../exec/planner/logical/DirPathBuilder.java    |   9 +-
 .../DrillPushPartitionFilterIntoScan.java       |  96 ++++++++++++----
 .../exec/planner/logical/DrillRuleSets.java     |   4 +-
 .../exec/store/dfs/easy/EasyGroupScan.java      |  15 ++-
 .../exec/store/parquet/ParquetGroupScan.java    |   1 +
 .../org/apache/drill/TestPartitionFilter.java   | 113 +++++++++++++++++++
 .../multilevel/csv/1994/Q1/orders_94_q1.csv     |  10 ++
 .../multilevel/csv/1994/Q2/orders_94_q2.csv     |  10 ++
 .../multilevel/csv/1994/Q3/orders_94_q3.csv     |  10 ++
 .../multilevel/csv/1994/Q4/orders_94_q4.csv     |  10 ++
 .../multilevel/csv/1995/Q1/orders_95_q1.csv     |  10 ++
 .../multilevel/csv/1995/Q2/orders_95_q2.csv     |  10 ++
 .../multilevel/csv/1995/Q3/orders_95_q3.csv     |  10 ++
 .../multilevel/csv/1995/Q4/orders_95_q4.csv     |  10 ++
 .../multilevel/json/1994/Q1/orders_94_q1.json   | 101 +++++++++++++++++
 .../multilevel/json/1994/Q2/orders_94_q2.json   | 101 +++++++++++++++++
 .../multilevel/json/1994/Q3/orders_94_q3.json   | 101 +++++++++++++++++
 .../multilevel/json/1994/Q4/orders_94_q4.json   | 101 +++++++++++++++++
 .../multilevel/json/1995/Q1/orders_95_q1.json   | 101 +++++++++++++++++
 .../multilevel/json/1995/Q2/orders_95_q2.json   | 101 +++++++++++++++++
 .../multilevel/json/1995/Q3/orders_95_q3.json   | 101 +++++++++++++++++
 .../multilevel/json/1995/Q4/orders_95_q4.json   | 101 +++++++++++++++++
 .../parquet/1994/Q1/orders_94_q1.parquet        | Bin 0 -> 2015 bytes
 .../parquet/1994/Q2/orders_94_q2.parquet        | Bin 0 -> 2130 bytes
 .../parquet/1994/Q3/orders_94_q3.parquet        | Bin 0 -> 2054 bytes
 .../parquet/1994/Q4/orders_94_q4.parquet        | Bin 0 -> 2056 bytes
 .../parquet/1995/Q1/orders_95_q1.parquet        | Bin 0 -> 2180 bytes
 .../parquet/1995/Q2/orders_95_q2.parquet        | Bin 0 -> 2110 bytes
 .../parquet/1995/Q3/orders_95_q3.parquet        | Bin 0 -> 1902 bytes
 .../parquet/1995/Q4/orders_95_q4.parquet        | Bin 0 -> 2013 bytes
 30 files changed, 1094 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DirPathBuilder.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DirPathBuilder.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DirPathBuilder.java
index f911d7c..743b7dc 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DirPathBuilder.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DirPathBuilder.java
@@ -21,7 +21,6 @@ import java.util.List;
 
 import org.apache.drill.common.expression.FieldReference;
 import org.apache.drill.common.expression.SchemaPath;
-import org.apache.drill.exec.planner.common.DrillScanRelBase;
 import org.eigenbase.relopt.RelOptUtil;
 import org.eigenbase.reltype.RelDataTypeField;
 import org.eigenbase.rex.RexBuilder;
@@ -49,7 +48,7 @@ public class DirPathBuilder extends RexVisitorImpl <SchemaPath> {
   static final String EMPTY_STRING = "";
 
   final private DrillFilterRel filterRel;
-  final private DrillScanRelBase scanRel;
+  final private DrillRel inputRel;
   final private RexBuilder builder;
   final private String dirLabel;
 
@@ -60,10 +59,10 @@ public class DirPathBuilder extends RexVisitorImpl <SchemaPath> {
   private RexNode finalCondition = null;     // placeholder for the final filter condition
   private boolean dirMatch = false;
 
-  DirPathBuilder(DrillFilterRel filterRel, DrillScanRelBase scanRel, RexBuilder builder, String dirLabel) {
+  DirPathBuilder(DrillFilterRel filterRel, DrillRel inputRel, RexBuilder builder, String dirLabel) {
     super(true);
     this.filterRel = filterRel;
-    this.scanRel = scanRel;
+    this.inputRel = inputRel;
     this.builder = builder;
     this.dirLabel = dirLabel;
     this.finalCondition = filterRel.getCondition();
@@ -153,7 +152,7 @@ public class DirPathBuilder extends RexVisitorImpl <SchemaPath> {
   @Override
   public SchemaPath visitInputRef(RexInputRef inputRef) {
     final int index = inputRef.getIndex();
-    final RelDataTypeField field = scanRel.getRowType().getFieldList().get(index);
+    final RelDataTypeField field = inputRel.getRowType().getFieldList().get(index);
     return FieldReference.getWithQuotedRef(field.getName());
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillPushPartitionFilterIntoScan.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillPushPartitionFilterIntoScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillPushPartitionFilterIntoScan.java
index 940b6c2..3fbc3af 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillPushPartitionFilterIntoScan.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillPushPartitionFilterIntoScan.java
@@ -29,15 +29,56 @@ import org.apache.drill.exec.store.dfs.FileSelection;
 import org.apache.drill.exec.store.dfs.FormatSelection;
 import org.eigenbase.relopt.RelOptRule;
 import org.eigenbase.relopt.RelOptRuleCall;
+import org.eigenbase.relopt.RelOptRuleOperand;
 import org.eigenbase.rex.RexNode;
 
 import com.google.common.collect.Lists;
 
-public class DrillPushPartitionFilterIntoScan extends RelOptRule {
-  public static final RelOptRule INSTANCE = new DrillPushPartitionFilterIntoScan();
+public abstract class DrillPushPartitionFilterIntoScan extends RelOptRule {
 
-  private DrillPushPartitionFilterIntoScan() {
-    super(RelOptHelper.some(DrillFilterRel.class, RelOptHelper.any(DrillScanRel.class)), "DrillPushPartitionFilterIntoScan");
+  public static final RelOptRule FILTER_ON_PROJECT =
+    new DrillPushPartitionFilterIntoScan(
+        RelOptHelper.some(DrillFilterRel.class, RelOptHelper.some(DrillProjectRel.class, RelOptHelper.any(DrillScanRel.class))),
+        "DrillPushPartitionFilterIntoScan:Filter_On_Project") {
+
+    @Override
+      public boolean matches(RelOptRuleCall call) {
+        final DrillScanRel scan = (DrillScanRel) call.rel(2);
+        return scan.getGroupScan().supportsPartitionFilterPushdown();
+      }
+
+    @Override
+    public void onMatch(RelOptRuleCall call) {
+      final DrillFilterRel filterRel = (DrillFilterRel) call.rel(0);
+      final DrillProjectRel projectRel = (DrillProjectRel) call.rel(1);
+      final DrillScanRel scanRel = (DrillScanRel) call.rel(2);
+      doOnMatch(call, filterRel, projectRel, scanRel);
+    }
+  };
+
+  public static final RelOptRule FILTER_ON_SCAN =
+      new DrillPushPartitionFilterIntoScan(
+          RelOptHelper.some(DrillFilterRel.class, RelOptHelper.any(DrillScanRel.class)),
+          "DrillPushPartitionFilterIntoScan:Filter_On_Scan") {
+
+      @Override
+        public boolean matches(RelOptRuleCall call) {
+          final DrillScanRel scan = (DrillScanRel) call.rel(1);
+          return scan.getGroupScan().supportsPartitionFilterPushdown();
+        }
+
+      @Override
+      public void onMatch(RelOptRuleCall call) {
+        final DrillFilterRel filterRel = (DrillFilterRel) call.rel(0);
+        final DrillScanRel scanRel = (DrillScanRel) call.rel(1);
+        doOnMatch(call, filterRel, null, scanRel);
+      }
+    };
+
+  private DrillPushPartitionFilterIntoScan(
+      RelOptRuleOperand operand,
+      String id) {
+    super(operand, id);
   }
 
   private FormatSelection splitFilter(FormatSelection origSelection, DirPathBuilder builder) {
@@ -78,19 +119,11 @@ public class DrillPushPartitionFilterIntoScan extends RelOptRule {
     return origSelection;
   }
 
-  @Override
-  public boolean matches(RelOptRuleCall call) {
-    final DrillScanRel scan = (DrillScanRel) call.rel(1);
-    return scan.getGroupScan().supportsPartitionFilterPushdown();
-  }
-
-  @Override
-  public void onMatch(RelOptRuleCall call) {
-    final DrillFilterRel filterRel = (DrillFilterRel) call.rel(0);
-    final DrillScanRel scanRel = (DrillScanRel) call.rel(1);
+  protected void doOnMatch(RelOptRuleCall call, DrillFilterRel filterRel, DrillProjectRel projectRel, DrillScanRel scanRel) {
+    DrillRel inputRel = projectRel != null ? projectRel : scanRel;
 
     PlannerSettings settings = PrelUtil.getPlannerSettings(call.getPlanner());
-    DirPathBuilder builder = new DirPathBuilder(filterRel, scanRel, filterRel.getCluster().getRexBuilder(), settings.getFsPartitionColumnLabel());
+    DirPathBuilder builder = new DirPathBuilder(filterRel, inputRel, filterRel.getCluster().getRexBuilder(), settings.getFsPartitionColumnLabel());
 
     FormatSelection origSelection = (FormatSelection)scanRel.getDrillTable().getSelection();
     FormatSelection newSelection = splitFilter(origSelection, builder);
@@ -99,26 +132,32 @@ public class DrillPushPartitionFilterIntoScan extends RelOptRule {
       return; // no directory filter was pushed down
     }
 
+    RexNode origFilterCondition = filterRel.getCondition();
     RexNode newFilterCondition = builder.getFinalCondition();
 
     try {
       FileGroupScan fgscan = ((FileGroupScan)scanRel.getGroupScan()).clone(newSelection.getSelection());
 
       if (newFilterCondition.isAlwaysTrue()) {
-        // TODO: temporarily keep the original filter until we resolve bugs
-        newFilterCondition = filterRel.getCondition();
-      }
-        /*
+
         final DrillScanRel newScanRel =
             new DrillScanRel(scanRel.getCluster(),
                 scanRel.getTraitSet().plus(DrillRel.DRILL_LOGICAL),
                 scanRel.getTable(),
                 fgscan,
-                filterRel.getRowType(),
+                scanRel.getRowType(),
                 scanRel.getColumns());
-        call.transformTo(newScanRel);
+
+        if (projectRel != null) {
+          DrillProjectRel newProjectRel = new DrillProjectRel(projectRel.getCluster(), projectRel.getTraitSet(),
+              newScanRel, projectRel.getProjects(), filterRel.getRowType());
+
+          call.transformTo(newProjectRel);
+        } else {
+          call.transformTo(newScanRel);
+        }
       } else {
-      */
+
       final DrillScanRel newScanRel =
           new DrillScanRel(scanRel.getCluster(),
               scanRel.getTraitSet().plus(DrillRel.DRILL_LOGICAL),
@@ -126,9 +165,18 @@ public class DrillPushPartitionFilterIntoScan extends RelOptRule {
               fgscan,
               scanRel.getRowType(),
               scanRel.getColumns());
-      final DrillFilterRel newFilterRel = new DrillFilterRel(filterRel.getCluster(), filterRel.getTraitSet(), newScanRel, newFilterCondition);
+      if (projectRel != null) {
+        DrillProjectRel newProjectRel = new DrillProjectRel(projectRel.getCluster(), projectRel.getTraitSet(),
+            newScanRel, projectRel.getProjects(), projectRel.getRowType());
+        inputRel = newProjectRel;
+      } else {
+        inputRel = newScanRel;
+      }
+      final DrillFilterRel newFilterRel = new DrillFilterRel(filterRel.getCluster(), filterRel.getTraitSet(),
+          inputRel, origFilterCondition /* for now keep the original condition until we add more test coverage */);
+
       call.transformTo(newFilterRel);
-      // }
+      }
     } catch (IOException e) {
       throw new DrillRuntimeException(e) ;
     }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillRuleSets.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillRuleSets.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillRuleSets.java
index ff1d5e4..7af541a 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillRuleSets.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillRuleSets.java
@@ -39,7 +39,6 @@ import org.apache.drill.exec.planner.physical.SortConvertPrule;
 import org.apache.drill.exec.planner.physical.SortPrule;
 import org.apache.drill.exec.planner.physical.StreamAggPrule;
 import org.apache.drill.exec.planner.physical.StreamingWindowPrule;
-import org.apache.drill.exec.planner.physical.StreamingWindowPrule;
 import org.apache.drill.exec.planner.physical.UnionAllPrule;
 import org.apache.drill.exec.planner.physical.WriterPrule;
 import org.eigenbase.rel.RelFactories;
@@ -97,7 +96,8 @@ public class DrillRuleSets {
 //      PushSortPastProjectRule.INSTANCE, //
 
       DrillPushProjIntoScan.INSTANCE,
-      DrillPushPartitionFilterIntoScan.INSTANCE,
+      DrillPushPartitionFilterIntoScan.FILTER_ON_PROJECT,
+      DrillPushPartitionFilterIntoScan.FILTER_ON_SCAN,
 
       ////////////////////////////////
       DrillScanRule.INSTANCE,

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyGroupScan.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyGroupScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyGroupScan.java
index 35d1868..e22e07e 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyGroupScan.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/easy/EasyGroupScan.java
@@ -180,8 +180,19 @@ public class EasyGroupScan extends AbstractFileGroupScan{
     mappings = AssignmentCreator.getMappings(incomingEndpoints, chunks);
   }
 
+  private void createMappings(List<EndpointAffinity> affinities) {
+    List<DrillbitEndpoint> endpoints = Lists.newArrayList();
+    for (EndpointAffinity e : affinities) {
+      endpoints.add(e.getEndpoint());
+    }
+    this.applyAssignments(endpoints);
+  }
+
   @Override
   public EasySubScan getSpecificScan(int minorFragmentId) {
+    if (mappings == null) {
+      createMappings(this.endpointAffinities);
+    }
     assert minorFragmentId < mappings.size() : String.format(
         "Mappings length [%d] should be longer than minor fragment id [%d] but it isn't.", mappings.size(),
         minorFragmentId);
@@ -214,7 +225,7 @@ public class EasyGroupScan extends AbstractFileGroupScan{
 
   @Override
   public String toString() {
-    return "EasyGroupScan [selectionRoot=" + selectionRoot + ", columns = " + columns + "]";
+    return "EasyGroupScan [selectionRoot=" + selectionRoot + ", numFiles=" + getFiles().size() + ", columns = " + columns + "]";
   }
 
   @Override
@@ -236,6 +247,8 @@ public class EasyGroupScan extends AbstractFileGroupScan{
   public FileGroupScan clone(FileSelection selection) throws IOException {
     EasyGroupScan newScan = new EasyGroupScan(this);
     newScan.initFromSelection(selection, formatPlugin);
+    newScan.mappings = null; /* the mapping will be created later when we get specific scan
+                                since the end-point affinities are not known at this time */
     return newScan;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetGroupScan.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetGroupScan.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetGroupScan.java
index 6d3cf5a..dab20e3 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetGroupScan.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/ParquetGroupScan.java
@@ -387,6 +387,7 @@ public class ParquetGroupScan extends AbstractFileGroupScan {
   public String toString() {
     return "ParquetGroupScan [entries=" + entries
         + ", selectionRoot=" + selectionRoot
+        + ", numFiles=" + getEntries().size()
         + ", columns=" + columns + "]";
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/java/org/apache/drill/TestPartitionFilter.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestPartitionFilter.java b/exec/java-exec/src/test/java/org/apache/drill/TestPartitionFilter.java
new file mode 100644
index 0000000..a47dc82
--- /dev/null
+++ b/exec/java-exec/src/test/java/org/apache/drill/TestPartitionFilter.java
@@ -0,0 +1,113 @@
+/**
+ * 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;
+
+import org.apache.drill.common.util.TestTools;
+import org.junit.Test;
+
+public class TestPartitionFilter extends BaseTestQuery{
+  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(TestPartitionFilter.class);
+
+  static final String WORKING_PATH = TestTools.getWorkingPath();
+  static final String TEST_RES_PATH = WORKING_PATH + "/src/test/resources";
+
+  @Test  //Parquet: basic test with dir0 and dir1 filters in different orders
+  public void testPartitionFilter1_Parquet() throws Exception {
+    String query1 = String.format("select dir0, dir1, o_custkey, o_orderdate from dfs_test.`%s/multilevel/parquet` where dir0=1994 and dir1='Q1'", TEST_RES_PATH);
+    String query2 = String.format("select dir0, dir1, o_custkey, o_orderdate from dfs_test.`%s/multilevel/parquet` where dir1='Q1' and dir0=1994", TEST_RES_PATH);
+    test(query1);
+    test(query2);
+  }
+
+  @Test  //Json: basic test with dir0 and dir1 filters in different orders
+  public void testPartitionFilter1_Json() throws Exception {
+    String query1 = String.format("select dir0, dir1, o_custkey, o_orderdate from dfs_test.`%s/multilevel/json` where dir0=1994 and dir1='Q1'", TEST_RES_PATH);
+    String query2 = String.format("select dir0, dir1, o_custkey, o_orderdate from dfs_test.`%s/multilevel/json` where dir1='Q1' and dir0=1994", TEST_RES_PATH);
+    test(query1);
+    test(query2);
+  }
+
+  @Test  //CSV: basic test with dir0 and dir1 filters in different orders
+  public void testPartitionFilter1_Csv() throws Exception {
+    String query1 = String.format("select * from dfs_test.`%s/multilevel/csv` where dir0=1994 and dir1='Q1'", TEST_RES_PATH);
+    String query2 = String.format("select * from dfs_test.`%s/multilevel/csv` where dir1='Q1' and dir0=1994", TEST_RES_PATH);
+    test(query1);
+    test(query2);
+  }
+
+  @Test //Parquet: partition filters are combined with regular columns in an AND
+  public void testPartitionFilter2_Parquet() throws Exception {
+    String query1 = String.format("select dir0, dir1, o_custkey, o_orderdate from dfs_test.`%s/multilevel/parquet` where o_custkey < 1000 and dir0=1994 and dir1='Q1'", TEST_RES_PATH);
+    String query2 = String.format("select dir0, dir1, o_custkey, o_orderdate from dfs_test.`%s/multilevel/parquet` where dir1='Q1' and o_custkey < 1000 and dir0=1994", TEST_RES_PATH);
+    test(query1);
+    test(query2);
+  }
+
+  @Test //Json: partition filters are combined with regular columns in an AND
+  public void testPartitionFilter2_Json() throws Exception {
+    String query1 = String.format("select dir0, dir1, o_custkey, o_orderdate from dfs_test.`%s/multilevel/json` where o_custkey < 1000 and dir0=1994 and dir1='Q1'", TEST_RES_PATH);
+    String query2 = String.format("select dir0, dir1, o_custkey, o_orderdate from dfs_test.`%s/multilevel/json` where dir1='Q1' and o_custkey < 1000 and dir0=1994", TEST_RES_PATH);
+    test(query1);
+    test(query2);
+  }
+
+  @Test //CSV: partition filters are combined with regular columns in an AND
+  public void testPartitionFilter2_Csv() throws Exception {
+    String query1 = String.format("select * from dfs_test.`%s/multilevel/csv` where columns[1] < 1000 and dir0=1994 and dir1='Q1'", TEST_RES_PATH);
+    String query2 = String.format("select * from dfs_test.`%s/multilevel/csv` where dir1='Q1' and columns[1] < 1000 and dir0=1994", TEST_RES_PATH);
+    test(query1);
+    test(query2);
+  }
+
+  @Test //Parquet: partition filters are ANDed and belong to a top-level OR
+  public void testPartitionFilter3_Parquet() throws Exception {
+    String query1 = String.format("select * from dfs_test.`%s/multilevel/parquet` where (dir0=1994 and dir1='Q1' and o_custkey < 500) or (dir0=1995 and dir1='Q2' and o_custkey > 500)", TEST_RES_PATH);
+    test(query1);
+  }
+
+  @Test //Json: partition filters are ANDed and belong to a top-level OR
+  public void testPartitionFilter3_Json() throws Exception {
+    String query1 = String.format("select * from dfs_test.`%s/multilevel/json` where (dir0=1994 and dir1='Q1' and o_custkey < 500) or (dir0=1995 and dir1='Q2' and o_custkey > 500)", TEST_RES_PATH);
+    test(query1);
+  }
+
+  @Test //CSV: partition filters are ANDed and belong to a top-level OR
+  public void testPartitionFilter3_Csv() throws Exception {
+    String query1 = String.format("select * from dfs_test.`%s/multilevel/csv` where (dir0=1994 and dir1='Q1' and columns[1] < 500) or (dir0=1995 and dir1='Q2' and columns[1] > 500)", TEST_RES_PATH);
+    test(query1);
+  }
+
+  @Test //Parquet: filters contain join conditions and partition filters
+  public void testPartitionFilter4_Parquet() throws Exception {
+    String query1 = String.format("select t1.dir0, t1.dir1, t1.o_custkey, t1.o_orderdate, cast(t2.c_name as varchar(10)) from dfs_test.`%s/multilevel/parquet` t1, cp.`tpch/customer.parquet` t2 where t1.o_custkey = t2.c_custkey and t1.dir0=1994 and t1.dir1='Q1'", TEST_RES_PATH);
+    test(query1);
+  }
+
+  @Test //Json: filters contain join conditions and partition filters
+  public void testPartitionFilter4_Json() throws Exception {
+    String query1 = String.format("select t1.dir0, t1.dir1, t1.o_custkey, t1.o_orderdate, cast(t2.c_name as varchar(10)) from dfs_test.`%s/multilevel/json` t1, cp.`tpch/customer.parquet` t2 where cast(t1.o_custkey as bigint) = cast(t2.c_custkey as bigint) and t1.dir0=1994 and t1.dir1='Q1'", TEST_RES_PATH);
+    test(query1);
+  }
+
+  @Test //CSV: filters contain join conditions and partition filters
+  public void testPartitionFilter4_Csv() throws Exception {
+    String query1 = String.format("select t1.dir0, t1.dir1, t1.columns[1] as o_custkey, t1.columns[4] as o_orderdate, cast(t2.c_name as varchar(10)) from dfs_test.`%s/multilevel/csv` t1, cp.`tpch/customer.parquet` t2 where cast(t1.columns[1] as bigint) = cast(t2.c_custkey as bigint) and t1.dir0=1994 and t1.dir1='Q1'", TEST_RES_PATH);
+    test(query1);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/csv/1994/Q1/orders_94_q1.csv
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/csv/1994/Q1/orders_94_q1.csv b/exec/java-exec/src/test/resources/multilevel/csv/1994/Q1/orders_94_q1.csv
new file mode 100644
index 0000000..6dd7682
--- /dev/null
+++ b/exec/java-exec/src/test/resources/multilevel/csv/1994/Q1/orders_94_q1.csv
@@ -0,0 +1,10 @@
+66,1292,F,104190.66,1994-01-20T00:00:00.000-08:00,5-LOW,Clerk#000000743,0,y pending requests integrate
+99,890,F,108594.87,1994-03-13T00:00:00.000-08:00,4-NOT SPECIFIED,Clerk#000000973,0,e carefully ironic packages. pending
+290,1180,F,67636.54,1994-01-01T00:00:00.000-08:00,4-NOT SPECIFIED,Clerk#000000735,0,efully dogged deposits. furiou
+291,1411,F,88375.89,1994-03-13T00:00:00.000-08:00,1-URGENT,Clerk#000000923,0,dolites. carefully regular pinto beans cajol
+323,392,F,121127.17,1994-03-26T00:00:00.000-08:00,1-URGENT,Clerk#000000959,0,arefully pending foxes sleep blithely. slyly express accoun
+352,1066,F,25542.02,1994-03-08T00:00:00.000-08:00,2-HIGH,Clerk#000000932,0,ke slyly bold pinto beans. blithely regular accounts against the spe
+389,1270,F,3266.69,1994-02-17T00:00:00.000-08:00,2-HIGH,Clerk#000000062,0,ing to the regular asymptotes. final, pending foxes about the blithely sil
+417,547,F,132531.73,1994-02-06T00:00:00.000-08:00,3-MEDIUM,Clerk#000000468,0,ironic, even packages. thinly unusual accounts sleep along the slyly unusual 
+673,793,F,34950.94,1994-03-10T00:00:00.000-08:00,1-URGENT,Clerk#000000448,0, special pinto beans use quickly furiously even depende
+833,553,F,53948.73,1994-02-13T00:00:00.000-08:00,3-MEDIUM,Clerk#000000437,0,ts haggle quickly across the slyl

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/csv/1994/Q2/orders_94_q2.csv
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/csv/1994/Q2/orders_94_q2.csv b/exec/java-exec/src/test/resources/multilevel/csv/1994/Q2/orders_94_q2.csv
new file mode 100644
index 0000000..3d42821
--- /dev/null
+++ b/exec/java-exec/src/test/resources/multilevel/csv/1994/Q2/orders_94_q2.csv
@@ -0,0 +1,10 @@
+69,845,F,204110.73,1994-06-04T00:00:00.000-07:00,4-NOT SPECIFIED,Clerk#000000330,0, depths atop the slyly thin deposits detect among the furiously silent accou
+96,1078,F,64364.3,1994-04-17T00:00:00.000-07:00,2-HIGH,Clerk#000000395,0,oost furiously. pinto
+131,928,F,140726.47,1994-06-08T00:00:00.000-07:00,3-MEDIUM,Clerk#000000625,0,after the fluffily special foxes integrate s
+224,25,F,234050.44,1994-06-18T00:00:00.000-07:00,4-NOT SPECIFIED,Clerk#000000642,0,r the quickly thin courts. carefully
+263,1162,F,104961.32,1994-05-17T00:00:00.000-07:00,2-HIGH,Clerk#000000088,0, pending instructions. blithely un
+355,701,F,103949.82,1994-06-14T00:00:00.000-07:00,5-LOW,Clerk#000000532,0,s. sometimes regular requests cajole. regular, pending accounts a
+356,1469,F,189160.02,1994-06-30T00:00:00.000-07:00,4-NOT SPECIFIED,Clerk#000000944,0,as wake along the bold accounts. even, 
+609,1252,F,33980.88,1994-06-01T00:00:00.000-07:00,3-MEDIUM,Clerk#000000348,0,- ironic gifts believe furiously ca
+672,1081,F,128581.82,1994-04-14T00:00:00.000-07:00,5-LOW,Clerk#000000106,0,egular requests are furiously according to 
+834,428,F,57631.12,1994-05-23T00:00:00.000-07:00,3-MEDIUM,Clerk#000000805,0, sleep. quickly even foxes are boldly. slyly express requests use slyly

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/csv/1994/Q3/orders_94_q3.csv
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/csv/1994/Q3/orders_94_q3.csv b/exec/java-exec/src/test/resources/multilevel/csv/1994/Q3/orders_94_q3.csv
new file mode 100644
index 0000000..65b13a8
--- /dev/null
+++ b/exec/java-exec/src/test/resources/multilevel/csv/1994/Q3/orders_94_q3.csv
@@ -0,0 +1,10 @@
+5,445,F,105367.67,1994-07-30T00:00:00.000-07:00,5-LOW,Clerk#000000925,0,quickly. bold deposits sleep slyly. packages use slyly
+64,322,F,35831.73,1994-07-16T00:00:00.000-07:00,3-MEDIUM,Clerk#000000661,0,wake fluffily. sometimes ironic pinto beans about the dolphin
+98,1045,F,71721.4,1994-09-25T00:00:00.000-07:00,1-URGENT,Clerk#000000448,0,c asymptotes. quickly regular packages should have to nag re
+161,167,F,17668.6,1994-08-31T00:00:00.000-07:00,2-HIGH,Clerk#000000322,0,carefully! special instructions sin
+231,910,F,234383.86,1994-09-29T00:00:00.000-07:00,2-HIGH,Clerk#000000446,0, packages haggle slyly after the carefully ironic instruct
+295,190,F,148569.49,1994-09-29T00:00:00.000-07:00,2-HIGH,Clerk#000000155,0, unusual pinto beans play. regular ideas haggle
+548,1240,F,139094.89,1994-09-21T00:00:00.000-07:00,1-URGENT,Clerk#000000435,0,arefully express instru
+902,86,F,49777.81,1994-07-27T00:00:00.000-07:00,4-NOT SPECIFIED,Clerk#000000811,0,yly final requests over the furiously regula
+960,347,F,84356.33,1994-09-21T00:00:00.000-07:00,3-MEDIUM,Clerk#000000120,0,regular accounts. requests
+1031,37,F,203268.37,1994-09-01T00:00:00.000-07:00,3-MEDIUM,Clerk#000000448,0,s; ironic theodolites along the carefully ex

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/csv/1994/Q4/orders_94_q4.csv
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/csv/1994/Q4/orders_94_q4.csv b/exec/java-exec/src/test/resources/multilevel/csv/1994/Q4/orders_94_q4.csv
new file mode 100644
index 0000000..88d5fff
--- /dev/null
+++ b/exec/java-exec/src/test/resources/multilevel/csv/1994/Q4/orders_94_q4.csv
@@ -0,0 +1,10 @@
+359,776,F,214770.97,1994-12-19T00:00:00.000-08:00,3-MEDIUM,Clerk#000000934,0,n dolphins. special courts above the carefully ironic requests use
+391,1103,F,14517.91,1994-11-17T00:00:00.000-08:00,2-HIGH,Clerk#000000256,0,orges thrash fluffil
+577,553,F,47860.53,1994-12-19T00:00:00.000-08:00,5-LOW,Clerk#000000154,0, deposits engage stealthil
+645,1144,F,350110.21,1994-12-03T00:00:00.000-08:00,2-HIGH,Clerk#000000090,0,quickly daring theodolites across the regu
+646,505,F,192105.59,1994-11-22T00:00:00.000-08:00,2-HIGH,Clerk#000000203,0,carefully even foxes. fina
+707,1162,F,80722.77,1994-11-20T00:00:00.000-08:00,3-MEDIUM,Clerk#000000199,0, ideas about the silent, bold deposits nag dolphins
+742,1030,F,258834.44,1994-12-23T00:00:00.000-08:00,5-LOW,Clerk#000000543,0,equests? slyly ironic dolphins boost carefully above the blithely
+900,460,F,173555.09,1994-10-01T00:00:00.000-07:00,4-NOT SPECIFIED,Clerk#000000060,0, fluffily express deposits nag furiousl
+930,1310,F,285619.42,1994-12-17T00:00:00.000-08:00,1-URGENT,Clerk#000000004,0, accounts nag slyly. ironic, ironic accounts wake blithel
+998,317,F,81009.81,1994-11-26T00:00:00.000-08:00,4-NOT SPECIFIED,Clerk#000000956,0,ronic dolphins. ironic, bold ideas haggle furiously furious

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/csv/1995/Q1/orders_95_q1.csv
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/csv/1995/Q1/orders_95_q1.csv b/exec/java-exec/src/test/resources/multilevel/csv/1995/Q1/orders_95_q1.csv
new file mode 100644
index 0000000..9558d2c
--- /dev/null
+++ b/exec/java-exec/src/test/resources/multilevel/csv/1995/Q1/orders_95_q1.csv
@@ -0,0 +1,10 @@
+65,163,P,95469.44,1995-03-18T00:00:00.000-08:00,1-URGENT,Clerk#000000632,0,ular requests are blithely pending orbits-- even requests against the deposit
+386,602,F,119718.02,1995-01-25T00:00:00.000-08:00,2-HIGH,Clerk#000000648,0, haggle quickly. stealthily bold asymptotes haggle among the furiously even re
+450,475,P,213638.07,1995-03-05T00:00:00.000-08:00,4-NOT SPECIFIED,Clerk#000000293,0,d theodolites. boldly bold foxes since the pack
+643,578,P,261882.19,1995-03-25T00:00:00.000-08:00,2-HIGH,Clerk#000000354,0,g dependencies. regular accounts 
+775,1333,F,75392.93,1995-03-18T00:00:00.000-08:00,1-URGENT,Clerk#000000191,0,kly express requests. fluffily silent accounts poach furiously
+802,1367,F,192178.48,1995-01-05T00:00:00.000-08:00,1-URGENT,Clerk#000000516,0,posits. ironic, pending requests cajole. even theodol
+897,490,P,88281.28,1995-03-20T00:00:00.000-08:00,1-URGENT,Clerk#000000316,0, wake quickly against 
+928,658,F,315638.02,1995-03-02T00:00:00.000-08:00,5-LOW,Clerk#000000450,0,ithely express pinto beans. 
+1056,275,F,41838.38,1995-02-11T00:00:00.000-08:00,1-URGENT,Clerk#000000125,0,t, even deposits hang about the slyly special i
+1092,1232,P,131664.83,1995-03-04T00:00:00.000-08:00,3-MEDIUM,Clerk#000000006,0,re quickly along the blithe

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/csv/1995/Q2/orders_95_q2.csv
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/csv/1995/Q2/orders_95_q2.csv b/exec/java-exec/src/test/resources/multilevel/csv/1995/Q2/orders_95_q2.csv
new file mode 100644
index 0000000..5d7059e
--- /dev/null
+++ b/exec/java-exec/src/test/resources/multilevel/csv/1995/Q2/orders_95_q2.csv
@@ -0,0 +1,10 @@
+162,142,O,3553.15,1995-05-08T00:00:00.000-07:00,3-MEDIUM,Clerk#000000378,0,nts hinder fluffily ironic instructions. express, express excuses 
+197,326,P,155247.48,1995-04-07T00:00:00.000-07:00,2-HIGH,Clerk#000000969,0,solve quickly about the even braids. carefully express deposits affix care
+225,331,P,226028.98,1995-05-25T00:00:00.000-07:00,1-URGENT,Clerk#000000177,0,s. blithely ironic accounts wake quickly fluffily special acc
+326,760,O,325448.68,1995-06-04T00:00:00.000-07:00,2-HIGH,Clerk#000000466,0, requests. furiously ironic asymptotes mold carefully alongside of the blit
+327,1447,P,32302.12,1995-04-17T00:00:00.000-07:00,5-LOW,Clerk#000000992,0,ng the slyly final courts. slyly even escapades eat 
+418,949,P,39431.46,1995-04-13T00:00:00.000-07:00,4-NOT SPECIFIED,Clerk#000000643,0,. furiously ironic instruc
+512,631,P,183939.48,1995-05-20T00:00:00.000-07:00,5-LOW,Clerk#000000814,0,ding requests. carefully express theodolites was quickly. furious
+513,607,O,78769.71,1995-05-01T00:00:00.000-07:00,2-HIGH,Clerk#000000522,0,regular packages. pinto beans cajole carefully against the even
+551,898,O,64301.4,1995-05-30T00:00:00.000-07:00,1-URGENT,Clerk#000000179,0,xpress accounts boost quic
+613,1384,O,56355.92,1995-06-18T00:00:00.000-07:00,2-HIGH,Clerk#000000172,0,ts hinder among the deposits. fluffily ironic depos

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/csv/1995/Q3/orders_95_q3.csv
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/csv/1995/Q3/orders_95_q3.csv b/exec/java-exec/src/test/resources/multilevel/csv/1995/Q3/orders_95_q3.csv
new file mode 100644
index 0000000..28db042
--- /dev/null
+++ b/exec/java-exec/src/test/resources/multilevel/csv/1995/Q3/orders_95_q3.csv
@@ -0,0 +1,10 @@
+32,1301,O,198665.57,1995-07-16T00:00:00.000-07:00,2-HIGH,Clerk#000000616,0,ise blithely bold, regular requests. quickly unusual dep
+166,1079,O,158207.39,1995-09-12T00:00:00.000-07:00,2-HIGH,Clerk#000000440,0,lets. ironic, bold asymptotes kindle
+448,1498,O,157247.56,1995-08-21T00:00:00.000-07:00,3-MEDIUM,Clerk#000000597,0, regular, express foxes use blithely. quic
+449,958,O,55082.33,1995-07-20T00:00:00.000-07:00,2-HIGH,Clerk#000000841,0,. furiously regular theodolites affix blithely 
+483,349,O,66194.38,1995-07-11T00:00:00.000-07:00,2-HIGH,Clerk#000000025,0,cross the carefully final e
+550,236,O,54818.45,1995-08-02T00:00:00.000-07:00,1-URGENT,Clerk#000000204,0,t requests. blithely 
+610,508,O,229411.94,1995-08-02T00:00:00.000-07:00,1-URGENT,Clerk#000000610,0,totes. ironic, unusual packag
+706,1474,O,40836.77,1995-09-09T00:00:00.000-07:00,1-URGENT,Clerk#000000448,0,g the packages. deposits caj
+740,436,O,126713.42,1995-07-16T00:00:00.000-07:00,3-MEDIUM,Clerk#000000583,0,courts haggle furiously across the final, regul
+805,1261,O,145879.67,1995-07-05T00:00:00.000-07:00,4-NOT SPECIFIED,Clerk#000000856,0,y according to the fluffily 

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/csv/1995/Q4/orders_95_q4.csv
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/csv/1995/Q4/orders_95_q4.csv b/exec/java-exec/src/test/resources/multilevel/csv/1995/Q4/orders_95_q4.csv
new file mode 100644
index 0000000..21c7b60
--- /dev/null
+++ b/exec/java-exec/src/test/resources/multilevel/csv/1995/Q4/orders_95_q4.csv
@@ -0,0 +1,10 @@
+4,1369,O,56000.91,1995-10-11T00:00:00.000-07:00,5-LOW,Clerk#000000124,0,sits. slyly regular warthogs cajole. regular, regular theodolites acro
+35,1276,O,194641.93,1995-10-23T00:00:00.000-07:00,4-NOT SPECIFIED,Clerk#000000259,0,zzle. carefully enticing deposits nag furio
+36,1153,O,42011.04,1995-11-03T00:00:00.000-08:00,1-URGENT,Clerk#000000358,0, quick packages are blithely. slyly silent accounts wake qu
+135,605,O,230472.84,1995-10-21T00:00:00.000-07:00,4-NOT SPECIFIED,Clerk#000000804,0,l platelets use according t
+227,100,O,69020.68,1995-11-10T00:00:00.000-08:00,5-LOW,Clerk#000000919,0, express instructions. slyly regul
+262,304,O,173401.63,1995-11-25T00:00:00.000-08:00,4-NOT SPECIFIED,Clerk#000000551,0,l packages. blithely final pinto beans use carefu
+420,902,O,269064.47,1995-10-31T00:00:00.000-08:00,4-NOT SPECIFIED,Clerk#000000756,0,leep carefully final excuses. fluffily pending requests unwind carefully above
+454,488,O,24543.95,1995-12-27T00:00:00.000-08:00,5-LOW,Clerk#000000890,0,dolites sleep carefully blithely regular deposits. quickly regul
+545,632,O,35129.54,1995-11-07T00:00:00.000-08:00,2-HIGH,Clerk#000000537,0,as. blithely final hockey players about th
+679,485,O,14905.06,1995-12-15T00:00:00.000-08:00,2-HIGH,Clerk#000000853,0,tealthy, final pinto beans haggle slyly. pending platelets about the special, 

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/json/1994/Q1/orders_94_q1.json
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/json/1994/Q1/orders_94_q1.json b/exec/java-exec/src/test/resources/multilevel/json/1994/Q1/orders_94_q1.json
new file mode 100644
index 0000000..da6ce00
--- /dev/null
+++ b/exec/java-exec/src/test/resources/multilevel/json/1994/Q1/orders_94_q1.json
@@ -0,0 +1,101 @@
+{
+  "o_orderkey" : 66,
+  "o_custkey" : 1292,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 104190.66,
+  "o_orderdate" : "1994-01-20T00:00:00.000-08:00",
+  "o_orderpriority" : "5-LOW",
+  "o_clerk" : "Clerk#000000743",
+  "o_shippriority" : 0,
+  "o_comment" : "y pending requests integrate"
+} {
+  "o_orderkey" : 99,
+  "o_custkey" : 890,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 108594.87,
+  "o_orderdate" : "1994-03-13T00:00:00.000-08:00",
+  "o_orderpriority" : "4-NOT SPECIFIED",
+  "o_clerk" : "Clerk#000000973",
+  "o_shippriority" : 0,
+  "o_comment" : "e carefully ironic packages. pending"
+} {
+  "o_orderkey" : 290,
+  "o_custkey" : 1180,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 67636.54,
+  "o_orderdate" : "1994-01-01T00:00:00.000-08:00",
+  "o_orderpriority" : "4-NOT SPECIFIED",
+  "o_clerk" : "Clerk#000000735",
+  "o_shippriority" : 0,
+  "o_comment" : "efully dogged deposits. furiou"
+} {
+  "o_orderkey" : 291,
+  "o_custkey" : 1411,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 88375.89,
+  "o_orderdate" : "1994-03-13T00:00:00.000-08:00",
+  "o_orderpriority" : "1-URGENT",
+  "o_clerk" : "Clerk#000000923",
+  "o_shippriority" : 0,
+  "o_comment" : "dolites. carefully regular pinto beans cajol"
+} {
+  "o_orderkey" : 323,
+  "o_custkey" : 392,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 121127.17,
+  "o_orderdate" : "1994-03-26T00:00:00.000-08:00",
+  "o_orderpriority" : "1-URGENT",
+  "o_clerk" : "Clerk#000000959",
+  "o_shippriority" : 0,
+  "o_comment" : "arefully pending foxes sleep blithely. slyly express accoun"
+} {
+  "o_orderkey" : 352,
+  "o_custkey" : 1066,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 25542.02,
+  "o_orderdate" : "1994-03-08T00:00:00.000-08:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000932",
+  "o_shippriority" : 0,
+  "o_comment" : "ke slyly bold pinto beans. blithely regular accounts against the spe"
+} {
+  "o_orderkey" : 389,
+  "o_custkey" : 1270,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 3266.69,
+  "o_orderdate" : "1994-02-17T00:00:00.000-08:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000062",
+  "o_shippriority" : 0,
+  "o_comment" : "ing to the regular asymptotes. final, pending foxes about the blithely sil"
+} {
+  "o_orderkey" : 417,
+  "o_custkey" : 547,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 132531.73,
+  "o_orderdate" : "1994-02-06T00:00:00.000-08:00",
+  "o_orderpriority" : "3-MEDIUM",
+  "o_clerk" : "Clerk#000000468",
+  "o_shippriority" : 0,
+  "o_comment" : "ironic, even packages. thinly unusual accounts sleep along the slyly unusual "
+} {
+  "o_orderkey" : 673,
+  "o_custkey" : 793,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 34950.94,
+  "o_orderdate" : "1994-03-10T00:00:00.000-08:00",
+  "o_orderpriority" : "1-URGENT",
+  "o_clerk" : "Clerk#000000448",
+  "o_shippriority" : 0,
+  "o_comment" : " special pinto beans use quickly furiously even depende"
+} {
+  "o_orderkey" : 833,
+  "o_custkey" : 553,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 53948.73,
+  "o_orderdate" : "1994-02-13T00:00:00.000-08:00",
+  "o_orderpriority" : "3-MEDIUM",
+  "o_clerk" : "Clerk#000000437",
+  "o_shippriority" : 0,
+  "o_comment" : "ts haggle quickly across the slyl"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/json/1994/Q2/orders_94_q2.json
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/json/1994/Q2/orders_94_q2.json b/exec/java-exec/src/test/resources/multilevel/json/1994/Q2/orders_94_q2.json
new file mode 100644
index 0000000..bc42db6
--- /dev/null
+++ b/exec/java-exec/src/test/resources/multilevel/json/1994/Q2/orders_94_q2.json
@@ -0,0 +1,101 @@
+{
+  "o_orderkey" : 69,
+  "o_custkey" : 845,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 204110.73,
+  "o_orderdate" : "1994-06-04T00:00:00.000-07:00",
+  "o_orderpriority" : "4-NOT SPECIFIED",
+  "o_clerk" : "Clerk#000000330",
+  "o_shippriority" : 0,
+  "o_comment" : " depths atop the slyly thin deposits detect among the furiously silent accou"
+} {
+  "o_orderkey" : 96,
+  "o_custkey" : 1078,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 64364.3,
+  "o_orderdate" : "1994-04-17T00:00:00.000-07:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000395",
+  "o_shippriority" : 0,
+  "o_comment" : "oost furiously. pinto"
+} {
+  "o_orderkey" : 131,
+  "o_custkey" : 928,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 140726.47,
+  "o_orderdate" : "1994-06-08T00:00:00.000-07:00",
+  "o_orderpriority" : "3-MEDIUM",
+  "o_clerk" : "Clerk#000000625",
+  "o_shippriority" : 0,
+  "o_comment" : "after the fluffily special foxes integrate s"
+} {
+  "o_orderkey" : 224,
+  "o_custkey" : 25,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 234050.44,
+  "o_orderdate" : "1994-06-18T00:00:00.000-07:00",
+  "o_orderpriority" : "4-NOT SPECIFIED",
+  "o_clerk" : "Clerk#000000642",
+  "o_shippriority" : 0,
+  "o_comment" : "r the quickly thin courts. carefully"
+} {
+  "o_orderkey" : 263,
+  "o_custkey" : 1162,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 104961.32,
+  "o_orderdate" : "1994-05-17T00:00:00.000-07:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000088",
+  "o_shippriority" : 0,
+  "o_comment" : " pending instructions. blithely un"
+} {
+  "o_orderkey" : 355,
+  "o_custkey" : 701,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 103949.82,
+  "o_orderdate" : "1994-06-14T00:00:00.000-07:00",
+  "o_orderpriority" : "5-LOW",
+  "o_clerk" : "Clerk#000000532",
+  "o_shippriority" : 0,
+  "o_comment" : "s. sometimes regular requests cajole. regular, pending accounts a"
+} {
+  "o_orderkey" : 356,
+  "o_custkey" : 1469,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 189160.02,
+  "o_orderdate" : "1994-06-30T00:00:00.000-07:00",
+  "o_orderpriority" : "4-NOT SPECIFIED",
+  "o_clerk" : "Clerk#000000944",
+  "o_shippriority" : 0,
+  "o_comment" : "as wake along the bold accounts. even, "
+} {
+  "o_orderkey" : 609,
+  "o_custkey" : 1252,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 33980.88,
+  "o_orderdate" : "1994-06-01T00:00:00.000-07:00",
+  "o_orderpriority" : "3-MEDIUM",
+  "o_clerk" : "Clerk#000000348",
+  "o_shippriority" : 0,
+  "o_comment" : "- ironic gifts believe furiously ca"
+} {
+  "o_orderkey" : 672,
+  "o_custkey" : 1081,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 128581.82,
+  "o_orderdate" : "1994-04-14T00:00:00.000-07:00",
+  "o_orderpriority" : "5-LOW",
+  "o_clerk" : "Clerk#000000106",
+  "o_shippriority" : 0,
+  "o_comment" : "egular requests are furiously according to "
+} {
+  "o_orderkey" : 834,
+  "o_custkey" : 428,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 57631.12,
+  "o_orderdate" : "1994-05-23T00:00:00.000-07:00",
+  "o_orderpriority" : "3-MEDIUM",
+  "o_clerk" : "Clerk#000000805",
+  "o_shippriority" : 0,
+  "o_comment" : " sleep. quickly even foxes are boldly. slyly express requests use slyly"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/json/1994/Q3/orders_94_q3.json
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/json/1994/Q3/orders_94_q3.json b/exec/java-exec/src/test/resources/multilevel/json/1994/Q3/orders_94_q3.json
new file mode 100644
index 0000000..ae6263a
--- /dev/null
+++ b/exec/java-exec/src/test/resources/multilevel/json/1994/Q3/orders_94_q3.json
@@ -0,0 +1,101 @@
+{
+  "o_orderkey" : 5,
+  "o_custkey" : 445,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 105367.67,
+  "o_orderdate" : "1994-07-30T00:00:00.000-07:00",
+  "o_orderpriority" : "5-LOW",
+  "o_clerk" : "Clerk#000000925",
+  "o_shippriority" : 0,
+  "o_comment" : "quickly. bold deposits sleep slyly. packages use slyly"
+} {
+  "o_orderkey" : 64,
+  "o_custkey" : 322,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 35831.73,
+  "o_orderdate" : "1994-07-16T00:00:00.000-07:00",
+  "o_orderpriority" : "3-MEDIUM",
+  "o_clerk" : "Clerk#000000661",
+  "o_shippriority" : 0,
+  "o_comment" : "wake fluffily. sometimes ironic pinto beans about the dolphin"
+} {
+  "o_orderkey" : 98,
+  "o_custkey" : 1045,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 71721.4,
+  "o_orderdate" : "1994-09-25T00:00:00.000-07:00",
+  "o_orderpriority" : "1-URGENT",
+  "o_clerk" : "Clerk#000000448",
+  "o_shippriority" : 0,
+  "o_comment" : "c asymptotes. quickly regular packages should have to nag re"
+} {
+  "o_orderkey" : 161,
+  "o_custkey" : 167,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 17668.6,
+  "o_orderdate" : "1994-08-31T00:00:00.000-07:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000322",
+  "o_shippriority" : 0,
+  "o_comment" : "carefully! special instructions sin"
+} {
+  "o_orderkey" : 231,
+  "o_custkey" : 910,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 234383.86,
+  "o_orderdate" : "1994-09-29T00:00:00.000-07:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000446",
+  "o_shippriority" : 0,
+  "o_comment" : " packages haggle slyly after the carefully ironic instruct"
+} {
+  "o_orderkey" : 295,
+  "o_custkey" : 190,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 148569.49,
+  "o_orderdate" : "1994-09-29T00:00:00.000-07:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000155",
+  "o_shippriority" : 0,
+  "o_comment" : " unusual pinto beans play. regular ideas haggle"
+} {
+  "o_orderkey" : 548,
+  "o_custkey" : 1240,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 139094.89,
+  "o_orderdate" : "1994-09-21T00:00:00.000-07:00",
+  "o_orderpriority" : "1-URGENT",
+  "o_clerk" : "Clerk#000000435",
+  "o_shippriority" : 0,
+  "o_comment" : "arefully express instru"
+} {
+  "o_orderkey" : 902,
+  "o_custkey" : 86,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 49777.81,
+  "o_orderdate" : "1994-07-27T00:00:00.000-07:00",
+  "o_orderpriority" : "4-NOT SPECIFIED",
+  "o_clerk" : "Clerk#000000811",
+  "o_shippriority" : 0,
+  "o_comment" : "yly final requests over the furiously regula"
+} {
+  "o_orderkey" : 960,
+  "o_custkey" : 347,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 84356.33,
+  "o_orderdate" : "1994-09-21T00:00:00.000-07:00",
+  "o_orderpriority" : "3-MEDIUM",
+  "o_clerk" : "Clerk#000000120",
+  "o_shippriority" : 0,
+  "o_comment" : "regular accounts. requests"
+} {
+  "o_orderkey" : 1031,
+  "o_custkey" : 37,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 203268.37,
+  "o_orderdate" : "1994-09-01T00:00:00.000-07:00",
+  "o_orderpriority" : "3-MEDIUM",
+  "o_clerk" : "Clerk#000000448",
+  "o_shippriority" : 0,
+  "o_comment" : "s; ironic theodolites along the carefully ex"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/json/1994/Q4/orders_94_q4.json
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/json/1994/Q4/orders_94_q4.json b/exec/java-exec/src/test/resources/multilevel/json/1994/Q4/orders_94_q4.json
new file mode 100644
index 0000000..d15cb9e
--- /dev/null
+++ b/exec/java-exec/src/test/resources/multilevel/json/1994/Q4/orders_94_q4.json
@@ -0,0 +1,101 @@
+{
+  "o_orderkey" : 359,
+  "o_custkey" : 776,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 214770.97,
+  "o_orderdate" : "1994-12-19T00:00:00.000-08:00",
+  "o_orderpriority" : "3-MEDIUM",
+  "o_clerk" : "Clerk#000000934",
+  "o_shippriority" : 0,
+  "o_comment" : "n dolphins. special courts above the carefully ironic requests use"
+} {
+  "o_orderkey" : 391,
+  "o_custkey" : 1103,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 14517.91,
+  "o_orderdate" : "1994-11-17T00:00:00.000-08:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000256",
+  "o_shippriority" : 0,
+  "o_comment" : "orges thrash fluffil"
+} {
+  "o_orderkey" : 577,
+  "o_custkey" : 553,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 47860.53,
+  "o_orderdate" : "1994-12-19T00:00:00.000-08:00",
+  "o_orderpriority" : "5-LOW",
+  "o_clerk" : "Clerk#000000154",
+  "o_shippriority" : 0,
+  "o_comment" : " deposits engage stealthil"
+} {
+  "o_orderkey" : 645,
+  "o_custkey" : 1144,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 350110.21,
+  "o_orderdate" : "1994-12-03T00:00:00.000-08:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000090",
+  "o_shippriority" : 0,
+  "o_comment" : "quickly daring theodolites across the regu"
+} {
+  "o_orderkey" : 646,
+  "o_custkey" : 505,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 192105.59,
+  "o_orderdate" : "1994-11-22T00:00:00.000-08:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000203",
+  "o_shippriority" : 0,
+  "o_comment" : "carefully even foxes. fina"
+} {
+  "o_orderkey" : 707,
+  "o_custkey" : 1162,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 80722.77,
+  "o_orderdate" : "1994-11-20T00:00:00.000-08:00",
+  "o_orderpriority" : "3-MEDIUM",
+  "o_clerk" : "Clerk#000000199",
+  "o_shippriority" : 0,
+  "o_comment" : " ideas about the silent, bold deposits nag dolphins"
+} {
+  "o_orderkey" : 742,
+  "o_custkey" : 1030,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 258834.44,
+  "o_orderdate" : "1994-12-23T00:00:00.000-08:00",
+  "o_orderpriority" : "5-LOW",
+  "o_clerk" : "Clerk#000000543",
+  "o_shippriority" : 0,
+  "o_comment" : "equests? slyly ironic dolphins boost carefully above the blithely"
+} {
+  "o_orderkey" : 900,
+  "o_custkey" : 460,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 173555.09,
+  "o_orderdate" : "1994-10-01T00:00:00.000-07:00",
+  "o_orderpriority" : "4-NOT SPECIFIED",
+  "o_clerk" : "Clerk#000000060",
+  "o_shippriority" : 0,
+  "o_comment" : " fluffily express deposits nag furiousl"
+} {
+  "o_orderkey" : 930,
+  "o_custkey" : 1310,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 285619.42,
+  "o_orderdate" : "1994-12-17T00:00:00.000-08:00",
+  "o_orderpriority" : "1-URGENT",
+  "o_clerk" : "Clerk#000000004",
+  "o_shippriority" : 0,
+  "o_comment" : " accounts nag slyly. ironic, ironic accounts wake blithel"
+} {
+  "o_orderkey" : 998,
+  "o_custkey" : 317,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 81009.81,
+  "o_orderdate" : "1994-11-26T00:00:00.000-08:00",
+  "o_orderpriority" : "4-NOT SPECIFIED",
+  "o_clerk" : "Clerk#000000956",
+  "o_shippriority" : 0,
+  "o_comment" : "ronic dolphins. ironic, bold ideas haggle furiously furious"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/json/1995/Q1/orders_95_q1.json
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/json/1995/Q1/orders_95_q1.json b/exec/java-exec/src/test/resources/multilevel/json/1995/Q1/orders_95_q1.json
new file mode 100644
index 0000000..704b664
--- /dev/null
+++ b/exec/java-exec/src/test/resources/multilevel/json/1995/Q1/orders_95_q1.json
@@ -0,0 +1,101 @@
+{
+  "o_orderkey" : 65,
+  "o_custkey" : 163,
+  "o_orderstatus" : "P",
+  "o_totalprice" : 95469.44,
+  "o_orderdate" : "1995-03-18T00:00:00.000-08:00",
+  "o_orderpriority" : "1-URGENT",
+  "o_clerk" : "Clerk#000000632",
+  "o_shippriority" : 0,
+  "o_comment" : "ular requests are blithely pending orbits-- even requests against the deposit"
+} {
+  "o_orderkey" : 386,
+  "o_custkey" : 602,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 119718.02,
+  "o_orderdate" : "1995-01-25T00:00:00.000-08:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000648",
+  "o_shippriority" : 0,
+  "o_comment" : " haggle quickly. stealthily bold asymptotes haggle among the furiously even re"
+} {
+  "o_orderkey" : 450,
+  "o_custkey" : 475,
+  "o_orderstatus" : "P",
+  "o_totalprice" : 213638.07,
+  "o_orderdate" : "1995-03-05T00:00:00.000-08:00",
+  "o_orderpriority" : "4-NOT SPECIFIED",
+  "o_clerk" : "Clerk#000000293",
+  "o_shippriority" : 0,
+  "o_comment" : "d theodolites. boldly bold foxes since the pack"
+} {
+  "o_orderkey" : 643,
+  "o_custkey" : 578,
+  "o_orderstatus" : "P",
+  "o_totalprice" : 261882.19,
+  "o_orderdate" : "1995-03-25T00:00:00.000-08:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000354",
+  "o_shippriority" : 0,
+  "o_comment" : "g dependencies. regular accounts "
+} {
+  "o_orderkey" : 775,
+  "o_custkey" : 1333,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 75392.93,
+  "o_orderdate" : "1995-03-18T00:00:00.000-08:00",
+  "o_orderpriority" : "1-URGENT",
+  "o_clerk" : "Clerk#000000191",
+  "o_shippriority" : 0,
+  "o_comment" : "kly express requests. fluffily silent accounts poach furiously"
+} {
+  "o_orderkey" : 802,
+  "o_custkey" : 1367,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 192178.48,
+  "o_orderdate" : "1995-01-05T00:00:00.000-08:00",
+  "o_orderpriority" : "1-URGENT",
+  "o_clerk" : "Clerk#000000516",
+  "o_shippriority" : 0,
+  "o_comment" : "posits. ironic, pending requests cajole. even theodol"
+} {
+  "o_orderkey" : 897,
+  "o_custkey" : 490,
+  "o_orderstatus" : "P",
+  "o_totalprice" : 88281.28,
+  "o_orderdate" : "1995-03-20T00:00:00.000-08:00",
+  "o_orderpriority" : "1-URGENT",
+  "o_clerk" : "Clerk#000000316",
+  "o_shippriority" : 0,
+  "o_comment" : " wake quickly against "
+} {
+  "o_orderkey" : 928,
+  "o_custkey" : 658,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 315638.02,
+  "o_orderdate" : "1995-03-02T00:00:00.000-08:00",
+  "o_orderpriority" : "5-LOW",
+  "o_clerk" : "Clerk#000000450",
+  "o_shippriority" : 0,
+  "o_comment" : "ithely express pinto beans. "
+} {
+  "o_orderkey" : 1056,
+  "o_custkey" : 275,
+  "o_orderstatus" : "F",
+  "o_totalprice" : 41838.38,
+  "o_orderdate" : "1995-02-11T00:00:00.000-08:00",
+  "o_orderpriority" : "1-URGENT",
+  "o_clerk" : "Clerk#000000125",
+  "o_shippriority" : 0,
+  "o_comment" : "t, even deposits hang about the slyly special i"
+} {
+  "o_orderkey" : 1092,
+  "o_custkey" : 1232,
+  "o_orderstatus" : "P",
+  "o_totalprice" : 131664.83,
+  "o_orderdate" : "1995-03-04T00:00:00.000-08:00",
+  "o_orderpriority" : "3-MEDIUM",
+  "o_clerk" : "Clerk#000000006",
+  "o_shippriority" : 0,
+  "o_comment" : "re quickly along the blithe"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/json/1995/Q2/orders_95_q2.json
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/json/1995/Q2/orders_95_q2.json b/exec/java-exec/src/test/resources/multilevel/json/1995/Q2/orders_95_q2.json
new file mode 100644
index 0000000..affbc1d
--- /dev/null
+++ b/exec/java-exec/src/test/resources/multilevel/json/1995/Q2/orders_95_q2.json
@@ -0,0 +1,101 @@
+{
+  "o_orderkey" : 162,
+  "o_custkey" : 142,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 3553.15,
+  "o_orderdate" : "1995-05-08T00:00:00.000-07:00",
+  "o_orderpriority" : "3-MEDIUM",
+  "o_clerk" : "Clerk#000000378",
+  "o_shippriority" : 0,
+  "o_comment" : "nts hinder fluffily ironic instructions. express, express excuses "
+} {
+  "o_orderkey" : 197,
+  "o_custkey" : 326,
+  "o_orderstatus" : "P",
+  "o_totalprice" : 155247.48,
+  "o_orderdate" : "1995-04-07T00:00:00.000-07:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000969",
+  "o_shippriority" : 0,
+  "o_comment" : "solve quickly about the even braids. carefully express deposits affix care"
+} {
+  "o_orderkey" : 225,
+  "o_custkey" : 331,
+  "o_orderstatus" : "P",
+  "o_totalprice" : 226028.98,
+  "o_orderdate" : "1995-05-25T00:00:00.000-07:00",
+  "o_orderpriority" : "1-URGENT",
+  "o_clerk" : "Clerk#000000177",
+  "o_shippriority" : 0,
+  "o_comment" : "s. blithely ironic accounts wake quickly fluffily special acc"
+} {
+  "o_orderkey" : 326,
+  "o_custkey" : 760,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 325448.68,
+  "o_orderdate" : "1995-06-04T00:00:00.000-07:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000466",
+  "o_shippriority" : 0,
+  "o_comment" : " requests. furiously ironic asymptotes mold carefully alongside of the blit"
+} {
+  "o_orderkey" : 327,
+  "o_custkey" : 1447,
+  "o_orderstatus" : "P",
+  "o_totalprice" : 32302.12,
+  "o_orderdate" : "1995-04-17T00:00:00.000-07:00",
+  "o_orderpriority" : "5-LOW",
+  "o_clerk" : "Clerk#000000992",
+  "o_shippriority" : 0,
+  "o_comment" : "ng the slyly final courts. slyly even escapades eat "
+} {
+  "o_orderkey" : 418,
+  "o_custkey" : 949,
+  "o_orderstatus" : "P",
+  "o_totalprice" : 39431.46,
+  "o_orderdate" : "1995-04-13T00:00:00.000-07:00",
+  "o_orderpriority" : "4-NOT SPECIFIED",
+  "o_clerk" : "Clerk#000000643",
+  "o_shippriority" : 0,
+  "o_comment" : ". furiously ironic instruc"
+} {
+  "o_orderkey" : 512,
+  "o_custkey" : 631,
+  "o_orderstatus" : "P",
+  "o_totalprice" : 183939.48,
+  "o_orderdate" : "1995-05-20T00:00:00.000-07:00",
+  "o_orderpriority" : "5-LOW",
+  "o_clerk" : "Clerk#000000814",
+  "o_shippriority" : 0,
+  "o_comment" : "ding requests. carefully express theodolites was quickly. furious"
+} {
+  "o_orderkey" : 513,
+  "o_custkey" : 607,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 78769.71,
+  "o_orderdate" : "1995-05-01T00:00:00.000-07:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000522",
+  "o_shippriority" : 0,
+  "o_comment" : "regular packages. pinto beans cajole carefully against the even"
+} {
+  "o_orderkey" : 551,
+  "o_custkey" : 898,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 64301.4,
+  "o_orderdate" : "1995-05-30T00:00:00.000-07:00",
+  "o_orderpriority" : "1-URGENT",
+  "o_clerk" : "Clerk#000000179",
+  "o_shippriority" : 0,
+  "o_comment" : "xpress accounts boost quic"
+} {
+  "o_orderkey" : 613,
+  "o_custkey" : 1384,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 56355.92,
+  "o_orderdate" : "1995-06-18T00:00:00.000-07:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000172",
+  "o_shippriority" : 0,
+  "o_comment" : "ts hinder among the deposits. fluffily ironic depos"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/json/1995/Q3/orders_95_q3.json
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/json/1995/Q3/orders_95_q3.json b/exec/java-exec/src/test/resources/multilevel/json/1995/Q3/orders_95_q3.json
new file mode 100644
index 0000000..acb4dbc
--- /dev/null
+++ b/exec/java-exec/src/test/resources/multilevel/json/1995/Q3/orders_95_q3.json
@@ -0,0 +1,101 @@
+{
+  "o_orderkey" : 32,
+  "o_custkey" : 1301,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 198665.57,
+  "o_orderdate" : "1995-07-16T00:00:00.000-07:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000616",
+  "o_shippriority" : 0,
+  "o_comment" : "ise blithely bold, regular requests. quickly unusual dep"
+} {
+  "o_orderkey" : 166,
+  "o_custkey" : 1079,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 158207.39,
+  "o_orderdate" : "1995-09-12T00:00:00.000-07:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000440",
+  "o_shippriority" : 0,
+  "o_comment" : "lets. ironic, bold asymptotes kindle"
+} {
+  "o_orderkey" : 448,
+  "o_custkey" : 1498,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 157247.56,
+  "o_orderdate" : "1995-08-21T00:00:00.000-07:00",
+  "o_orderpriority" : "3-MEDIUM",
+  "o_clerk" : "Clerk#000000597",
+  "o_shippriority" : 0,
+  "o_comment" : " regular, express foxes use blithely. quic"
+} {
+  "o_orderkey" : 449,
+  "o_custkey" : 958,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 55082.33,
+  "o_orderdate" : "1995-07-20T00:00:00.000-07:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000841",
+  "o_shippriority" : 0,
+  "o_comment" : ". furiously regular theodolites affix blithely "
+} {
+  "o_orderkey" : 483,
+  "o_custkey" : 349,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 66194.38,
+  "o_orderdate" : "1995-07-11T00:00:00.000-07:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000025",
+  "o_shippriority" : 0,
+  "o_comment" : "cross the carefully final e"
+} {
+  "o_orderkey" : 550,
+  "o_custkey" : 236,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 54818.45,
+  "o_orderdate" : "1995-08-02T00:00:00.000-07:00",
+  "o_orderpriority" : "1-URGENT",
+  "o_clerk" : "Clerk#000000204",
+  "o_shippriority" : 0,
+  "o_comment" : "t requests. blithely "
+} {
+  "o_orderkey" : 610,
+  "o_custkey" : 508,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 229411.94,
+  "o_orderdate" : "1995-08-02T00:00:00.000-07:00",
+  "o_orderpriority" : "1-URGENT",
+  "o_clerk" : "Clerk#000000610",
+  "o_shippriority" : 0,
+  "o_comment" : "totes. ironic, unusual packag"
+} {
+  "o_orderkey" : 706,
+  "o_custkey" : 1474,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 40836.77,
+  "o_orderdate" : "1995-09-09T00:00:00.000-07:00",
+  "o_orderpriority" : "1-URGENT",
+  "o_clerk" : "Clerk#000000448",
+  "o_shippriority" : 0,
+  "o_comment" : "g the packages. deposits caj"
+} {
+  "o_orderkey" : 740,
+  "o_custkey" : 436,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 126713.42,
+  "o_orderdate" : "1995-07-16T00:00:00.000-07:00",
+  "o_orderpriority" : "3-MEDIUM",
+  "o_clerk" : "Clerk#000000583",
+  "o_shippriority" : 0,
+  "o_comment" : "courts haggle furiously across the final, regul"
+} {
+  "o_orderkey" : 805,
+  "o_custkey" : 1261,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 145879.67,
+  "o_orderdate" : "1995-07-05T00:00:00.000-07:00",
+  "o_orderpriority" : "4-NOT SPECIFIED",
+  "o_clerk" : "Clerk#000000856",
+  "o_shippriority" : 0,
+  "o_comment" : "y according to the fluffily "
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/json/1995/Q4/orders_95_q4.json
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/json/1995/Q4/orders_95_q4.json b/exec/java-exec/src/test/resources/multilevel/json/1995/Q4/orders_95_q4.json
new file mode 100644
index 0000000..68fbbec
--- /dev/null
+++ b/exec/java-exec/src/test/resources/multilevel/json/1995/Q4/orders_95_q4.json
@@ -0,0 +1,101 @@
+{
+  "o_orderkey" : 4,
+  "o_custkey" : 1369,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 56000.91,
+  "o_orderdate" : "1995-10-11T00:00:00.000-07:00",
+  "o_orderpriority" : "5-LOW",
+  "o_clerk" : "Clerk#000000124",
+  "o_shippriority" : 0,
+  "o_comment" : "sits. slyly regular warthogs cajole. regular, regular theodolites acro"
+} {
+  "o_orderkey" : 35,
+  "o_custkey" : 1276,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 194641.93,
+  "o_orderdate" : "1995-10-23T00:00:00.000-07:00",
+  "o_orderpriority" : "4-NOT SPECIFIED",
+  "o_clerk" : "Clerk#000000259",
+  "o_shippriority" : 0,
+  "o_comment" : "zzle. carefully enticing deposits nag furio"
+} {
+  "o_orderkey" : 36,
+  "o_custkey" : 1153,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 42011.04,
+  "o_orderdate" : "1995-11-03T00:00:00.000-08:00",
+  "o_orderpriority" : "1-URGENT",
+  "o_clerk" : "Clerk#000000358",
+  "o_shippriority" : 0,
+  "o_comment" : " quick packages are blithely. slyly silent accounts wake qu"
+} {
+  "o_orderkey" : 135,
+  "o_custkey" : 605,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 230472.84,
+  "o_orderdate" : "1995-10-21T00:00:00.000-07:00",
+  "o_orderpriority" : "4-NOT SPECIFIED",
+  "o_clerk" : "Clerk#000000804",
+  "o_shippriority" : 0,
+  "o_comment" : "l platelets use according t"
+} {
+  "o_orderkey" : 227,
+  "o_custkey" : 100,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 69020.68,
+  "o_orderdate" : "1995-11-10T00:00:00.000-08:00",
+  "o_orderpriority" : "5-LOW",
+  "o_clerk" : "Clerk#000000919",
+  "o_shippriority" : 0,
+  "o_comment" : " express instructions. slyly regul"
+} {
+  "o_orderkey" : 262,
+  "o_custkey" : 304,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 173401.63,
+  "o_orderdate" : "1995-11-25T00:00:00.000-08:00",
+  "o_orderpriority" : "4-NOT SPECIFIED",
+  "o_clerk" : "Clerk#000000551",
+  "o_shippriority" : 0,
+  "o_comment" : "l packages. blithely final pinto beans use carefu"
+} {
+  "o_orderkey" : 420,
+  "o_custkey" : 902,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 269064.47,
+  "o_orderdate" : "1995-10-31T00:00:00.000-08:00",
+  "o_orderpriority" : "4-NOT SPECIFIED",
+  "o_clerk" : "Clerk#000000756",
+  "o_shippriority" : 0,
+  "o_comment" : "leep carefully final excuses. fluffily pending requests unwind carefully above"
+} {
+  "o_orderkey" : 454,
+  "o_custkey" : 488,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 24543.95,
+  "o_orderdate" : "1995-12-27T00:00:00.000-08:00",
+  "o_orderpriority" : "5-LOW",
+  "o_clerk" : "Clerk#000000890",
+  "o_shippriority" : 0,
+  "o_comment" : "dolites sleep carefully blithely regular deposits. quickly regul"
+} {
+  "o_orderkey" : 545,
+  "o_custkey" : 632,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 35129.54,
+  "o_orderdate" : "1995-11-07T00:00:00.000-08:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000537",
+  "o_shippriority" : 0,
+  "o_comment" : "as. blithely final hockey players about th"
+} {
+  "o_orderkey" : 679,
+  "o_custkey" : 485,
+  "o_orderstatus" : "O",
+  "o_totalprice" : 14905.06,
+  "o_orderdate" : "1995-12-15T00:00:00.000-08:00",
+  "o_orderpriority" : "2-HIGH",
+  "o_clerk" : "Clerk#000000853",
+  "o_shippriority" : 0,
+  "o_comment" : "tealthy, final pinto beans haggle slyly. pending platelets about the special, "
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/parquet/1994/Q1/orders_94_q1.parquet
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/parquet/1994/Q1/orders_94_q1.parquet b/exec/java-exec/src/test/resources/multilevel/parquet/1994/Q1/orders_94_q1.parquet
new file mode 100644
index 0000000..b4abe60
Binary files /dev/null and b/exec/java-exec/src/test/resources/multilevel/parquet/1994/Q1/orders_94_q1.parquet differ

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/parquet/1994/Q2/orders_94_q2.parquet
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/parquet/1994/Q2/orders_94_q2.parquet b/exec/java-exec/src/test/resources/multilevel/parquet/1994/Q2/orders_94_q2.parquet
new file mode 100644
index 0000000..f5338af
Binary files /dev/null and b/exec/java-exec/src/test/resources/multilevel/parquet/1994/Q2/orders_94_q2.parquet differ

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/parquet/1994/Q3/orders_94_q3.parquet
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/parquet/1994/Q3/orders_94_q3.parquet b/exec/java-exec/src/test/resources/multilevel/parquet/1994/Q3/orders_94_q3.parquet
new file mode 100644
index 0000000..16cb2c4
Binary files /dev/null and b/exec/java-exec/src/test/resources/multilevel/parquet/1994/Q3/orders_94_q3.parquet differ

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/parquet/1994/Q4/orders_94_q4.parquet
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/parquet/1994/Q4/orders_94_q4.parquet b/exec/java-exec/src/test/resources/multilevel/parquet/1994/Q4/orders_94_q4.parquet
new file mode 100644
index 0000000..bf0ed05
Binary files /dev/null and b/exec/java-exec/src/test/resources/multilevel/parquet/1994/Q4/orders_94_q4.parquet differ

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/parquet/1995/Q1/orders_95_q1.parquet
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/parquet/1995/Q1/orders_95_q1.parquet b/exec/java-exec/src/test/resources/multilevel/parquet/1995/Q1/orders_95_q1.parquet
new file mode 100644
index 0000000..93514c4
Binary files /dev/null and b/exec/java-exec/src/test/resources/multilevel/parquet/1995/Q1/orders_95_q1.parquet differ

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/parquet/1995/Q2/orders_95_q2.parquet
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/parquet/1995/Q2/orders_95_q2.parquet b/exec/java-exec/src/test/resources/multilevel/parquet/1995/Q2/orders_95_q2.parquet
new file mode 100644
index 0000000..e8ae33e
Binary files /dev/null and b/exec/java-exec/src/test/resources/multilevel/parquet/1995/Q2/orders_95_q2.parquet differ

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/parquet/1995/Q3/orders_95_q3.parquet
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/parquet/1995/Q3/orders_95_q3.parquet b/exec/java-exec/src/test/resources/multilevel/parquet/1995/Q3/orders_95_q3.parquet
new file mode 100644
index 0000000..aae46dd
Binary files /dev/null and b/exec/java-exec/src/test/resources/multilevel/parquet/1995/Q3/orders_95_q3.parquet differ

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/1959ec66/exec/java-exec/src/test/resources/multilevel/parquet/1995/Q4/orders_95_q4.parquet
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/multilevel/parquet/1995/Q4/orders_95_q4.parquet b/exec/java-exec/src/test/resources/multilevel/parquet/1995/Q4/orders_95_q4.parquet
new file mode 100644
index 0000000..bae64e3
Binary files /dev/null and b/exec/java-exec/src/test/resources/multilevel/parquet/1995/Q4/orders_95_q4.parquet differ