Java Code Examples for org.apache.cassandra.config.CFMetaData#isCounter()

The following examples show how to use org.apache.cassandra.config.CFMetaData#isCounter() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: CreateIndexStatement.java    From stratio-cassandra with Apache License 2.0 4 votes vote down vote up
public void validate(ClientState state) throws RequestValidationException
{
    CFMetaData cfm = ThriftValidation.validateColumnFamily(keyspace(), columnFamily());
    if (cfm.isCounter())
        throw new InvalidRequestException("Secondary indexes are not supported on counter tables");

    IndexTarget target = rawTarget.prepare(cfm);
    ColumnDefinition cd = cfm.getColumnDefinition(target.column);

    if (cd == null)
        throw new InvalidRequestException("No column definition found for column " + target.column);

    boolean isMap = cd.type instanceof MapType;
    boolean isFrozenCollection = cd.type.isCollection() && !cd.type.isMultiCell();
    if (target.isCollectionKeys)
    {
        if (!isMap)
            throw new InvalidRequestException("Cannot create index on keys of column " + target + " with non-map type");
        if (!cd.type.isMultiCell())
            throw new InvalidRequestException("Cannot create index on keys of frozen<map> column " + target);
    }
    else if (target.isFullCollection)
    {
        if (!isFrozenCollection)
            throw new InvalidRequestException("full() indexes can only be created on frozen collections");
    }
    else if (isFrozenCollection)
    {
        throw new InvalidRequestException("Frozen collections currently only support full-collection indexes. " +
                                          "For example, 'CREATE INDEX ON <table>(full(<columnName>))'.");
    }

    if (cd.getIndexType() != null)
    {
        boolean previousIsKeys = cd.hasIndexOption(SecondaryIndex.INDEX_KEYS_OPTION_NAME);
        if (isMap && target.isCollectionKeys != previousIsKeys)
        {
            String msg = "Cannot create index on %s %s, an index on %s %s already exists and indexing "
                    + "a map on both keys and values at the same time is not currently supported";
            throw new InvalidRequestException(String.format(msg,
                                                            target.column, target.isCollectionKeys ? "keys" : "values",
                                                            target.column, previousIsKeys ? "keys" : "values"));
        }

        if (ifNotExists)
            return;
        else
            throw new InvalidRequestException("Index already exists");
    }

    properties.validate(cfm);

    // TODO: we could lift that limitation
    if ((cfm.comparator.isDense() || !cfm.comparator.isCompound()) && cd.kind != ColumnDefinition.Kind.REGULAR)
        throw new InvalidRequestException("Secondary indexes are not supported on PRIMARY KEY columns in COMPACT STORAGE tables");

    // It would be possible to support 2ndary index on static columns (but not without modifications of at least ExtendedFilter and
    // CompositesIndex) and maybe we should, but that means a query like:
    //     SELECT * FROM foo WHERE static_column = 'bar'
    // would pull the full partition every time the static column of partition is 'bar', which sounds like offering a
    // fair potential for foot-shooting, so I prefer leaving that to a follow up ticket once we have identified cases where
    // such indexing is actually useful.
    if (cd.isStatic())
        throw new InvalidRequestException("Secondary indexes are not allowed on static columns");

    if (cd.kind == ColumnDefinition.Kind.PARTITION_KEY && cd.isOnAllComponents())
        throw new InvalidRequestException(String.format("Cannot create secondary index on partition key column %s", target.column));
}
 
Example 2
Source File: CassandraServer.java    From stratio-cassandra with Apache License 2.0 4 votes vote down vote up
private List<IMutation> createMutationList(ConsistencyLevel consistency_level,
                                           Map<ByteBuffer,Map<String,List<Mutation>>> mutation_map,
                                           boolean allowCounterMutations)
throws RequestValidationException
{
    List<IMutation> mutations = new ArrayList<>();
    ThriftClientState cState = state();
    String keyspace = cState.getKeyspace();

    for (Map.Entry<ByteBuffer, Map<String, List<Mutation>>> mutationEntry: mutation_map.entrySet())
    {
        ByteBuffer key = mutationEntry.getKey();

        // We need to separate mutation for standard cf and counter cf (that will be encapsulated in a
        // CounterMutation) because it doesn't follow the same code path
        org.apache.cassandra.db.Mutation standardMutation = null;
        org.apache.cassandra.db.Mutation counterMutation = null;

        Map<String, List<Mutation>> columnFamilyToMutations = mutationEntry.getValue();
        for (Map.Entry<String, List<Mutation>> columnFamilyMutations : columnFamilyToMutations.entrySet())
        {
            String cfName = columnFamilyMutations.getKey();

            cState.hasColumnFamilyAccess(keyspace, cfName, Permission.MODIFY);

            CFMetaData metadata = ThriftValidation.validateColumnFamily(keyspace, cfName);
            ThriftValidation.validateKey(metadata, key);

            org.apache.cassandra.db.Mutation mutation;
            if (metadata.isCounter())
            {
                ThriftConversion.fromThrift(consistency_level).validateCounterForWrite(metadata);
                counterMutation = counterMutation == null ? new org.apache.cassandra.db.Mutation(keyspace, key) : counterMutation;
                mutation = counterMutation;
            }
            else
            {
                standardMutation = standardMutation == null ? new org.apache.cassandra.db.Mutation(keyspace, key) : standardMutation;
                mutation = standardMutation;
            }

            for (Mutation m : columnFamilyMutations.getValue())
            {
                ThriftValidation.validateMutation(metadata, m);

                if (m.deletion != null)
                {
                    deleteColumnOrSuperColumn(mutation, metadata, m.deletion);
                }
                if (m.column_or_supercolumn != null)
                {
                    addColumnOrSuperColumn(mutation, metadata, m.column_or_supercolumn);
                }
            }
        }
        if (standardMutation != null && !standardMutation.isEmpty())
            mutations.add(standardMutation);

        if (counterMutation != null && !counterMutation.isEmpty())
        {
            if (allowCounterMutations)
                mutations.add(new CounterMutation(counterMutation, ThriftConversion.fromThrift(consistency_level)));
            else
                throw new org.apache.cassandra.exceptions.InvalidRequestException("Counter mutations are not allowed in atomic batches");
        }
    }

    return mutations;
}