[ASTERIXDB-3229][RT] Part 4: Re-enable columnar filters

- user model changes: no
- storage format changes: no
- interface changes: no

Details:
This patch re-enable columnar filters (range and value).
It also re-enable the filters' tests.

Change-Id: Iea3a8a3fb0e9b4fa446d112f4776a2a7ff134ab4
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17695
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Wail Alkowaileet <wael.y.k@gmail.com>
Reviewed-by: Murtadha Hubail <mhubail@apache.org>
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/ColumnFilterPushdownProcessor.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/ColumnFilterPushdownProcessor.java
index 8db7969..00b2dc4 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/ColumnFilterPushdownProcessor.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/ColumnFilterPushdownProcessor.java
@@ -30,7 +30,6 @@
 import org.apache.asterix.common.config.DatasetConfig;
 import org.apache.asterix.metadata.entities.Dataset;
 import org.apache.asterix.metadata.utils.DatasetUtil;
-import org.apache.asterix.metadata.utils.filter.ArrayPathCheckerVisitor;
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.optimizer.rules.pushdown.PushdownContext;
@@ -39,6 +38,7 @@
 import org.apache.asterix.optimizer.rules.pushdown.schema.AnyExpectedSchemaNode;
 import org.apache.asterix.optimizer.rules.pushdown.schema.ExpectedSchemaNodeType;
 import org.apache.asterix.optimizer.rules.pushdown.schema.IExpectedSchemaNode;
+import org.apache.asterix.optimizer.rules.pushdown.visitor.ArrayPathCheckerVisitor;
 import org.apache.asterix.optimizer.rules.pushdown.visitor.ColumnFilterPathBuilderVisitor;
 import org.apache.asterix.optimizer.rules.pushdown.visitor.ExpressionToExpectedSchemaNodeVisitor;
 import org.apache.commons.lang3.mutable.Mutable;
