Check type of segment spec before using for time ordering

This commit is contained in:
Justin Borromeo 2019-03-25 15:19:45 -07:00
parent b822fc73df
commit da4fc66403
1 changed files with 100 additions and 94 deletions

View File

@ -92,15 +92,6 @@ public class ScanQueryRunnerFactory implements QueryRunnerFactory<ScanResultValu
return (queryPlus, responseContext) -> { return (queryPlus, responseContext) -> {
ScanQuery query = (ScanQuery) queryPlus.getQuery(); ScanQuery query = (ScanQuery) queryPlus.getQuery();
List<SegmentDescriptor> descriptorsOrdered =
((MultipleSpecificSegmentSpec) query.getQuerySegmentSpec()).getDescriptors(); // Ascending time order
List<QueryRunner<ScanResultValue>> queryRunnersOrdered = Lists.newArrayList(queryRunners); // Ascending time order by default
if (query.getOrder().equals(ScanQuery.Order.DESCENDING)) {
descriptorsOrdered = Lists.reverse(descriptorsOrdered);
queryRunnersOrdered = Lists.reverse(queryRunnersOrdered);
}
// Note: this variable is effective only when queryContext has a timeout. // Note: this variable is effective only when queryContext has a timeout.
// See the comment of CTX_TIMEOUT_AT. // See the comment of CTX_TIMEOUT_AT.
final long timeoutAt = System.currentTimeMillis() + QueryContexts.getTimeout(queryPlus.getQuery()); final long timeoutAt = System.currentTimeMillis() + QueryContexts.getTimeout(queryPlus.getQuery());
@ -119,7 +110,21 @@ public class ScanQueryRunnerFactory implements QueryRunnerFactory<ScanResultValu
} else { } else {
return returnedRows; return returnedRows;
} }
} else if (query.getLimit() <= scanQueryConfig.getMaxRowsQueuedForOrdering()) { } else {
if (!(query.getQuerySegmentSpec() instanceof MultipleSpecificSegmentSpec)) {
throw new UOE("Time-ordering on scan queries is only supported for queries with segment specs"
+ "of type MultipleSpecificSegmentSpec");
}
List<SegmentDescriptor> descriptorsOrdered =
((MultipleSpecificSegmentSpec) query.getQuerySegmentSpec()).getDescriptors(); // Ascending time order
List<QueryRunner<ScanResultValue>> queryRunnersOrdered = Lists.newArrayList(queryRunners); // Ascending time order by default
if (query.getOrder().equals(ScanQuery.Order.DESCENDING)) {
descriptorsOrdered = Lists.reverse(descriptorsOrdered);
queryRunnersOrdered = Lists.reverse(queryRunnersOrdered);
}
if (query.getLimit() <= scanQueryConfig.getMaxRowsQueuedForOrdering()) {
// Use priority queue strategy // Use priority queue strategy
return sortAndLimitScanResultValuesPriorityQueue( return sortAndLimitScanResultValuesPriorityQueue(
Sequences.concat(Sequences.map( Sequences.concat(Sequences.map(
@ -217,6 +222,7 @@ public class ScanQueryRunnerFactory implements QueryRunnerFactory<ScanResultValu
scanQueryConfig.getMaxRowsQueuedForOrdering() scanQueryConfig.getMaxRowsQueuedForOrdering()
); );
} }
}
}; };
} }