private static void bootstrapCardinalityEstimationProvider(final Configuration configuration) { // Safety net: provide a fallback estimator. KeyValueProvider<OutputSlot<?>, CardinalityEstimator> fallbackProvider = new FunctionalKeyValueProvider<OutputSlot<?>, CardinalityEstimator>( outputSlot -> new FallbackCardinalityEstimator(), configuration ).withSlf4jWarning("Creating fallback cardinality estimator for {}."); // Default option: Implementations define their estimators. KeyValueProvider<OutputSlot<?>, CardinalityEstimator> defaultProvider = new FunctionalKeyValueProvider<>(fallbackProvider, (outputSlot, requestee) -> { assert outputSlot.getOwner().isElementary() : String.format("Cannot provide estimator for composite %s.", outputSlot.getOwner()); final ElementaryOperator operator = (ElementaryOperator) outputSlot.getOwner(); // Instance-level estimator? if (operator.getCardinalityEstimator(outputSlot.getIndex()) != null) { return operator.getCardinalityEstimator(outputSlot.getIndex()); } // Type-level estimator? return operator .createCardinalityEstimator(outputSlot.getIndex(), configuration) .orElse(null); }); // Customizable layer: Users can override manually. KeyValueProvider<OutputSlot<?>, CardinalityEstimator> overrideProvider = new MapBasedKeyValueProvider<>(defaultProvider); configuration.setCardinalityEstimatorProvider(overrideProvider); }