Addressed code review comments.
diff --git a/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/base/RuleCollections.java b/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/base/RuleCollections.java
index 3ad3db4..f14fff8 100644
--- a/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/base/RuleCollections.java
+++ b/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/base/RuleCollections.java
@@ -251,8 +251,8 @@
physicalRewritesTopLevel.add(new PushNestedOrderByUnderPreSortedGroupByRule());
physicalRewritesTopLevel.add(new PushLimitDownRule());
physicalRewritesTopLevel.add(new IntroduceProjectsRule());
- physicalRewritesTopLevel.add(new IntroduceRapidFrameFlushProjectRule());
physicalRewritesTopLevel.add(new SetAlgebricksPhysicalOperatorsRule());
+ physicalRewritesTopLevel.add(new IntroduceRapidFrameFlushProjectRule());
physicalRewritesTopLevel.add(new SetExecutionModeRule());
return physicalRewritesTopLevel;
}
diff --git a/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/IntroduceRapidFrameFlushProjectRule.java b/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/IntroduceRapidFrameFlushProjectRule.java
index c1afa20..d3e11ed2 100644
--- a/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/IntroduceRapidFrameFlushProjectRule.java
+++ b/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/IntroduceRapidFrameFlushProjectRule.java
@@ -24,6 +24,7 @@
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.ExtensionOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator;
+import edu.uci.ics.hyracks.algebricks.core.algebra.operators.physical.StreamProjectPOperator;
import edu.uci.ics.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule;
/**
@@ -43,16 +44,26 @@
}
private boolean checkIfRuleIsApplicable(AbstractLogicalOperator op) {
- if (op.getPhysicalOperator() == null) {
+ if (op.getOperatorTag() != LogicalOperatorTag.EXTENSION_OPERATOR) {
return false;
}
- if (op.getOperatorTag() == LogicalOperatorTag.EXTENSION_OPERATOR) {
- ExtensionOperator extensionOp = (ExtensionOperator) op;
- if (extensionOp.getDelegate() instanceof CommitOperator) {
- return true;
- }
+ ExtensionOperator extensionOp = (ExtensionOperator) op;
+ if (!(extensionOp.getDelegate() instanceof CommitOperator)) {
+ return false;
}
- return false;
+
+ AbstractLogicalOperator descendantOp = op;
+ while (descendantOp != null) {
+ if (descendantOp.getOperatorTag() == LogicalOperatorTag.PROJECT) {
+ if (descendantOp.getPhysicalOperator() == null) {
+ return false;
+ }
+ } else if (descendantOp.getOperatorTag() == LogicalOperatorTag.INSERT_DELETE) {
+ break;
+ }
+ descendantOp = (AbstractLogicalOperator) descendantOp.getInputs().get(0).getValue();
+ }
+ return true;
}
@Override
@@ -71,7 +82,8 @@
while (descendantOp != null) {
if (descendantOp.getOperatorTag() == LogicalOperatorTag.PROJECT) {
projectOp = (ProjectOperator) descendantOp;
- projectOp.setRapidFrameFlush(true);
+ StreamProjectPOperator physicalOp = (StreamProjectPOperator) projectOp.getPhysicalOperator();
+ physicalOp.setRapidFrameFlush(true);
planModified = true;
} else if (descendantOp.getOperatorTag() == LogicalOperatorTag.INSERT_DELETE) {
break;