@Override public CardinalityEstimate estimate(OptimizationContext optimizationContext, CardinalityEstimate... inputEstimates) { return new CardinalityEstimate(this.outputSize, this.outputSize, 1d, this.isOverride); } }
/** * @deprecated These method does not do anything, anymore. */ @Deprecated public CardinalityEstimate getCardinalityEstimate() { return new CardinalityEstimate(42, 42, 0.42); } //
/** * Parses the given {@link JSONObject} to create a new instance. * * @param json that should be parsed * @return the new instance */ public static CardinalityEstimate fromJson(JSONObject json) { return new CardinalityEstimate(json.getLong("lowerBound"), json.getLong("upperBound"), json.getDouble("confidence")); }
/** * Divides the estimate values, not the probability. * * @param denominator by which this instance should be divided * @return the quotient */ public CardinalityEstimate divideBy(double denominator) { return new CardinalityEstimate( (long) Math.ceil(this.getLowerEstimate() / denominator), (long) Math.ceil(this.getUpperEstimate() / denominator), this.getCorrectnessProbability() ); }
@Override public CardinalityEstimate estimate(OptimizationContext optimizationContext, CardinalityEstimate... inputEstimates) { double probability = .5d; long upperEstimate = 1L; for (CardinalityEstimate inputEstimate : inputEstimates) { if (inputEstimate == null) { inputEstimate = CardinalityEstimate.EMPTY_ESTIMATE; } probability *= inputEstimate.getCorrectnessProbability(); upperEstimate *= 1 + 10 * inputEstimate.getUpperEstimate(); if (upperEstimate < 0L) { upperEstimate = Long.MAX_VALUE; } } return new CardinalityEstimate(1L, upperEstimate, probability); }
/** * Injects the measured {@code cardinality}. */ private void injectMeasuredCardinality(long cardinality, OptimizationContext.OperatorContext targetOperatorContext, int outputIndex) { // Build the new CardinalityEstimate. final CardinalityEstimate newCardinality = new CardinalityEstimate(cardinality, cardinality, 1d, true); final CardinalityEstimate oldCardinality = targetOperatorContext.getOutputCardinality(outputIndex); if (!newCardinality.equals(oldCardinality)) { if (this.logger.isInfoEnabled()) { this.logger.info("Updating cardinality of {}'s output {} from {} to {}.", targetOperatorContext.getOperator(), outputIndex, oldCardinality, newCardinality ); } targetOperatorContext.setOutputCardinality(outputIndex, newCardinality); } }
return new CardinalityEstimate(estimate, estimate, this.certaintyProb); .min() .orElseThrow(IllegalStateException::new); return new CardinalityEstimate(lowerEstimate, upperEstimate, correctnessProb);
@Override public Optional<CardinalityEstimator> createCardinalityEstimator(int outputIndex, Configuration configuration) { switch (outputIndex) { case 0: return Optional.of((optimizationContext, inputEstimates) -> { assert inputEstimates.length == 1; return new CardinalityEstimate( calculateNumVertices(inputEstimates[0].getLowerEstimate(), PageRankOperator.this.graphDensity.getUpperEstimate()), calculateNumVertices(inputEstimates[0].getUpperEstimate(), PageRankOperator.this.graphDensity.getLowerEstimate()), inputEstimates[0].getCorrectnessProbability() * PageRankOperator.this.graphDensity.getCorrectnessProbability() ); }); default: throw new IllegalArgumentException(String.format("%s does not have an OutputSlot with index %d.", this, outputIndex)); } }
return new CardinalityEstimate(0L, 0L, 1d); cardinalityEstimate = new CardinalityEstimate( (long) (numEstimatedLines - expectedDeviation), (long) (numEstimatedLines + expectedDeviation),
public CardinalityEstimate plus(CardinalityEstimate that) { return new CardinalityEstimate( addSafe(this.getLowerEstimate(), that.getLowerEstimate()), addSafe(this.getUpperEstimate(), that.getUpperEstimate()), Math.min(this.getCorrectnessProbability(), that.getCorrectnessProbability()) ); }