Sets a filter or filter list on the scanner based on whether or not the query had tags it needed to match. NOTE: This method will sort the group bys. @param scanner The scanner to modify. @param group_bys An optional list of tag keys that we want to group on. May be null. @param row_key_literals An
(
final Scanner scanner,
final List<byte[]> group_bys,
final ByteMap<byte[][]> row_key_literals,
final boolean explicit_tags,
final boolean enable_fuzzy_filter,
final int end_time)
| 412 | * to stop scanning. |
| 413 | */ |
| 414 | public static void setDataTableScanFilter( |
| 415 | final Scanner scanner, |
| 416 | final List<byte[]> group_bys, |
| 417 | final ByteMap<byte[][]> row_key_literals, |
| 418 | final boolean explicit_tags, |
| 419 | final boolean enable_fuzzy_filter, |
| 420 | final int end_time) { |
| 421 | |
| 422 | // no-op |
| 423 | if ((group_bys == null || group_bys.isEmpty()) |
| 424 | && (row_key_literals == null || row_key_literals.isEmpty())) { |
| 425 | return; |
| 426 | } |
| 427 | |
| 428 | if (group_bys != null) { |
| 429 | Collections.sort(group_bys, Bytes.MEMCMP); |
| 430 | } |
| 431 | |
| 432 | final int prefix_width = Const.SALT_WIDTH() + TSDB.metrics_width() + |
| 433 | Const.TIMESTAMP_BYTES; |
| 434 | |
| 435 | final FuzzyRowFilter fuzzy_filter; |
| 436 | if (explicit_tags && |
| 437 | enable_fuzzy_filter && |
| 438 | row_key_literals != null && |
| 439 | !row_key_literals.isEmpty()) { |
| 440 | |
| 441 | final byte[] fuzzy_key = new byte[prefix_width + (row_key_literals.size() * |
| 442 | (TSDB.tagk_width() + TSDB.tagv_width()))]; |
| 443 | System.arraycopy(scanner.getCurrentKey(), 0, fuzzy_key, 0, |
| 444 | scanner.getCurrentKey().length); |
| 445 | |
| 446 | final List<FuzzyFilterPair> fuzzy_filter_pairs = |
| 447 | buildFuzzyFilters(row_key_literals, fuzzy_key); |
| 448 | |
| 449 | // The Fuzzy Filter list is sorted: the first and last filters row key |
| 450 | // can be used to build the stop key for the scanner |
| 451 | final byte[] stop_key = Arrays.copyOf( |
| 452 | fuzzy_filter_pairs.get(fuzzy_filter_pairs.size() - 1).getRowKey(), |
| 453 | fuzzy_key.length); |
| 454 | System.arraycopy(scanner.getCurrentKey(), 0, stop_key, 0, prefix_width); |
| 455 | Internal.setBaseTime(stop_key, end_time); |
| 456 | int idx = prefix_width + TSDB.tagk_width(); |
| 457 | // max out the tag values |
| 458 | while (idx < stop_key.length) { |
| 459 | for (int i = 0; i < TSDB.tagv_width(); i++) { |
| 460 | stop_key[idx++] = (byte) 0xFF; |
| 461 | } |
| 462 | idx += TSDB.tagk_width(); |
| 463 | } |
| 464 | |
| 465 | scanner.setStartKey(fuzzy_key); |
| 466 | scanner.setStopKey(stop_key); |
| 467 | fuzzy_filter = new FuzzyRowFilter(fuzzy_filter_pairs); |
| 468 | } else { |
| 469 | fuzzy_filter = null; |
| 470 | } |
| 471 |