private Stream<RowColumnRangeIterator> getBatchForRow(byte[] row, ColumnRangeSelection columnRange, int batchSize) { return kvs.getRowsColumnRange( tableRef, Collections.singleton(row), BatchColumnRangeSelection.create(columnRange, batchSize), SweepQueueUtils.READ_TS).values().stream(); }
@Override public String toString() { String start = PtBytes.encodeBase64String(getStartCol()); String end = PtBytes.encodeBase64String(getEndCol()); String batch = String.valueOf(batchHint); return Joiner.on(',').join(ImmutableList.of(start, end, batch)); } }
if (isEndOfColumnRange(lastCol, batchColumnRangeSelection.getEndCol())) { ret.put(e.getKey(), firstPageIter); } else { byte[] nextCol = RangeRequests.nextLexicographicName(lastCol); BatchColumnRangeSelection nextColumnRangeSelection = BatchColumnRangeSelection.create( nextCol, batchColumnRangeSelection.getEndCol(), batchColumnRangeSelection.getBatchHint()); Iterator<Map.Entry<Cell, Value>> nextPagesIter = getRowColumnRange( tableRef,
private static BatchColumnRangeSelection nextLexicographicalRangeEnd( BatchColumnRangeSelection currentRange, byte[] rangeEnd) { if (rangeEnd.length != 0 && !RangeRequests.isTerminalRow(false, rangeEnd)) { return BatchColumnRangeSelection.create( currentRange.getStartCol(), RangeRequests.getNextStartRow(false, rangeEnd), currentRange.getBatchHint()); } else { return currentRange; } }
private boolean isEndOfColumnRange(boolean completedCell, byte[] lastCol, int numRawResults, BatchColumnRangeSelection columnRangeSelection) { return (numRawResults < columnRangeSelection.getBatchHint()) || (completedCell && (RangeRequests.isLastRowName(lastCol) || Arrays.equals( RangeRequests.nextLexicographicName(lastCol), columnRangeSelection.getEndCol()))); }
@Override protected FullQuery getRowsColumnRangeSubQuery( byte[] row, long ts, BatchColumnRangeSelection columnRangeSelection) { String query = " /* GET_ROWS_COLUMN_RANGE (" + tableName + ") */ " + "SELECT s.row_name, s.col_name, s.ts" + getValueSubselect("s", true) + " FROM ( SELECT m.row_name, m.col_name, max(m.ts) as ts" + getValueSubselectForGroupBy("m") + " FROM " + tableName + " m" + " WHERE m.row_name = ?" + " AND m.ts < ? " + (columnRangeSelection.getStartCol().length > 0 ? " AND m.col_name >= ?" : "") + (columnRangeSelection.getEndCol().length > 0 ? " AND m.col_name < ?" : "") + " GROUP BY m.row_name, m.col_name" + " ORDER BY m.row_name ASC, m.col_name ASC ) s WHERE rownum <= " + columnRangeSelection.getBatchHint(); FullQuery fullQuery = new FullQuery(query).withArg(row).withArg(ts); if (columnRangeSelection.getStartCol().length > 0) { fullQuery = fullQuery.withArg(columnRangeSelection.getStartCol()); } if (columnRangeSelection.getEndCol().length > 0) { fullQuery = fullQuery.withArg(columnRangeSelection.getEndCol()); } return fullQuery; }
@Override public ClosableIterator<Map.Entry<Cell, Value>> getBatch(int batchSize, @Nullable byte[] lastToken) { byte[] startCol = columnRangeSelection.getStartCol(); if (lastToken != null) { startCol = RangeRequests.nextLexicographicName(lastToken); } BatchColumnRangeSelection newRange = BatchColumnRangeSelection.create(startCol, columnRangeSelection.getEndCol(), batchSize); Map<byte[], RowColumnRangeIterator> range = keyValueService.getRowsColumnRange( tableRef, ImmutableList.of(row), newRange, timestamp); if (range.isEmpty()) { return ClosableIterators.wrap(ImmutableList.<Map.Entry<Cell, Value>>of().iterator()); } return ClosableIterators.wrap(Iterables.getOnlyElement(range.values())); }
@Override public boolean hasNext(byte[] lastToken) { if (RangeRequests.isLastRowName(lastToken)) { return false; } else { return !Arrays.equals(RangeRequests.nextLexicographicName(lastToken), columnRangeSelection.getEndCol()); } }
@Override protected TokenBackedBasicResultsPage<Entry<Cell, Value>, byte[]> getFirstPage() throws Exception { return page(batchColumnRangeSelection.getStartCol()); }
@Override public String toString() { return "multiget_slice(" + tableRef.getQualifiedName() + ", " + rows.size() + " rows, " + batchColumnRangeSelection.getBatchHint() + " max columns)"; } });
@Override protected FullQuery getRowsColumnRangeSubQuery( byte[] row, long ts, BatchColumnRangeSelection columnRangeSelection) { String query = " /* GET_ROWS_COLUMN_RANGE (" + tableName + ") */ " + " SELECT m.row_name, m.col_name, max(m.ts) as ts" + " FROM " + prefixedTableName() + " m " + " WHERE m.row_name = ? " + " AND m.ts < ? " + (columnRangeSelection.getStartCol().length > 0 ? " AND m.col_name >= ?" : "") + (columnRangeSelection.getEndCol().length > 0 ? " AND m.col_name < ?" : "") + " GROUP BY m.row_name, m.col_name" + " ORDER BY m.col_name ASC LIMIT " + columnRangeSelection.getBatchHint(); FullQuery fullQuery = new FullQuery(wrapQueryWithIncludeValue("GET_ROWS_COLUMN_RANGE", query, true)) .withArg(row) .withArg(ts); if (columnRangeSelection.getStartCol().length > 0) { fullQuery = fullQuery.withArg(columnRangeSelection.getStartCol()); } if (columnRangeSelection.getEndCol().length > 0) { fullQuery = fullQuery.withArg(columnRangeSelection.getEndCol()); } return fullQuery; }
@Override public ClosableIterator<Map.Entry<Cell, Value>> getBatch(int batchSize, @Nullable byte[] lastToken) { byte[] startCol = columnRangeSelection.getStartCol(); if (lastToken != null) { startCol = RangeRequests.nextLexicographicName(lastToken); } BatchColumnRangeSelection newRange = BatchColumnRangeSelection.create(startCol, columnRangeSelection.getEndCol(), batchSize); Map<byte[], RowColumnRangeIterator> range = keyValueService.getRowsColumnRange( tableRef, ImmutableList.of(row), newRange, timestamp); if (range.isEmpty()) { return ClosableIterators.wrap(ImmutableList.<Map.Entry<Cell, Value>>of().iterator()); } return ClosableIterators.wrap(Iterables.getOnlyElement(range.values())); }
private static BatchColumnRangeSelection nextLexicographicalRangeEnd( BatchColumnRangeSelection currentRange, byte[] rangeEnd) { if (rangeEnd.length != 0 && !RangeRequests.isTerminalRow(false, rangeEnd)) { return BatchColumnRangeSelection.create( currentRange.getStartCol(), RangeRequests.getNextStartRow(false, rangeEnd), currentRange.getBatchHint()); } else { return currentRange; } }
private boolean isEndOfColumnRange(boolean completedCell, byte[] lastCol, int numRawResults, BatchColumnRangeSelection columnRangeSelection) { return (numRawResults < columnRangeSelection.getBatchHint()) || (completedCell && (RangeRequests.isLastRowName(lastCol) || Arrays.equals( RangeRequests.nextLexicographicName(lastCol), columnRangeSelection.getEndCol()))); }
@Override public boolean hasNext(byte[] lastToken) { if (RangeRequests.isLastRowName(lastToken)) { return false; } else { return !Arrays.equals(RangeRequests.nextLexicographicName(lastToken), columnRangeSelection.getEndCol()); } }
@Override protected TokenBackedBasicResultsPage<Entry<Cell, Value>, byte[]> getFirstPage() throws Exception { return page(batchColumnRangeSelection.getStartCol()); }
keyValueService, tableRef, row, columnRangeSelection, getStartTimestamp()); BatchSizeIncreasingIterator<Map.Entry<Cell, Value>> batchIterator = new BatchSizeIncreasingIterator<>( batchProvider, columnRangeSelection.getBatchHint(), ClosableIterators.wrap(rawIterator)); Iterator<Iterator<Map.Entry<Cell, byte[]>>> postFilteredBatches = new AbstractIterator<Iterator<Map.Entry<Cell, byte[]>>>() {
public static BatchColumnRangeSelection valueOf(String serialized) { String[] split = deserializeRegex.split(serialized); byte[] startCol = PtBytes.decodeBase64(split[0]); byte[] endCol = PtBytes.decodeBase64(split[1]); int batchHint = Integer.parseInt(split[2]); return BatchColumnRangeSelection.create(startCol, endCol, batchHint); }
@Override public Map<byte[], RowColumnRangeIterator> getRowsColumnRange(TableReference tableRef, Iterable<byte[]> rows, BatchColumnRangeSelection batchColumnRangeSelection, long timestamp) { Map<byte[], RowColumnRangeIterator> result = Maps.newHashMap(); ConcurrentSkipListMap<Key, byte[]> table = getTableMap(tableRef).entries; ColumnRangeSelection columnRangeSelection = new ColumnRangeSelection( batchColumnRangeSelection.getStartCol(), batchColumnRangeSelection.getEndCol()); for (byte[] row : rows) { result.put(row, getColumnRangeForSingleRow(table, row, columnRangeSelection, timestamp)); } return result; }
ret.put(row, new LocalRowColumnRangeIterator(resultIterator)); } else { BatchColumnRangeSelection newColumnRange = BatchColumnRangeSelection.create(nextCol, batchColumnRangeSelection.getEndCol(), batchColumnRangeSelection.getBatchHint()); ret.put(row, new LocalRowColumnRangeIterator(Iterators.concat( resultIterator,