private long[] extractEstimateValues(CardinalityEstimate[] inputEstimates) { long[] lowerAndUpperEstimates = new long[this.numInputs * 2]; for (int i = 0; i < this.numInputs; i++) { final CardinalityEstimate inputEstimate = inputEstimates[i]; lowerAndUpperEstimates[i << 1] = inputEstimate.getLowerEstimate(); lowerAndUpperEstimates[(i << 1) + 1] = inputEstimate.getUpperEstimate(); } return lowerAndUpperEstimates; } }
public double calculateSpread(CardinalityEstimate cardinalityEstimate) { return ((double) cardinalityEstimate.getUpperEstimate() + this.spreadSmoothing) / ((double) cardinalityEstimate.getLowerEstimate() + this.spreadSmoothing); }
/** * Serializes this instance to the given {@link JSONObject}. * * @param json to which this instance should be serialized * @return {@code json} */ public JSONObject toJson(JSONObject json) { json.put("lowerBound", this.getLowerEstimate()); json.put("upperBound", this.getUpperEstimate()); json.put("confidence", this.getCorrectnessProbability()); return json; }
/** * 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 String toString() { return String.format( "(%,d..%,d, %s)", this.getLowerEstimate(), this.getUpperEstimate(), Formats.formatPercentage(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); }
public CardinalityEstimate plus(CardinalityEstimate that) { return new CardinalityEstimate( addSafe(this.getLowerEstimate(), that.getLowerEstimate()), addSafe(this.getUpperEstimate(), that.getUpperEstimate()), Math.min(this.getCorrectnessProbability(), that.getCorrectnessProbability()) ); }
private void write(OptimizationContext.OperatorContext operatorContext, OutputSlot<?> output, long outputCardinality) { JSONArray jsonInputCardinalities = new JSONArray(); final Operator operator = operatorContext.getOperator(); for (int inputIndex = 0; inputIndex < operator.getNumInputs(); inputIndex++) { final InputSlot<?> input = operator.getInput(inputIndex); final CardinalityEstimate inputEstimate = operatorContext.getInputCardinality(inputIndex); JSONObject jsonInputCardinality = new JSONObject(); jsonInputCardinality.put("name", input.getName()); jsonInputCardinality.put("index", input.getIndex()); jsonInputCardinality.put("isBroadcast", input.isBroadcast()); jsonInputCardinality.put("lowerBound", inputEstimate.getLowerEstimate()); jsonInputCardinality.put("upperBound", inputEstimate.getUpperEstimate()); jsonInputCardinality.put("confidence", inputEstimate.getCorrectnessProbability()); jsonInputCardinalities.put(jsonInputCardinality); } JSONObject jsonOperator = new JSONObject(); jsonOperator.put("class", operator.getClass().getCanonicalName()); // TODO: UDFs? How can we reference them? JSONObject jsonOutput = new JSONObject(); jsonOutput.put("name", output.getName()); jsonOutput.put("index", output.getIndex()); jsonOutput.put("cardinality", outputCardinality); JSONObject jsonMeasurement = new JSONObject(); jsonMeasurement.put("inputs", jsonInputCardinalities); jsonMeasurement.put("operator", jsonOperator); jsonMeasurement.put("output", jsonOutput); this.write(jsonMeasurement); }
final CardinalityEstimate cardinalityEstimate = this.replaceNullCardinality(cardinalityEstimates[pos]); combinations[0][pos] = cardinalityEstimate.getLowerEstimate(); combinations[1][pos] = cardinalityEstimate.getUpperEstimate();
@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)); } }
cardinalityEstimate0.getUpperEstimate() <= cardinalityEstimate1.getUpperEstimate();