@@ -131,7 +131,7 @@
             throws AlgebricksException {
         ILogicalExpression filterExpr = scanDefineDescriptor.getFilterExpression();
         if (filterExpr != null) {
-            filterExpr = orExpression(filterExpr, inlinedExpr);
+            filterExpr = andExpression(filterExpr, inlinedExpr);
             scanDefineDescriptor.setFilterExpression(filterExpr);
         } else {
             scanDefineDescriptor.setFilterExpression(inlinedExpr);
@@ -148,7 +148,7 @@
         return true;
     }
 
-    protected final AbstractFunctionCallExpression orExpression(ILogicalExpression filterExpr,
+    protected final AbstractFunctionCallExpression andExpression(ILogicalExpression filterExpr,
             ILogicalExpression inlinedExpr) {
         AbstractFunctionCallExpression funcExpr = (AbstractFunctionCallExpression) filterExpr;
         if (!BuiltinFunctions.AND.equals(funcExpr.getFunctionIdentifier())) {
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/ColumnRangeFilterPushdownProcessor.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/ColumnRangeFilterPushdownProcessor.java
index 47db154..b01c06f 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/ColumnRangeFilterPushdownProcessor.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/ColumnRangeFilterPushdownProcessor.java
@@ -109,7 +109,7 @@
     protected boolean putFilterInformation(ScanDefineDescriptor scanDefineDescriptor, ILogicalExpression inlinedExpr) {
         ILogicalExpression filterExpr = scanDefineDescriptor.getRangeFilterExpression();
         if (filterExpr != null) {
-            filterExpr = orExpression(filterExpr, inlinedExpr);
+            filterExpr = andExpression(filterExpr, inlinedExpr);
             scanDefineDescriptor.setRangeFilterExpression(filterExpr);
         } else {
             scanDefineDescriptor.setRangeFilterExpression(inlinedExpr);
@@ -131,7 +131,8 @@
         SourceLocation sourceLocation = funcExpr.getSourceLocation();
         FunctionCallInformation functionCallInfo = new FunctionCallInformation(functionName, sourceLocation,
                 ProjectionFiltrationWarningFactoryProvider.getIncomparableTypesFactory(leftConstant));
-        ARecordType path = pathBuilderVisitor.buildPath(node, constantValue, sourceInformationMap, functionCallInfo);
+        ARecordType path =
+                pathBuilderVisitor.buildPath(node, constantValue.getType(), sourceInformationMap, functionCallInfo);
         paths.put(pathExpr, path);
         return true;
     }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/filter/ArrayPathCheckerVisitor.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/ArrayPathCheckerVisitor.java
similarity index 96%
rename from asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/filter/ArrayPathCheckerVisitor.java
rename to asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/ArrayPathCheckerVisitor.java
index b1ed40b..46a247b 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/filter/ArrayPathCheckerVisitor.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/ArrayPathCheckerVisitor.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.metadata.utils.filter;
+package org.apache.asterix.optimizer.rules.pushdown.visitor;
 
 import static org.apache.asterix.om.utils.ProjectionFiltrationTypeUtil.EMPTY_TYPE;
 
@@ -39,7 +39,7 @@
  * @see ColumnarRepeatedIterableFilterEvaluator#evaluate()
  */
 public class ArrayPathCheckerVisitor implements IATypeVisitor<Boolean, AbstractCollectionType> {
-    private final Set<Object> seenCollections;
+    private final Set<AbstractCollectionType> seenCollections;
     private boolean firstPath;
 
     public ArrayPathCheckerVisitor() {
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/ColumnFilterPathBuilderVisitor.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/ColumnFilterPathBuilderVisitor.java
index 94fff57..79bb9b2 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/ColumnFilterPathBuilderVisitor.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/ColumnFilterPathBuilderVisitor.java
@@ -46,16 +46,16 @@
     private int counter = 0;
 
     public ARecordType buildPath(AnyExpectedSchemaNode anyNode) {
-        return buildPath(anyNode, null, null, null);
+        return buildPath(anyNode, BuiltinType.ANY, null, null);
     }
 
-    public ARecordType buildPath(AnyExpectedSchemaNode anyNode, IAObject constant,
+    public ARecordType buildPath(AnyExpectedSchemaNode anyNode, IAType constType,
             Map<String, FunctionCallInformation> sourceInformationMap, FunctionCallInformation compareFunctionInfo) {
 
         this.sourceInformationMap = sourceInformationMap;
-        this.type = BuiltinType.ANY;
+        this.type = constType;
         if (sourceInformationMap != null) {
-            this.type = rename(constant.getType());
+            this.type = rename(constType);
             sourceInformationMap.put(type.getTypeName(), compareFunctionInfo);
         }
         return (ARecordType) anyNode.accept(this, anyNode);
@@ -104,7 +104,7 @@
         IAType[] fieldTypes = { childType };
         String[] fieldNames = { key };
 
-        return new ARecordType(typeName, fieldNames, fieldTypes, false);
+        return new ARecordType(typeName, fieldNames, fieldTypes, true);
     }
 
     private String getTypeName() {
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/001/001.016.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/001/001.016.query.sqlpp
index 586ec6d..8725175 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/001/001.016.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/001/001.016.query.sqlpp
@@ -24,7 +24,7 @@
 
 SELECT VALUE d
 FROM ColumnDataset d
--- The filter should bailout as we
+-- The range filter should bailout as we
 -- don't support type promotion/demotion
 -- for filters
 WHERE (SOME a in d.array SATISFIES a < 100.1)
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/001/001.017.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/001/001.017.query.sqlpp
index f6d1155..b20147f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/001/001.017.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/001/001.017.query.sqlpp
@@ -24,7 +24,7 @@
 EXPLAIN
 SELECT VALUE d
 FROM ColumnDataset d
--- The filter should bailout as we
+-- The range filter should bailout as we
 -- don't support type promotion/demotion
 -- for filters
 WHERE (SOME a in d.array SATISFIES a < 100.1)
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.007.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.007.plan
index df17e28..fb2c537 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.007.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.007.plan
@@ -18,7 +18,7 @@
                 -- ASSIGN  |PARTITIONED|
                   exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    data-scan []<-[$$20, $$d] <- test.ColumnDataset filter on (and(gt($$19, "1"), lt($$19, "3"))) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                    data-scan []<-[$$20, $$d] <- test.ColumnDataset filter on: and(gt($$d.getField("a"), "1"), lt($$d.getField("a"), "3")) range-filter on: and(gt($$d.getField("a"), "1"), lt($$d.getField("a"), "3")) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                     -- DATASOURCE_SCAN  |PARTITIONED|
                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.009.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.009.plan
index e1d8169..5247f18 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.009.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.009.plan
@@ -18,7 +18,7 @@
                 -- ASSIGN  |PARTITIONED|
                   exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    data-scan []<-[$$20, $$d] <- test.ColumnDataset filter on (and(gt($$19, 1), lt($$19, 3))) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                    data-scan []<-[$$20, $$d] <- test.ColumnDataset filter on: and(gt($$d.getField("a"), 1), lt($$d.getField("a"), 3)) range-filter on: and(gt($$d.getField("a"), 1), lt($$d.getField("a"), 3)) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                     -- DATASOURCE_SCAN  |PARTITIONED|
                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.011.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.011.plan
index 9bde6f8..c45186a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.011.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.011.plan
@@ -31,7 +31,7 @@
                     -- ASSIGN  |PARTITIONED|
                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on (lt($$a, "100")) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on: lt(scan-collection($$d.getField("array")), "100") range-filter on: lt(scan-collection($$d.getField("array")), "100") [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.013.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.013.plan
index 73c0dad..71850ec 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.013.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.013.plan
@@ -31,7 +31,7 @@
                     -- ASSIGN  |PARTITIONED|
                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on (lt($$a, 100)) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on: lt(scan-collection($$d.getField("array")), 100) range-filter on: lt(scan-collection($$d.getField("array")), 100) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.015.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.015.plan
index 8081995..a9ae3bb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.015.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.015.plan
@@ -31,7 +31,7 @@
                     -- ASSIGN  |PARTITIONED|
                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on (eq($$a, 100)) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on: eq(scan-collection($$d.getField("array")), 100) range-filter on: eq(scan-collection($$d.getField("array")), 100) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.017.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.017.plan
index 224f230..92a9008 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.017.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.017.plan
@@ -31,7 +31,7 @@
                     -- ASSIGN  |PARTITIONED|
                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on (lt($$a, 100.1)) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on: lt(scan-collection($$d.getField("array")), 100.1) range-filter on: lt(scan-collection($$d.getField("array")), 100.1) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.019.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.019.plan
index 39f91fa..4910f04 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.019.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.019.plan
@@ -22,7 +22,7 @@
                     -- ASSIGN  |PARTITIONED|
                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$29, $$d] <- test.ColumnDataset project ({array:[any]}) filter on (and(gt($$item, 60), lt($$item, 100))) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                        data-scan []<-[$$29, $$d] <- test.ColumnDataset project ({array:[any]}) filter on: and(gt(scan-collection($$d.getField("array")), 60), lt(scan-collection($$d.getField("array")), 100)) range-filter on: and(gt(scan-collection($$d.getField("array")), 60), lt(scan-collection($$d.getField("array")), 100)) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.021.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.021.plan
index 8b4a749..c808095 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.021.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.021.plan
@@ -22,7 +22,7 @@
                     -- ASSIGN  |PARTITIONED|
                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$27, $$d] <- test.ColumnDataset project ({array:[any]}) filter on (eq($$item, 100)) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                        data-scan []<-[$$27, $$d] <- test.ColumnDataset project ({array:[any]}) filter on: eq(scan-collection($$d.getField("array")), 100) range-filter on: eq(scan-collection($$d.getField("array")), 100) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.023.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.023.plan
index ea8f045..dac0c41 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.023.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.023.plan
@@ -22,7 +22,7 @@
                     -- ASSIGN  |PARTITIONED|
                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$27, $$d] <- test.ColumnDataset project ({array:[any]}) filter on (gt($$item, 10000)) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                        data-scan []<-[$$27, $$d] <- test.ColumnDataset project ({array:[any]}) filter on: gt(scan-collection($$d.getField("array")), 10000) range-filter on: gt(scan-collection($$d.getField("array")), 10000) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.025.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.025.plan
index c5e17a8..b1842ca 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.025.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/001/001.025.plan
@@ -28,7 +28,7 @@
                           -- ASSIGN  |PARTITIONED|
                             exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              data-scan []<-[$$35, $$d] <- test.ColumnDataset project ({a:any,array:[any]}) filter on (or(eq($$34, "1"), gt($$item, 10))) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                              data-scan []<-[$$35, $$d] <- test.ColumnDataset project ({a:any,array:[any]}) filter on: or(eq($$d.getField("a"), "1"), gt(scan-collection($$d.getField("array")), 10)) range-filter on: or(eq($$d.getField("a"), "1"), gt(scan-collection($$d.getField("array")), 10)) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.006.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.006.plan
index 7742bab..9be2ed6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.006.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.006.plan
@@ -26,7 +26,7 @@
                         -- STREAM_PROJECT  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$48, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on (gt($$D, " ")) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                            data-scan []<-[$$48, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: gt(scan-collection($$C.getField("dates")), " ") range-filter on: gt(scan-collection($$C.getField("dates")), " ") [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.102.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.102.plan
index 45aff78..a246dba 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.102.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.102.plan
@@ -26,7 +26,7 @@
                         -- STREAM_PROJECT  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$49, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on (eq(substring($$D, 0, 4), "2011")) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                            data-scan []<-[$$49, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2011") [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.105.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.105.plan
index a5caa61..dad5f25 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.105.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.105.plan
@@ -30,7 +30,7 @@
                             -- STREAM_PROJECT  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                data-scan []<-[$$53, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on (or(eq(substring($$D, 0, 4), "2011"), eq(substring($$D, 0, 4), "2016"))) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                data-scan []<-[$$53, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: or(eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2011"), eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2016")) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                   exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.108.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.108.plan
index 04762cc..7807f1e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.108.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.108.plan
@@ -37,7 +37,7 @@
                         -- STREAM_PROJECT  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$54, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on (or(eq(substring($$D, 0, 4), "2011"), eq(substring($$D, 0, 4), "2016"))) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                            data-scan []<-[$$54, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: or(eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2011"), eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2016")) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.113.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.113.plan
index 13e2226..012f2c7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.113.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/004/004.113.plan
@@ -32,7 +32,7 @@
                               -- STREAM_PROJECT  |PARTITIONED|
                                 exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  data-scan []<-[$$56, $$C] <- TestYelp.YelpCheckin project ({dates:[any],business_id:any}) filter on (or(starts-with($$C.getField("business_id"), "-0"), or(eq(substring($$D, 0, 4), "2011"), eq(substring($$D, 0, 4), "2016")))) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                  data-scan []<-[$$56, $$C] <- TestYelp.YelpCheckin project ({dates:[any],business_id:any}) filter on: or(starts-with($$C.getField("business_id"), "-0"), eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2011"), eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2016")) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                     exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/005/005.008.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/005/005.008.plan
index dc65a11..d517ee0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/005/005.008.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/005/005.008.plan
@@ -26,7 +26,7 @@
                         -- STREAM_PROJECT  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$49, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on (gt(numeric-add($$D, 1), 2018)) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                            data-scan []<-[$$49, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: gt(numeric-add(scan-collection($$C.getField("dates")), 1), 2018) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/005/005.011.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/005/005.011.plan
index 230a782..54e5fa0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/005/005.011.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/005/005.011.plan
@@ -26,7 +26,7 @@
                         -- STREAM_PROJECT  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$52, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on (or(gt(numeric-add($$D, 1), 2018), eq(substring($$D, 0, 4), "2011"))) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+                            data-scan []<-[$$52, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: or(gt(numeric-add(scan-collection($$C.getField("dates")), 1), 2018), eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2011")) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.007.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.007.plan
index 57b0572..8550e65 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.007.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.007.plan
@@ -18,7 +18,7 @@
                 -- ASSIGN  |PARTITIONED|
                   exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 1.0]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    data-scan []<-[$$20, $$d] <- test.ColumnDataset filter on (and(gt($$19, "1"), lt($$19, "3"))) [cardinality: 6.0, op-cost: 1.0, total-cost: 1.0]
+                    data-scan []<-[$$20, $$d] <- test.ColumnDataset filter on: and(gt($$d.getField("a"), "1"), lt($$d.getField("a"), "3")) range-filter on: and(gt($$d.getField("a"), "1"), lt($$d.getField("a"), "3")) [cardinality: 6.0, op-cost: 1.0, total-cost: 1.0]
                     -- DATASOURCE_SCAN  |PARTITIONED|
                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.009.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.009.plan
index 1ed6e29..26029f0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.009.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.009.plan
@@ -18,7 +18,7 @@
                 -- ASSIGN  |PARTITIONED|
                   exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 0.11]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    data-scan []<-[$$20, $$d] <- test.ColumnDataset filter on (and(gt($$19, 1), lt($$19, 3))) [cardinality: 6.0, op-cost: 0.11, total-cost: 0.11]
+                    data-scan []<-[$$20, $$d] <- test.ColumnDataset filter on: and(gt($$d.getField("a"), 1), lt($$d.getField("a"), 3)) range-filter on: and(gt($$d.getField("a"), 1), lt($$d.getField("a"), 3)) [cardinality: 6.0, op-cost: 0.11, total-cost: 0.11]
                     -- DATASOURCE_SCAN  |PARTITIONED|
                       exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.011.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.011.plan
index 642b823..6b57afe 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.011.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.011.plan
@@ -31,7 +31,7 @@
                     -- ASSIGN  |PARTITIONED|
                       exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 0.11]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on (lt($$a, "100")) [cardinality: 6.0, op-cost: 0.11, total-cost: 0.11]
+                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on: lt(scan-collection($$d.getField("array")), "100") range-filter on: lt(scan-collection($$d.getField("array")), "100") [cardinality: 6.0, op-cost: 0.11, total-cost: 0.11]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.013.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.013.plan
index 3252e98..821f0bb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.013.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.013.plan
@@ -31,7 +31,7 @@
                     -- ASSIGN  |PARTITIONED|
                       exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 3.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on (lt($$a, 100)) [cardinality: 6.0, op-cost: 3.0, total-cost: 3.0]
+                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on: lt(scan-collection($$d.getField("array")), 100) range-filter on: lt(scan-collection($$d.getField("array")), 100) [cardinality: 6.0, op-cost: 3.0, total-cost: 3.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.015.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.015.plan
index 8659d34..c97dc2a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.015.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.015.plan
@@ -31,7 +31,7 @@
                     -- ASSIGN  |PARTITIONED|
                       exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 1.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on (eq($$a, 100)) [cardinality: 6.0, op-cost: 1.0, total-cost: 1.0]
+                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on: eq(scan-collection($$d.getField("array")), 100) range-filter on: eq(scan-collection($$d.getField("array")), 100) [cardinality: 6.0, op-cost: 1.0, total-cost: 1.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.017.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.017.plan
index 17622bb..8e80f4c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.017.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.017.plan
@@ -31,7 +31,7 @@
                     -- ASSIGN  |PARTITIONED|
                       exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 4.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on (lt($$a, 100.1)) [cardinality: 6.0, op-cost: 4.0, total-cost: 4.0]
+                        data-scan []<-[$$28, $$d] <- test.ColumnDataset filter on: lt(scan-collection($$d.getField("array")), 100.1) range-filter on: lt(scan-collection($$d.getField("array")), 100.1) [cardinality: 6.0, op-cost: 4.0, total-cost: 4.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.019.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.019.plan
index ee14cae..484d76f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.019.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.019.plan
@@ -22,7 +22,7 @@
                     -- ASSIGN  |PARTITIONED|
                       exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 3.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$29, $$d] <- test.ColumnDataset project ({array:[any]}) filter on (and(gt($$item, 60), lt($$item, 100))) [cardinality: 6.0, op-cost: 3.0, total-cost: 3.0]
+                        data-scan []<-[$$29, $$d] <- test.ColumnDataset project ({array:[any]}) filter on: and(gt(scan-collection($$d.getField("array")), 60), lt(scan-collection($$d.getField("array")), 100)) range-filter on: and(gt(scan-collection($$d.getField("array")), 60), lt(scan-collection($$d.getField("array")), 100)) [cardinality: 6.0, op-cost: 3.0, total-cost: 3.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.021.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.021.plan
index 3eb5d69..8b3eb88 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.021.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.021.plan
@@ -22,7 +22,7 @@
                     -- ASSIGN  |PARTITIONED|
                       exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 1.0]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$27, $$d] <- test.ColumnDataset project ({array:[any]}) filter on (eq($$item, 100)) [cardinality: 6.0, op-cost: 1.0, total-cost: 1.0]
+                        data-scan []<-[$$27, $$d] <- test.ColumnDataset project ({array:[any]}) filter on: eq(scan-collection($$d.getField("array")), 100) range-filter on: eq(scan-collection($$d.getField("array")), 100) [cardinality: 6.0, op-cost: 1.0, total-cost: 1.0]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.023.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.023.plan
index 1db3103..7bda2a5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.023.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.023.plan
@@ -22,7 +22,7 @@
                     -- ASSIGN  |PARTITIONED|
                       exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 0.11]
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        data-scan []<-[$$27, $$d] <- test.ColumnDataset project ({array:[any]}) filter on (gt($$item, 10000)) [cardinality: 6.0, op-cost: 0.11, total-cost: 0.11]
+                        data-scan []<-[$$27, $$d] <- test.ColumnDataset project ({array:[any]}) filter on: gt(scan-collection($$d.getField("array")), 10000) range-filter on: gt(scan-collection($$d.getField("array")), 10000) [cardinality: 6.0, op-cost: 0.11, total-cost: 0.11]
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.025.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.025.plan
index f249625..ef44ab2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.025.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/001/001.025.plan
@@ -28,7 +28,7 @@
                           -- ASSIGN  |PARTITIONED|
                             exchange [cardinality: 6.0, op-cost: 0.0, total-cost: 2.0]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              data-scan []<-[$$35, $$d] <- test.ColumnDataset project ({a:any,array:[any]}) filter on (or(eq($$34, "1"), gt($$item, 10))) [cardinality: 6.0, op-cost: 2.0, total-cost: 2.0]
+                              data-scan []<-[$$35, $$d] <- test.ColumnDataset project ({a:any,array:[any]}) filter on: or(eq($$d.getField("a"), "1"), gt(scan-collection($$d.getField("array")), 10)) range-filter on: or(eq($$d.getField("a"), "1"), gt(scan-collection($$d.getField("array")), 10)) [cardinality: 6.0, op-cost: 2.0, total-cost: 2.0]
                               -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.006.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.006.plan
index a0f80bd..d2c4559 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.006.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.006.plan
@@ -26,7 +26,7 @@
                         -- STREAM_PROJECT  |PARTITIONED|
                           exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 99.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$48, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on (gt($$D, " ")) [cardinality: 30.0, op-cost: 99.0, total-cost: 99.0]
+                            data-scan []<-[$$48, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: gt(scan-collection($$C.getField("dates")), " ") range-filter on: gt(scan-collection($$C.getField("dates")), " ") [cardinality: 30.0, op-cost: 99.0, total-cost: 99.0]
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.102.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.102.plan
index 0a26cc8..fb64b66 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.102.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.102.plan
@@ -26,7 +26,7 @@
                         -- STREAM_PROJECT  |PARTITIONED|
                           exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 6.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$49, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on (eq(substring($$D, 0, 4), "2011")) [cardinality: 30.0, op-cost: 6.0, total-cost: 6.0]
+                            data-scan []<-[$$49, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2011") [cardinality: 30.0, op-cost: 6.0, total-cost: 6.0]
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.105.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.105.plan
index 1c5ee50..317dccc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.105.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.105.plan
@@ -30,7 +30,7 @@
                             -- STREAM_PROJECT  |PARTITIONED|
                               exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 20.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                data-scan []<-[$$53, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on (or(eq(substring($$D, 0, 4), "2011"), eq(substring($$D, 0, 4), "2016"))) [cardinality: 30.0, op-cost: 20.0, total-cost: 20.0]
+                                data-scan []<-[$$53, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: or(eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2011"), eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2016")) [cardinality: 30.0, op-cost: 20.0, total-cost: 20.0]
                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                   exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.108.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.108.plan
index 6c282bb..f541fed 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.108.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.108.plan
@@ -37,7 +37,7 @@
                         -- STREAM_PROJECT  |PARTITIONED|
                           exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 11.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$54, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on (or(eq(substring($$D, 0, 4), "2011"), eq(substring($$D, 0, 4), "2016"))) [cardinality: 30.0, op-cost: 11.0, total-cost: 11.0]
+                            data-scan []<-[$$54, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: or(eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2011"), eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2016")) [cardinality: 30.0, op-cost: 11.0, total-cost: 11.0]
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.113.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.113.plan
index 5c3412b..5433b03 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.113.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/004/004.113.plan
@@ -32,7 +32,7 @@
                               -- STREAM_PROJECT  |PARTITIONED|
                                 exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 7.0]
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  data-scan []<-[$$56, $$C] <- TestYelp.YelpCheckin project ({dates:[any],business_id:any}) filter on (or(starts-with($$C.getField("business_id"), "-0"), or(eq(substring($$D, 0, 4), "2011"), eq(substring($$D, 0, 4), "2016")))) [cardinality: 30.0, op-cost: 7.0, total-cost: 7.0]
+                                  data-scan []<-[$$56, $$C] <- TestYelp.YelpCheckin project ({dates:[any],business_id:any}) filter on: or(starts-with($$C.getField("business_id"), "-0"), eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2011"), eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2016")) [cardinality: 30.0, op-cost: 7.0, total-cost: 7.0]
                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                     exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/005/005.008.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/005/005.008.plan
index 5d7d75c..1e221be 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/005/005.008.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/005/005.008.plan
@@ -26,7 +26,7 @@
                         -- STREAM_PROJECT  |PARTITIONED|
                           exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 2.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$49, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on (gt(numeric-add($$D, 1), 2018)) [cardinality: 30.0, op-cost: 2.0, total-cost: 2.0]
+                            data-scan []<-[$$49, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: gt(numeric-add(scan-collection($$C.getField("dates")), 1), 2018) [cardinality: 30.0, op-cost: 2.0, total-cost: 2.0]
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/005/005.011.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/005/005.011.plan
index f989fe0..346e3d3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/005/005.011.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/filter/005/005.011.plan
@@ -26,7 +26,7 @@
                         -- STREAM_PROJECT  |PARTITIONED|
                           exchange [cardinality: 30.0, op-cost: 0.0, total-cost: 8.0]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan []<-[$$52, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on (or(gt(numeric-add($$D, 1), 2018), eq(substring($$D, 0, 4), "2011"))) [cardinality: 30.0, op-cost: 8.0, total-cost: 8.0]
+                            data-scan []<-[$$52, $$C] <- TestYelp.YelpCheckin project ({dates:[any]}) filter on: or(gt(numeric-add(scan-collection($$C.getField("dates")), 1), 2018), eq(substring(scan-collection($$C.getField("dates")), 0, 4), "2011")) [cardinality: 30.0, op-cost: 8.0, total-cost: 8.0]
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
index 5e09fa6..fc0ceca 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -16226,46 +16226,45 @@
         <output-dir compare="Text">upsert/002</output-dir>
       </compilation-unit>
     </test-case>
-    <!--  Disabled until fully merge the remaining filter patches  -->
-<!--    <test-case FilePath="column" check-warnings="true">-->
-<!--      <compilation-unit name="filter/001">-->
-<!--        <output-dir compare="Text">filter/001</output-dir>-->
-<!--        <expected-warn>ASX0051: Incomparable input types: string and bigint (in line 30, at column 23)</expected-warn>-->
-<!--        <expected-warn>ASX0051: Incomparable input types: bigint and string (in line 29, at column 38)</expected-warn>-->
-<!--        <expected-warn>ASX0051: Incomparable input types: array and bigint (in line 28, at column 15)</expected-warn>-->
-<!--      </compilation-unit>-->
-<!--    </test-case>-->
-<!--    <test-case FilePath="column" check-warnings="true">-->
-<!--      <compilation-unit name="filter/002">-->
-<!--        <output-dir compare="Text">filter/002</output-dir>-->
-<!--        <expected-warn>ASX0051: Incomparable input types: string and bigint (in line 29, at column 23)</expected-warn>-->
-<!--      </compilation-unit>-->
-<!--    </test-case>-->
-<!--    <test-case FilePath="column">-->
-<!--      <compilation-unit name="filter/003">-->
-<!--        <output-dir compare="Text">filter/003</output-dir>-->
-<!--      </compilation-unit>-->
-<!--    </test-case>-->
-<!--    <test-case FilePath="column">-->
-<!--      <compilation-unit name="filter/004">-->
-<!--        <output-dir compare="Text">filter/004</output-dir>-->
-<!--      </compilation-unit>-->
-<!--    </test-case>-->
-<!--    <test-case FilePath="column">-->
-<!--      <compilation-unit name="filter/005">-->
-<!--        <output-dir compare="Text">filter/005</output-dir>-->
-<!--      </compilation-unit>-->
-<!--    </test-case>-->
-<!--    <test-case FilePath="column">-->
-<!--      <compilation-unit name="filter/006">-->
-<!--        <output-dir compare="Text">filter/006</output-dir>-->
-<!--      </compilation-unit>-->
-<!--    </test-case>-->
-<!--    <test-case FilePath="column">-->
-<!--      <compilation-unit name="filter/007">-->
-<!--        <output-dir compare="Text">filter/007</output-dir>-->
-<!--      </compilation-unit>-->
-<!--    </test-case>-->
+    <test-case FilePath="column" check-warnings="true">
+      <compilation-unit name="filter/001">
+        <output-dir compare="Text">filter/001</output-dir>
+        <expected-warn>ASX0051: Incomparable input types: string and bigint (in line 30, at column 23)</expected-warn>
+        <expected-warn>ASX0051: Incomparable input types: bigint and string (in line 29, at column 38)</expected-warn>
+        <expected-warn>ASX0051: Incomparable input types: array and bigint (in line 28, at column 15)</expected-warn>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="column" check-warnings="true">
+      <compilation-unit name="filter/002">
+        <output-dir compare="Text">filter/002</output-dir>
+        <expected-warn>ASX0051: Incomparable input types: string and bigint (in line 29, at column 23)</expected-warn>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="column">
+      <compilation-unit name="filter/003">
+        <output-dir compare="Text">filter/003</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="column">
+      <compilation-unit name="filter/004">
+        <output-dir compare="Text">filter/004</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="column">
+      <compilation-unit name="filter/005">
+        <output-dir compare="Text">filter/005</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="column">
+      <compilation-unit name="filter/006">
+        <output-dir compare="Text">filter/006</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="column">
+      <compilation-unit name="filter/007">
+        <output-dir compare="Text">filter/007</output-dir>
+      </compilation-unit>
+    </test-case>
     <test-case FilePath="column">
       <compilation-unit name="big-object">
         <output-dir compare="Text">big-object</output-dir>
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/FilterAccessorProvider.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/FilterAccessorProvider.java
index 2302aa6..12c0078 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/FilterAccessorProvider.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/FilterAccessorProvider.java
@@ -30,9 +30,9 @@
 import org.apache.asterix.column.filter.iterable.accessor.ColumnFilterValueAccessorEvaluator;
 import org.apache.asterix.column.filter.iterable.accessor.MissingEvaluator;
 import org.apache.asterix.column.filter.iterable.accessor.UnionColumnFilterValueAccessorEvaluator;
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessor;
-import org.apache.asterix.column.filter.normalized.accessor.ColumnFilterNormalizedValueAccessor;
-import org.apache.asterix.column.filter.normalized.accessor.NoOpColumnFilterValueAccessor;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessor;
+import org.apache.asterix.column.filter.range.accessor.ColumnRangeFilterValueAccessor;
+import org.apache.asterix.column.filter.range.accessor.NoOpColumnRangeFilterValueAccessor;
 import org.apache.asterix.column.metadata.schema.AbstractSchemaNode;
 import org.apache.asterix.column.metadata.schema.ObjectSchemaNode;
 import org.apache.asterix.column.metadata.schema.primitive.MissingFieldSchemaNode;
@@ -54,7 +54,7 @@
     private final SchemaClipperVisitor clipperVisitor;
     private final PathExtractorVisitor pathExtractorVisitor;
     private final Map<ARecordType, PrimitiveSchemaNode> cachedNodes;
-    private final List<IColumnFilterNormalizedValueAccessor> filterAccessors;
+    private final List<IColumnRangeFilterValueAccessor> filterAccessors;
     private final List<IColumnValuesReader> filterColumnReaders;
     private final IValueGetterFactory valueGetterFactory;
 
@@ -79,7 +79,7 @@
         cachedNodes.clear();
     }
 
-    public IColumnFilterNormalizedValueAccessor createColumnFilterNormalizedValueAccessor(ARecordType path, boolean min)
+    public IColumnRangeFilterValueAccessor createRangeFilterValueAccessor(ARecordType path, boolean min)
             throws HyracksDataException {
         PrimitiveSchemaNode node = cachedNodes.get(path);
         if (node == null) {
@@ -90,10 +90,10 @@
 
         ATypeTag typeTag = node.getTypeTag();
         if (typeTag == ATypeTag.MISSING) {
-            return NoOpColumnFilterValueAccessor.INSTANCE;
+            return NoOpColumnRangeFilterValueAccessor.INSTANCE;
         }
-        IColumnFilterNormalizedValueAccessor accessor =
-                new ColumnFilterNormalizedValueAccessor(node.getColumnIndex(), typeTag, min);
+        IColumnRangeFilterValueAccessor accessor =
+                new ColumnRangeFilterValueAccessor(node.getColumnIndex(), typeTag, min);
         filterAccessors.add(accessor);
         return accessor;
     }
@@ -118,7 +118,7 @@
         return new UnionColumnFilterValueAccessorEvaluator(unionReaders, valueGetters);
     }
 
-    public List<IColumnFilterNormalizedValueAccessor> getFilterAccessors() {
+    public List<IColumnRangeFilterValueAccessor> getFilterAccessors() {
         return filterAccessors;
     }
 
@@ -126,11 +126,10 @@
         return filterColumnReaders;
     }
 
-    public static void setFilterValues(List<IColumnFilterNormalizedValueAccessor> filterValueAccessors,
-            ByteBuffer pageZero, int numberOfColumns) {
+    public static void setFilterValues(List<IColumnRangeFilterValueAccessor> filterValueAccessors, ByteBuffer pageZero,
+            int numberOfColumns) {
         for (int i = 0; i < filterValueAccessors.size(); i++) {
-            ColumnFilterNormalizedValueAccessor accessor =
-                    (ColumnFilterNormalizedValueAccessor) filterValueAccessors.get(i);
+            ColumnRangeFilterValueAccessor accessor = (ColumnRangeFilterValueAccessor) filterValueAccessors.get(i);
             int columnIndex = accessor.getColumnIndex();
             long normalizedValue;
             if (columnIndex < numberOfColumns) {
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/IColumnFilterEvaluator.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/IColumnFilterEvaluator.java
index 023e04f..f20e4ee 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/IColumnFilterEvaluator.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/IColumnFilterEvaluator.java
@@ -19,11 +19,11 @@
 package org.apache.asterix.column.filter;
 
 import org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluatorFactory;
-import org.apache.asterix.column.filter.normalized.IColumnNormalizedFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterEvaluatorFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
 /**
- * An evaluator created by either {@link IColumnNormalizedFilterEvaluatorFactory}
+ * An evaluator created by either {@link IColumnRangeFilterEvaluatorFactory}
  * or {@link IColumnIterableFilterEvaluatorFactory}.
  */
 public interface IColumnFilterEvaluator {
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/NoOpColumnFilterEvaluatorFactory.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/NoOpColumnFilterEvaluatorFactory.java
index b14402b..4c649a2 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/NoOpColumnFilterEvaluatorFactory.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/NoOpColumnFilterEvaluatorFactory.java
@@ -20,7 +20,7 @@
 
 import org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluator;
 import org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluatorFactory;
-import org.apache.asterix.column.filter.normalized.IColumnNormalizedFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterEvaluatorFactory;
 import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
@@ -28,7 +28,7 @@
  * The factory returns {@link TrueColumnFilterEvaluator#INSTANCE} which evaluates always to true
  */
 public class NoOpColumnFilterEvaluatorFactory
-        implements IColumnNormalizedFilterEvaluatorFactory, IColumnIterableFilterEvaluatorFactory {
+        implements IColumnRangeFilterEvaluatorFactory, IColumnIterableFilterEvaluatorFactory {
     private static final long serialVersionUID = -7122361396576592000L;
     public static final NoOpColumnFilterEvaluatorFactory INSTANCE = new NoOpColumnFilterEvaluatorFactory();
 
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/IColumnNormalizedFilterEvaluatorFactory.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/IColumnRangeFilterEvaluatorFactory.java
similarity index 91%
rename from asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/IColumnNormalizedFilterEvaluatorFactory.java
rename to asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/IColumnRangeFilterEvaluatorFactory.java
index 4832d64..969f114 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/IColumnNormalizedFilterEvaluatorFactory.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/IColumnRangeFilterEvaluatorFactory.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.filter.normalized;
+package org.apache.asterix.column.filter.range;
 
 import java.io.Serializable;
 import java.util.PriorityQueue;
@@ -35,6 +35,6 @@
  * @see IColumnBatchWriter#writeColumns(PriorityQueue)
  */
 @FunctionalInterface
-public interface IColumnNormalizedFilterEvaluatorFactory extends Serializable {
+public interface IColumnRangeFilterEvaluatorFactory extends Serializable {
     IColumnFilterEvaluator create(FilterAccessorProvider filterAccessorProvider) throws HyracksDataException;
 }
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/IColumnFilterNormalizedValueAccessor.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/IColumnRangeFilterValueAccessor.java
similarity index 87%
rename from asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/IColumnFilterNormalizedValueAccessor.java
rename to asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/IColumnRangeFilterValueAccessor.java
index 99937cc..7ba01b7 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/IColumnFilterNormalizedValueAccessor.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/IColumnRangeFilterValueAccessor.java
@@ -16,14 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.filter.normalized;
+package org.apache.asterix.column.filter.range;
 
 import org.apache.asterix.om.types.ATypeTag;
 
 /**
- * Creates a normalized value accessor
+ * Creates a range value accessor
  */
-public interface IColumnFilterNormalizedValueAccessor {
+public interface IColumnRangeFilterValueAccessor {
     /**
      * @return the normalized value
      */
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/IColumnFilterNormalizedValueAccessorFactory.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/IColumnRangeFilterValueAccessorFactory.java
similarity index 83%
rename from asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/IColumnFilterNormalizedValueAccessorFactory.java
rename to asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/IColumnRangeFilterValueAccessorFactory.java
index d27718e..fc97c1a 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/IColumnFilterNormalizedValueAccessorFactory.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/IColumnRangeFilterValueAccessorFactory.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.filter.normalized;
+package org.apache.asterix.column.filter.range;
 
 import java.io.Serializable;
 import java.util.PriorityQueue;
@@ -34,7 +34,6 @@
  * @see IColumnBatchWriter#writeColumns(PriorityQueue)
  */
 @FunctionalInterface
-public interface IColumnFilterNormalizedValueAccessorFactory extends Serializable {
-    IColumnFilterNormalizedValueAccessor create(FilterAccessorProvider filterAccessorProvider)
-            throws HyracksDataException;
+public interface IColumnRangeFilterValueAccessorFactory extends Serializable {
+    IColumnRangeFilterValueAccessor create(FilterAccessorProvider filterAccessorProvider) throws HyracksDataException;
 }
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/accessor/ColumnFilterNormalizedValueAccessor.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/ColumnRangeFilterValueAccessor.java
similarity index 78%
rename from asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/accessor/ColumnFilterNormalizedValueAccessor.java
rename to asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/ColumnRangeFilterValueAccessor.java
index da1d176..de68ab3 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/accessor/ColumnFilterNormalizedValueAccessor.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/ColumnRangeFilterValueAccessor.java
@@ -16,18 +16,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.filter.normalized.accessor;
+package org.apache.asterix.column.filter.range.accessor;
 
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessor;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessor;
 import org.apache.asterix.om.types.ATypeTag;
 
-public class ColumnFilterNormalizedValueAccessor implements IColumnFilterNormalizedValueAccessor {
+public class ColumnRangeFilterValueAccessor implements IColumnRangeFilterValueAccessor {
     private final int columnIndex;
     private final ATypeTag typeTag;
     private final boolean min;
     private long normalizedValue;
 
-    public ColumnFilterNormalizedValueAccessor(int columnIndex, ATypeTag typeTag, boolean min) {
+    public ColumnRangeFilterValueAccessor(int columnIndex, ATypeTag typeTag, boolean min) {
         this.columnIndex = columnIndex;
         this.typeTag = typeTag;
         this.min = min;
@@ -54,4 +54,9 @@
     public ATypeTag getTypeTag() {
         return typeTag;
     }
+
+    @Override
+    public String toString() {
+        return Long.toString(normalizedValue);
+    }
 }
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/accessor/ColumnFilterNormalizedValueAccessorFactory.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/ColumnRangeFilterValueAccessorFactory.java
similarity index 72%
rename from asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/accessor/ColumnFilterNormalizedValueAccessorFactory.java
rename to asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/ColumnRangeFilterValueAccessorFactory.java
index 8e7c858..232484b 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/accessor/ColumnFilterNormalizedValueAccessorFactory.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/ColumnRangeFilterValueAccessorFactory.java
@@ -16,29 +16,29 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.filter.normalized.accessor;
+package org.apache.asterix.column.filter.range.accessor;
 
 import org.apache.asterix.column.filter.FilterAccessorProvider;
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessor;
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessor;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessorFactory;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.om.types.visitor.PathStringBuilderForIATypeVisitor;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
-public class ColumnFilterNormalizedValueAccessorFactory implements IColumnFilterNormalizedValueAccessorFactory {
+public class ColumnRangeFilterValueAccessorFactory implements IColumnRangeFilterValueAccessorFactory {
     private static final long serialVersionUID = -6341611172763952841L;
     private final ARecordType path;
     private final boolean min;
 
-    public ColumnFilterNormalizedValueAccessorFactory(ARecordType path, boolean min) {
+    public ColumnRangeFilterValueAccessorFactory(ARecordType path, boolean min) {
         this.path = path;
         this.min = min;
     }
 
     @Override
-    public IColumnFilterNormalizedValueAccessor create(FilterAccessorProvider filterAccessorProvider)
+    public IColumnRangeFilterValueAccessor create(FilterAccessorProvider filterAccessorProvider)
             throws HyracksDataException {
-        return filterAccessorProvider.createColumnFilterNormalizedValueAccessor(path, min);
+        return filterAccessorProvider.createRangeFilterValueAccessor(path, min);
     }
 
     @Override
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/accessor/ConstantColumnFilterNormalizedValueAccessor.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/ConstantColumnRangeFilterValueAccessor.java
similarity index 78%
rename from asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/accessor/ConstantColumnFilterNormalizedValueAccessor.java
rename to asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/ConstantColumnRangeFilterValueAccessor.java
index cca3cab..ae84e35 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/accessor/ConstantColumnFilterNormalizedValueAccessor.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/ConstantColumnRangeFilterValueAccessor.java
@@ -16,18 +16,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.filter.normalized.accessor;
+package org.apache.asterix.column.filter.range.accessor;
 
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessor;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessor;
 import org.apache.asterix.om.types.ATypeTag;
 
-public final class ConstantColumnFilterNormalizedValueAccessor implements IColumnFilterNormalizedValueAccessor {
+public final class ConstantColumnRangeFilterValueAccessor implements IColumnRangeFilterValueAccessor {
     private final long normalizedValue;
     private final ATypeTag typeTag;
 
     //TODO add UUID
 
-    public ConstantColumnFilterNormalizedValueAccessor(long normalizedValue, ATypeTag typeTag) {
+    public ConstantColumnRangeFilterValueAccessor(long normalizedValue, ATypeTag typeTag) {
         this.normalizedValue = normalizedValue;
         this.typeTag = typeTag;
     }
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/accessor/ConstantColumnFilterNormalizedValueAccessorFactory.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/ConstantColumnRangeFilterValueAccessorFactory.java
similarity index 75%
rename from asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/accessor/ConstantColumnFilterNormalizedValueAccessorFactory.java
rename to asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/ConstantColumnRangeFilterValueAccessorFactory.java
index 667a2c3..4d2c198 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/accessor/ConstantColumnFilterNormalizedValueAccessorFactory.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/ConstantColumnRangeFilterValueAccessorFactory.java
@@ -16,11 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.filter.normalized.accessor;
+package org.apache.asterix.column.filter.range.accessor;
 
 import org.apache.asterix.column.filter.FilterAccessorProvider;
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessor;
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessor;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessorFactory;
 import org.apache.asterix.om.base.ADouble;
 import org.apache.asterix.om.base.AInt64;
 import org.apache.asterix.om.base.AString;
@@ -28,20 +28,19 @@
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
-public class ConstantColumnFilterNormalizedValueAccessorFactory implements IColumnFilterNormalizedValueAccessorFactory {
+public class ConstantColumnRangeFilterValueAccessorFactory implements IColumnRangeFilterValueAccessorFactory {
     private static final long serialVersionUID = -4835407779342615453L;
     private final long normalizedValue;
     private final ATypeTag typeTag;
     private final String stringValue;
 
-    private ConstantColumnFilterNormalizedValueAccessorFactory(String stringValue, long normalizedValue,
-            ATypeTag typeTag) {
+    private ConstantColumnRangeFilterValueAccessorFactory(String stringValue, long normalizedValue, ATypeTag typeTag) {
         this.stringValue = stringValue;
         this.normalizedValue = normalizedValue;
         this.typeTag = typeTag;
     }
 
-    public static ConstantColumnFilterNormalizedValueAccessorFactory createFactory(IAObject value) {
+    public static ConstantColumnRangeFilterValueAccessorFactory createFactory(IAObject value) {
         String stringValue;
         long normalizedValue;
         ATypeTag typeTag = value.getType().getTypeTag();
@@ -64,13 +63,13 @@
                 return null;
         }
 
-        return new ConstantColumnFilterNormalizedValueAccessorFactory(stringValue, normalizedValue, typeTag);
+        return new ConstantColumnRangeFilterValueAccessorFactory(stringValue, normalizedValue, typeTag);
     }
 
     @Override
-    public IColumnFilterNormalizedValueAccessor create(FilterAccessorProvider filterAccessorProvider)
+    public IColumnRangeFilterValueAccessor create(FilterAccessorProvider filterAccessorProvider)
             throws HyracksDataException {
-        return new ConstantColumnFilterNormalizedValueAccessor(normalizedValue, typeTag);
+        return new ConstantColumnRangeFilterValueAccessor(normalizedValue, typeTag);
     }
 
     @Override
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/accessor/NoOpColumnFilterValueAccessor.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/NoOpColumnRangeFilterValueAccessor.java
similarity index 72%
rename from asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/accessor/NoOpColumnFilterValueAccessor.java
rename to asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/NoOpColumnRangeFilterValueAccessor.java
index acd3a44..5d538c7 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/accessor/NoOpColumnFilterValueAccessor.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/NoOpColumnRangeFilterValueAccessor.java
@@ -16,15 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.filter.normalized.accessor;
+package org.apache.asterix.column.filter.range.accessor;
 
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessor;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessor;
 import org.apache.asterix.om.types.ATypeTag;
 
-public class NoOpColumnFilterValueAccessor implements IColumnFilterNormalizedValueAccessor {
-    public static final IColumnFilterNormalizedValueAccessor INSTANCE = new NoOpColumnFilterValueAccessor();
+public class NoOpColumnRangeFilterValueAccessor implements IColumnRangeFilterValueAccessor {
+    public static final IColumnRangeFilterValueAccessor INSTANCE = new NoOpColumnRangeFilterValueAccessor();
 
-    private NoOpColumnFilterValueAccessor() {
+    private NoOpColumnRangeFilterValueAccessor() {
     }
 
     @Override
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/compartor/AbstractColumnFilterComparatorFactory.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/compartor/AbstractColumnFilterComparatorFactory.java
similarity index 68%
rename from asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/compartor/AbstractColumnFilterComparatorFactory.java
rename to asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/compartor/AbstractColumnFilterComparatorFactory.java
index cb63204..0374a4d 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/compartor/AbstractColumnFilterComparatorFactory.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/compartor/AbstractColumnFilterComparatorFactory.java
@@ -16,26 +16,26 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.filter.normalized.compartor;
+package org.apache.asterix.column.filter.range.compartor;
 
 import org.apache.asterix.column.filter.FalseColumnFilterEvaluator;
 import org.apache.asterix.column.filter.FilterAccessorProvider;
 import org.apache.asterix.column.filter.IColumnFilterEvaluator;
 import org.apache.asterix.column.filter.TrueColumnFilterEvaluator;
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessor;
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessorFactory;
-import org.apache.asterix.column.filter.normalized.IColumnNormalizedFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessor;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessorFactory;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
-abstract class AbstractColumnFilterComparatorFactory implements IColumnNormalizedFilterEvaluatorFactory {
+abstract class AbstractColumnFilterComparatorFactory implements IColumnRangeFilterEvaluatorFactory {
     private static final long serialVersionUID = 4229059703449173694L;
-    private final IColumnFilterNormalizedValueAccessorFactory left;
-    private final IColumnFilterNormalizedValueAccessorFactory right;
+    private final IColumnRangeFilterValueAccessorFactory left;
+    private final IColumnRangeFilterValueAccessorFactory right;
 
-    AbstractColumnFilterComparatorFactory(IColumnFilterNormalizedValueAccessorFactory left,
-            IColumnFilterNormalizedValueAccessorFactory right) {
+    AbstractColumnFilterComparatorFactory(IColumnRangeFilterValueAccessorFactory left,
+            IColumnRangeFilterValueAccessorFactory right) {
         this.left = left;
         this.right = right;
     }
@@ -43,8 +43,8 @@
     @Override
     public final IColumnFilterEvaluator create(FilterAccessorProvider filterAccessorProvider)
             throws HyracksDataException {
-        IColumnFilterNormalizedValueAccessor leftAccessor = left.create(filterAccessorProvider);
-        IColumnFilterNormalizedValueAccessor rightAccessor = right.create(filterAccessorProvider);
+        IColumnRangeFilterValueAccessor leftAccessor = left.create(filterAccessorProvider);
+        IColumnRangeFilterValueAccessor rightAccessor = right.create(filterAccessorProvider);
 
         ATypeTag leftTypeTag = leftAccessor.getTypeTag();
         ATypeTag rightTypeTag = rightAccessor.getTypeTag();
@@ -61,8 +61,8 @@
         return rightTypeTag == ATypeTag.MISSING || leftTypeTag != rightTypeTag;
     }
 
-    protected abstract IColumnFilterEvaluator createComparator(IColumnFilterNormalizedValueAccessor left,
-            IColumnFilterNormalizedValueAccessor right);
+    protected abstract IColumnFilterEvaluator createComparator(IColumnRangeFilterValueAccessor left,
+            IColumnRangeFilterValueAccessor right);
 
     protected abstract String getOpt();
 
@@ -72,10 +72,10 @@
     }
 
     static abstract class AbstractComparator implements IColumnFilterEvaluator {
-        protected final IColumnFilterNormalizedValueAccessor left;
-        protected final IColumnFilterNormalizedValueAccessor right;
+        protected final IColumnRangeFilterValueAccessor left;
+        protected final IColumnRangeFilterValueAccessor right;
 
-        AbstractComparator(IColumnFilterNormalizedValueAccessor left, IColumnFilterNormalizedValueAccessor right) {
+        AbstractComparator(IColumnRangeFilterValueAccessor left, IColumnRangeFilterValueAccessor right) {
             this.left = left;
             this.right = right;
         }
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/compartor/GEColumnFilterEvaluatorFactory.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/compartor/GEColumnFilterEvaluatorFactory.java
similarity index 71%
rename from asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/compartor/GEColumnFilterEvaluatorFactory.java
rename to asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/compartor/GEColumnFilterEvaluatorFactory.java
index bd880e6..0edee65 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/compartor/GEColumnFilterEvaluatorFactory.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/compartor/GEColumnFilterEvaluatorFactory.java
@@ -16,23 +16,23 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.filter.normalized.compartor;
+package org.apache.asterix.column.filter.range.compartor;
 
 import org.apache.asterix.column.filter.IColumnFilterEvaluator;
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessor;
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessor;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessorFactory;
 
 public class GEColumnFilterEvaluatorFactory extends AbstractColumnFilterComparatorFactory {
     private static final long serialVersionUID = 6879193736347174789L;
 
-    public GEColumnFilterEvaluatorFactory(IColumnFilterNormalizedValueAccessorFactory left,
-            IColumnFilterNormalizedValueAccessorFactory right) {
+    public GEColumnFilterEvaluatorFactory(IColumnRangeFilterValueAccessorFactory left,
+            IColumnRangeFilterValueAccessorFactory right) {
         super(left, right);
     }
 
     @Override
-    protected IColumnFilterEvaluator createComparator(IColumnFilterNormalizedValueAccessor left,
-            IColumnFilterNormalizedValueAccessor right) {
+    protected IColumnFilterEvaluator createComparator(IColumnRangeFilterValueAccessor left,
+            IColumnRangeFilterValueAccessor right) {
         return new AbstractComparator(left, right) {
             @Override
             public boolean evaluate() {
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/compartor/GTColumnFilterEvaluatorFactory.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/compartor/GTColumnFilterEvaluatorFactory.java
similarity index 71%
rename from asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/compartor/GTColumnFilterEvaluatorFactory.java
rename to asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/compartor/GTColumnFilterEvaluatorFactory.java
index de8eed0..7a21bd1 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/compartor/GTColumnFilterEvaluatorFactory.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/compartor/GTColumnFilterEvaluatorFactory.java
@@ -16,23 +16,23 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.filter.normalized.compartor;
+package org.apache.asterix.column.filter.range.compartor;
 
 import org.apache.asterix.column.filter.IColumnFilterEvaluator;
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessor;
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessor;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessorFactory;
 
 public class GTColumnFilterEvaluatorFactory extends AbstractColumnFilterComparatorFactory {
     private static final long serialVersionUID = -3104103170926445020L;
 
-    public GTColumnFilterEvaluatorFactory(IColumnFilterNormalizedValueAccessorFactory left,
-            IColumnFilterNormalizedValueAccessorFactory right) {
+    public GTColumnFilterEvaluatorFactory(IColumnRangeFilterValueAccessorFactory left,
+            IColumnRangeFilterValueAccessorFactory right) {
         super(left, right);
     }
 
     @Override
-    protected IColumnFilterEvaluator createComparator(IColumnFilterNormalizedValueAccessor left,
-            IColumnFilterNormalizedValueAccessor right) {
+    protected IColumnFilterEvaluator createComparator(IColumnRangeFilterValueAccessor left,
+            IColumnRangeFilterValueAccessor right) {
         return new AbstractComparator(left, right) {
             @Override
             public boolean evaluate() {
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/compartor/LEColumnFilterEvaluatorFactory.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/compartor/LEColumnFilterEvaluatorFactory.java
similarity index 71%
rename from asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/compartor/LEColumnFilterEvaluatorFactory.java
rename to asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/compartor/LEColumnFilterEvaluatorFactory.java
index dd43c5a..7cef6ab 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/compartor/LEColumnFilterEvaluatorFactory.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/compartor/LEColumnFilterEvaluatorFactory.java
@@ -16,23 +16,23 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.filter.normalized.compartor;
+package org.apache.asterix.column.filter.range.compartor;
 
 import org.apache.asterix.column.filter.IColumnFilterEvaluator;
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessor;
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessor;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessorFactory;
 
 public class LEColumnFilterEvaluatorFactory extends AbstractColumnFilterComparatorFactory {
     private static final long serialVersionUID = 1068661809768620550L;
 
-    public LEColumnFilterEvaluatorFactory(IColumnFilterNormalizedValueAccessorFactory left,
-            IColumnFilterNormalizedValueAccessorFactory right) {
+    public LEColumnFilterEvaluatorFactory(IColumnRangeFilterValueAccessorFactory left,
+            IColumnRangeFilterValueAccessorFactory right) {
         super(left, right);
     }
 
     @Override
-    protected IColumnFilterEvaluator createComparator(IColumnFilterNormalizedValueAccessor left,
-            IColumnFilterNormalizedValueAccessor right) {
+    protected IColumnFilterEvaluator createComparator(IColumnRangeFilterValueAccessor left,
+            IColumnRangeFilterValueAccessor right) {
         return new AbstractComparator(left, right) {
             @Override
             public boolean evaluate() {
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/compartor/LTColumnFilterEvaluatorFactory.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/compartor/LTColumnFilterEvaluatorFactory.java
similarity index 71%
rename from asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/compartor/LTColumnFilterEvaluatorFactory.java
rename to asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/compartor/LTColumnFilterEvaluatorFactory.java
index 7896ccf..2848d57 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/compartor/LTColumnFilterEvaluatorFactory.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/compartor/LTColumnFilterEvaluatorFactory.java
@@ -16,23 +16,23 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.filter.normalized.compartor;
+package org.apache.asterix.column.filter.range.compartor;
 
 import org.apache.asterix.column.filter.IColumnFilterEvaluator;
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessor;
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessor;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessorFactory;
 
 public class LTColumnFilterEvaluatorFactory extends AbstractColumnFilterComparatorFactory {
     private static final long serialVersionUID = -4066709771630858677L;
 
-    public LTColumnFilterEvaluatorFactory(IColumnFilterNormalizedValueAccessorFactory left,
-            IColumnFilterNormalizedValueAccessorFactory right) {
+    public LTColumnFilterEvaluatorFactory(IColumnRangeFilterValueAccessorFactory left,
+            IColumnRangeFilterValueAccessorFactory right) {
         super(left, right);
     }
 
     @Override
-    protected IColumnFilterEvaluator createComparator(IColumnFilterNormalizedValueAccessor left,
-            IColumnFilterNormalizedValueAccessor right) {
+    protected IColumnFilterEvaluator createComparator(IColumnRangeFilterValueAccessor left,
+            IColumnRangeFilterValueAccessor right) {
         return new AbstractComparator(left, right) {
             @Override
             public boolean evaluate() {
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/evaluator/ANDColumnFilterEvaluatorFactory.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/evaluator/ANDColumnFilterEvaluatorFactory.java
similarity index 88%
rename from asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/evaluator/ANDColumnFilterEvaluatorFactory.java
rename to asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/evaluator/ANDColumnFilterEvaluatorFactory.java
index 924cbd6..ddc63bd 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/evaluator/ANDColumnFilterEvaluatorFactory.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/evaluator/ANDColumnFilterEvaluatorFactory.java
@@ -16,20 +16,20 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.filter.normalized.evaluator;
+package org.apache.asterix.column.filter.range.evaluator;
 
 import org.apache.asterix.column.filter.FalseColumnFilterEvaluator;
 import org.apache.asterix.column.filter.FilterAccessorProvider;
 import org.apache.asterix.column.filter.IColumnFilterEvaluator;
 import org.apache.asterix.column.filter.TrueColumnFilterEvaluator;
-import org.apache.asterix.column.filter.normalized.IColumnNormalizedFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterEvaluatorFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
 public class ANDColumnFilterEvaluatorFactory extends AbstractColumnFilterEvaluatorFactory {
     private static final long serialVersionUID = -7902069740719309586L;
 
-    public ANDColumnFilterEvaluatorFactory(IColumnNormalizedFilterEvaluatorFactory left,
-            IColumnNormalizedFilterEvaluatorFactory right) {
+    public ANDColumnFilterEvaluatorFactory(IColumnRangeFilterEvaluatorFactory left,
+            IColumnRangeFilterEvaluatorFactory right) {
         super(left, right);
     }
 
@@ -56,7 +56,7 @@
     }
 
     private IColumnFilterEvaluator create(IColumnFilterEvaluator left, IColumnFilterEvaluator right) {
-        return new AbstractNormalizedEvaluator(left, right) {
+        return new AbstractFilterEvaluator(left, right) {
             @Override
             public boolean evaluate() throws HyracksDataException {
                 return left.evaluate() && right.evaluate();
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/evaluator/AbstractColumnFilterEvaluatorFactory.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/evaluator/AbstractColumnFilterEvaluatorFactory.java
similarity index 67%
rename from asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/evaluator/AbstractColumnFilterEvaluatorFactory.java
rename to asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/evaluator/AbstractColumnFilterEvaluatorFactory.java
index 66597db..35b7fc0 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/evaluator/AbstractColumnFilterEvaluatorFactory.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/evaluator/AbstractColumnFilterEvaluatorFactory.java
@@ -16,19 +16,19 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.filter.normalized.evaluator;
+package org.apache.asterix.column.filter.range.evaluator;
 
 import org.apache.asterix.column.filter.IColumnFilterEvaluator;
-import org.apache.asterix.column.filter.normalized.IColumnNormalizedFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterEvaluatorFactory;
 
-public abstract class AbstractColumnFilterEvaluatorFactory implements IColumnNormalizedFilterEvaluatorFactory {
+public abstract class AbstractColumnFilterEvaluatorFactory implements IColumnRangeFilterEvaluatorFactory {
     private static final long serialVersionUID = 1436531448052787426L;
 
-    protected final IColumnNormalizedFilterEvaluatorFactory left;
-    protected final IColumnNormalizedFilterEvaluatorFactory right;
+    protected final IColumnRangeFilterEvaluatorFactory left;
+    protected final IColumnRangeFilterEvaluatorFactory right;
 
-    public AbstractColumnFilterEvaluatorFactory(IColumnNormalizedFilterEvaluatorFactory left,
-            IColumnNormalizedFilterEvaluatorFactory right) {
+    public AbstractColumnFilterEvaluatorFactory(IColumnRangeFilterEvaluatorFactory left,
+            IColumnRangeFilterEvaluatorFactory right) {
         this.left = left;
         this.right = right;
     }
@@ -40,11 +40,11 @@
         return left.toString() + " " + getOp() + " " + right.toString();
     }
 
-    static abstract class AbstractNormalizedEvaluator implements IColumnFilterEvaluator {
+    static abstract class AbstractFilterEvaluator implements IColumnFilterEvaluator {
         protected final IColumnFilterEvaluator left;
         protected final IColumnFilterEvaluator right;
 
-        AbstractNormalizedEvaluator(IColumnFilterEvaluator left, IColumnFilterEvaluator right) {
+        AbstractFilterEvaluator(IColumnFilterEvaluator left, IColumnFilterEvaluator right) {
             this.left = left;
             this.right = right;
         }
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/evaluator/ORColumnFilterEvaluatorFactory.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/evaluator/ORColumnFilterEvaluatorFactory.java
similarity index 88%
rename from asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/evaluator/ORColumnFilterEvaluatorFactory.java
rename to asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/evaluator/ORColumnFilterEvaluatorFactory.java
index 046f05d..5c909e0 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/normalized/evaluator/ORColumnFilterEvaluatorFactory.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/evaluator/ORColumnFilterEvaluatorFactory.java
@@ -16,20 +16,20 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.column.filter.normalized.evaluator;
+package org.apache.asterix.column.filter.range.evaluator;
 
 import org.apache.asterix.column.filter.FalseColumnFilterEvaluator;
 import org.apache.asterix.column.filter.FilterAccessorProvider;
 import org.apache.asterix.column.filter.IColumnFilterEvaluator;
 import org.apache.asterix.column.filter.TrueColumnFilterEvaluator;
-import org.apache.asterix.column.filter.normalized.IColumnNormalizedFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterEvaluatorFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
 public class ORColumnFilterEvaluatorFactory extends AbstractColumnFilterEvaluatorFactory {
     private static final long serialVersionUID = 9029706131191375500L;
 
-    public ORColumnFilterEvaluatorFactory(IColumnNormalizedFilterEvaluatorFactory left,
-            IColumnNormalizedFilterEvaluatorFactory right) {
+    public ORColumnFilterEvaluatorFactory(IColumnRangeFilterEvaluatorFactory left,
+            IColumnRangeFilterEvaluatorFactory right) {
         super(left, right);
     }
 
@@ -57,7 +57,7 @@
     }
 
     private IColumnFilterEvaluator create(IColumnFilterEvaluator left, IColumnFilterEvaluator right) {
-        return new AbstractNormalizedEvaluator(left, right) {
+        return new AbstractFilterEvaluator(left, right) {
             @Override
             public boolean evaluate() throws HyracksDataException {
                 return left.evaluate() || right.evaluate();
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/secondary/create/PrimaryScanColumnTupleWithMetaProjector.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/secondary/create/PrimaryScanColumnTupleWithMetaProjector.java
index e7fb31f..79a1860 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/secondary/create/PrimaryScanColumnTupleWithMetaProjector.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/secondary/create/PrimaryScanColumnTupleWithMetaProjector.java
@@ -39,7 +39,7 @@
     public PrimaryScanColumnTupleWithMetaProjector(ARecordType datasetType, ARecordType metaType,
             int numberOfPrimaryKeys, ARecordType requestedType) {
         projector = new QueryColumnWithMetaTupleProjector(datasetType, metaType, numberOfPrimaryKeys, requestedType,
-                Collections.emptyMap(), metaType, Collections.emptyMap(), NoOpColumnFilterEvaluatorFactory.INSTANCE,
+                Collections.emptyMap(), metaType, NoOpColumnFilterEvaluatorFactory.INSTANCE,
                 NoOpColumnFilterEvaluatorFactory.INSTANCE, NoOpWarningCollector.INSTANCE, null);
     }
 
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/secondary/upsert/UpsertPreviousColumnTupleWithMetaProjector.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/secondary/upsert/UpsertPreviousColumnTupleWithMetaProjector.java
index 2c760bf..271649a 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/secondary/upsert/UpsertPreviousColumnTupleWithMetaProjector.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/secondary/upsert/UpsertPreviousColumnTupleWithMetaProjector.java
@@ -42,7 +42,7 @@
         // +2 one for the record and one for meta
         builder = new ArrayTupleBuilder(numberOfPrimaryKeys + 2);
         projector = new QueryColumnWithMetaTupleProjector(datasetType, metaType, numberOfPrimaryKeys, requestedType,
-                Collections.emptyMap(), metaType, Collections.emptyMap(), NoOpColumnFilterEvaluatorFactory.INSTANCE,
+                Collections.emptyMap(), metaType, NoOpColumnFilterEvaluatorFactory.INSTANCE,
                 NoOpColumnFilterEvaluatorFactory.INSTANCE, NoOpWarningCollector.INSTANCE, null);
     }
 
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnMetadata.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnMetadata.java
index 248b5a5..d9071b8 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnMetadata.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnMetadata.java
@@ -35,8 +35,8 @@
 import org.apache.asterix.column.filter.TrueColumnFilterEvaluator;
 import org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluator;
 import org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluatorFactory;
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessor;
-import org.apache.asterix.column.filter.normalized.IColumnNormalizedFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessor;
 import org.apache.asterix.column.metadata.AbstractColumnImmutableReadMetadata;
 import org.apache.asterix.column.metadata.FieldNamesDictionary;
 import org.apache.asterix.column.metadata.schema.AbstractSchemaNode;
@@ -69,7 +69,7 @@
     private final FieldNamesDictionary fieldNamesDictionary;
     private final PrimitiveColumnValuesReader[] primaryKeyReaders;
     private final IColumnFilterEvaluator normalizedFilterEvaluator;
-    private final List<IColumnFilterNormalizedValueAccessor> filterValueAccessors;
+    private final List<IColumnRangeFilterValueAccessor> filterValueAccessors;
     private final IColumnIterableFilterEvaluator columnFilterEvaluator;
     private final List<IColumnValuesReader> filterColumnReaders;
 
@@ -79,7 +79,7 @@
             PrimitiveColumnValuesReader[] primaryKeyReaders, IValueReference serializedMetadata,
             FieldNamesDictionary fieldNamesDictionary, ObjectSchemaNode root, IColumnValuesReaderFactory readerFactory,
             IValueGetterFactory valueGetterFactory, IColumnFilterEvaluator normalizedFilterEvaluator,
-            List<IColumnFilterNormalizedValueAccessor> filterValueAccessors,
+            List<IColumnRangeFilterValueAccessor> filterValueAccessors,
             IColumnIterableFilterEvaluator columnFilterEvaluator, List<IColumnValuesReader> filterColumnReaders)
             throws HyracksDataException {
         super(datasetType, metaType, primaryKeyReaders.length, serializedMetadata, -1);
@@ -105,11 +105,11 @@
         return primaryKeyReaders;
     }
 
-    public final IColumnFilterEvaluator getNormalizedFilterEvaluator() {
+    public final IColumnFilterEvaluator getRangeFilterEvaluator() {
         return normalizedFilterEvaluator;
     }
 
-    public final List<IColumnFilterNormalizedValueAccessor> getFilterValueAccessors() {
+    public final List<IColumnRangeFilterValueAccessor> getFilterValueAccessors() {
         return filterValueAccessors;
     }
 
@@ -175,7 +175,7 @@
             IValueReference serializedMetadata, IColumnValuesReaderFactory readerFactory,
             IValueGetterFactory valueGetterFactory, ARecordType requestedType,
             Map<String, FunctionCallInformation> functionCallInfoMap,
-            IColumnNormalizedFilterEvaluatorFactory normalizedEvaluatorFactory,
+            IColumnRangeFilterEvaluatorFactory normalizedEvaluatorFactory,
             IColumnIterableFilterEvaluatorFactory columnFilterEvaluatorFactory, IWarningCollector warningCollector,
             IHyracksTaskContext context) throws IOException {
         byte[] bytes = serializedMetadata.getByteArray();
@@ -204,7 +204,7 @@
         IColumnFilterEvaluator normalizedFilterEvaluator = TrueColumnFilterEvaluator.INSTANCE;
         IColumnIterableFilterEvaluator columnFilterEvaluator = TrueColumnFilterEvaluator.INSTANCE;
         List<IColumnValuesReader> filterColumnReaders = Collections.emptyList();
-        List<IColumnFilterNormalizedValueAccessor> filterValueAccessors = Collections.emptyList();
+        List<IColumnRangeFilterValueAccessor> filterValueAccessors = Collections.emptyList();
         if (context != null) {
             FilterAccessorProvider filterAccessorProvider =
                     new FilterAccessorProvider(root, clipperVisitor, readerFactory, valueGetterFactory);
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnTupleProjector.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnTupleProjector.java
index e2a69d6..b7b9745 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnTupleProjector.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnTupleProjector.java
@@ -25,7 +25,7 @@
 import org.apache.asterix.column.assembler.value.MissingValueGetter;
 import org.apache.asterix.column.assembler.value.ValueGetterFactory;
 import org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluatorFactory;
-import org.apache.asterix.column.filter.normalized.IColumnNormalizedFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterEvaluatorFactory;
 import org.apache.asterix.column.tuple.AssembledTupleReference;
 import org.apache.asterix.column.tuple.QueryColumnTupleReference;
 import org.apache.asterix.column.values.reader.ColumnValueReaderFactory;
@@ -47,13 +47,13 @@
     protected final Map<String, FunctionCallInformation> functionCallInfoMap;
     protected final IWarningCollector warningCollector;
     protected final IHyracksTaskContext context;
-    protected final IColumnNormalizedFilterEvaluatorFactory normalizedFilterEvaluatorFactory;
+    protected final IColumnRangeFilterEvaluatorFactory normalizedFilterEvaluatorFactory;
     protected final IColumnIterableFilterEvaluatorFactory columnFilterEvaluatorFactory;
     private final AssembledTupleReference assembledTupleReference;
 
     public QueryColumnTupleProjector(ARecordType datasetType, int numberOfPrimaryKeys, ARecordType requestedType,
             Map<String, FunctionCallInformation> functionCallInfoMap,
-            IColumnNormalizedFilterEvaluatorFactory normalizedFilterEvaluatorFactory,
+            IColumnRangeFilterEvaluatorFactory normalizedFilterEvaluatorFactory,
             IColumnIterableFilterEvaluatorFactory columnFilterEvaluatorFactory, IWarningCollector warningCollector,
             IHyracksTaskContext context) {
         this.datasetType = datasetType;
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnTupleProjectorFactory.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnTupleProjectorFactory.java
index f63df95..0265a05 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnTupleProjectorFactory.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnTupleProjectorFactory.java
@@ -21,7 +21,7 @@
 import java.util.Map;
 
 import org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluatorFactory;
-import org.apache.asterix.column.filter.normalized.IColumnNormalizedFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterEvaluatorFactory;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.runtime.projection.FunctionCallInformation;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
@@ -38,14 +38,12 @@
     private final ARecordType requestedType;
     private final ARecordType requestedMetaType;
     private final Map<String, FunctionCallInformation> functionCallInfo;
-    private final Map<String, FunctionCallInformation> metaFunctionCallInfo;
-    private final IColumnNormalizedFilterEvaluatorFactory normalizedFilterEvaluatorFactory;
+    private final IColumnRangeFilterEvaluatorFactory rangeFilterEvaluatorFactory;
     private final IColumnIterableFilterEvaluatorFactory columnFilterEvaluatorFactory;
 
     public QueryColumnTupleProjectorFactory(ARecordType datasetType, ARecordType metaType, int numberOfPrimaryKeys,
             ARecordType requestedType, Map<String, FunctionCallInformation> functionCallInfo,
-            ARecordType requestedMetaType, Map<String, FunctionCallInformation> metaFunctionCallInfo,
-            IColumnNormalizedFilterEvaluatorFactory normalizedFilterEvaluatorFactory,
+            ARecordType requestedMetaType, IColumnRangeFilterEvaluatorFactory rangeFilterEvaluatorFactory,
             IColumnIterableFilterEvaluatorFactory columnFilterEvaluatorFactory) {
         this.datasetType = datasetType;
         this.metaType = metaType;
@@ -53,8 +51,7 @@
         this.requestedType = requestedType;
         this.functionCallInfo = functionCallInfo;
         this.requestedMetaType = requestedMetaType;
-        this.metaFunctionCallInfo = metaFunctionCallInfo;
-        this.normalizedFilterEvaluatorFactory = normalizedFilterEvaluatorFactory;
+        this.rangeFilterEvaluatorFactory = rangeFilterEvaluatorFactory;
         this.columnFilterEvaluatorFactory = columnFilterEvaluatorFactory;
     }
 
@@ -64,11 +61,11 @@
         if (requestedMetaType == null) {
             // The dataset does not contain a meta part
             return new QueryColumnTupleProjector(datasetType, numberOfPrimaryKeys, requestedType, functionCallInfo,
-                    normalizedFilterEvaluatorFactory, columnFilterEvaluatorFactory, warningCollector, context);
+                    rangeFilterEvaluatorFactory, columnFilterEvaluatorFactory, warningCollector, context);
         }
         // The dataset has a meta part
         return new QueryColumnWithMetaTupleProjector(datasetType, metaType, numberOfPrimaryKeys, requestedType,
-                functionCallInfo, requestedMetaType, metaFunctionCallInfo, normalizedFilterEvaluatorFactory,
-                columnFilterEvaluatorFactory, warningCollector, context);
+                functionCallInfo, requestedMetaType, rangeFilterEvaluatorFactory, columnFilterEvaluatorFactory,
+                warningCollector, context);
     }
 }
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnWithMetaMetadata.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnWithMetaMetadata.java
index c23dbcf..c89a67b 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnWithMetaMetadata.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnWithMetaMetadata.java
@@ -32,8 +32,8 @@
 import org.apache.asterix.column.filter.TrueColumnFilterEvaluator;
 import org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluator;
 import org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluatorFactory;
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessor;
-import org.apache.asterix.column.filter.normalized.IColumnNormalizedFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessor;
 import org.apache.asterix.column.metadata.FieldNamesDictionary;
 import org.apache.asterix.column.metadata.schema.AbstractSchemaNode;
 import org.apache.asterix.column.metadata.schema.ObjectSchemaNode;
@@ -64,7 +64,7 @@
             PrimitiveColumnValuesReader[] primaryKeyReaders, IValueReference serializedMetadata,
             FieldNamesDictionary fieldNamesDictionary, ObjectSchemaNode root, ObjectSchemaNode metaRoot,
             IColumnValuesReaderFactory readerFactory, IValueGetterFactory valueGetterFactory,
-            IColumnFilterEvaluator filterEvaluator, List<IColumnFilterNormalizedValueAccessor> filterValueAccessors,
+            IColumnFilterEvaluator filterEvaluator, List<IColumnRangeFilterValueAccessor> filterValueAccessors,
             IColumnIterableFilterEvaluator columnFilterEvaluator, List<IColumnValuesReader> filterColumnReaders)
             throws HyracksDataException {
         super(datasetType, metaType, primaryKeyReaders, serializedMetadata, fieldNamesDictionary, root, readerFactory,
@@ -121,8 +121,7 @@
             int numberOfPrimaryKeys, IValueReference serializedMetadata, IColumnValuesReaderFactory readerFactory,
             IValueGetterFactory valueGetterFactory, ARecordType requestedType,
             Map<String, FunctionCallInformation> functionCallInfo, ARecordType metaRequestedType,
-            Map<String, FunctionCallInformation> metaFunctionCallInfo,
-            IColumnNormalizedFilterEvaluatorFactory normalizedEvaluatorFactory,
+            IColumnRangeFilterEvaluatorFactory normalizedEvaluatorFactory,
             IColumnIterableFilterEvaluatorFactory columnFilterEvaluatorFactory, IWarningCollector warningCollector,
             IHyracksTaskContext context) throws IOException {
         byte[] bytes = serializedMetadata.getByteArray();
@@ -139,20 +138,18 @@
         ObjectSchemaNode root = (ObjectSchemaNode) AbstractSchemaNode.deserialize(input, null);
         ObjectSchemaNode metaRoot = (ObjectSchemaNode) AbstractSchemaNode.deserialize(input, null);
 
-        //Clip dataset schema
         SchemaClipperVisitor clipperVisitor =
                 new SchemaClipperVisitor(fieldNamesDictionary, functionCallInfo, warningCollector);
+        //Clip dataset schema
         ObjectSchemaNode clippedRoot = clip(requestedType, root, clipperVisitor);
 
         //Clip meta schema
-        SchemaClipperVisitor metaClipperVisitor =
-                new SchemaClipperVisitor(fieldNamesDictionary, metaFunctionCallInfo, warningCollector);
-        ObjectSchemaNode metaClippedRoot = clip(metaRequestedType, metaRoot, metaClipperVisitor);
+        ObjectSchemaNode metaClippedRoot = clip(metaRequestedType, metaRoot, clipperVisitor);
 
         IColumnFilterEvaluator normalizedFilterEvaluator = TrueColumnFilterEvaluator.INSTANCE;
         IColumnIterableFilterEvaluator columnFilterEvaluator = TrueColumnFilterEvaluator.INSTANCE;
         List<IColumnValuesReader> filterColumnReaders = Collections.emptyList();
-        List<IColumnFilterNormalizedValueAccessor> filterValueAccessors = Collections.emptyList();
+        List<IColumnRangeFilterValueAccessor> filterValueAccessors = Collections.emptyList();
         if (context != null) {
             FilterAccessorProvider filterAccessorProvider =
                     new FilterAccessorProvider(root, clipperVisitor, readerFactory, valueGetterFactory);
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnWithMetaTupleProjector.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnWithMetaTupleProjector.java
index 838973f..f31c7cc 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnWithMetaTupleProjector.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/QueryColumnWithMetaTupleProjector.java
@@ -24,7 +24,7 @@
 
 import org.apache.asterix.column.assembler.value.ValueGetterFactory;
 import org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluatorFactory;
-import org.apache.asterix.column.filter.normalized.IColumnNormalizedFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterEvaluatorFactory;
 import org.apache.asterix.column.tuple.QueryColumnWithMetaTupleReference;
 import org.apache.asterix.column.values.reader.ColumnValueReaderFactory;
 import org.apache.asterix.om.types.ARecordType;
@@ -40,19 +40,16 @@
 public class QueryColumnWithMetaTupleProjector extends QueryColumnTupleProjector {
     private final ARecordType metaType;
     private final ARecordType requestedMetaType;
-    private final Map<String, FunctionCallInformation> metaFunctionCallInfoMap;
 
     public QueryColumnWithMetaTupleProjector(ARecordType datasetType, ARecordType metaType, int numberOfPrimaryKeys,
             ARecordType requestedType, Map<String, FunctionCallInformation> functionCallInfoMap,
-            ARecordType requestedMetaType, Map<String, FunctionCallInformation> metaFunctionCallInfoMap,
-            IColumnNormalizedFilterEvaluatorFactory filterEvaluator,
+            ARecordType requestedMetaType, IColumnRangeFilterEvaluatorFactory filterEvaluator,
             IColumnIterableFilterEvaluatorFactory columnFilterEvaluatorFactory, IWarningCollector warningCollector,
             IHyracksTaskContext context) {
         super(datasetType, numberOfPrimaryKeys, requestedType, functionCallInfoMap, filterEvaluator,
                 columnFilterEvaluatorFactory, warningCollector, context);
         this.metaType = metaType;
         this.requestedMetaType = requestedMetaType;
-        this.metaFunctionCallInfoMap = metaFunctionCallInfoMap;
     }
 
     @Override
@@ -60,8 +57,8 @@
         try {
             return QueryColumnWithMetaMetadata.create(datasetType, metaType, numberOfPrimaryKeys, serializedMetadata,
                     new ColumnValueReaderFactory(), ValueGetterFactory.INSTANCE, requestedType, functionCallInfoMap,
-                    requestedMetaType, metaFunctionCallInfoMap, normalizedFilterEvaluatorFactory,
-                    columnFilterEvaluatorFactory, warningCollector, context);
+                    requestedMetaType, normalizedFilterEvaluatorFactory, columnFilterEvaluatorFactory, warningCollector,
+                    context);
         } catch (IOException e) {
             throw HyracksDataException.create(e);
         }
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/tuple/QueryColumnTupleReference.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/tuple/QueryColumnTupleReference.java
index c9b1eac..71497f5 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/tuple/QueryColumnTupleReference.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/tuple/QueryColumnTupleReference.java
@@ -30,7 +30,7 @@
 import org.apache.asterix.column.filter.IFilterApplier;
 import org.apache.asterix.column.filter.TrueColumnFilterEvaluator;
 import org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluator;
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessor;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessor;
 import org.apache.asterix.column.operation.query.ColumnAssembler;
 import org.apache.asterix.column.operation.query.QueryColumnMetadata;
 import org.apache.asterix.column.values.IColumnValuesReader;
@@ -46,8 +46,8 @@
 
 public final class QueryColumnTupleReference extends AbstractAsterixColumnTupleReference {
     private final ColumnAssembler assembler;
-    private final IColumnFilterEvaluator normalizedFilterEvaluator;
-    private final List<IColumnFilterNormalizedValueAccessor> filterValueAccessors;
+    private final IColumnFilterEvaluator rangeFilterEvaluator;
+    private final List<IColumnRangeFilterValueAccessor> filterValueAccessors;
     private final IColumnIterableFilterEvaluator columnFilterEvaluator;
     private final IFilterApplier filterApplier;
     private final List<IColumnValuesReader> filterColumnReaders;
@@ -58,7 +58,7 @@
         super(componentIndex, frame, columnMetadata, multiPageOp);
         assembler = columnMetadata.getAssembler();
 
-        normalizedFilterEvaluator = columnMetadata.getNormalizedFilterEvaluator();
+        rangeFilterEvaluator = columnMetadata.getRangeFilterEvaluator();
         filterValueAccessors = columnMetadata.getFilterValueAccessors();
 
         columnFilterEvaluator = columnMetadata.getColumnFilterEvaluator();
@@ -91,7 +91,7 @@
         //Skip filters
         pageZero.position(pageZero.position() + numberOfColumns * AbstractColumnFilterWriter.FILTER_SIZE);
         //Check if we should read all column pages
-        boolean readColumns = normalizedFilterEvaluator.evaluate();
+        boolean readColumns = rangeFilterEvaluator.evaluate();
         assembler.reset(readColumns ? numberOfTuples : 0);
         columnFilterEvaluator.reset();
         return readColumns;
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/tuple/QueryColumnWithMetaTupleReference.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/tuple/QueryColumnWithMetaTupleReference.java
index ea3b4b7..798c15f 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/tuple/QueryColumnWithMetaTupleReference.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/tuple/QueryColumnWithMetaTupleReference.java
@@ -30,7 +30,7 @@
 import org.apache.asterix.column.filter.IFilterApplier;
 import org.apache.asterix.column.filter.TrueColumnFilterEvaluator;
 import org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluator;
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessor;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessor;
 import org.apache.asterix.column.operation.query.ColumnAssembler;
 import org.apache.asterix.column.operation.query.QueryColumnMetadata;
 import org.apache.asterix.column.operation.query.QueryColumnWithMetaMetadata;
@@ -48,8 +48,8 @@
 public final class QueryColumnWithMetaTupleReference extends AbstractAsterixColumnTupleReference {
     private final ColumnAssembler assembler;
     private final ColumnAssembler metaAssembler;
-    private final IColumnFilterEvaluator normalizedFilterEvaluator;
-    private final List<IColumnFilterNormalizedValueAccessor> filterValueAccessors;
+    private final IColumnFilterEvaluator rangeFilterEvaluator;
+    private final List<IColumnRangeFilterValueAccessor> filterValueAccessors;
     private final IColumnIterableFilterEvaluator columnFilterEvaluator;
     private final IFilterApplier filterApplier;
     private final List<IColumnValuesReader> filterColumnReaders;
@@ -61,7 +61,7 @@
         assembler = columnMetadata.getAssembler();
         metaAssembler = ((QueryColumnWithMetaMetadata) columnMetadata).getMetaAssembler();
 
-        normalizedFilterEvaluator = columnMetadata.getNormalizedFilterEvaluator();
+        rangeFilterEvaluator = columnMetadata.getRangeFilterEvaluator();
         filterValueAccessors = columnMetadata.getFilterValueAccessors();
 
         columnFilterEvaluator = columnMetadata.getColumnFilterEvaluator();
@@ -94,7 +94,7 @@
         //Skip filters
         pageZero.position(pageZero.position() + numberOfColumns * AbstractColumnFilterWriter.FILTER_SIZE);
         //Check if we should read all column pages
-        boolean readColumns = normalizedFilterEvaluator.evaluate();
+        boolean readColumns = rangeFilterEvaluator.evaluate();
         assembler.reset(readColumns ? numberOfTuples : 0);
         metaAssembler.reset(readColumns ? numberOfTuples : 0);
         columnFilterEvaluator.reset();
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/IndexUtil.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/IndexUtil.java
index 46b4a7b..6a67313 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/IndexUtil.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/IndexUtil.java
@@ -29,7 +29,7 @@
 
 import org.apache.asterix.column.filter.NoOpColumnFilterEvaluatorFactory;
 import org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluatorFactory;
-import org.apache.asterix.column.filter.normalized.IColumnNormalizedFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterEvaluatorFactory;
 import org.apache.asterix.column.operation.lsm.secondary.create.PrimaryScanColumnTupleProjectorFactory;
 import org.apache.asterix.column.operation.lsm.secondary.upsert.UpsertPreviousColumnTupleProjectorFactory;
 import org.apache.asterix.column.operation.query.QueryColumnTupleProjectorFactory;
@@ -44,7 +44,7 @@
 import org.apache.asterix.metadata.entities.Index;
 import org.apache.asterix.metadata.entities.InternalDatasetDetails;
 import org.apache.asterix.metadata.utils.filter.ColumnFilterBuilder;
-import org.apache.asterix.metadata.utils.filter.NormalizedColumnFilterBuilder;
+import org.apache.asterix.metadata.utils.filter.ColumnRangeFilterBuilder;
 import org.apache.asterix.om.base.AString;
 import org.apache.asterix.om.base.IAObject;
 import org.apache.asterix.om.types.ARecordType;
@@ -283,7 +283,7 @@
             // pushdown is disabled
             ARecordType metaType = metaItemType == null ? null : ALL_FIELDS_TYPE;
             return new QueryColumnTupleProjectorFactory(datasetType, metaItemType, numberOfPrimaryKeys, ALL_FIELDS_TYPE,
-                    Collections.emptyMap(), metaType, Collections.emptyMap(), NoOpColumnFilterEvaluatorFactory.INSTANCE,
+                    Collections.emptyMap(), metaType, NoOpColumnFilterEvaluatorFactory.INSTANCE,
                     NoOpColumnFilterEvaluatorFactory.INSTANCE);
         }
         ColumnDatasetProjectionFiltrationInfo columnInfo =
@@ -293,15 +293,14 @@
         ARecordType metaRequestedType = columnInfo.getMetaProjectedType();
         Map<String, FunctionCallInformation> callInfo = columnInfo.getFunctionCallInfoMap();
 
-        NormalizedColumnFilterBuilder normalizedColumnFilterBuilder = new NormalizedColumnFilterBuilder(columnInfo);
-        IColumnNormalizedFilterEvaluatorFactory normalizedFilterEvaluatorFactory =
-                normalizedColumnFilterBuilder.build();
+        ColumnRangeFilterBuilder columnRangeFilterBuilder = new ColumnRangeFilterBuilder(columnInfo);
+        IColumnRangeFilterEvaluatorFactory rangeFilterEvaluatorFactory = columnRangeFilterBuilder.build();
 
-        ColumnFilterBuilder columnFilterBuilder = new ColumnFilterBuilder(columnInfo, context);
+        ColumnFilterBuilder columnFilterBuilder = new ColumnFilterBuilder(columnInfo, context, typeEnv);
         IColumnIterableFilterEvaluatorFactory columnFilterEvaluatorFactory = columnFilterBuilder.build();
 
         return new QueryColumnTupleProjectorFactory(datasetType, metaItemType, numberOfPrimaryKeys, recordRequestedType,
-                callInfo, metaRequestedType, callInfo, normalizedFilterEvaluatorFactory, columnFilterEvaluatorFactory);
+                callInfo, metaRequestedType, rangeFilterEvaluatorFactory, columnFilterEvaluatorFactory);
     }
 
     public static ITupleProjectorFactory createUpsertTupleProjectorFactory(DatasetFormatInfo datasetFormatInfo,
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/filter/AbstractFilterBuilder.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/filter/AbstractFilterBuilder.java
new file mode 100644
index 0000000..ce39220
--- /dev/null
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/filter/AbstractFilterBuilder.java
@@ -0,0 +1,117 @@
+/*
+ * 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.asterix.metadata.utils.filter;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.asterix.common.api.IApplicationContext;
+import org.apache.asterix.common.config.CompilerProperties;
+import org.apache.asterix.metadata.declared.MetadataProvider;
+import org.apache.asterix.om.functions.IFunctionDescriptor;
+import org.apache.asterix.om.functions.IFunctionManager;
+import org.apache.asterix.om.functions.IFunctionTypeInferer;
+import org.apache.asterix.om.types.ARecordType;
+import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
+import org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
+import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
+import org.apache.hyracks.algebricks.core.algebra.expressions.ConstantExpression;
+import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.core.jobgen.impl.JobGenContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.SourceLocation;
+
+abstract class AbstractFilterBuilder {
+
+    protected final Map<ILogicalExpression, ARecordType> filterPaths;
+    protected final ILogicalExpression filterExpression;
+    protected final JobGenContext context;
+    protected final IVariableTypeEnvironment typeEnv;
+
+    AbstractFilterBuilder(Map<ILogicalExpression, ARecordType> filterPaths, ILogicalExpression filterExpression,
+            JobGenContext context, IVariableTypeEnvironment typeEnv) {
+        this.filterPaths = filterPaths;
+        this.filterExpression = filterExpression;
+        this.context = context;
+        this.typeEnv = typeEnv;
+    }
+
+    protected IScalarEvaluatorFactory createEvaluator(ILogicalExpression expression) throws AlgebricksException {
+        if (filterPaths.containsKey(expression)) {
+            // Path expression, create a value accessor (i.e., a column reader)
+            return createValueAccessor(expression);
+        } else if (expression.getExpressionTag() == LogicalExpressionTag.CONSTANT) {
+            return createConstantAccessor(expression);
+        } else if (expression.getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL) {
+            return handleFunction(expression);
+        }
+
+        /*
+         * A variable expression: This should not happen as the provided filter expression is inlined.
+         * If a variable was encountered for some reason, it should only be the record variable. If the record variable
+         * was encountered, that means there's a missing value path the compiler didn't provide.
+         */
+        throw new IllegalStateException(
+                "Unsupported expression " + expression + ". the provided paths are: " + filterPaths);
+    }
+
+    protected abstract IScalarEvaluatorFactory createValueAccessor(ILogicalExpression expression);
+
+    private IScalarEvaluatorFactory createConstantAccessor(ILogicalExpression expression) throws AlgebricksException {
+        MetadataProvider metadataProvider = (MetadataProvider) context.getMetadataProvider();
+        ConstantExpression constExpr = (ConstantExpression) expression;
+        return metadataProvider.getDataFormat().getConstantEvalFactory(constExpr.getValue());
+    }
+
+    private IScalarEvaluatorFactory handleFunction(ILogicalExpression expr) throws AlgebricksException {
+        AbstractFunctionCallExpression funcExpr = (AbstractFunctionCallExpression) expr;
+        IScalarEvaluatorFactory[] args = handleArgs(funcExpr);
+        IFunctionDescriptor fd = resolveFunction(funcExpr);
+        return fd.createEvaluatorFactory(args);
+    }
+
+    private IScalarEvaluatorFactory[] handleArgs(AbstractFunctionCallExpression funcExpr) throws AlgebricksException {
+        List<Mutable<ILogicalExpression>> args = funcExpr.getArguments();
+        IScalarEvaluatorFactory[] argsEvalFactories = new IScalarEvaluatorFactory[args.size()];
+        for (int i = 0; i < args.size(); i++) {
+            ILogicalExpression expr = args.get(i).getValue();
+            IScalarEvaluatorFactory evalFactory = createEvaluator(expr);
+            argsEvalFactories[i] = evalFactory;
+        }
+        return argsEvalFactories;
+    }
+
+    private IFunctionDescriptor resolveFunction(AbstractFunctionCallExpression funcExpr) throws AlgebricksException {
+        MetadataProvider metadataProvider = (MetadataProvider) context.getMetadataProvider();
+        IFunctionManager functionManager = metadataProvider.getFunctionManager();
+        FunctionIdentifier fnId = funcExpr.getFunctionIdentifier();
+        SourceLocation sourceLocation = funcExpr.getSourceLocation();
+        IFunctionDescriptor fd = functionManager.lookupFunction(fnId, sourceLocation);
+        fd.setSourceLocation(sourceLocation);
+        IFunctionTypeInferer fnTypeInfer = functionManager.lookupFunctionTypeInferer(fnId);
+        if (fnTypeInfer != null) {
+            CompilerProperties compilerProps = ((IApplicationContext) context.getAppContext()).getCompilerProperties();
+            fnTypeInfer.infer(funcExpr, fd, typeEnv, compilerProps);
+        }
+        return fd;
+    }
+}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/filter/ColumnFilterBuilder.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/filter/ColumnFilterBuilder.java
index 2b8847b..a89193b 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/filter/ColumnFilterBuilder.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/filter/ColumnFilterBuilder.java
@@ -18,53 +18,28 @@
  */
 package org.apache.asterix.metadata.utils.filter;
 
-import static org.apache.asterix.metadata.utils.filter.NormalizedColumnFilterBuilder.NORMALIZED_PUSHABLE_FUNCTIONS;
-
-import java.util.List;
-import java.util.Map;
-
 import org.apache.asterix.column.filter.NoOpColumnFilterEvaluatorFactory;
 import org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluatorFactory;
 import org.apache.asterix.column.filter.iterable.accessor.ColumnFilterValueAccessorEvaluatorFactory;
 import org.apache.asterix.column.filter.iterable.evaluator.ColumnIterableFilterEvaluatorFactory;
-import org.apache.asterix.common.api.IApplicationContext;
-import org.apache.asterix.common.config.CompilerProperties;
-import org.apache.asterix.metadata.declared.MetadataProvider;
-import org.apache.asterix.om.functions.BuiltinFunctions;
-import org.apache.asterix.om.functions.IFunctionDescriptor;
-import org.apache.asterix.om.functions.IFunctionManager;
-import org.apache.asterix.om.functions.IFunctionTypeInferer;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.runtime.projection.ColumnDatasetProjectionFiltrationInfo;
-import org.apache.commons.lang3.mutable.Mutable;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
-import org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
-import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
-import org.apache.hyracks.algebricks.core.algebra.expressions.ConstantExpression;
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
 import org.apache.hyracks.algebricks.core.jobgen.impl.JobGenContext;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
-import org.apache.hyracks.api.exceptions.SourceLocation;
 
-public class ColumnFilterBuilder {
-    private final FilterVariableTypeEnvironment typeEnv;
-    private final Map<ILogicalExpression, ARecordType> filterPaths;
-    private final ILogicalExpression filterExpression;
-    private final JobGenContext context;
-    private final ArrayPathCheckerVisitor checkerVisitor;
+public class ColumnFilterBuilder extends AbstractFilterBuilder {
 
-    public ColumnFilterBuilder(ColumnDatasetProjectionFiltrationInfo projectionFiltrationInfo, JobGenContext context) {
-        typeEnv = new FilterVariableTypeEnvironment();
-        this.filterPaths = projectionFiltrationInfo.getFilterPaths();
-        this.filterExpression = projectionFiltrationInfo.getFilterExpression();
-        this.context = context;
-        checkerVisitor = new ArrayPathCheckerVisitor();
+    public ColumnFilterBuilder(ColumnDatasetProjectionFiltrationInfo projectionFiltrationInfo, JobGenContext context,
+            IVariableTypeEnvironment typeEnv) {
+        super(projectionFiltrationInfo.getFilterPaths(), projectionFiltrationInfo.getFilterExpression(), context,
+                typeEnv);
     }
 
     public IColumnIterableFilterEvaluatorFactory build() throws AlgebricksException {
-        if (filterExpression == null || filterPaths.isEmpty()
-                || checkerVisitor.containsMultipleArrayPaths(filterPaths.values())) {
+        if (filterExpression == null || filterPaths.isEmpty()) {
             return NoOpColumnFilterEvaluatorFactory.INSTANCE;
         }
         IScalarEvaluatorFactory evalFactory = createEvaluator(filterExpression);
@@ -74,89 +49,9 @@
         return new ColumnIterableFilterEvaluatorFactory(evalFactory);
     }
 
-    private IScalarEvaluatorFactory createEvaluator(ILogicalExpression expression) throws AlgebricksException {
-        if (filterPaths.containsKey(expression)) {
-            return createValueAccessor(expression);
-        } else if (expression.getExpressionTag() == LogicalExpressionTag.CONSTANT) {
-            return createConstantAccessor(expression);
-        } else if (expression.getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL) {
-            return handleFunction(expression);
-        }
-        return null;
-    }
-
-    private IScalarEvaluatorFactory createValueAccessor(ILogicalExpression expression) {
+    @Override
+    protected IScalarEvaluatorFactory createValueAccessor(ILogicalExpression expression) {
         ARecordType path = filterPaths.get(expression);
         return new ColumnFilterValueAccessorEvaluatorFactory(path);
     }
-
-    private IScalarEvaluatorFactory createConstantAccessor(ILogicalExpression expression) throws AlgebricksException {
-        MetadataProvider metadataProvider = (MetadataProvider) context.getMetadataProvider();
-        ConstantExpression constExpr = (ConstantExpression) expression;
-        return metadataProvider.getDataFormat().getConstantEvalFactory(constExpr.getValue());
-    }
-
-    private IScalarEvaluatorFactory handleFunction(ILogicalExpression expr) throws AlgebricksException {
-        AbstractFunctionCallExpression funcExpr = (AbstractFunctionCallExpression) expr;
-        IScalarEvaluatorFactory[] args = handleArgs(funcExpr);
-        if (args == null) {
-            return null;
-        }
-
-        IFunctionDescriptor fd = resolveFunction(funcExpr);
-        return fd.createEvaluatorFactory(args);
-    }
-
-    private IScalarEvaluatorFactory[] handleArgs(AbstractFunctionCallExpression funcExpr) throws AlgebricksException {
-        List<Mutable<ILogicalExpression>> args = funcExpr.getArguments();
-        IScalarEvaluatorFactory[] argsEvalFactories = new IScalarEvaluatorFactory[args.size()];
-        for (int i = 0; i < args.size(); i++) {
-            ILogicalExpression expr = args.get(i).getValue();
-            IScalarEvaluatorFactory evalFactory = createEvaluator(expr);
-            if (evalFactory == null) {
-                return null;
-            }
-            argsEvalFactories[i] = evalFactory;
-        }
-        return argsEvalFactories;
-    }
-
-    private IFunctionDescriptor resolveFunction(AbstractFunctionCallExpression funcExpr) throws AlgebricksException {
-        MetadataProvider metadataProvider = (MetadataProvider) context.getMetadataProvider();
-        IFunctionManager functionManager = metadataProvider.getFunctionManager();
-        FunctionIdentifier fnId = funcExpr.getFunctionIdentifier();
-        SourceLocation sourceLocation = funcExpr.getSourceLocation();
-        IFunctionDescriptor fd = functionManager.lookupFunction(fnId, sourceLocation);
-        fd.setSourceLocation(sourceLocation);
-        IFunctionTypeInferer fnTypeInfer = functionManager.lookupFunctionTypeInferer(fnId);
-        if (fnTypeInfer != null) {
-            CompilerProperties compilerProps = ((IApplicationContext) context.getAppContext()).getCompilerProperties();
-            fnTypeInfer.infer(funcExpr, fd, typeEnv, compilerProps);
-        }
-        return fd;
-    }
-
-    public static boolean isPushable(FunctionIdentifier fid) {
-        return NORMALIZED_PUSHABLE_FUNCTIONS.contains(fid) || !isNestedFunction(fid) && !isTypeFunction(fid);
-    }
-
-    private static boolean isTypeFunction(FunctionIdentifier fid) {
-        return fid.getName().startsWith("is");
-    }
-
-    private static boolean isNestedFunction(FunctionIdentifier fid) {
-        return isObjectFunction(fid) || isArrayFunction(fid) || BuiltinFunctions.DEEP_EQUAL.equals(fid);
-    }
-
-    private static boolean isObjectFunction(FunctionIdentifier fid) {
-        String functionName = fid.getName();
-        return functionName.contains("object") || BuiltinFunctions.PAIRS.equals(fid);
-    }
-
-    private static boolean isArrayFunction(FunctionIdentifier fid) {
-        String functionName = fid.getName();
-        return functionName.startsWith("array") || functionName.startsWith("strict")
-                || BuiltinFunctions.GET_ITEM.equals(fid);
-    }
-
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/filter/ColumnRangeFilterBuilder.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/filter/ColumnRangeFilterBuilder.java
new file mode 100644
index 0000000..be05381
--- /dev/null
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/filter/ColumnRangeFilterBuilder.java
@@ -0,0 +1,189 @@
+/*
+ * 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.asterix.metadata.utils.filter;
+
+import static org.apache.asterix.metadata.utils.PushdownUtil.isCompare;
+import static org.apache.asterix.metadata.utils.PushdownUtil.isConstant;
+import static org.apache.hyracks.algebricks.core.algebra.functions.AlgebricksBuiltinFunctions.ComparisonKind;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.asterix.column.filter.NoOpColumnFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessorFactory;
+import org.apache.asterix.column.filter.range.accessor.ColumnRangeFilterValueAccessorFactory;
+import org.apache.asterix.column.filter.range.accessor.ConstantColumnRangeFilterValueAccessorFactory;
+import org.apache.asterix.column.filter.range.compartor.GEColumnFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.compartor.GTColumnFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.compartor.LEColumnFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.compartor.LTColumnFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.evaluator.ANDColumnFilterEvaluatorFactory;
+import org.apache.asterix.column.filter.range.evaluator.ORColumnFilterEvaluatorFactory;
+import org.apache.asterix.om.base.IAObject;
+import org.apache.asterix.om.constants.AsterixConstantValue;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.types.ARecordType;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.utils.NonTaggedFormatUtil;
+import org.apache.asterix.runtime.projection.ColumnDatasetProjectionFiltrationInfo;
+import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
+import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
+import org.apache.hyracks.algebricks.core.algebra.expressions.ConstantExpression;
+import org.apache.hyracks.algebricks.core.algebra.functions.AlgebricksBuiltinFunctions;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+
+public class ColumnRangeFilterBuilder {
+
+    private final Map<ILogicalExpression, ARecordType> filterPaths;
+    private final ILogicalExpression filterExpression;
+
+    public ColumnRangeFilterBuilder(ColumnDatasetProjectionFiltrationInfo projectionFiltrationInfo) {
+        this.filterPaths = projectionFiltrationInfo.getFilterPaths();
+        this.filterExpression = projectionFiltrationInfo.getRangeFilterExpression();
+    }
+
+    public IColumnRangeFilterEvaluatorFactory build() {
+        if (filterExpression == null || filterPaths.isEmpty()) {
+            return NoOpColumnFilterEvaluatorFactory.INSTANCE;
+        }
+        return createEvaluator(filterPaths, filterExpression);
+    }
+
+    private IColumnRangeFilterEvaluatorFactory createEvaluator(Map<ILogicalExpression, ARecordType> filterPaths,
+            ILogicalExpression filterExpression) {
+        AbstractFunctionCallExpression funcExpr = (AbstractFunctionCallExpression) filterExpression;
+
+        if (isCompare(funcExpr)) {
+            return createComparator(funcExpr.getFunctionIdentifier(), funcExpr.getArguments(), filterPaths);
+        }
+        return createEvaluatorsForArgs(funcExpr, filterPaths);
+    }
+
+    private IColumnRangeFilterEvaluatorFactory createComparator(FunctionIdentifier fid,
+            List<Mutable<ILogicalExpression>> arguments, Map<ILogicalExpression, ARecordType> filterPaths) {
+        ILogicalExpression left = arguments.get(0).getValue();
+        ILogicalExpression right = arguments.get(1).getValue();
+
+        if (isConstant(right)) {
+            ARecordType path = filterPaths.get(left);
+            IAObject constant = getConstant(right);
+            return createComparator(fid, path, constant, true);
+        } else {
+            ARecordType path = filterPaths.get(right);
+            IAObject constant = getConstant(left);
+            return createComparator(fid, path, constant, false);
+        }
+    }
+
+    private IColumnRangeFilterEvaluatorFactory createEvaluatorsForArgs(AbstractFunctionCallExpression funcExpr,
+            Map<ILogicalExpression, ARecordType> filterPaths) {
+        List<Mutable<ILogicalExpression>> args = funcExpr.getArguments();
+        FunctionIdentifier fid = funcExpr.getFunctionIdentifier();
+
+        //AND/OR have at least two arguments
+        IColumnRangeFilterEvaluatorFactory arg0 = createEvaluator(filterPaths, args.get(0).getValue());
+        IColumnRangeFilterEvaluatorFactory arg1 = createEvaluator(filterPaths, args.get(1).getValue());
+
+        IColumnRangeFilterEvaluatorFactory left = createEvaluator(fid, arg0, arg1);
+        for (int i = 2; i < args.size(); i++) {
+            IColumnRangeFilterEvaluatorFactory right = createEvaluator(filterPaths, args.get(i).getValue());
+            left = createEvaluator(fid, left, right);
+        }
+        return left;
+    }
+
+    private IColumnRangeFilterEvaluatorFactory createComparator(FunctionIdentifier fid, ARecordType path,
+            IAObject constant, boolean rightConstant) {
+        if (path == null) {
+            // skipped path
+            return NoOpColumnFilterEvaluatorFactory.INSTANCE;
+        }
+
+        ComparisonKind comparisonKind = getComparisonKind(fid, constant.getType().getTypeTag());
+        IColumnRangeFilterValueAccessorFactory constValue =
+                ConstantColumnRangeFilterValueAccessorFactory.createFactory(constant);
+        IColumnRangeFilterValueAccessorFactory min = new ColumnRangeFilterValueAccessorFactory(path, true);
+        IColumnRangeFilterValueAccessorFactory max = new ColumnRangeFilterValueAccessorFactory(path, false);
+
+        if (rightConstant) {
+            return createEvaluator(comparisonKind, min, constValue, max);
+        }
+        return createEvaluator(invert(comparisonKind), min, constValue, max);
+    }
+
+    private ComparisonKind getComparisonKind(FunctionIdentifier fid, ATypeTag typeTag) {
+        ComparisonKind comparisonKind = AlgebricksBuiltinFunctions.getComparisonType(fid);
+
+        if (!NonTaggedFormatUtil.isFixedSizedCollection(typeTag)) {
+            // For variable-length values, we include equal as their filters are not decisive.
+            if (comparisonKind == ComparisonKind.LT) {
+                return ComparisonKind.LE;
+            } else if (comparisonKind == ComparisonKind.GT) {
+                return ComparisonKind.GE;
+            }
+        }
+
+        return comparisonKind;
+    }
+
+    private static IColumnRangeFilterEvaluatorFactory createEvaluator(FunctionIdentifier fid,
+            IColumnRangeFilterEvaluatorFactory left, IColumnRangeFilterEvaluatorFactory right) {
+        if (BuiltinFunctions.AND.equals(fid)) {
+            return new ANDColumnFilterEvaluatorFactory(left, right);
+        }
+        return new ORColumnFilterEvaluatorFactory(left, right);
+    }
+
+    private static ComparisonKind invert(ComparisonKind comparisonKind) {
+        if (comparisonKind == ComparisonKind.LT) {
+            return ComparisonKind.GE;
+        } else if (comparisonKind == ComparisonKind.LE) {
+            return ComparisonKind.GT;
+        } else if (comparisonKind == ComparisonKind.GT) {
+            return ComparisonKind.LE;
+        }
+        //ComparisonKind.GE
+        return ComparisonKind.LT;
+    }
+
+    private static IColumnRangeFilterEvaluatorFactory createEvaluator(ComparisonKind comparisonKind,
+            IColumnRangeFilterValueAccessorFactory min, IColumnRangeFilterValueAccessorFactory constVal,
+            IColumnRangeFilterValueAccessorFactory max) {
+        if (comparisonKind == ComparisonKind.LT) {
+            return new GTColumnFilterEvaluatorFactory(constVal, min);
+        } else if (comparisonKind == ComparisonKind.LE) {
+            return new GEColumnFilterEvaluatorFactory(constVal, min);
+        } else if (comparisonKind == ComparisonKind.EQ) {
+            IColumnRangeFilterEvaluatorFactory minComp = new GEColumnFilterEvaluatorFactory(constVal, min);
+            IColumnRangeFilterEvaluatorFactory maxComp = new LEColumnFilterEvaluatorFactory(constVal, max);
+            return new ANDColumnFilterEvaluatorFactory(minComp, maxComp);
+        } else if (comparisonKind == ComparisonKind.GT) {
+            return new LTColumnFilterEvaluatorFactory(constVal, max);
+        }
+        //ComparisonKind.GE
+        return new LEColumnFilterEvaluatorFactory(constVal, max);
+    }
+
+    private static IAObject getConstant(ILogicalExpression expr) {
+        return ((AsterixConstantValue) ((ConstantExpression) expr).getValue()).getObject();
+    }
+
+}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/filter/FilterVariableTypeEnvironment.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/filter/FilterVariableTypeEnvironment.java
deleted file mode 100644
index 0743b1c..0000000
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/filter/FilterVariableTypeEnvironment.java
+++ /dev/null
@@ -1,56 +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.asterix.metadata.utils.filter;
-
-import java.util.List;
-
-import org.apache.asterix.om.types.BuiltinType;
-import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
-import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
-import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
-
-public class FilterVariableTypeEnvironment implements IVariableTypeEnvironment {
-    @Override
-    public Object getVarType(LogicalVariable var) throws AlgebricksException {
-        throw new IllegalAccessError("Should not be invoked");
-    }
-
-    @Override
-    public Object getVarType(LogicalVariable var, List<LogicalVariable> nonMissableVariables,
-            List<List<LogicalVariable>> correlatedMissableVariableLists, List<LogicalVariable> nonNullableVariables,
-            List<List<LogicalVariable>> correlatedNullableVariableLists) throws AlgebricksException {
-        throw new IllegalAccessError("Should not be invoked");
-    }
-
-    @Override
-    public void setVarType(LogicalVariable var, Object type) {
-        throw new IllegalAccessError("Should not be invoked");
-    }
-
-    @Override
-    public Object getType(ILogicalExpression expr) throws AlgebricksException {
-        return BuiltinType.ANY;
-    }
-
-    @Override
-    public boolean substituteProducedVariable(LogicalVariable v1, LogicalVariable v2) throws AlgebricksException {
-        throw new IllegalAccessError("Should not be invoked");
-    }
-}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/filter/NormalizedColumnFilterBuilder.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/filter/NormalizedColumnFilterBuilder.java
deleted file mode 100644
index 0994664..0000000
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/filter/NormalizedColumnFilterBuilder.java
+++ /dev/null
@@ -1,191 +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.asterix.metadata.utils.filter;
-
-import static org.apache.hyracks.algebricks.core.algebra.functions.AlgebricksBuiltinFunctions.ComparisonKind;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.asterix.column.filter.NoOpColumnFilterEvaluatorFactory;
-import org.apache.asterix.column.filter.normalized.IColumnFilterNormalizedValueAccessorFactory;
-import org.apache.asterix.column.filter.normalized.IColumnNormalizedFilterEvaluatorFactory;
-import org.apache.asterix.column.filter.normalized.accessor.ColumnFilterNormalizedValueAccessorFactory;
-import org.apache.asterix.column.filter.normalized.accessor.ConstantColumnFilterNormalizedValueAccessorFactory;
-import org.apache.asterix.column.filter.normalized.compartor.GEColumnFilterEvaluatorFactory;
-import org.apache.asterix.column.filter.normalized.compartor.GTColumnFilterEvaluatorFactory;
-import org.apache.asterix.column.filter.normalized.compartor.LEColumnFilterEvaluatorFactory;
-import org.apache.asterix.column.filter.normalized.compartor.LTColumnFilterEvaluatorFactory;
-import org.apache.asterix.column.filter.normalized.evaluator.ANDColumnFilterEvaluatorFactory;
-import org.apache.asterix.column.filter.normalized.evaluator.ORColumnFilterEvaluatorFactory;
-import org.apache.asterix.om.base.IAObject;
-import org.apache.asterix.om.constants.AsterixConstantValue;
-import org.apache.asterix.om.functions.BuiltinFunctions;
-import org.apache.asterix.om.types.ARecordType;
-import org.apache.asterix.runtime.projection.ColumnDatasetProjectionFiltrationInfo;
-import org.apache.commons.lang3.mutable.Mutable;
-import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
-import org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
-import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
-import org.apache.hyracks.algebricks.core.algebra.expressions.ConstantExpression;
-import org.apache.hyracks.algebricks.core.algebra.functions.AlgebricksBuiltinFunctions;
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
-
-public class NormalizedColumnFilterBuilder {
-    public static final Set<FunctionIdentifier> COMPARE_FUNCTIONS = getCompareFunctions();
-    public static final Set<FunctionIdentifier> NORMALIZED_PUSHABLE_FUNCTIONS = getNormalizedPushableFunctions();
-
-    private final Map<ILogicalExpression, ARecordType> filterPaths;
-    private final ILogicalExpression filterExpression;
-
-    public NormalizedColumnFilterBuilder(ColumnDatasetProjectionFiltrationInfo projectionFiltrationInfo) {
-        this.filterPaths = projectionFiltrationInfo.getFilterPaths();
-        this.filterExpression = projectionFiltrationInfo.getFilterExpression();
-    }
-
-    public IColumnNormalizedFilterEvaluatorFactory build() {
-        if (filterExpression == null || filterPaths.isEmpty()) {
-            return NoOpColumnFilterEvaluatorFactory.INSTANCE;
-        }
-        return createEvaluator(filterPaths, filterExpression);
-    }
-
-    private IColumnNormalizedFilterEvaluatorFactory createEvaluator(Map<ILogicalExpression, ARecordType> filterPaths,
-            ILogicalExpression filterExpression) {
-        AbstractFunctionCallExpression funcExpr = (AbstractFunctionCallExpression) filterExpression;
-        FunctionIdentifier fid = funcExpr.getFunctionIdentifier();
-
-        if (COMPARE_FUNCTIONS.contains(fid)) {
-            return createComparator(fid, funcExpr.getArguments(), filterPaths);
-        }
-        return createEvaluatorsForArgs(funcExpr, filterPaths);
-    }
-
-    private IColumnNormalizedFilterEvaluatorFactory createComparator(FunctionIdentifier fid,
-            List<Mutable<ILogicalExpression>> arguments, Map<ILogicalExpression, ARecordType> filterPaths) {
-        ILogicalExpression arg0 = arguments.get(0).getValue();
-        ILogicalExpression arg1 = arguments.get(1).getValue();
-
-        if (arg1.getExpressionTag() == LogicalExpressionTag.CONSTANT) {
-            ARecordType path = filterPaths.get(arg0);
-            IAObject constant = getConstant(arg1);
-            return createComparator(fid, path, constant, true);
-        } else {
-            ARecordType path = filterPaths.get(arg1);
-            IAObject constant = getConstant(arg0);
-            return createComparator(fid, path, constant, false);
-        }
-    }
-
-    private IColumnNormalizedFilterEvaluatorFactory createEvaluatorsForArgs(AbstractFunctionCallExpression funcExpr,
-            Map<ILogicalExpression, ARecordType> filterPaths) {
-        List<Mutable<ILogicalExpression>> args = funcExpr.getArguments();
-        FunctionIdentifier fid = funcExpr.getFunctionIdentifier();
-
-        //AND/OR have at least two arguments
-        IColumnNormalizedFilterEvaluatorFactory arg0 = createEvaluator(filterPaths, args.get(0).getValue());
-        IColumnNormalizedFilterEvaluatorFactory arg1 = createEvaluator(filterPaths, args.get(1).getValue());
-
-        IColumnNormalizedFilterEvaluatorFactory left = createEvaluator(fid, arg0, arg1);
-        for (int i = 2; i < args.size() && left != null; i++) {
-            IColumnNormalizedFilterEvaluatorFactory right = createEvaluator(filterPaths, args.get(i).getValue());
-            left = createEvaluator(fid, left, right);
-        }
-        return left;
-    }
-
-    private IColumnNormalizedFilterEvaluatorFactory createComparator(FunctionIdentifier fid, ARecordType path,
-            IAObject constant, boolean leftToRight) {
-        ComparisonKind comparisonKind = AlgebricksBuiltinFunctions.getComparisonType(fid);
-        if (path == null) {
-            // skipped path
-            return NoOpColumnFilterEvaluatorFactory.INSTANCE;
-        }
-
-        IColumnFilterNormalizedValueAccessorFactory constValue =
-                ConstantColumnFilterNormalizedValueAccessorFactory.createFactory(constant);
-        IColumnFilterNormalizedValueAccessorFactory min = new ColumnFilterNormalizedValueAccessorFactory(path, true);
-        IColumnFilterNormalizedValueAccessorFactory max = new ColumnFilterNormalizedValueAccessorFactory(path, false);
-
-        if (leftToRight) {
-            return createEvaluator(comparisonKind, min, constValue, max);
-        }
-        return createEvaluator(invert(comparisonKind), min, constValue, max);
-    }
-
-    private static IColumnNormalizedFilterEvaluatorFactory createEvaluator(FunctionIdentifier fid,
-            IColumnNormalizedFilterEvaluatorFactory left, IColumnNormalizedFilterEvaluatorFactory right) {
-        if (right == null) {
-            return null;
-        }
-        if (BuiltinFunctions.AND.equals(fid)) {
-            return new ANDColumnFilterEvaluatorFactory(left, right);
-        }
-        return new ORColumnFilterEvaluatorFactory(left, right);
-    }
-
-    private static ComparisonKind invert(ComparisonKind comparisonKind) {
-        if (comparisonKind == ComparisonKind.LT) {
-            return ComparisonKind.GE;
-        } else if (comparisonKind == ComparisonKind.LE) {
-            return ComparisonKind.GT;
-        } else if (comparisonKind == ComparisonKind.GT) {
-            return ComparisonKind.LE;
-        }
-        //ComparisonKind.GE
-        return ComparisonKind.LT;
-    }
-
-    private static IColumnNormalizedFilterEvaluatorFactory createEvaluator(ComparisonKind comparisonKind,
-            IColumnFilterNormalizedValueAccessorFactory min, IColumnFilterNormalizedValueAccessorFactory constVal,
-            IColumnFilterNormalizedValueAccessorFactory max) {
-        if (comparisonKind == ComparisonKind.LT) {
-            return new GTColumnFilterEvaluatorFactory(constVal, min);
-        } else if (comparisonKind == ComparisonKind.LE) {
-            return new GEColumnFilterEvaluatorFactory(constVal, min);
-        } else if (comparisonKind == ComparisonKind.EQ) {
-            IColumnNormalizedFilterEvaluatorFactory minComp = new GEColumnFilterEvaluatorFactory(constVal, min);
-            IColumnNormalizedFilterEvaluatorFactory maxComp = new LEColumnFilterEvaluatorFactory(constVal, max);
-            return new ANDColumnFilterEvaluatorFactory(minComp, maxComp);
-        } else if (comparisonKind == ComparisonKind.GT) {
-            return new LTColumnFilterEvaluatorFactory(constVal, max);
-        }
-        //ComparisonKind.GE
-        return new LEColumnFilterEvaluatorFactory(constVal, max);
-    }
-
-    private static IAObject getConstant(ILogicalExpression expr) {
-        return ((AsterixConstantValue) ((ConstantExpression) expr).getValue()).getObject();
-    }
-
-    private static Set<FunctionIdentifier> getCompareFunctions() {
-        return Set.of(AlgebricksBuiltinFunctions.LE, AlgebricksBuiltinFunctions.GE, AlgebricksBuiltinFunctions.LT,
-                AlgebricksBuiltinFunctions.GT, AlgebricksBuiltinFunctions.EQ);
-    }
-
-    private static Set<FunctionIdentifier> getNormalizedPushableFunctions() {
-        Set<FunctionIdentifier> pushableFunctions = new HashSet<>(COMPARE_FUNCTIONS);
-        pushableFunctions.add(AlgebricksBuiltinFunctions.AND);
-        pushableFunctions.add(AlgebricksBuiltinFunctions.OR);
-        return pushableFunctions;
-    }
-
-}