use of com.scalar.db.api.Put in project scalardb by scalar-labs.
the class JdbcTransactionIntegrationTest method prepareTransfer.
private JdbcTransaction prepareTransfer(int fromId, int toId, int amount) throws TransactionException {
JdbcTransaction transaction = manager.start();
List<Get> gets = prepareGets(NAMESPACE, TABLE);
Optional<Result> fromResult = transaction.get(gets.get(fromId));
assertThat(fromResult.isPresent()).isTrue();
IntValue fromBalance = new IntValue(BALANCE, getBalance(fromResult.get()) - amount);
Optional<Result> toResult = transaction.get(gets.get(toId));
assertThat(toResult.isPresent()).isTrue();
IntValue toBalance = new IntValue(BALANCE, getBalance(toResult.get()) + amount);
List<Put> puts = preparePuts(NAMESPACE, TABLE);
puts.get(fromId).withValue(fromBalance);
puts.get(toId).withValue(toBalance);
transaction.put(puts.get(fromId));
transaction.put(puts.get(toId));
return transaction;
}
use of com.scalar.db.api.Put in project scalardb by scalar-labs.
the class BatchHandlerTest method handle_MultiPartitionOperationsGiven_ShouldCallTransactWriteItems.
@Test
public void handle_MultiPartitionOperationsGiven_ShouldCallTransactWriteItems() {
// Arrange
when(client.transactWriteItems(any(TransactWriteItemsRequest.class))).thenReturn(transactWriteResponse);
Put put1 = preparePut();
Key partitionKey = new Key(ANY_NAME_1, ANY_TEXT_3);
Key clusteringKey = new Key(ANY_NAME_2, ANY_TEXT_3);
Put put2 = new Put(partitionKey, clusteringKey).forNamespace(ANY_NAMESPACE_NAME).forTable(ANY_TABLE_NAME).withValue(ANY_NAME_3, ANY_INT_1).withValue(ANY_NAME_4, ANY_INT_2);
// Act Assert
assertThatCode(() -> handler.handle(Arrays.asList(put1, put2))).doesNotThrowAnyException();
// Assert
verify(client).transactWriteItems(any(TransactWriteItemsRequest.class));
}
use of com.scalar.db.api.Put in project scalardb by scalar-labs.
the class DistributedTransactionServiceWithConsensusCommitWithExtraWriteIntegrationTest method commit_WriteSkewOnNonExistingRecordsWithSerializableWithExtraWrite_OneShouldCommitTheOtherShouldThrowCommitConflictException.
private void commit_WriteSkewOnNonExistingRecordsWithSerializableWithExtraWrite_OneShouldCommitTheOtherShouldThrowCommitConflictException(String table1, String table2) throws TransactionException {
// Arrange
// no records
// Act
GrpcTransaction transaction1 = manager.start();
GrpcTransaction transaction2 = manager.start();
Get get1_1 = prepareGet(0, 1, table2);
Optional<Result> result1 = transaction1.get(get1_1);
Get get1_2 = prepareGet(0, 0, table1);
transaction1.get(get1_2);
int current1 = 0;
Get get2_1 = prepareGet(0, 0, table1);
Optional<Result> result2 = transaction2.get(get2_1);
Get get2_2 = prepareGet(0, 1, table2);
transaction2.get(get2_2);
int current2 = 0;
Put put1 = preparePut(0, 0, table1).withValue(BALANCE, current1 + 1);
transaction1.put(put1);
Put put2 = preparePut(0, 1, table2).withValue(BALANCE, current2 + 1);
transaction2.put(put2);
Throwable thrown1 = catchThrowable(transaction1::commit);
Throwable thrown2 = catchThrowable(transaction2::commit);
// Assert
assertThat(result1.isPresent()).isFalse();
assertThat(result2.isPresent()).isFalse();
GrpcTransaction transaction = manager.start();
result1 = transaction.get(get1_1);
result2 = transaction.get(get2_1);
transaction.commit();
assertThat(result1.isPresent()).isFalse();
assertThat(result2).isPresent();
assertThat(getBalance(result2.get())).isEqualTo(1);
assertThat(thrown1).doesNotThrowAnyException();
assertThat(thrown2).isInstanceOf(CommitConflictException.class);
}
use of com.scalar.db.api.Put in project scalardb by scalar-labs.
the class DistributedTransactionServiceWithJdbcTransactionIntegrationTest method preparePut.
private Put preparePut(int id, int type, String namespace, String table) {
Key partitionKey = new Key(ACCOUNT_ID, id);
Key clusteringKey = new Key(ACCOUNT_TYPE, type);
return new Put(partitionKey, clusteringKey).forNamespace(namespace).forTable(table).withConsistency(Consistency.LINEARIZABLE);
}
use of com.scalar.db.api.Put in project scalardb by scalar-labs.
the class DistributedTransactionServiceWithJdbcTransactionIntegrationTest method populateRecords.
private void populateRecords() throws TransactionException {
GrpcTransaction transaction = manager.start();
IntStream.range(0, NUM_ACCOUNTS).forEach(i -> IntStream.range(0, NUM_TYPES).forEach(j -> {
Key partitionKey = new Key(ACCOUNT_ID, i);
Key clusteringKey = new Key(ACCOUNT_TYPE, j);
Put put = new Put(partitionKey, clusteringKey).forNamespace(NAMESPACE).forTable(TABLE).withValue(BALANCE, INITIAL_BALANCE);
try {
transaction.put(put);
} catch (CrudException e) {
throw new RuntimeException(e);
}
}));
transaction.commit();
}
Aggregations