in wayang-commons/wayang-core/src/main/java/org/apache/wayang/core/optimizer/costs/IntervalLoadEstimator.java [106:146]
public LoadEstimate calculate(EstimationContext context) {
final CardinalityEstimate[] inputEstimates = context.getInputCardinalities();
final CardinalityEstimate[] outputEstimates = context.getOutputCardinalities();
Validate.isTrue(inputEstimates.length >= this.numInputs || this.numInputs == UNSPECIFIED_NUM_SLOTS,
"Received %d input estimates, require %d.", inputEstimates.length, this.numInputs);
Validate.isTrue(outputEstimates.length == this.numOutputs || this.numOutputs == UNSPECIFIED_NUM_SLOTS,
"Received %d output estimates, require %d.", outputEstimates.length, this.numOutputs);
long[][] inputEstimateCombinations = this.enumerateCombinations(inputEstimates);
long[][] outputEstimateCombinations = this.enumerateCombinations(outputEstimates);
long lowerEstimate = -1, upperEstimate = -1;
for (int inputEstimateId = 0; inputEstimateId < inputEstimateCombinations.length; inputEstimateId++) {
for (int outputEstimateId = 0; outputEstimateId < outputEstimateCombinations.length; outputEstimateId++) {
long estimate = Math.max(this.lowerBoundEstimator.applyAsLong(
inputEstimateCombinations[inputEstimateId],
outputEstimateCombinations[outputEstimateId]
), 0);
if (lowerEstimate == -1 || estimate < lowerEstimate) {
lowerEstimate = estimate;
}
if (upperEstimate == -1 || estimate > upperEstimate) {
upperEstimate = estimate;
}
estimate = Math.max(this.upperBoundEstimator.applyAsLong(
inputEstimateCombinations[inputEstimateId],
outputEstimateCombinations[outputEstimateId]
), 0);
if (lowerEstimate == -1 || estimate < lowerEstimate) {
lowerEstimate = estimate;
}
if (upperEstimate == -1 || estimate > upperEstimate) {
upperEstimate = estimate;
}
}
}
double correctnessProbability = this.calculateJointProbability(inputEstimates, outputEstimates)
* this.correctnessProbablity;
return new LoadEstimate(lowerEstimate, upperEstimate, correctnessProbability);
}