public class

UniquenessConstraint

extends Object
package com.netflix.astyanax.recipes;

import com.google.common.base.Supplier;
import com.netflix.astyanax.Keyspace;
import com.netflix.astyanax.MutationBatch;
import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
import com.netflix.astyanax.model.ColumnFamily;
import com.netflix.astyanax.model.ColumnList;
import com.netflix.astyanax.model.ConsistencyLevel;

@Deprecated
public class UniquenessConstraint<K, C> {
    private final ColumnFamily<K, C> columnFamily;
    private final Keyspace keyspace;
    private final Supplier<C> uniqueColumnSupplier;
    private Integer ttl;
    private ConsistencyLevel consistencyLevel = ConsistencyLevel.CL_QUORUM;
    private UniquenessConstraintViolationMonitor<K, C> monitor;

    public UniquenessConstraint(Keyspace keyspace, ColumnFamily<K, C> columnFamily, Supplier<C> uniqueColumnSupplier) {
        this.keyspace = keyspace;
        this.columnFamily = columnFamily;
        this.uniqueColumnSupplier = uniqueColumnSupplier;
    }

    public UniquenessConstraint<K, C> setTtl(Integer ttl) {
        this.ttl = ttl;
        return this;
    }

    public UniquenessConstraint<K, C> setMonitor(UniquenessConstraintViolationMonitor<K, C> monitor) {
        this.monitor = monitor;
        return this;
    }

    public C isUnique(K key) throws ConnectionException {
        C unique = uniqueColumnSupplier.get();

        // Phase 1: Write a unique column
        MutationBatch m = keyspace.prepareMutationBatch().setConsistencyLevel(consistencyLevel);
        m.withRow(columnFamily, key).putEmptyColumn(unique, ttl);
        m.execute();

        // Phase 2: Read back all columns. There should be only 1
        ColumnList<C> result = keyspace.prepareQuery(columnFamily).setConsistencyLevel(consistencyLevel).getKey(key)
                .execute().getResult();

        if (result.size() == 1) {
            return unique;
        }

        if (this.monitor != null)
            this.monitor.onViolation(key, unique);

        // Rollback
        m = keyspace.prepareMutationBatch().setConsistencyLevel(consistencyLevel);
        m.withRow(columnFamily, key).deleteColumn(unique);
        m.execute();
        return null;
    }
}