/** * Get the a granularity which must be satisfied by any answering table granularity for this request. * <p> * If a query has a time grain constraint, it will be returned as a granularity with the request time zone * applied. If the query has no constraint, the request grain will be returned as a granularity. * * @param apiRequest DataApiRequest from the user which may specify a coarsest satisfying grain * @param query Query which may apply a coarsest satisfying grain * * @return The coarsest valid table grain to satisfy the query */ public Granularity resolveAcceptingGrain(DataApiRequest apiRequest, TemplateDruidQuery query) { // Gather any specified time grains Granularity requestGranularity = apiRequest.getGranularity(); ZonelessTimeGrain queryGrain = query.getInnermostQuery().getTimeGrain(); // The query makes no restrictions, so use the apiRequest only if (queryGrain == null) { return requestGranularity; } if (requestGranularity.satisfiedBy(queryGrain)) { return queryGrain.buildZonedTimeGrain(apiRequest.getTimeZone()); } LOG.error(QUERY_GRAIN_NOT_SATISFIED.format(queryGrain, requestGranularity)); throw new IllegalArgumentException(QUERY_GRAIN_NOT_SATISFIED.format(queryGrain, requestGranularity)); }