This is an automated email from the ASF dual-hosted git repository.

wyk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 8d9966a4a5 [ASTERIXDB-3324][COMP][RT] Stabilize columnar filters and 
projector
8d9966a4a5 is described below

commit 8d9966a4a5da00d91b081c58192416394247ecbb
Author: Wail Alkowaileet <[email protected]>
AuthorDate: Wed Dec 6 07:54:32 2023 -0800

    [ASTERIXDB-3324][COMP][RT] Stabilize columnar filters and projector
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    This patch includes multiple fixes described in ASTERIXDB-3324
    
    Change-Id: Id8d91a207abb619b8a6a996b4446ca6e06eaaa71
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17993
    Integration-Tests: Jenkins <[email protected]>
    Tested-by: Jenkins <[email protected]>
    Reviewed-by: Wail Alkowaileet <[email protected]>
    Reviewed-by: Ali Alsuliman <[email protected]>
    Contrib: Michael Blow <[email protected]>
---
 .../optimizer/rules/pushdown/PushdownContext.java  |  2 +-
 .../processor/AbstractFilterPushdownProcessor.java | 18 +++++++++-------
 .../processor/ColumnFilterPushdownProcessor.java   |  9 ++++++--
 .../ColumnRangeFilterPushdownProcessor.java        |  5 +++--
 .../ColumnValueAccessPushdownProcessor.java        |  5 ++++-
 .../ExternalDatasetFilterPushdownProcessor.java    |  5 +++--
 .../pushdown/schema/ExpectedSchemaBuilder.java     |  2 +-
 .../pushdown/schema/RootExpectedSchemaNode.java    |  9 ++++----
 .../ExpressionValueAccessPushdownVisitor.java      | 19 +++--------------
 .../pushdown/visitor/PushdownOperatorVisitor.java  | 16 ++++++++++++++-
 .../translator/LangExpressionToPlanTranslator.java |  2 ++
 .../ParquetPlainFixedLengthValuesReader.java       |  6 +++---
 .../column/filter/FilterAccessorProvider.java      |  8 ++++++--
 .../filter/NoOpColumnFilterEvaluatorFactory.java   |  5 ++---
 ...tory.java => ColumnFilterEvaluatorContext.java} | 21 ++++++++++++-------
 .../IColumnIterableFilterEvaluatorFactory.java     |  5 +----
 .../ColumnFilterValueAccessorEvaluatorFactory.java | 13 ++++--------
 .../ColumnIterableFilterEvaluatorFactory.java      | 14 +++++++++----
 ... => MissingColumnRangeFilterValueAccessor.java} |  6 +++---
 .../NoOpColumnRangeFilterValueAccessor.java        |  2 +-
 .../AbstractColumnFilterComparatorFactory.java     | 10 ++++++++-
 .../schema/visitor/PathExtractorVisitor.java       |  6 +++---
 .../column/operation/query/ColumnAssembler.java    |  4 ++++
 .../operation/query/QueryColumnMetadata.java       | 20 ++++++++----------
 .../query/QueryColumnWithMetaMetadata.java         | 21 ++++++++-----------
 .../reader/value/key/FloatKeyValueReader.java      |  2 +-
 .../asterix/metadata/utils/PushdownUtil.java       | 24 ++++++++++++++++++++++
 .../impls/btree/AbstractColumnBTreeLeafFrame.java  |  3 ++-
 28 files changed, 158 insertions(+), 104 deletions(-)

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/PushdownContext.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/PushdownContext.java
index 7d1e068245..51d25a4cc2 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/PushdownContext.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/PushdownContext.java
@@ -244,7 +244,7 @@ public class PushdownContext {
 
     private static Set<LogicalOperatorTag> getScopeOperators() {
         return EnumSet.of(LogicalOperatorTag.INNERJOIN, 
LogicalOperatorTag.LEFTOUTERJOIN, LogicalOperatorTag.GROUP,
-                LogicalOperatorTag.AGGREGATE, LogicalOperatorTag.WINDOW);
+                LogicalOperatorTag.AGGREGATE, LogicalOperatorTag.WINDOW, 
LogicalOperatorTag.UNIONALL);
     }
 
 }
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/AbstractFilterPushdownProcessor.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/AbstractFilterPushdownProcessor.java
index 9a88036db6..02870c5508 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/AbstractFilterPushdownProcessor.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/AbstractFilterPushdownProcessor.java
@@ -84,9 +84,11 @@ abstract class AbstractFilterPushdownProcessor extends 
AbstractPushdownProcessor
     /**
      * Prepare to pushdown a SELECT expression in the use-descriptor
      *
-     * @param useDescriptor contains the SELECT operator and its expression
+     * @param useDescriptor  contains the operator and its expression
+     * @param scanDescriptor contains the scan definition where to push the 
filter expression
      */
