>From Janhavi Tripurwar <[email protected]>:
Janhavi Tripurwar has uploaded this change for review. (
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20572?usp=email )
Change subject: [ASTERIXDB-3673]: Fix: Prevent CBO failure when samples are
empty
......................................................................
[ASTERIXDB-3673]: Fix: Prevent CBO failure when samples are empty
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
- Fallback to RBO when samples are empty.
- Moved issueWarning method to OperatorUtil for better accessibility.
- Added warning log for visibility.
Change-Id: Iad996433d22308f8f4096e30a0b04be27c58c020
---
M
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
M
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/OperatorUtils.java
M
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
3 files changed, 23 insertions(+), 2 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/72/20572/1
diff --git
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
index 0d0c984..4f6db11 100644
---
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
+++
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
@@ -1591,11 +1591,19 @@
continue;
}
Index index = handle.findSampleIndex(scanOp, context);
+ Index.SampleIndexDetails idxDetails = (Index.SampleIndexDetails)
index.getIndexDetails();
+ double origDatasetCard = idxDetails.getSourceCardinality();
if (index == null) {
return false;
}
+ if (origDatasetCard == 0) {
+ double sampleCard =
Math.min(idxDetails.getSampleCardinalityTarget(), origDatasetCard);
+ OperatorUtils.issueWarning(sampleCard, scanOp, context);
+ return false;
+ }
n++;
}
+
return (leafInputs.size() == n);
}
}
diff --git
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/OperatorUtils.java
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/OperatorUtils.java
index 27c37d7..68aff90 100644
---
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/OperatorUtils.java
+++
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/OperatorUtils.java
@@ -44,7 +44,9 @@
import
org.apache.hyracks.algebricks.core.algebra.operators.logical.DataSourceScanOperator;
import
org.apache.hyracks.algebricks.core.algebra.operators.logical.DistinctOperator;
import
org.apache.hyracks.algebricks.core.algebra.operators.logical.GroupByOperator;
+import org.apache.hyracks.api.exceptions.IWarningCollector;
import org.apache.hyracks.api.exceptions.SourceLocation;
+import org.apache.hyracks.api.exceptions.Warning;
public class OperatorUtils {
@@ -324,4 +326,15 @@
return distinctOp;
}
+
+ protected static void issueWarning(double sampleCard,
DataSourceScanOperator scanOp, IOptimizationContext optCtx) {
+ if (sampleCard == 0) {
+ sampleCard = 1;
+ IWarningCollector warningCollector = optCtx.getWarningCollector();
+ if (warningCollector.shouldWarn()) {
+ warningCollector.warn(Warning.of(scanOp.getSourceLocation(),
+
org.apache.asterix.common.exceptions.ErrorCode.SAMPLE_HAS_ZERO_ROWS));
+ }
+ }
+ }
}
diff --git
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
index 78cf365..4f96207 100644
---
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
+++
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
@@ -592,7 +592,7 @@
Index.SampleIndexDetails idxDetails = (Index.SampleIndexDetails)
index.getIndexDetails();
double origDatasetCard = idxDetails.getSourceCardinality();
double sampleCard = Math.min(idxDetails.getSampleCardinalityTarget(),
origDatasetCard);
- issueWarning(sampleCard, scanOp);
+ OperatorUtils.issueWarning(sampleCard, scanOp, optCtx);
// replace the dataScanSourceOperator with the sampling source
SampleDataSource sampledatasource =
joinEnum.getSampleDataSource(scanOp);
@@ -797,7 +797,7 @@
Index.SampleIndexDetails idxDetails = (Index.SampleIndexDetails)
index.getIndexDetails();
double origDatasetCard = idxDetails.getSourceCardinality();
double sampleCard = Math.min(idxDetails.getSampleCardinalityTarget(),
origDatasetCard);
- issueWarning(sampleCard, scanOp);
+ OperatorUtils.issueWarning(sampleCard, scanOp, optCtx);
return index;
}
--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20572?usp=email
To unsubscribe, or for help writing mail filters, visit
https://asterix-gerrit.ics.uci.edu/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: asterixdb
Gerrit-Branch: phoenix
Gerrit-Change-Id: Iad996433d22308f8f4096e30a0b04be27c58c020
Gerrit-Change-Number: 20572
Gerrit-PatchSet: 1
Gerrit-Owner: Janhavi Tripurwar <[email protected]>