use of io.cdap.cdap.api.dataset.table.Row in project cdap by caskdata.
the class TableTest method testEmptyGet.
@Test
public void testEmptyGet() throws Exception {
DatasetAdmin admin = getTableAdmin(CONTEXT1, MY_TABLE);
admin.create();
try (Table myTable = getTable(CONTEXT1, MY_TABLE)) {
Transaction tx = txClient.startShort();
((TransactionAware) myTable).startTx(tx);
myTable.put(R1, C1, V1);
myTable.put(R1, C2, V2);
// to be used for validation later
TreeMap<byte[], byte[]> expectedColumns = new TreeMap<>(Bytes.BYTES_COMPARATOR);
expectedColumns.put(C1, V1);
expectedColumns.put(C2, V2);
Result expectedResult = new Result(R1, expectedColumns);
Result emptyResult = new Result(R1, ImmutableMap.<byte[], byte[]>of());
((TransactionAware) myTable).commitTx();
txClient.commitOrThrow(tx);
// start another transaction, so that the buffering table doesn't cache the values; the underlying Table
// implementations are tested this way.
tx = txClient.startShort();
((TransactionAware) myTable).startTx(tx);
Row row = myTable.get(R1, new byte[][] { C1, C2 });
assertEquals(expectedResult, row);
// passing in empty columns returns empty result
row = myTable.get(R1, new byte[][] {});
assertEquals(emptyResult, row);
// test all the Get constructors and their behavior
// constructors specifying only rowkey retrieve all columns
Get get = new Get(R1);
Assert.assertNull(get.getColumns());
assertEquals(expectedResult, myTable.get(get));
get = new Get(Bytes.toString(R1));
Assert.assertNull(get.getColumns());
assertEquals(expectedResult, myTable.get(get));
get.add(C1);
get.add(Bytes.toString(C2));
assertEquals(expectedResult, myTable.get(get));
// constructor specifying columns, but with an empty array/collection retrieve 0 columns
get = new Get(R1, new byte[][] {});
Assert.assertNotNull(get.getColumns());
assertEquals(emptyResult, myTable.get(get));
get = new Get(R1, ImmutableList.<byte[]>of());
Assert.assertNotNull(get.getColumns());
assertEquals(emptyResult, myTable.get(get));
get = new Get(Bytes.toString(R1), new String[] {});
Assert.assertNotNull(get.getColumns());
assertEquals(emptyResult, myTable.get(get));
get = new Get(Bytes.toString(R1), ImmutableList.<String>of());
Assert.assertNotNull(get.getColumns());
assertEquals(emptyResult, myTable.get(get));
row = myTable.get(R1, new byte[][] {});
assertEquals(emptyResult, row);
txClient.abort(tx);
} finally {
admin.drop();
}
}
use of io.cdap.cdap.api.dataset.table.Row in project cdap by caskdata.
the class TableTest method testStringPutGet.
private void testStringPutGet(Table t, String key, String col, String val) throws Exception {
Transaction tx = txClient.startShort();
((TransactionAware) t).startTx(tx);
t.put(new Put(key, col, val));
Row row = t.get(new Get(key));
Assert.assertTrue(!row.isEmpty());
Assert.assertEquals(key, Bytes.toString(row.getRow()));
Assert.assertEquals(1, row.getColumns().size());
Assert.assertEquals(col, Bytes.toString(row.getColumns().entrySet().iterator().next().getKey()));
Assert.assertEquals(val, Bytes.toString(row.getColumns().entrySet().iterator().next().getValue()));
Assert.assertEquals(val, Bytes.toString(row.get(col)));
Assert.assertEquals(val, row.getString(col));
((TransactionAware) t).rollbackTx();
txClient.abort(tx);
}
use of io.cdap.cdap.api.dataset.table.Row in project cdap by caskdata.
the class TableTest method testMultiGetWithEmpty.
@Test
public void testMultiGetWithEmpty() throws Exception {
DatasetAdmin admin = getTableAdmin(CONTEXT1, MY_TABLE);
admin.create();
try (Table myTable = getTable(CONTEXT1, MY_TABLE)) {
Transaction tx = txClient.startShort();
((TransactionAware) myTable).startTx(tx);
myTable.put(R1, C1, V1);
myTable.put(R1, C2, V2);
myTable.put(R1, C3, V3);
myTable.put(R1, C4, V4);
List<Get> gets = new ArrayList<>();
// the second and fourth Gets are requesting 0 columns. This tests correctness of batch-get logic, when there
// is/are empty Gets among them.
gets.add(new Get(R1, C1));
gets.add(new Get(R1, ImmutableList.<byte[]>of()));
gets.add(new Get(R1, C2, C3));
gets.add(new Get(R1, ImmutableList.<byte[]>of()));
gets.add(new Get(R1, C4));
List<Row> rows = myTable.get(gets);
// first off, the Gets at index two and four should be empty
Assert.assertEquals(0, rows.get(1).getColumns().size());
Assert.assertEquals(0, rows.get(3).getColumns().size());
// verify the results of the other Gets
Assert.assertEquals(1, rows.get(0).getColumns().size());
Assert.assertArrayEquals(V1, rows.get(0).get(C1));
Assert.assertEquals(2, rows.get(2).getColumns().size());
Assert.assertArrayEquals(V2, rows.get(2).get(C2));
Assert.assertArrayEquals(V3, rows.get(2).get(C3));
Assert.assertEquals(1, rows.get(4).getColumns().size());
Assert.assertArrayEquals(V4, rows.get(4).get(C4));
txClient.abort(tx);
} finally {
admin.drop();
}
}
use of io.cdap.cdap.api.dataset.table.Row in project cdap by caskdata.
the class MetricsTableTest method testFuzzyScan.
@Test
public void testFuzzyScan() throws Exception {
MetricsTable table = getTable("testFuzzyScan");
NavigableMap<byte[], SortedMap<byte[], Long>> writes = Maps.newTreeMap(Bytes.BYTES_COMPARATOR);
byte[] abc = { 'a', 'b', 'c' };
for (byte b1 : abc) {
for (byte b2 : abc) {
for (byte b3 : abc) {
for (byte b4 : abc) {
// we put two columns, but will scan only one column
writes.put(new byte[] { b1, b2, b3, b4 }, mapOf(A, Bytes.toLong(X)));
}
}
}
}
table.put(writes);
// we should have 81 (3^4) rows now
Assert.assertEquals(81, countRange(table, null, null));
// now do a fuzzy scan of the table
FuzzyRowFilter filter = new FuzzyRowFilter(ImmutableList.of(ImmutablePair.of(new byte[] { '*', 'b', '*', 'b' }, new byte[] { 0x01, 0x00, 0x01, 0x00 })));
Scanner scanner = table.scan(null, null, filter);
int count = 0;
while (true) {
Row entry = scanner.next();
if (entry == null) {
break;
}
Assert.assertTrue(entry.getRow()[1] == 'b' && entry.getRow()[3] == 'b');
Assert.assertEquals(1, entry.getColumns().size());
Assert.assertTrue(entry.getColumns().containsKey(A));
count++;
}
Assert.assertEquals(9, count);
}
use of io.cdap.cdap.api.dataset.table.Row in project cdap by caskdata.
the class BufferingTableTest method testMultiGetIncludesBuffer.
@Test
public void testMultiGetIncludesBuffer() throws Exception {
DatasetAdmin admin = getTableAdmin(CONTEXT1, MY_TABLE);
admin.create();
try (BufferingTable table = getTable(CONTEXT1, MY_TABLE)) {
// persist some data
Transaction tx1 = txClient.startShort();
table.startTx(tx1);
// writing a couple rows
// table should look like the following, with everything in the buffer
// c1 c2 c3 c4
// r1 1 2 3 -
// r2 - 3 2 1
table.put(R1, a(C1, C2, C3), lb(1, 2, 3));
table.put(R2, a(C2, C3, C4), lb(3, 2, 1));
// check that multi-get can see buffered writes
List<Row> rows = table.get(Lists.newArrayList(new Get(R1), new Get(R2)));
Assert.assertEquals(2, rows.size());
TableAssert.assertRow(rows.get(0), R1, a(C1, C2, C3), lb(1, 2, 3));
TableAssert.assertRow(rows.get(1), R2, a(C2, C3, C4), lb(3, 2, 1));
// check multi-get with gets that specify columns, and one get that should return an empty row
rows = table.get(Lists.newArrayList(new Get(R1, C2, C3), new Get(R2, C2, C3), new Get(R3)));
Assert.assertEquals(3, rows.size());
TableAssert.assertRow(rows.get(0), R1, a(C2, C3), lb(2, 3));
TableAssert.assertRow(rows.get(1), R2, a(C2, C3), lb(3, 2));
Assert.assertTrue(rows.get(2).isEmpty());
// persist changes
Collection<byte[]> txChanges = table.getTxChanges();
txClient.canCommitOrThrow(tx1, txChanges);
Assert.assertTrue(table.commitTx());
txClient.commitOrThrow(tx1);
table.postTxCommit();
// start another transaction
Transaction tx2 = txClient.startShort();
table.startTx(tx2);
// now add another row, delete a row, and change some column values
// table should look like the following
// c1 c2 c3 c4 c5
// r1 - - 3 2 -
// r3 - - - - 1
table.put(R1, a(C2, C3, C4), lb(4, 3, 2));
table.delete(R1, a(C1, C2));
table.delete(R2);
table.put(R3, C5, L1);
// verify multi-get sees persisted data with buffer applied on top
rows = table.get(Lists.newArrayList(new Get(R1), new Get(R2), new Get(R3)));
Assert.assertEquals(3, rows.size());
TableAssert.assertRow(rows.get(0), R1, a(C3, C4), lb(3, 2));
Assert.assertTrue(rows.get(1).isEmpty());
TableAssert.assertRow(rows.get(2), R3, a(C5), lb(1));
// pretend there was a write conflict and rollback changes
Assert.assertTrue(table.rollbackTx());
txClient.abort(tx2);
// start another transaction and make sure it can't see what was done before
Transaction tx3 = txClient.startShort();
table.startTx(tx3);
rows = table.get(Lists.newArrayList(new Get(R1), new Get(R2)));
Assert.assertEquals(2, rows.size());
TableAssert.assertRow(rows.get(0), R1, a(C1, C2, C3), lb(1, 2, 3));
TableAssert.assertRow(rows.get(1), R2, a(C2, C3, C4), lb(3, 2, 1));
} finally {
admin.drop();
}
}
Aggregations