/** * Performs a comparison based on how much data each table has within their volatile intervals. * * @param left The first table * @param right The second table * * @return negative if left has more data in its volatile segment than right */ @Override public int compare(PhysicalTable left, PhysicalTable right) { long leftVolatileDataDuration = getAvailableVolatileDataDuration(left); long rightVolatileDataDuration = getAvailableVolatileDataDuration(right); long mostCompleteVolatile = rightVolatileDataDuration - leftVolatileDataDuration; // A saturated cast that allows us to turn a long into an int such that any long within the range of valid // integers is preserved, but anything outside the range is rounded to Integer.MIN_VALUE or Integer.MAX_VALUE. return (int) Math.max(Math.min(Integer.MAX_VALUE, mostCompleteVolatile), Integer.MIN_VALUE); }
@Override public BinaryOperator<PhysicalTable> getBetterTableOperator(QueryPlanningConstraint requestConstraint) { List<Comparator<PhysicalTable>> comparators = new ArrayList<>(); if (BardFeatureFlag.PARTIAL_DATA.isOn()) { comparators.add( new PartialTimeComparator(requestConstraint, partialDataHandler)); comparators.add( new VolatileTimeComparator(requestConstraint, partialDataHandler, volatileIntervalsService)); } comparators.add(COMPARE_GRANULARITY); comparators.add(CARDINALITY_COMPARATOR); ChainingComparator<PhysicalTable> tableComparator = new ChainingComparator<>(comparators); return BinaryOperator.minBy(tableComparator); } }