this.minimumGranularity = minimumGranularity; this.requestGranularity = requestGranularity; this.logicalMetricNames = generateLogicalMetricNames();
requestConstraint.getMinimumGranularity(), requestConstraint.getAllColumnNames(), candidateTables ); requestConstraint.getAllDimensionNames(), requestConstraint.getLogicalMetricNames(), requestConstraint.getMinimumGranularity() )); throw me;
/** * Stores the request table name and intervals and creates a predicate to test a physical table based on request * intervals. * * @param requestConstraint Contains the request constraints extracted from DataApiRequest and TemplateDruidQuery */ public TimeAlignmentPhysicalTableMatcher(QueryPlanningConstraint requestConstraint) { if (requestConstraint.getIntervals().isEmpty()) { throw new IllegalStateException("Intervals cannot be empty"); } logicalTableName = requestConstraint.getLogicalTable().getName(); requestIntervals = requestConstraint.getIntervals(); isTableAligned = new IsTableStartAlignedWithIntervals(requestConstraint.getIntervals()); }
@Override public NoMatchFoundException noneFoundException() { String logicalTableName = requestConstraint.getLogicalTable().getName(); Set<String> logicalMetrics = requestConstraint.getLogicalMetricNames(); Set<String> dimensions = requestConstraint.getAllDimensionNames(); String grainName = requestConstraint.getMinimumGranularity().getName(); LOG.error(MESSAGE_FORMAT.logFormat(logicalTableName, dimensions, logicalMetrics, grainName)); return new NoMatchFoundException( MESSAGE_FORMAT.format(logicalTableName, dimensions, logicalMetrics, grainName)); } }
@Override public boolean test(PhysicalTable table) { if (!requestConstraint.getMinimumGranularity().satisfiedBy(table.getSchema().getGranularity())) { return false; } Set<String> supplyNames = table.getSchema().getColumns().stream() .map(Column::getName) .collect(Collectors.toCollection(LinkedHashSet::new)); Set<String> columnNames = requestConstraint.getAllColumnNames(); return supplyNames.containsAll(columnNames); }
/** * Compare two Physical Tables based on how much missing time they have. * * @param left The first table * @param right The second table * * @return negative if table1 has less missing time than table2 */ @Override public int compare(PhysicalTable left, PhysicalTable right) { // choose table with most data available for given columns long missingDurationLeft = IntervalUtils.getTotalDuration( partialDataHandler.findMissingTimeGrainIntervals( left.getAvailableIntervals(requestConstraint), new SimplifiedIntervalList(requestConstraint.getIntervals()), requestConstraint.getRequestGranularity() ) ); long missingDurationRight = IntervalUtils.getTotalDuration( partialDataHandler.findMissingTimeGrainIntervals( right.getAvailableIntervals(requestConstraint), new SimplifiedIntervalList(requestConstraint.getIntervals()), requestConstraint.getRequestGranularity() ) ); long difference = missingDurationLeft - missingDurationRight; return (int) Math.max(Math.min(Integer.MAX_VALUE, difference), Integer.MIN_VALUE); } }
TableUtils.getConstrainedLogicalTableAvailability( logicalTable, new QueryPlanningConstraint( tablesApiRequest.getDimensions(), tablesApiRequest.getFilterDimensions(),
@Override public NoMatchFoundException noneFoundException() { Set<String> aggDimensions = requestConstraint.getRequestDimensions().stream() .filter(Dimension::isAggregatable) .map(Dimension::getApiName) .collect(Collectors.toSet()); Set<String> nonAggDimensions = requestConstraint.getRequestDimensions().stream() .filter(StreamUtils.not(Dimension::isAggregatable)) .map(Dimension::getApiName) .collect(Collectors.toSet()); LOG.error(MESSAGE_FORMAT.logFormat(nonAggDimensions, aggDimensions)); return new NoMatchFoundException(MESSAGE_FORMAT.format(nonAggDimensions, aggDimensions)); } }
@Override public boolean test(PhysicalTable table) { Set<String> columnNames = requestConstraint.getAllColumnNames(); // If table contains non-agg dimensions, query must contain all these non-agg dimensions to use this table. return table.getDimensions().stream() .filter(StreamUtils.not(Dimension::isAggregatable)) .map(Dimension::getApiName) .allMatch(columnNames::contains); }
SimplifiedIntervalList requestIntervals = new SimplifiedIntervalList(requestConstraint.getIntervals()); Granularity apiRequestGranularity = requestConstraint.getRequestGranularity();
QueryPlanningConstraint constraint = new QueryPlanningConstraint(request, template); ConstrainedTable table = resolver.resolve(group.getPhysicalTables(), constraint).withConstraint(constraint); Filter filter = druidFilterBuilder.buildFilters(request.getApiFilters());
/** * Constructor. * * @param dataApiRequest <b>Data API request</b> containing the constraints information * @param templateDruidQuery Query containing metric constraint information */ public QueryPlanningConstraint( @NotNull DataApiRequest dataApiRequest, @NotNull TemplateDruidQuery templateDruidQuery ) { super(dataApiRequest, templateDruidQuery); this.logicalTable = dataApiRequest.getTable(); this.intervals = Collections.unmodifiableList(dataApiRequest.getIntervals()); this.logicalMetrics = Collections.unmodifiableSet(dataApiRequest.getLogicalMetrics()); this.minimumGranularity = new RequestQueryGranularityResolver().apply(dataApiRequest, templateDruidQuery); this.requestGranularity = dataApiRequest.getGranularity(); this.logicalMetricNames = generateLogicalMetricNames(); }
/** * Constructor. * * @param tablesApiRequest <b>Tables API request</b> containing the constraints information. */ public QueryPlanningConstraint(@NotNull TablesApiRequest tablesApiRequest) { super( tablesApiRequest.getDimensions(), tablesApiRequest.getFilterDimensions(), Collections.emptySet(), Collections.emptySet(), tablesApiRequest.getApiFilters() ); this.logicalTable = tablesApiRequest.getTable(); this.intervals = Collections.unmodifiableList(tablesApiRequest.getIntervals()); this.logicalMetrics = Collections.unmodifiableSet(tablesApiRequest.getLogicalMetrics()); this.minimumGranularity = tablesApiRequest.getGranularity(); this.requestGranularity = tablesApiRequest.getGranularity(); this.logicalMetricNames = generateLogicalMetricNames(); }