@Override protected TokenBackedBasicResultsPage<Entry<Cell, Value>, byte[]> getFirstPage() throws Exception { return page(batchColumnRangeSelection.getStartCol()); }
@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)); } }
@Override public FullQuery getRowsColumnRangeQuery( Map<byte[], BatchColumnRangeSelection> columnRangeSelectionsByRow, long ts) { List<String> subQueries = new ArrayList<>(columnRangeSelectionsByRow.size()); int totalArgs = 0; for (BatchColumnRangeSelection columnRangeSelection : columnRangeSelectionsByRow.values()) { totalArgs += 2 + ((columnRangeSelection.getStartCol().length > 0) ? 1 : 0) + ((columnRangeSelection.getEndCol().length > 0) ? 1 : 0); } List<Object> args = new ArrayList<>(totalArgs); for (Map.Entry<byte[], BatchColumnRangeSelection> entry : columnRangeSelectionsByRow.entrySet()) { FullQuery query = getRowsColumnRangeSubQuery(entry.getKey(), ts, entry.getValue()); subQueries.add(query.getQuery()); for (Object arg : query.getArgs()) { args.add(arg); } } String query = Joiner.on(") UNION ALL (").appendTo(new StringBuilder("("), subQueries).append(")") .append(" ORDER BY row_name ASC, col_name ASC").toString(); return new FullQuery(query).withArgs(args); }
@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 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; }
SortedMap<byte[], Value> map = row.getValue().build(); Set<Map.Entry<byte[], Value>> subMap; if ((columnRangeSelection.getStartCol().length == 0) && (columnRangeSelection.getEndCol().length == 0)) { subMap = map.entrySet(); } else if (columnRangeSelection.getStartCol().length == 0) { subMap = map.headMap(columnRangeSelection.getEndCol()).entrySet(); } else if (columnRangeSelection.getEndCol().length == 0) { subMap = map.tailMap(columnRangeSelection.getStartCol()).entrySet(); } else { subMap = map.subMap(columnRangeSelection.getStartCol(), columnRangeSelection.getEndCol()).entrySet();
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 NavigableMap<Cell, byte[]> getReadsInColumnRangeSkippingWrites( TableReference table, byte[] row, BatchColumnRangeSelection range) { NavigableMap<Cell, byte[]> reads = getReadsForTable(table); Cell startCell = Cells.createSmallestCellForRow(row); if ((range.getStartCol() != null) && (range.getStartCol().length > 0)) { startCell = Cell.create(row, range.getStartCol()); } reads = reads.tailMap(startCell, true); if ((range.getEndCol() != null) && (range.getEndCol().length > 0)) { Cell endCell = Cell.create(row, range.getEndCol()); reads = reads.headMap(endCell, false); } else if (!RangeRequests.isLastRowName(row)) { Cell endCell = Cells.createSmallestCellForRow(RangeRequests.nextLexicographicName(row)); reads = reads.headMap(endCell, false); } ConcurrentNavigableMap<Cell, byte[]> writes = writesByTable.get(table); if (writes != null) { reads = Maps.filterKeys(reads, Predicates.not(Predicates.in(writes.keySet()))); } return reads; }
private SortedMap<Cell, byte[]> getLocalWritesForColumnRange( TableReference tableRef, BatchColumnRangeSelection columnRangeSelection, byte[] row) { SortedMap<Cell, byte[]> writes = getLocalWrites(tableRef); Cell startCell; if (columnRangeSelection.getStartCol().length != 0) { startCell = Cell.create(row, columnRangeSelection.getStartCol()); } else { startCell = Cells.createSmallestCellForRow(row); } writes = writes.tailMap(startCell); if (RangeRequests.isLastRowName(row)) { return writes; } Cell endCell; if (columnRangeSelection.getEndCol().length != 0) { endCell = Cell.create(row, columnRangeSelection.getEndCol()); } else { endCell = Cells.createSmallestCellForRow(RangeRequests.nextLexicographicName(row)); } writes = writes.headMap(endCell); return writes; }
@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 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; }
public static Arg<BatchColumnRangeSelection> batchColumnRangeSelection(TableReference tableReference, BatchColumnRangeSelection batchColumnRangeSelection) { String startCol = PtBytes.toString(batchColumnRangeSelection.getStartCol()); String endCol = PtBytes.toString(batchColumnRangeSelection.getEndCol()); return getArg("batchColumnRangeSelection", batchColumnRangeSelection, logArbitrator.isColumnNameSafe(tableReference, startCol) && logArbitrator.isColumnNameSafe(tableReference, endCol)); }
@Override public RowColumnRangeExtractor.RowColumnRangeResult apply(CassandraClient client) throws Exception { Range range = createColumnRange( batchColumnRangeSelection.getStartCol(), batchColumnRangeSelection.getEndCol(), startTs); Limit limit = Limit.of(batchColumnRangeSelection.getBatchHint()); SlicePredicate pred = SlicePredicates.create(range, limit); Map<ByteBuffer, List<ColumnOrSuperColumn>> results = wrappingQueryRunner.multiget( "getRowsColumnRange", client, tableRef, wrap(rows), pred, readConsistency); RowColumnRangeExtractor extractor = new RowColumnRangeExtractor(metricsManager); extractor.extractResults(rows, results, startTs); return extractor.getRowColumnRangeResult(); }
@Override protected TokenBackedBasicResultsPage<Entry<Cell, Value>, byte[]> getFirstPage() throws Exception { return page(batchColumnRangeSelection.getStartCol()); }
@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)); } }
@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 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; }
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; } }
public static Arg<BatchColumnRangeSelection> batchColumnRangeSelection(TableReference tableReference, BatchColumnRangeSelection batchColumnRangeSelection) { String startCol = PtBytes.toString(batchColumnRangeSelection.getStartCol()); String endCol = PtBytes.toString(batchColumnRangeSelection.getEndCol()); return getArg("batchColumnRangeSelection", batchColumnRangeSelection, logArbitrator.isColumnNameSafe(tableReference, startCol) && logArbitrator.isColumnNameSafe(tableReference, endCol)); }
@Override public RowColumnRangeExtractor.RowColumnRangeResult apply(CassandraClient client) throws Exception { Range range = createColumnRange( batchColumnRangeSelection.getStartCol(), batchColumnRangeSelection.getEndCol(), startTs); Limit limit = Limit.of(batchColumnRangeSelection.getBatchHint()); SlicePredicate pred = SlicePredicates.create(range, limit); Map<ByteBuffer, List<ColumnOrSuperColumn>> results = wrappingQueryRunner.multiget( "getRowsColumnRange", client, tableRef, wrap(rows), pred, readConsistency); RowColumnRangeExtractor extractor = new RowColumnRangeExtractor(metricsManager); extractor.extractResults(rows, results, startTs); return extractor.getRowColumnRangeResult(); }