use of com.scalar.db.api.PutIf in project scalardb by scalar-labs.
the class CosmosMutation method getMutationType.
@Nonnull
public MutationType getMutationType() {
Mutation mutation = (Mutation) getOperation();
if (!mutation.getCondition().isPresent()) {
if (mutation instanceof Put) {
return MutationType.PUT;
} else {
return MutationType.DELETE_IF;
}
}
MutationCondition condition = mutation.getCondition().get();
if (condition instanceof PutIfNotExists) {
return MutationType.PUT_IF_NOT_EXISTS;
} else if (condition instanceof PutIfExists || condition instanceof PutIf) {
return MutationType.PUT_IF;
} else {
return MutationType.DELETE_IF;
}
}
use of com.scalar.db.api.PutIf in project scalardb by scalar-labs.
the class PrepareMutationComposer method add.
private void add(Delete base, TransactionResult result) {
Put put = new Put(base.getPartitionKey(), getClusteringKey(base, result).orElse(null)).forNamespace(base.forNamespace().get()).forTable(base.forTable().get()).withConsistency(Consistency.LINEARIZABLE);
List<Value<?>> values = new ArrayList<>();
values.add(Attribute.toIdValue(id));
values.add(Attribute.toStateValue(TransactionState.DELETED));
values.add(Attribute.toPreparedAtValue(current));
if (result != null) {
values.addAll(createBeforeValues(base, result));
int version = result.getVersion();
values.add(Attribute.toVersionValue(version + 1));
// check if the record is not interrupted by other conflicting transactions
put.withCondition(new PutIf(new ConditionalExpression(VERSION, toVersionValue(version), Operator.EQ), new ConditionalExpression(ID, toIdValue(result.getId()), Operator.EQ)));
} else {
put.withValue(Attribute.toVersionValue(1));
// check if the record is not created by other conflicting transactions
put.withCondition(new PutIfNotExists());
}
put.withValues(values);
mutations.add(put);
}
use of com.scalar.db.api.PutIf in project scalardb by scalar-labs.
the class PrepareMutationComposer method add.
private void add(Put base, TransactionResult result) {
Put put = new Put(base.getPartitionKey(), getClusteringKey(base, result).orElse(null)).forNamespace(base.forNamespace().get()).forTable(base.forTable().get()).withConsistency(Consistency.LINEARIZABLE);
put.withValue(Attribute.toIdValue(id));
put.withValue(Attribute.toStateValue(TransactionState.PREPARED));
put.withValue(Attribute.toPreparedAtValue(current));
base.getColumns().values().forEach(put::withValue);
if (result != null) {
// overwrite existing record
put.withValues(createBeforeValues(base, result));
int version = result.getVersion();
put.withValue(Attribute.toVersionValue(version + 1));
// check if the record is not interrupted by other conflicting transactions
put.withCondition(new PutIf(new ConditionalExpression(VERSION, toVersionValue(version), Operator.EQ), new ConditionalExpression(ID, toIdValue(result.getId()), Operator.EQ)));
} else {
// initial record
put.withValue(Attribute.toVersionValue(1));
// check if the record is not created by other conflicting transactions
put.withCondition(new PutIfNotExists());
}
mutations.add(put);
}
use of com.scalar.db.api.PutIf in project scalardb by scalar-labs.
the class RollbackMutationComposer method composePut.
private Put composePut(Operation base, TransactionResult result) throws ExecutionException {
assert result.getState().equals(TransactionState.PREPARED) || result.getState().equals(TransactionState.DELETED);
TransactionalTableMetadata metadata = tableMetadataManager.getTransactionalTableMetadata(base);
LinkedHashSet<String> beforeImageColumnNames = metadata.getBeforeImageColumnNames();
Map<String, Value<?>> map = new HashMap<>();
result.getValues().forEach((k, v) -> {
if (beforeImageColumnNames.contains(k)) {
String key = k.substring(Attribute.BEFORE_PREFIX.length());
map.put(key, v.copyWith(key));
}
});
return new Put(getPartitionKey(base, result), getClusteringKey(base, result).orElse(null)).forNamespace(base.forNamespace().get()).forTable(base.forTable().get()).withCondition(new PutIf(new ConditionalExpression(ID, toIdValue(id), Operator.EQ), new ConditionalExpression(STATE, toStateValue(result.getState()), Operator.EQ))).withConsistency(Consistency.LINEARIZABLE).withValues(map.values());
}
use of com.scalar.db.api.PutIf in project scalardb by scalar-labs.
the class RollbackMutationComposerTest method add_PutAndResultFromSnapshotGivenAndPreparedResultGivenFromStorage_ShouldComposePut.
@Test
public void add_PutAndResultFromSnapshotGivenAndPreparedResultGivenFromStorage_ShouldComposePut() throws ExecutionException {
// Arrange
composer = new RollbackMutationComposer(ANY_ID_2, storage, tableMetadataManager, mutations);
TransactionResult resultInSnapshot = prepareInitialResult(ANY_ID_1, TransactionState.COMMITTED);
TransactionResult result = prepareResult(TransactionState.PREPARED);
when(storage.get(any(Get.class))).thenReturn(Optional.of(result));
Put put = preparePut();
// Act
composer.add(put, resultInSnapshot);
// Assert
Put actual = (Put) mutations.get(0);
Put expected = new Put(put.getPartitionKey(), put.getClusteringKey().orElse(null)).forNamespace(put.forNamespace().get()).forTable(put.forTable().get());
expected.withConsistency(Consistency.LINEARIZABLE);
expected.withCondition(new PutIf(new ConditionalExpression(ID, toIdValue(ANY_ID_2), Operator.EQ), new ConditionalExpression(STATE, toStateValue(TransactionState.PREPARED), Operator.EQ)));
expected.withValues(extractAfterValues(resultInSnapshot));
assertThat(actual).isEqualTo(expected);
verify(storage).get(any(Get.class));
}
Aggregations