@JsonCreator public static BatchColumnRangeSelection create(@JsonProperty("startCol") byte[] startCol, @JsonProperty("endCol") byte[] endCol, @JsonProperty("batchHint") int batchHint) { return new BatchColumnRangeSelection(new ColumnRangeSelection(startCol, endCol), batchHint); }
@Override public FullQuery getRowsColumnRangeCountsQuery( Iterable<byte[]> rows, long ts, ColumnRangeSelection columnRangeSelection) { String query = " /* GET_ROWS_COLUMN_RANGE_COUNT(" + tableName + ") */" + " SELECT m.row_name, COUNT(m.col_name) AS column_count " + " FROM " + tableName + " m, TABLE(CAST(? AS " + structArrayPrefix() + "CELL_TS_TABLE)) t " + " WHERE m.row_name = t.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"; FullQuery fullQuery = new FullQuery(query).withArgs(rowsToOracleArray(rows), 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 boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } BatchColumnRangeSelection other = (BatchColumnRangeSelection) obj; if (batchHint != other.batchHint) { return false; } if (columnRangeSelection == null) { if (other.columnRangeSelection != null) { return false; } } else if (!columnRangeSelection.equals(other.columnRangeSelection)) { return false; } return true; }
public byte[] getStartCol() { return columnRangeSelection.getStartCol(); }
public byte[] getEndCol() { return columnRangeSelection.getEndCol(); }
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + batchHint; result = prime * result + ((columnRangeSelection == null) ? 0 : columnRangeSelection.hashCode()); return result; }
public byte[] getStartCol() { return columnRangeSelection.getStartCol(); }
public byte[] getEndCol() { return columnRangeSelection.getEndCol(); }
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + batchHint; result = prime * result + ((columnRangeSelection == null) ? 0 : columnRangeSelection.hashCode()); return result; }
public static ColumnRangeSelection valueOf(String serialized) { // Pass in -1 to split so that it doesn't discard empty strings String[] split = deserializeRegex.split(serialized, -1); byte[] startCol = PtBytes.decodeBase64(split[0]); byte[] endCol = PtBytes.decodeBase64(split[1]); return new ColumnRangeSelection(startCol, endCol); }
@Override public FullQuery getRowsColumnRangeCountsQuery( Iterable<byte[]> rows, long ts, ColumnRangeSelection columnRangeSelection) { String query = " /* GET_ROWS_COLUMN_RANGE_COUNT(" + tableName + ") */" + " SELECT m.row_name, COUNT(m.col_name) AS column_count " + " FROM " + prefixedTableName() + " m " + " WHERE m.row_name IN " + numParams(Iterables.size(rows)) + " AND m.ts < ? " + (columnRangeSelection.getStartCol().length > 0 ? " AND m.col_name >= ?" : "") + (columnRangeSelection.getEndCol().length > 0 ? " AND m.col_name < ?" : "") + " GROUP BY m.row_name"; FullQuery fullQuery = new FullQuery(query).withArgs(rows).withArg(ts); if (columnRangeSelection.getStartCol().length > 0) { fullQuery = fullQuery.withArg(columnRangeSelection.getStartCol()); } if (columnRangeSelection.getEndCol().length > 0) { fullQuery = fullQuery.withArg(columnRangeSelection.getEndCol()); } return fullQuery; }
private static void assertColumnRangesInPartitionsMatchOriginal( RowsColumnRangeBatchRequest request, List<RowsColumnRangeBatchRequest> partitions) { Assert.assertEquals(request.getPartialFirstRow(), partitions.get(0).getPartialFirstRow()); Assert.assertEquals(request.getPartialLastRow(), partitions.get(partitions.size() - 1).getPartialLastRow()); for (RowsColumnRangeBatchRequest partition : partitions) { Assert.assertTrue(partition.getRowsToLoadFully().isEmpty() || partition.getColumnRangeSelection().equals(request.getColumnRangeSelection())); } }
private void getAllRowsAndAssert(WideRowTable table, Blackhole blackhole, Consumer<Integer> assertion) { int rowsRead = table.getTransactionManager().runTaskThrowOnConflict(txn -> { Iterator<Map.Entry<Cell, byte[]>> iter = txn.getRowsColumnRange( table.getTableRef(), Collections.singleton(Tables.ROW_BYTES.array()), new ColumnRangeSelection(null, null), 10000); int count = 0; while (iter.hasNext()) { blackhole.consume(iter.next()); ++count; } return count; }); assertion.accept(rowsRead); } }
@Override protected FullQuery getRowsColumnRangeFullyLoadedRowsSubQuery( List<byte[]> rows, long ts, ColumnRangeSelection columnRangeSelection) { String query = " /* GET_ROWS_COLUMN_RANGE_FULLY_LOADED_ROWS (" + tableName + ") */ " + "SELECT * FROM ( SELECT m.row_name, m.col_name, max(m.ts) as ts" + " FROM " + tableName + " m, TABLE(CAST(? AS " + structArrayPrefix() + "CELL_TS_TABLE)) t " + " WHERE m.row_name = t.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 )"; String wrappedQuery = wrapQueryWithIncludeValue("GET_ROWS_COLUMN_RANGE_FULLY_LOADED_ROWS", query, true); FullQuery fullQuery = new FullQuery(wrappedQuery).withArgs(rowsToOracleArray(rows), 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 boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } BatchColumnRangeSelection other = (BatchColumnRangeSelection) obj; if (batchHint != other.batchHint) { return false; } if (columnRangeSelection == null) { if (other.columnRangeSelection != null) { return false; } } else if (!columnRangeSelection.equals(other.columnRangeSelection)) { return false; } return true; }
@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; }
@Override protected FullQuery getRowsColumnRangeFullyLoadedRowsSubQuery( List<byte[]> rows, long ts, ColumnRangeSelection columnRangeSelection) { String query = " /* GET_ROWS_COLUMN_RANGE_FULLY_LOADED_ROW (" + tableName + ") */ " + " SELECT m.row_name, m.col_name, max(m.ts) as ts" + " FROM " + prefixedTableName() + " m " + " WHERE m.row_name IN " + numParams(Iterables.size(rows)) + " 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"; String wrappedQuery = wrapQueryWithIncludeValue("GET_ROWS_COLUMN_RANGE_FULLY_LOADED_ROW", query, true); FullQuery fullQuery = new FullQuery(wrappedQuery).withArgs(rows).withArg(ts); if (columnRangeSelection.getStartCol().length > 0) { fullQuery = fullQuery.withArg(columnRangeSelection.getStartCol()); } if (columnRangeSelection.getEndCol().length > 0) { fullQuery = fullQuery.withArg(columnRangeSelection.getEndCol()); } return fullQuery; } }
@Test public void testColumnRangeReadSupported() { Transaction t1 = startTransaction(); // The transactions table is registered as IGNORE_ALL, so the request is supported // Reading at timestamp 0 to avoid any repercussions for in-flight transactions t1.getRowsColumnRange(TransactionConstants.TRANSACTION_TABLE, ImmutableList.of(ValueType.VAR_LONG.convertFromJava(0L)), new ColumnRangeSelection(PtBytes.EMPTY_BYTE_ARRAY, PtBytes.EMPTY_BYTE_ARRAY), 1); }
public static Arg<ColumnRangeSelection> columnRangeSelection(TableReference tableReference, ColumnRangeSelection columnRangeSelection) { String startCol = PtBytes.toString(columnRangeSelection.getStartCol()); String endCol = PtBytes.toString(columnRangeSelection.getEndCol()); return getArg("columnRangeSelection", columnRangeSelection, logArbitrator.isColumnNameSafe(tableReference, startCol) && logArbitrator.isColumnNameSafe(tableReference, endCol)); }
@Override protected List<byte[]> getRange(Transaction txn, long startInclusive, long endExclusive) { KvDynamicColumnsTable table = BenchmarksTableFactory.of().getKvDynamicColumnsTable(txn); List<byte[]> data = Lists.newArrayList(); table.getRowsColumnRange( ImmutableSet.of(KvDynamicColumnsRow.of(bucket)), new ColumnRangeSelection( KvDynamicColumnsColumn.of(startInclusive).persistToBytes(), KvDynamicColumnsColumn.of(endExclusive).persistToBytes()), batchSize) .forEachRemaining(entry -> data.add(entry.getValue().getValue())); return data; }