-    protected abstract void preparePushdown(UseDescriptor useDescriptor) 
throws AlgebricksException;
+    protected abstract void preparePushdown(UseDescriptor useDescriptor, 
ScanDefineDescriptor scanDescriptor)
+            throws AlgebricksException;
 
     /**
      * Is an expression pushable
@@ -159,23 +161,25 @@ abstract class AbstractFilterPushdownProcessor extends 
AbstractPushdownProcessor
 
     private boolean inlineAndPushdownFilter(UseDescriptor useDescriptor, 
ScanDefineDescriptor scanDefineDescriptor)
             throws AlgebricksException {
-        ILogicalOperator selectOp = useDescriptor.getOperator();
-        if (visitedOperators.contains(selectOp)) {
+        ILogicalOperator op = useDescriptor.getOperator();
+        if (visitedOperators.contains(op)) {
             // Skip and follow through to find any other selects that can be 
pushed down
             return false;
         }
         boolean changed = false;
-        // Get a clone of the SELECT expression and inline it
+
+        // Get a clone of the operator's expression and inline it
         ILogicalExpression inlinedExpr = 
pushdownContext.cloneAndInlineExpression(useDescriptor, context);
+
         // Prepare for pushdown
-        preparePushdown(useDescriptor);
+        preparePushdown(useDescriptor, scanDefineDescriptor);
         if (pushdownFilterExpression(inlinedExpr)) {
             putFilterInformation(scanDefineDescriptor, inlinedExpr);
             changed = true;
         }
 
         // Do not push down a select twice.
-        visitedOperators.add(selectOp);
+        visitedOperators.add(op);
         return changed;
     }
 
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 417d6cafe5..d4db751ae6 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,6 +30,7 @@ import java.util.Map;
 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.PushdownUtil;
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.optimizer.rules.pushdown.PushdownContext;
@@ -45,6 +46,7 @@ import org.apache.commons.lang3.mutable.Mutable;
 import org.apache.commons.lang3.mutable.MutableObject;
 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.ILogicalOperator;
 import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
 import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag;
 import 
org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
@@ -92,8 +94,11 @@ public class ColumnFilterPushdownProcessor extends 
AbstractFilterPushdownProcess
     }
 
     @Override
-    protected void preparePushdown(UseDescriptor useDescriptor) throws 
AlgebricksException {
-        
exprToNodeVisitor.setTypeEnv(useDescriptor.getOperator().computeOutputTypeEnvironment(context));
+    protected void preparePushdown(UseDescriptor useDescriptor, 
ScanDefineDescriptor scanDescriptor)
+            throws AlgebricksException {
+        ILogicalOperator useOp = useDescriptor.getOperator();
+        ILogicalOperator scanOp = scanDescriptor.getOperator();
+        exprToNodeVisitor.setTypeEnv(PushdownUtil.getTypeEnv(useOp, scanOp, 
context));
         paths.clear();
     }
 
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 a9dcfc126c..b56c550656 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
@@ -71,8 +71,9 @@ public class ColumnRangeFilterPushdownProcessor extends 
ColumnFilterPushdownProc
     }
 
     @Override
-    protected void preparePushdown(UseDescriptor useDescriptor) throws 
AlgebricksException {
-        super.preparePushdown(useDescriptor);
+    protected void preparePushdown(UseDescriptor useDescriptor, 
ScanDefineDescriptor scanDescriptor)
+            throws AlgebricksException {
+        super.preparePushdown(useDescriptor, scanDescriptor);
         sourceInformationMap.clear();
     }
 
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/ColumnValueAccessPushdownProcessor.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/ColumnValueAccessPushdownProcessor.java
index 9378cff6e8..7db3dd24f3 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/ColumnValueAccessPushdownProcessor.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/ColumnValueAccessPushdownProcessor.java
@@ -21,6 +21,7 @@ package org.apache.asterix.optimizer.rules.pushdown.processor;
 import java.util.List;
 
 import org.apache.asterix.metadata.utils.DatasetUtil;
+import org.apache.asterix.metadata.utils.PushdownUtil;
 import org.apache.asterix.optimizer.rules.pushdown.PushdownContext;
 import org.apache.asterix.optimizer.rules.pushdown.descriptor.DefineDescriptor;
 import 
org.apache.asterix.optimizer.rules.pushdown.descriptor.ScanDefineDescriptor;
@@ -29,6 +30,7 @@ import 
org.apache.asterix.optimizer.rules.pushdown.schema.ExpectedSchemaBuilder;
 import 
org.apache.asterix.optimizer.rules.pushdown.schema.RootExpectedSchemaNode;
 import 
org.apache.asterix.optimizer.rules.pushdown.visitor.ExpressionValueAccessPushdownVisitor;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
 import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
 import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
 import 
org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
@@ -81,7 +83,8 @@ public class ColumnValueAccessPushdownProcessor extends 
AbstractPushdownProcesso
         List<UseDescriptor> useDescriptors = 
pushdownContext.getUseDescriptors(defineDescriptor);
         for (UseDescriptor useDescriptor : useDescriptors) {
             LogicalVariable producedVariable = 
useDescriptor.getProducedVariable();
-            IVariableTypeEnvironment typeEnv = 
useDescriptor.getOperator().computeOutputTypeEnvironment(context);
+            ILogicalOperator op = useDescriptor.getOperator();
+            IVariableTypeEnvironment typeEnv = PushdownUtil.getTypeEnv(op, 
context);
             expressionVisitor.transform(useDescriptor.getExpression(), 
producedVariable, typeEnv);
         }
 
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/ExternalDatasetFilterPushdownProcessor.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/ExternalDatasetFilterPushdownProcessor.java
index bb5c8531e4..96b252a954 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/ExternalDatasetFilterPushdownProcessor.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/processor/ExternalDatasetFilterPushdownProcessor.java
@@ -61,8 +61,9 @@ public class ExternalDatasetFilterPushdownProcessor extends 
ColumnFilterPushdown
     }
 
     @Override
-    protected void preparePushdown(UseDescriptor useDescriptor) throws 
AlgebricksException {
-        super.preparePushdown(useDescriptor);
+    protected void preparePushdown(UseDescriptor useDescriptor, 
ScanDefineDescriptor scanDescriptor)
+            throws AlgebricksException {
+        super.preparePushdown(useDescriptor, scanDescriptor);
     }
 
     @Override
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/schema/ExpectedSchemaBuilder.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/schema/ExpectedSchemaBuilder.java
index 71be18e5fc..6b215084f0 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/schema/ExpectedSchemaBuilder.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/schema/ExpectedSchemaBuilder.java
@@ -80,7 +80,7 @@ public class ExpectedSchemaBuilder {
         AbstractComplexExpectedSchemaNode parent = node.getParent();
         if (parent == null) {
             //It is a root node. Request the entire record
-            varToNode.put(variable, 
RootExpectedSchemaNode.ALL_FIELDS_ROOT_NODE);
+            varToNode.put(variable, 
RootExpectedSchemaNode.ALL_FIELDS_ROOT_IRREPLACEABLE_NODE);
         } else {
             // If it is a nested node, replace it to a LEAF node
             AnyExpectedSchemaNode leafNode = (AnyExpectedSchemaNode) 
node.replaceIfNeeded(ExpectedSchemaNodeType.ANY,
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/schema/RootExpectedSchemaNode.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/schema/RootExpectedSchemaNode.java
index 1a978f36b4..189505b93a 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/schema/RootExpectedSchemaNode.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/schema/RootExpectedSchemaNode.java
@@ -27,7 +27,10 @@ public class RootExpectedSchemaNode extends 
ObjectExpectedSchemaNode {
     private static final int ALL_FIELDS_ROOT = 1;
     //Root with custom fields
     private static final int CLIPPED_ROOT = 2;
+    private static final int ALL_FIELDS_ROOT_IRREPLACEABLE = 3;
     public static final RootExpectedSchemaNode ALL_FIELDS_ROOT_NODE = new 
RootExpectedSchemaNode(ALL_FIELDS_ROOT);
+    public static final RootExpectedSchemaNode 
ALL_FIELDS_ROOT_IRREPLACEABLE_NODE =
+            new RootExpectedSchemaNode(ALL_FIELDS_ROOT_IRREPLACEABLE);
     public static final RootExpectedSchemaNode EMPTY_ROOT_NODE = new 
RootExpectedSchemaNode(EMPTY_ROOT);
 
     private final int rootType;
@@ -41,10 +44,6 @@ public class RootExpectedSchemaNode extends 
ObjectExpectedSchemaNode {
         this.rootType = rootType;
     }
 
-    public int getRootType() {
-        return rootType;
-    }
-
     @Override
     public AbstractComplexExpectedSchemaNode 
replaceIfNeeded(ExpectedSchemaNodeType expectedNodeType,
             SourceLocation sourceLocation, String functionName) {
@@ -65,6 +64,6 @@ public class RootExpectedSchemaNode extends 
ObjectExpectedSchemaNode {
     }
 
     public boolean isAllFields() {
-        return rootType == ALL_FIELDS_ROOT;
+        return rootType == ALL_FIELDS_ROOT || rootType == 
ALL_FIELDS_ROOT_IRREPLACEABLE;
     }
 }
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/ExpressionValueAccessPushdownVisitor.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/ExpressionValueAccessPushdownVisitor.java
index 45dfcfffad..a56f834991 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/ExpressionValueAccessPushdownVisitor.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/ExpressionValueAccessPushdownVisitor.java
@@ -41,21 +41,8 @@ public class ExpressionValueAccessPushdownVisitor {
         this.builder = builder;
     }
 
-    public boolean transform(ILogicalExpression expression, LogicalVariable 
producedVariable,
-            IVariableTypeEnvironment typeEnv) throws AlgebricksException {
-        return pushValueAccessExpression(expression, producedVariable, 
typeEnv);
-    }
-
-    private boolean pushValueAccessExpression(Mutable<ILogicalExpression> 
exprRef, LogicalVariable producedVar,
-            IVariableTypeEnvironment typeEnv) throws AlgebricksException {
-        return pushValueAccessExpression(exprRef.getValue(), producedVar, 
typeEnv);
-    }
-
-    /**
-     * Pushdown field access expressions and array access expressions down
-     */
-    private boolean pushValueAccessExpression(ILogicalExpression expr, 
LogicalVariable producedVar,
-            IVariableTypeEnvironment typeEnv) throws AlgebricksException {
+    public boolean transform(ILogicalExpression expr, LogicalVariable 
producedVar, IVariableTypeEnvironment typeEnv)
+            throws AlgebricksException {
         if (skipPushdown(expr)) {
             return false;
         }
@@ -124,7 +111,7 @@ public class ExpressionValueAccessPushdownVisitor {
              * We need to set the produced variable as null here as the 
produced variable will not correspond to the
              * nested expression.
              */
-            changed |= pushValueAccessExpression(exprRef, producedVar, 
typeEnv);
+            changed |= transform(exprRef.getValue(), null, typeEnv);
         }
         return changed;
     }
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/PushdownOperatorVisitor.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/PushdownOperatorVisitor.java
index b00f8a1e97..28309aa062 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/PushdownOperatorVisitor.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/PushdownOperatorVisitor.java
@@ -43,6 +43,7 @@ import 
org.apache.asterix.optimizer.rules.pushdown.descriptor.ScanDefineDescript
 import 
org.apache.asterix.optimizer.rules.pushdown.schema.RootExpectedSchemaNode;
 import org.apache.commons.lang3.mutable.Mutable;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.common.utils.Triple;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalPlan;
@@ -51,6 +52,7 @@ import 
org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
 import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag;
 import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
 import 
org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
+import 
org.apache.hyracks.algebricks.core.algebra.expressions.VariableReferenceExpression;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import 
org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractScanOperator;
 import 
org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractUnnestMapOperator;
@@ -127,7 +129,18 @@ public class PushdownOperatorVisitor implements 
ILogicalOperatorVisitor<Void, Vo
         // Enter scope for (new stage) for operators like GROUP and JOIN
         pushdownContext.enterScope(op);
         defUseComputer.init(op, producedVariables);
+
         op.acceptExpressionTransform(defUseComputer);
+        if (op.getOperatorTag() == LogicalOperatorTag.UNIONALL) {
+            // UnionAll is a special case
+            UnionAllOperator unionOp = (UnionAllOperator) op;
+            for (Triple<LogicalVariable, LogicalVariable, LogicalVariable> 
vars : unionOp.getVariableMappings()) {
+                VariableReferenceExpression left = new 
VariableReferenceExpression(vars.first);
+                pushdownContext.use(op, left, -1, null);
+                VariableReferenceExpression right = new 
VariableReferenceExpression(vars.second);
+                pushdownContext.use(op, right, -1, null);
+            }
+        }
     }
 
     /*
@@ -212,7 +225,8 @@ public class PushdownOperatorVisitor implements 
ILogicalOperatorVisitor<Void, Vo
      * 2- return the actual DatasetDataSource
      */
     private DatasetDataSource getDatasetDataSourceIfApplicable(DataSource 
dataSource) throws AlgebricksException {
-        if (dataSource == null || dataSource.getDatasourceType() == 
DataSource.Type.SAMPLE) {
+        if (dataSource == null || dataSource.getDatasourceType() == 
DataSource.Type.SAMPLE
+                || !(dataSource instanceof DatasetDataSource)) {
             return null;
         }
 
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
index 68cb2850a0..08561c0dc8 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
@@ -2198,6 +2198,8 @@ abstract class LangExpressionToPlanTranslator
         NestedTupleSourceOperator ntsOp = new NestedTupleSourceOperator(new 
MutableObject<>(subplanOp));
         ntsOp.setSourceLocation(sourceLoc);
         SelectOperator select = new SelectOperator(selectExpr);
+        // Disable pushdowns
+        
select.getAnnotations().put(OperatorAnnotations.DISALLOW_FILTER_PUSHDOWN_TO_SCAN,
 Boolean.TRUE);
         // The select operator cannot be moved up and down, otherwise it will 
cause
         // typing issues (ASTERIXDB-1203).
         OperatorPropertiesUtil.markMovable(select, false);
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/decoder/ParquetPlainFixedLengthValuesReader.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/decoder/ParquetPlainFixedLengthValuesReader.java
index 417043e2d8..28e0033e7b 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/decoder/ParquetPlainFixedLengthValuesReader.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/decoder/ParquetPlainFixedLengthValuesReader.java
@@ -54,7 +54,7 @@ public class ParquetPlainFixedLengthValuesReader extends 
AbstractParquetValuesRe
         try {
             in.skipBytes(valueLength);
         } catch (IOException e) {
-            throw new ParquetDecodingException("could not skip double", e);
+            throw new ParquetDecodingException("could not skip " + valueLength 
+ " bytes", e);
         }
     }
 
@@ -63,7 +63,7 @@ public class ParquetPlainFixedLengthValuesReader extends 
AbstractParquetValuesRe
         try {
             return in.readLong();
         } catch (IOException e) {
-            throw new ParquetDecodingException("could not read double", e);
+            throw new ParquetDecodingException("could not read long", e);
         }
     }
 
