Search in sources :

Example 16 with PutIf

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;
    }
}
Also used : PutIfNotExists(com.scalar.db.api.PutIfNotExists) PutIf(com.scalar.db.api.PutIf) MutationCondition(com.scalar.db.api.MutationCondition) Mutation(com.scalar.db.api.Mutation) Put(com.scalar.db.api.Put) PutIfExists(com.scalar.db.api.PutIfExists) Nonnull(javax.annotation.Nonnull)

Example 17 with PutIf

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);
}
Also used : PutIfNotExists(com.scalar.db.api.PutIfNotExists) PutIf(com.scalar.db.api.PutIf) ConditionalExpression(com.scalar.db.api.ConditionalExpression) Value(com.scalar.db.io.Value) Attribute.toIdValue(com.scalar.db.transaction.consensuscommit.Attribute.toIdValue) Attribute.toVersionValue(com.scalar.db.transaction.consensuscommit.Attribute.toVersionValue) ArrayList(java.util.ArrayList) Put(com.scalar.db.api.Put)

Example 18 with PutIf

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);
}
Also used : PutIfNotExists(com.scalar.db.api.PutIfNotExists) PutIf(com.scalar.db.api.PutIf) ConditionalExpression(com.scalar.db.api.ConditionalExpression) Put(com.scalar.db.api.Put)

Example 19 with PutIf

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());
}
Also used : PutIf(com.scalar.db.api.PutIf) HashMap(java.util.HashMap) ConditionalExpression(com.scalar.db.api.ConditionalExpression) TextValue(com.scalar.db.io.TextValue) Value(com.scalar.db.io.Value) Attribute.toIdValue(com.scalar.db.transaction.consensuscommit.Attribute.toIdValue) Attribute.toStateValue(com.scalar.db.transaction.consensuscommit.Attribute.toStateValue) Put(com.scalar.db.api.Put)

Example 20 with PutIf

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));
}
Also used : PutIf(com.scalar.db.api.PutIf) Get(com.scalar.db.api.Get) ConditionalExpression(com.scalar.db.api.ConditionalExpression) Put(com.scalar.db.api.Put) Test(org.junit.jupiter.api.Test)

Aggregations

PutIf (com.scalar.db.api.PutIf)34 ConditionalExpression (com.scalar.db.api.ConditionalExpression)30 Put (com.scalar.db.api.Put)26 Test (org.junit.jupiter.api.Test)25 Get (com.scalar.db.api.Get)8 IntValue (com.scalar.db.io.IntValue)8 TextValue (com.scalar.db.io.TextValue)7 Key (com.scalar.db.io.Key)6 PutIfNotExists (com.scalar.db.api.PutIfNotExists)5 Result (com.scalar.db.api.Result)5 Test (org.junit.Test)5 Scan (com.scalar.db.api.Scan)4 MutationCondition (com.scalar.db.api.MutationCondition)3 Value (com.scalar.db.io.Value)3 HashMap (java.util.HashMap)3 Delete (com.scalar.db.api.Delete)2 Attribute.toIdValue (com.scalar.db.transaction.consensuscommit.Attribute.toIdValue)2 Mutation (com.scalar.db.api.Mutation)1 PutIfExists (com.scalar.db.api.PutIfExists)1 BooleanValue (com.scalar.db.io.BooleanValue)1