@@ -72,7 +72,7 @@ public class ParquetPlainFixedLengthValuesReader extends 
AbstractParquetValuesRe
         try {
             return in.readFloat();
         } catch (IOException e) {
-            throw new ParquetDecodingException("could not read double", e);
+            throw new ParquetDecodingException("could not read float", e);
         }
     }
 
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 12c0078594..af64325f60 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
@@ -32,6 +32,7 @@ import 
org.apache.asterix.column.filter.iterable.accessor.MissingEvaluator;
 import 
org.apache.asterix.column.filter.iterable.accessor.UnionColumnFilterValueAccessorEvaluator;
 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.MissingColumnRangeFilterValueAccessor;
 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;
@@ -48,7 +49,6 @@ import 
org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
 public class FilterAccessorProvider {
-    public static final String FILTER_ACCESSOR_PROVIDER_KEY = 
"filter-accessor-provider";
     private final ObjectSchemaNode root;
     private final ObjectSchemaNode metaRoot;
     private final SchemaClipperVisitor clipperVisitor;
@@ -88,9 +88,13 @@ public class FilterAccessorProvider {
             cachedNodes.put(path, node);
         }
 
+        if (node.isPrimaryKey()) {
+            return NoOpColumnRangeFilterValueAccessor.INSTANCE;
+        }
+
         ATypeTag typeTag = node.getTypeTag();
         if (typeTag == ATypeTag.MISSING) {
-            return NoOpColumnRangeFilterValueAccessor.INSTANCE;
+            return MissingColumnRangeFilterValueAccessor.INSTANCE;
         }
         IColumnRangeFilterValueAccessor accessor =
                 new ColumnRangeFilterValueAccessor(node.getColumnIndex(), 
typeTag, min);
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 4c649a2909..5891311da7 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
@@ -18,10 +18,10 @@
  */
 package org.apache.asterix.column.filter;
 
+import org.apache.asterix.column.filter.iterable.ColumnFilterEvaluatorContext;
 import 
org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluator;
 import 
org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluatorFactory;
 import 
org.apache.asterix.column.filter.range.IColumnRangeFilterEvaluatorFactory;
-import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
 /**
@@ -41,8 +41,7 @@ public class NoOpColumnFilterEvaluatorFactory
     }
 
     @Override
-    public IColumnIterableFilterEvaluator create(FilterAccessorProvider 
filterAccessorProvider,
-            IEvaluatorContext context) throws HyracksDataException {
+    public IColumnIterableFilterEvaluator create(ColumnFilterEvaluatorContext 
context) throws HyracksDataException {
         return TrueColumnFilterEvaluator.INSTANCE;
     }
 
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/IColumnIterableFilterEvaluatorFactory.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/ColumnFilterEvaluatorContext.java
similarity index 60%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/IColumnIterableFilterEvaluatorFactory.java
copy to 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/ColumnFilterEvaluatorContext.java
index 99df077e2b..b16eb68553 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/IColumnIterableFilterEvaluatorFactory.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/ColumnFilterEvaluatorContext.java
@@ -18,13 +18,20 @@
  */
 package org.apache.asterix.column.filter.iterable;
 
-import java.io.Serializable;
-
 import org.apache.asterix.column.filter.FilterAccessorProvider;
-import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.algebricks.runtime.evaluators.EvaluatorContext;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+
+public class ColumnFilterEvaluatorContext extends EvaluatorContext {
+    private final FilterAccessorProvider filterAccessorProvider;
+
+    public ColumnFilterEvaluatorContext(IHyracksTaskContext taskContext,
+            FilterAccessorProvider filterAccessorProvider) {
+        super(taskContext);
+        this.filterAccessorProvider = filterAccessorProvider;
+    }
 
-public interface IColumnIterableFilterEvaluatorFactory extends Serializable {
-    IColumnIterableFilterEvaluator create(FilterAccessorProvider 
filterAccessorProvider, IEvaluatorContext context)
-            throws HyracksDataException;
+    public FilterAccessorProvider getFilterAccessorProvider() {
+        return filterAccessorProvider;
+    }
 }
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/IColumnIterableFilterEvaluatorFactory.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/IColumnIterableFilterEvaluatorFactory.java
index 99df077e2b..969062214b 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/IColumnIterableFilterEvaluatorFactory.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/IColumnIterableFilterEvaluatorFactory.java
@@ -20,11 +20,8 @@ package org.apache.asterix.column.filter.iterable;
 
 import java.io.Serializable;
 
-import org.apache.asterix.column.filter.FilterAccessorProvider;
-import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
 public interface IColumnIterableFilterEvaluatorFactory extends Serializable {
-    IColumnIterableFilterEvaluator create(FilterAccessorProvider 
filterAccessorProvider, IEvaluatorContext context)
-            throws HyracksDataException;
+    IColumnIterableFilterEvaluator create(ColumnFilterEvaluatorContext 
context) throws HyracksDataException;
 }
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/accessor/ColumnFilterValueAccessorEvaluatorFactory.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/accessor/ColumnFilterValueAccessorEvaluatorFactory.java
index ce26d6ba75..28623d78b4 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/accessor/ColumnFilterValueAccessorEvaluatorFactory.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/accessor/ColumnFilterValueAccessorEvaluatorFactory.java
@@ -19,13 +19,12 @@
 package org.apache.asterix.column.filter.iterable.accessor;
 
 import org.apache.asterix.column.filter.FilterAccessorProvider;
+import org.apache.asterix.column.filter.iterable.ColumnFilterEvaluatorContext;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
-import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.dataflow.common.utils.TaskUtil;
 
 public class ColumnFilterValueAccessorEvaluatorFactory implements 
IScalarEvaluatorFactory {
     private static final long serialVersionUID = -7871899093673316190L;
@@ -37,12 +36,8 @@ public class ColumnFilterValueAccessorEvaluatorFactory 
implements IScalarEvaluat
 
     @Override
     public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) 
throws HyracksDataException {
-        IHyracksTaskContext taskContext = ctx.getTaskContext();
-        FilterAccessorProvider provider =
-                
TaskUtil.get(FilterAccessorProvider.FILTER_ACCESSOR_PROVIDER_KEY, taskContext);
-        if (provider == null) {
-            throw new IllegalStateException("FILTER_ACCESSOR_PROVIDER_KEY is 
not set");
-        }
-        return provider.createColumnAccessEvaluator(path);
+        ColumnFilterEvaluatorContext columnEvalCtx = 
(ColumnFilterEvaluatorContext) ctx;
+        FilterAccessorProvider filterAccessorProvider = 
columnEvalCtx.getFilterAccessorProvider();
+        return filterAccessorProvider.createColumnAccessEvaluator(path);
     }
 }
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/evaluator/ColumnIterableFilterEvaluatorFactory.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/evaluator/ColumnIterableFilterEvaluatorFactory.java
index 742511b9f0..44441ddb86 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/evaluator/ColumnIterableFilterEvaluatorFactory.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/evaluator/ColumnIterableFilterEvaluatorFactory.java
@@ -21,10 +21,10 @@ package org.apache.asterix.column.filter.iterable.evaluator;
 import java.util.List;
 
 import org.apache.asterix.column.filter.FilterAccessorProvider;
+import org.apache.asterix.column.filter.iterable.ColumnFilterEvaluatorContext;
 import 
org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluator;
 import 
org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluatorFactory;
 import org.apache.asterix.column.values.IColumnValuesReader;
-import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -38,10 +38,16 @@ public class ColumnIterableFilterEvaluatorFactory 
implements IColumnIterableFilt
     }
 
     @Override
-    public IColumnIterableFilterEvaluator create(FilterAccessorProvider 
filterAccessorProvider,
-            IEvaluatorContext context) throws HyracksDataException {
-        List<IColumnValuesReader> readers = 
filterAccessorProvider.getFilterColumnReaders();
+    public IColumnIterableFilterEvaluator create(ColumnFilterEvaluatorContext 
context) throws HyracksDataException {
         IScalarEvaluator evaluator = 
evaluatorFactory.createScalarEvaluator(context);
+        FilterAccessorProvider filterAccessorProvider = 
context.getFilterAccessorProvider();
+        // Readers are populated by evaluatorFactory.createScalarEvaluator()
+        List<IColumnValuesReader> readers = 
filterAccessorProvider.getFilterColumnReaders();
+
+        if (readers.isEmpty()) {
+            throw new NullPointerException("Readers are empty");
+        }
+
         if (readers.stream().anyMatch(IColumnValuesReader::isRepeated)) {
             return new ColumnarRepeatedIterableFilterEvaluator(evaluator, 
readers);
         }
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/NoOpColumnRangeFilterValueAccessor.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/MissingColumnRangeFilterValueAccessor.java
similarity index 86%
copy from 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/NoOpColumnRangeFilterValueAccessor.java
copy to 
asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/MissingColumnRangeFilterValueAccessor.java
index 5d538c7031..5a0c7ffada 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/NoOpColumnRangeFilterValueAccessor.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/MissingColumnRangeFilterValueAccessor.java
@@ -21,10 +21,10 @@ package org.apache.asterix.column.filter.range.accessor;
 import org.apache.asterix.column.filter.range.IColumnRangeFilterValueAccessor;
 import org.apache.asterix.om.types.ATypeTag;
 
-public class NoOpColumnRangeFilterValueAccessor implements 
IColumnRangeFilterValueAccessor {
-    public static final IColumnRangeFilterValueAccessor INSTANCE = new 
NoOpColumnRangeFilterValueAccessor();
+public class MissingColumnRangeFilterValueAccessor implements 
IColumnRangeFilterValueAccessor {
+    public static final IColumnRangeFilterValueAccessor INSTANCE = new 
MissingColumnRangeFilterValueAccessor();
 
-    private NoOpColumnRangeFilterValueAccessor() {
+    private MissingColumnRangeFilterValueAccessor() {
     }
 
     @Override
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/NoOpColumnRangeFilterValueAccessor.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/NoOpColumnRangeFilterValueAccessor.java
index 5d538c7031..2718c2d918 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/NoOpColumnRangeFilterValueAccessor.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/accessor/NoOpColumnRangeFilterValueAccessor.java
@@ -34,6 +34,6 @@ public class NoOpColumnRangeFilterValueAccessor implements 
IColumnRangeFilterVal
 
     @Override
     public ATypeTag getTypeTag() {
-        return ATypeTag.MISSING;
+        return ATypeTag.ANY;
     }
 }
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/compartor/AbstractColumnFilterComparatorFactory.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/compartor/AbstractColumnFilterComparatorFactory.java
index 0374a4d433..fa9abdae1c 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/compartor/AbstractColumnFilterComparatorFactory.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/range/compartor/AbstractColumnFilterComparatorFactory.java
@@ -25,6 +25,7 @@ import 
org.apache.asterix.column.filter.TrueColumnFilterEvaluator;
 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.column.filter.range.accessor.NoOpColumnRangeFilterValueAccessor;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -48,7 +49,8 @@ abstract class AbstractColumnFilterComparatorFactory 
implements IColumnRangeFilt
 
         ATypeTag leftTypeTag = leftAccessor.getTypeTag();
         ATypeTag rightTypeTag = rightAccessor.getTypeTag();
-        if (leftTypeTag != rightTypeTag && 
ATypeHierarchy.isCompatible(leftTypeTag, rightTypeTag)) {
+        if (isNoOp(leftAccessor, rightAccessor)
+                || leftTypeTag != rightTypeTag && 
ATypeHierarchy.isCompatible(leftTypeTag, rightTypeTag)) {
             // Cannot compare comparable values with different types. Bail out.
             return TrueColumnFilterEvaluator.INSTANCE;
         } else if (cannotCompare(leftTypeTag, rightTypeTag)) {
@@ -57,6 +59,12 @@ abstract class AbstractColumnFilterComparatorFactory 
implements IColumnRangeFilt
         return createComparator(leftAccessor, rightAccessor);
     }
 
+    private boolean isNoOp(IColumnRangeFilterValueAccessor leftAccessor,
+            IColumnRangeFilterValueAccessor rightAccessor) {
+        return leftAccessor == NoOpColumnRangeFilterValueAccessor.INSTANCE
+                || rightAccessor == 
NoOpColumnRangeFilterValueAccessor.INSTANCE;
+    }
+
     private boolean cannotCompare(ATypeTag leftTypeTag, ATypeTag rightTypeTag) 
{
         return rightTypeTag == ATypeTag.MISSING || leftTypeTag != rightTypeTag;
     }
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/visitor/PathExtractorVisitor.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/visitor/PathExtractorVisitor.java
index efff918769..1b63361b94 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/visitor/PathExtractorVisitor.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/metadata/schema/visitor/PathExtractorVisitor.java
@@ -113,7 +113,6 @@ public class PathExtractorVisitor implements 
ISchemaNodeVisitor<AbstractSchemaNo
 
     @Override
     public AbstractSchemaNode visit(PrimitiveSchemaNode primitiveNode, Void 
arg) throws HyracksDataException {
-        //Missing column index is -1
         return primitiveNode;
     }
 
@@ -126,8 +125,9 @@ public class PathExtractorVisitor implements 
ISchemaNodeVisitor<AbstractSchemaNo
     private IColumnValuesReader createReader(PrimitiveSchemaNode 
primitiveNode, List<IColumnValuesReader> readers) {
         IColumnValuesReader reader;
         if (delimiters.isEmpty()) {
-            reader = 
readerFactory.createValueReader(primitiveNode.getTypeTag(), 
primitiveNode.getColumnIndex(), level,
-                    primitiveNode.isPrimaryKey());
+            int nodeLevel = primitiveNode.isPrimaryKey() ? 1 : level;
+            reader = 
readerFactory.createValueReader(primitiveNode.getTypeTag(), 
primitiveNode.getColumnIndex(),
+                    nodeLevel, primitiveNode.isPrimaryKey());
         } else {
             // array
             reader = 
readerFactory.createValueReader(primitiveNode.getTypeTag(), 
primitiveNode.getColumnIndex(), level,
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/ColumnAssembler.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/ColumnAssembler.java
index f5a327deee..835bb50f63 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/ColumnAssembler.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/ColumnAssembler.java
@@ -110,6 +110,10 @@ public final class ColumnAssembler {
     }
 
     public int skip(int count) throws HyracksDataException {
+        if (numberOfTuples == 0) {
+            // Avoid advancing tupleIndex and numberOfSkips if a mega leaf 
node is filtered out
+            return 0;
+        }
         numberOfSkips += count;
         tupleIndex += count;
         for (int i = 0; i < assemblers.length; i++) {
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 e32460978c..d50af3808c 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
@@ -33,6 +33,7 @@ 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.iterable.ColumnFilterEvaluatorContext;
 import 
org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluator;
 import 
org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluatorFactory;
 import 
org.apache.asterix.column.filter.range.IColumnRangeFilterEvaluatorFactory;
@@ -48,14 +49,11 @@ import 
org.apache.asterix.column.values.IColumnValuesReaderFactory;
 import org.apache.asterix.column.values.reader.PrimitiveColumnValuesReader;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.runtime.projection.FunctionCallInformation;
-import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
-import org.apache.hyracks.algebricks.runtime.evaluators.EvaluatorContext;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.IWarningCollector;
 import org.apache.hyracks.data.std.api.IValueReference;
 import org.apache.hyracks.data.std.primitive.IntegerPointable;
-import org.apache.hyracks.dataflow.common.utils.TaskUtil;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.api.AbstractColumnTupleReader;
 import org.apache.hyracks.util.LogRedactionUtil;
 import org.apache.logging.log4j.LogManager;
@@ -207,20 +205,18 @@ public class QueryColumnMetadata extends 
AbstractColumnImmutableReadMetadata {
         List<IColumnRangeFilterValueAccessor> filterValueAccessors = 
Collections.emptyList();
         String jobId = null;
         if (context != null) {
-            FilterAccessorProvider filterAccessorProvider =
+            FilterAccessorProvider accessorProvider =
                     new FilterAccessorProvider(root, clipperVisitor, 
readerFactory, valueGetterFactory);
-            TaskUtil.put(FilterAccessorProvider.FILTER_ACCESSOR_PROVIDER_KEY, 
filterAccessorProvider, context);
             // Min/Max filters in page0
-            normalizedFilterEvaluator = 
normalizedEvaluatorFactory.create(filterAccessorProvider);
-            filterValueAccessors = filterAccessorProvider.getFilterAccessors();
-
+            normalizedFilterEvaluator = 
normalizedEvaluatorFactory.create(accessorProvider);
+            filterValueAccessors = accessorProvider.getFilterAccessors();
             // Filter columns (columns appeared in WHERE clause)
-            IEvaluatorContext evaluatorContext = new EvaluatorContext(context);
+            ColumnFilterEvaluatorContext evaluatorContext = new 
ColumnFilterEvaluatorContext(context, accessorProvider);
             // ignore atomic (or flat) types information
             clipperVisitor.setIgnoreFlatType(true);
-            filterAccessorProvider.reset();
-            columnFilterEvaluator = 
columnFilterEvaluatorFactory.create(filterAccessorProvider, evaluatorContext);
-            filterColumnReaders = 
filterAccessorProvider.getFilterColumnReaders();
+            accessorProvider.reset();
+            columnFilterEvaluator = 
columnFilterEvaluatorFactory.create(evaluatorContext);
+            filterColumnReaders = accessorProvider.getFilterColumnReaders();
             jobId = context.getJobletContext().getJobId().toString();
         }
         // log normalized filter
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 b4de820169..34e40ffa3d 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
@@ -30,6 +30,7 @@ import 
org.apache.asterix.column.assembler.value.IValueGetterFactory;
 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.iterable.ColumnFilterEvaluatorContext;
 import 
org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluator;
 import 
org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluatorFactory;
 import 
org.apache.asterix.column.filter.range.IColumnRangeFilterEvaluatorFactory;
@@ -44,14 +45,11 @@ import 
org.apache.asterix.column.values.IColumnValuesReaderFactory;
 import org.apache.asterix.column.values.reader.PrimitiveColumnValuesReader;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.runtime.projection.FunctionCallInformation;
-import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
-import org.apache.hyracks.algebricks.runtime.evaluators.EvaluatorContext;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.IWarningCollector;
 import org.apache.hyracks.data.std.api.IValueReference;
 import org.apache.hyracks.data.std.primitive.IntegerPointable;
-import org.apache.hyracks.dataflow.common.utils.TaskUtil;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.api.AbstractColumnTupleReader;
 
 /**
@@ -150,22 +148,21 @@ public final class QueryColumnWithMetaMetadata extends 
QueryColumnMetadata {
         IColumnIterableFilterEvaluator columnFilterEvaluator = 
TrueColumnFilterEvaluator.INSTANCE;
         List<IColumnValuesReader> filterColumnReaders = 
Collections.emptyList();
         List<IColumnRangeFilterValueAccessor> filterValueAccessors = 
Collections.emptyList();
-        String jobId = "";
+        String jobId = null;
         if (context != null) {
-            FilterAccessorProvider filterAccessorProvider =
+            FilterAccessorProvider accessorProvider =
                     new FilterAccessorProvider(root, clipperVisitor, 
readerFactory, valueGetterFactory);
-            TaskUtil.put(FilterAccessorProvider.FILTER_ACCESSOR_PROVIDER_KEY, 
filterAccessorProvider, context);
             // Min/Max filters in page0
-            normalizedFilterEvaluator = 
normalizedEvaluatorFactory.create(filterAccessorProvider);
-            filterValueAccessors = filterAccessorProvider.getFilterAccessors();
+            normalizedFilterEvaluator = 
normalizedEvaluatorFactory.create(accessorProvider);
+            filterValueAccessors = accessorProvider.getFilterAccessors();
 
             // Filter columns (columns appeared in WHERE clause)
-            IEvaluatorContext evaluatorContext = new EvaluatorContext(context);
+            ColumnFilterEvaluatorContext evaluatorContext = new 
ColumnFilterEvaluatorContext(context, accessorProvider);
             // ignore atomic (or flat) types information
             clipperVisitor.setIgnoreFlatType(true);
-            filterAccessorProvider.reset();
-            columnFilterEvaluator = 
columnFilterEvaluatorFactory.create(filterAccessorProvider, evaluatorContext);
-            filterColumnReaders = 
filterAccessorProvider.getFilterColumnReaders();
+            accessorProvider.reset();
+            columnFilterEvaluator = 
columnFilterEvaluatorFactory.create(evaluatorContext);
+            filterColumnReaders = accessorProvider.getFilterColumnReaders();
             jobId = context.getJobletContext().getJobId().toString();
         }
 
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/key/FloatKeyValueReader.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/key/FloatKeyValueReader.java
index be83385f76..8040594227 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/key/FloatKeyValueReader.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/key/FloatKeyValueReader.java
@@ -34,7 +34,7 @@ public final class FloatKeyValueReader extends 
AbstractFixedLengthColumnKeyValue
     }
 
     @Override
-    public double getDouble() {
+    public float getFloat() {
         return FloatPointable.getFloat(value.getByteArray(), 
value.getStartOffset());
     }
 
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/PushdownUtil.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/PushdownUtil.java
index aaaeea1bd8..86fa2bfe31 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/PushdownUtil.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/PushdownUtil.java
@@ -37,7 +37,10 @@ import org.apache.asterix.om.utils.ConstantExpressionUtil;
 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.ILogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
 import org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
+import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag;
 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.IAlgebricksConstantValue;
@@ -60,6 +63,27 @@ public class PushdownUtil {
     private PushdownUtil() {
     }
 
+    public static IVariableTypeEnvironment getTypeEnv(ILogicalOperator 
useOperator, IOptimizationContext context)
+            throws AlgebricksException {
+        if (useOperator.getOperatorTag() == LogicalOperatorTag.DATASOURCESCAN
+                || useOperator.getOperatorTag() == 
LogicalOperatorTag.INNERJOIN) {
+            // Special case: for pushed select condition
+            return useOperator.computeOutputTypeEnvironment(context);
+        } else {
+            return useOperator.computeInputTypeEnvironment(context);
+        }
+    }
+
+    public static IVariableTypeEnvironment getTypeEnv(ILogicalOperator 
useOperator, ILogicalOperator scanOperator,
+            IOptimizationContext context) throws AlgebricksException {
+        if (useOperator == scanOperator) {
+            // Special case: for pushed select condition
+            return useOperator.computeOutputTypeEnvironment(context);
+        } else {
+            return scanOperator.computeOutputTypeEnvironment(context);
+        }
+    }
+
     public static String getFieldName(AbstractFunctionCallExpression 
fieldAccessExpr, IVariableTypeEnvironment typeEnv)
             throws AlgebricksException {
         if 
(BuiltinFunctions.FIELD_ACCESS_BY_NAME.equals(fieldAccessExpr.getFunctionIdentifier()))
 {
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/AbstractColumnBTreeLeafFrame.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/AbstractColumnBTreeLeafFrame.java
index 9aeafa431c..6ecd59e33d 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/AbstractColumnBTreeLeafFrame.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/AbstractColumnBTreeLeafFrame.java
@@ -94,7 +94,8 @@ public abstract class AbstractColumnBTreeLeafFrame implements 
ITreeIndexFrame {
     @Override
     public final void setPage(ICachedPage page) {
         this.page = page;
-        this.buf = page.getBuffer();
+        // Duplicate to avoid interference when scanning the dataset twice
+        this.buf = page.getBuffer().duplicate();
         buf.clear();
         buf.position(HEADER_SIZE);
     }

Reply via email to