http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java index ecabd2f..7560e2f 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java @@ -27,21 +27,20 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.cassandra.auth.Permission; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.ColumnDefinition; -import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.CFName; import org.apache.cassandra.cql3.ColumnIdentifier; import org.apache.cassandra.cql3.IndexName; -import org.apache.cassandra.cql3.Validation; import org.apache.cassandra.db.marshal.MapType; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.exceptions.RequestValidationException; import org.apache.cassandra.exceptions.UnauthorizedException; +import org.apache.cassandra.schema.ColumnMetadata; import org.apache.cassandra.schema.IndexMetadata; import org.apache.cassandra.schema.Indexes; +import org.apache.cassandra.schema.MigrationManager; +import org.apache.cassandra.schema.Schema; +import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.service.ClientState; -import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.transport.Event; @@ -75,20 +74,20 @@ public class CreateIndexStatement extends SchemaAlteringStatement public void validate(ClientState state) throws RequestValidationException { - CFMetaData cfm = Validation.validateColumnFamily(keyspace(), columnFamily()); + TableMetadata table = Schema.instance.validateTable(keyspace(), columnFamily()); - if (cfm.isCounter()) + if (table.isCounter()) throw new InvalidRequestException("Secondary indexes are not supported on counter tables"); - if (cfm.isView()) + if (table.isView()) throw new InvalidRequestException("Secondary indexes are not supported on materialized views"); - if (cfm.isCompactTable() && !cfm.isStaticCompactTable()) + if (table.isCompactTable() && !table.isStaticCompactTable()) throw new InvalidRequestException("Secondary indexes are not supported on COMPACT STORAGE tables that have clustering columns"); List<IndexTarget> targets = new ArrayList<>(rawTargets.size()); for (IndexTarget.Raw rawTarget : rawTargets) - targets.add(rawTarget.prepare(cfm)); + targets.add(rawTarget.prepare(table)); if (targets.isEmpty() && !properties.isCustom) throw new InvalidRequestException("Only CUSTOM indexes can be created without specifying a target column"); @@ -98,16 +97,16 @@ public class CreateIndexStatement extends SchemaAlteringStatement for (IndexTarget target : targets) { - ColumnDefinition cd = cfm.getColumnDefinition(target.column); + ColumnMetadata cd = table.getColumn(target.column); if (cd == null) throw new InvalidRequestException("No column definition found for column " + target.column); // TODO: we could lift that limitation - if (cfm.isCompactTable() && cd.isPrimaryKeyColumn()) + if (table.isCompactTable() && cd.isPrimaryKeyColumn()) throw new InvalidRequestException("Secondary indexes are not supported on PRIMARY KEY columns in COMPACT STORAGE tables"); - if (cd.kind == ColumnDefinition.Kind.PARTITION_KEY && cfm.getKeyValidatorAsClusteringComparator().size() == 1) + if (cd.kind == ColumnMetadata.Kind.PARTITION_KEY && table.partitionKeyColumns().size() == 1) throw new InvalidRequestException(String.format("Cannot create secondary index on partition key column %s", target.column)); boolean isMap = cd.type instanceof MapType; @@ -126,7 +125,7 @@ public class CreateIndexStatement extends SchemaAlteringStatement if (!Strings.isNullOrEmpty(indexName)) { - if (Schema.instance.getKSMetaData(keyspace()).existingIndexNames(null).contains(indexName)) + if (Schema.instance.getKeyspaceMetadata(keyspace()).existingIndexNames(null).contains(indexName)) { if (ifNotExists) return; @@ -152,7 +151,7 @@ public class CreateIndexStatement extends SchemaAlteringStatement throw new InvalidRequestException("full() indexes can only be created on frozen collections"); } - private void validateIsSimpleIndexIfTargetColumnNotCollection(ColumnDefinition cd, IndexTarget target) throws InvalidRequestException + private void validateIsSimpleIndexIfTargetColumnNotCollection(ColumnMetadata cd, IndexTarget target) throws InvalidRequestException { if (!cd.type.isCollection() && target.type != IndexTarget.Type.SIMPLE) throw new InvalidRequestException(String.format("Cannot create %s() index on %s. " + @@ -183,10 +182,10 @@ public class CreateIndexStatement extends SchemaAlteringStatement public Event.SchemaChange announceMigration(QueryState queryState, boolean isLocalOnly) throws RequestValidationException { - CFMetaData cfm = Schema.instance.getCFMetaData(keyspace(), columnFamily()).copy(); + TableMetadata current = Schema.instance.getTableMetadata(keyspace(), columnFamily()); List<IndexTarget> targets = new ArrayList<>(rawTargets.size()); for (IndexTarget.Raw rawTarget : rawTargets) - targets.add(rawTarget.prepare(cfm)); + targets.add(rawTarget.prepare(current)); String acceptedName = indexName; if (Strings.isNullOrEmpty(acceptedName)) @@ -196,7 +195,7 @@ public class CreateIndexStatement extends SchemaAlteringStatement targets.size() == 1 ? targets.get(0).column.toString() : null); } - if (Schema.instance.getKSMetaData(keyspace()).existingIndexNames(null).contains(acceptedName)) + if (Schema.instance.getKeyspaceMetadata(keyspace()).existingIndexNames(null).contains(acceptedName)) { if (ifNotExists) return null; @@ -214,13 +213,13 @@ public class CreateIndexStatement extends SchemaAlteringStatement else { indexOptions = Collections.emptyMap(); - kind = cfm.isCompound() ? IndexMetadata.Kind.COMPOSITES : IndexMetadata.Kind.KEYS; + kind = current.isCompound() ? IndexMetadata.Kind.COMPOSITES : IndexMetadata.Kind.KEYS; } - IndexMetadata index = IndexMetadata.fromIndexTargets(cfm, targets, acceptedName, kind, indexOptions); + IndexMetadata index = IndexMetadata.fromIndexTargets(targets, acceptedName, kind, indexOptions); // check to disallow creation of an index which duplicates an existing one in all but name - Optional<IndexMetadata> existingIndex = Iterables.tryFind(cfm.getIndexes(), existing -> existing.equalsWithoutName(index)); + Optional<IndexMetadata> existingIndex = Iterables.tryFind(current.indexes, existing -> existing.equalsWithoutName(index)); if (existingIndex.isPresent()) { if (ifNotExists) @@ -231,10 +230,14 @@ public class CreateIndexStatement extends SchemaAlteringStatement existingIndex.get().name)); } + TableMetadata updated = + current.unbuild() + .indexes(current.indexes.with(index)) + .build(); + logger.trace("Updating index definition for {}", indexName); - cfm.indexes(cfm.getIndexes().with(index)); - MigrationManager.announceColumnFamilyUpdate(cfm, isLocalOnly); + MigrationManager.announceTableUpdate(updated, isLocalOnly); // Creating an index is akin to updating the CF return new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, Event.SchemaChange.Target.TABLE, keyspace(), columnFamily());
http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/CreateKeyspaceStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateKeyspaceStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateKeyspaceStatement.java index b1e63fb..f859ff7 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CreateKeyspaceStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/CreateKeyspaceStatement.java @@ -20,13 +20,14 @@ package org.apache.cassandra.cql3.statements; import java.util.regex.Pattern; import org.apache.cassandra.auth.*; -import org.apache.cassandra.cql3.Validation; import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.config.SchemaConstants; import org.apache.cassandra.exceptions.*; import org.apache.cassandra.locator.LocalStrategy; import org.apache.cassandra.schema.KeyspaceMetadata; import org.apache.cassandra.schema.KeyspaceParams; +import org.apache.cassandra.schema.MigrationManager; +import org.apache.cassandra.schema.Schema; +import org.apache.cassandra.schema.SchemaConstants; import org.apache.cassandra.service.*; import org.apache.cassandra.transport.Event; @@ -74,7 +75,7 @@ public class CreateKeyspaceStatement extends SchemaAlteringStatement */ public void validate(ClientState state) throws RequestValidationException { - Validation.validateKeyspaceNotSystem(name); + Schema.validateKeyspaceNotSystem(name); // keyspace name if (!PATTERN_WORD_CHARS.matcher(name).matches()) http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java index aabd221..1b09c0b 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java @@ -30,11 +30,8 @@ import org.apache.cassandra.cql3.*; import org.apache.cassandra.db.*; import org.apache.cassandra.db.marshal.*; import org.apache.cassandra.exceptions.*; -import org.apache.cassandra.schema.KeyspaceMetadata; -import org.apache.cassandra.schema.TableParams; -import org.apache.cassandra.schema.Types; +import org.apache.cassandra.schema.*; import org.apache.cassandra.service.ClientState; -import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.transport.Event; @@ -61,9 +58,9 @@ public class CreateTableStatement extends SchemaAlteringStatement private final Set<ColumnIdentifier> staticColumns; private final TableParams params; private final boolean ifNotExists; - private final UUID id; + private final TableId id; - public CreateTableStatement(CFName name, TableParams params, boolean ifNotExists, Set<ColumnIdentifier> staticColumns, UUID id) + public CreateTableStatement(CFName name, TableParams params, boolean ifNotExists, Set<ColumnIdentifier> staticColumns, TableId id) { super(name); this.params = params; @@ -86,7 +83,7 @@ public class CreateTableStatement extends SchemaAlteringStatement { try { - MigrationManager.announceNewColumnFamily(getCFMetaData(), isLocalOnly); + MigrationManager.announceNewTable(toTableMetadata(), isLocalOnly); return new Event.SchemaChange(Event.SchemaChange.Change.CREATED, Event.SchemaChange.Target.TABLE, keyspace(), columnFamily()); } catch (AlreadyExistsException e) @@ -113,12 +110,33 @@ public class CreateTableStatement extends SchemaAlteringStatement } } - public CFMetaData.Builder metadataBuilder() + /** + */ + public static TableMetadata.Builder parse(String cql, String keyspace) + { + CreateTableStatement.RawStatement raw = CQLFragmentParser.parseAny(CqlParser::createTableStatement, cql, "CREATE TABLE"); + raw.prepareKeyspace(keyspace); + CreateTableStatement prepared = (CreateTableStatement) raw.prepare(Types.none()).statement; + return prepared.builder(); + } + + public TableMetadata.Builder builder() { - CFMetaData.Builder builder = CFMetaData.Builder.create(keyspace(), columnFamily(), isDense, isCompound, hasCounters); - builder.withId(id); + TableMetadata.Builder builder = TableMetadata.builder(keyspace(), columnFamily()); + + if (id != null) + builder.id(id); + + builder.isDense(isDense) + .isCompound(isCompound) + .isCounter(hasCounters) + .isSuper(false) + .isView(false) + .params(params); + for (int i = 0; i < keyAliases.size(); i++) - builder.addPartitionKey(keyAliases.get(i), keyTypes.get(i)); + builder.addPartitionKeyColumn(keyAliases.get(i), keyTypes.get(i)); + for (int i = 0; i < columnAliases.size(); i++) builder.addClusteringColumn(columnAliases.get(i), clusteringTypes.get(i)); @@ -136,14 +154,14 @@ public class CreateTableStatement extends SchemaAlteringStatement boolean isCompactTable = isDense || !isCompound; if (isCompactTable) { - CompactTables.DefaultNames names = CompactTables.defaultNameGenerator(builder.usedColumnNames()); + CompactTables.DefaultNames names = CompactTables.defaultNameGenerator(builder.columnNames()); // Compact tables always have a clustering and a single regular value. if (isStaticCompact) { builder.addClusteringColumn(names.defaultClusteringName(), UTF8Type.instance); builder.addRegularColumn(names.defaultCompactValueName(), hasCounters ? CounterColumnType.instance : BytesType.instance); } - else if (isDense && !builder.hasRegulars()) + else if (isDense && !builder.hasRegularColumns()) { // Even for dense, we might not have our regular column if it wasn't part of the declaration. If // that's the case, add it but with a specific EmptyType so we can recognize that case later @@ -155,20 +173,14 @@ public class CreateTableStatement extends SchemaAlteringStatement } /** - * Returns a CFMetaData instance based on the parameters parsed from this + * Returns a TableMetadata instance based on the parameters parsed from this * {@code CREATE} statement, or defaults where applicable. * - * @return a CFMetaData instance corresponding to the values parsed from this statement - * @throws InvalidRequestException on failure to validate parsed parameters + * @return a TableMetadata instance corresponding to the values parsed from this statement */ - public CFMetaData getCFMetaData() - { - return metadataBuilder().build().params(params); - } - - public TableParams params() + public TableMetadata toTableMetadata() { - return params; + return builder().build(); } public static class RawStatement extends CFStatement @@ -195,7 +207,7 @@ public class CreateTableStatement extends SchemaAlteringStatement */ public ParsedStatement.Prepared prepare() throws RequestValidationException { - KeyspaceMetadata ksm = Schema.instance.getKSMetaData(keyspace()); + KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(keyspace()); if (ksm == null) throw new ConfigurationException(String.format("Keyspace %s doesn't exist", keyspace())); return prepare(ksm.types); http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/CreateTriggerStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateTriggerStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateTriggerStatement.java index 8f84e4a..0f12b9c 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CreateTriggerStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/CreateTriggerStatement.java @@ -20,18 +20,17 @@ package org.apache.cassandra.cql3.statements; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.CFName; -import org.apache.cassandra.cql3.Validation; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.exceptions.RequestValidationException; import org.apache.cassandra.exceptions.UnauthorizedException; +import org.apache.cassandra.schema.MigrationManager; +import org.apache.cassandra.schema.Schema; +import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.schema.TriggerMetadata; import org.apache.cassandra.schema.Triggers; import org.apache.cassandra.service.ClientState; -import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.transport.Event; import org.apache.cassandra.triggers.TriggerExecutor; @@ -59,8 +58,8 @@ public class CreateTriggerStatement extends SchemaAlteringStatement public void validate(ClientState state) throws RequestValidationException { - CFMetaData cfm = Validation.validateColumnFamily(keyspace(), columnFamily()); - if (cfm.isView()) + TableMetadata metadata = Schema.instance.validateTable(keyspace(), columnFamily()); + if (metadata.isView()) throw new InvalidRequestException("Cannot CREATE TRIGGER against a materialized view"); try @@ -75,8 +74,8 @@ public class CreateTriggerStatement extends SchemaAlteringStatement public Event.SchemaChange announceMigration(QueryState queryState, boolean isLocalOnly) throws ConfigurationException, InvalidRequestException { - CFMetaData cfm = Schema.instance.getCFMetaData(keyspace(), columnFamily()).copy(); - Triggers triggers = cfm.getTriggers(); + TableMetadata current = Schema.instance.getTableMetadata(keyspace(), columnFamily()); + Triggers triggers = current.triggers; if (triggers.get(triggerName).isPresent()) { @@ -86,9 +85,14 @@ public class CreateTriggerStatement extends SchemaAlteringStatement throw new InvalidRequestException(String.format("Trigger %s already exists", triggerName)); } - cfm.triggers(triggers.with(TriggerMetadata.create(triggerName, triggerClass))); + TableMetadata updated = + current.unbuild() + .triggers(triggers.with(TriggerMetadata.create(triggerName, triggerClass))) + .build(); + logger.info("Adding trigger with name {} and class {}", triggerName, triggerClass); - MigrationManager.announceColumnFamilyUpdate(cfm, isLocalOnly); + + MigrationManager.announceTableUpdate(updated, isLocalOnly); return new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, Event.SchemaChange.Target.TABLE, keyspace(), columnFamily()); } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/CreateTypeStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateTypeStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateTypeStatement.java index ff9af75..4462bc2 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CreateTypeStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/CreateTypeStatement.java @@ -21,15 +21,15 @@ import java.util.*; import java.util.stream.Collectors; import org.apache.cassandra.auth.Permission; -import org.apache.cassandra.config.*; import org.apache.cassandra.cql3.*; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.UserType; import org.apache.cassandra.exceptions.*; import org.apache.cassandra.schema.KeyspaceMetadata; +import org.apache.cassandra.schema.MigrationManager; +import org.apache.cassandra.schema.Schema; import org.apache.cassandra.schema.Types; import org.apache.cassandra.service.ClientState; -import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.transport.Event; @@ -67,7 +67,7 @@ public class CreateTypeStatement extends SchemaAlteringStatement public void validate(ClientState state) throws RequestValidationException { - KeyspaceMetadata ksm = Schema.instance.getKSMetaData(name.getKeyspace()); + KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(name.getKeyspace()); if (ksm == null) throw new InvalidRequestException(String.format("Cannot add type in unknown keyspace %s", name.getKeyspace())); @@ -120,7 +120,7 @@ public class CreateTypeStatement extends SchemaAlteringStatement public Event.SchemaChange announceMigration(QueryState queryState, boolean isLocalOnly) throws InvalidRequestException, ConfigurationException { - KeyspaceMetadata ksm = Schema.instance.getKSMetaData(name.getKeyspace()); + KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(name.getKeyspace()); assert ksm != null; // should haven't validate otherwise // Can happen with ifNotExists http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/CreateViewStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateViewStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateViewStatement.java index cf5be1e..8e92534 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CreateViewStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/CreateViewStatement.java @@ -24,10 +24,6 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import org.apache.cassandra.auth.Permission; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.ColumnDefinition; -import org.apache.cassandra.config.Schema; -import org.apache.cassandra.config.ViewDefinition; import org.apache.cassandra.cql3.*; import org.apache.cassandra.cql3.restrictions.StatementRestrictions; import org.apache.cassandra.cql3.selection.RawSelector; @@ -40,9 +36,13 @@ import org.apache.cassandra.exceptions.AlreadyExistsException; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.exceptions.RequestValidationException; import org.apache.cassandra.exceptions.UnauthorizedException; +import org.apache.cassandra.schema.ColumnMetadata; +import org.apache.cassandra.schema.MigrationManager; +import org.apache.cassandra.schema.Schema; +import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.schema.TableParams; +import org.apache.cassandra.schema.ViewMetadata; import org.apache.cassandra.service.ClientState; -import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.transport.Event; @@ -51,8 +51,8 @@ public class CreateViewStatement extends SchemaAlteringStatement private final CFName baseName; private final List<RawSelector> selectClause; private final WhereClause whereClause; - private final List<ColumnDefinition.Raw> partitionKeys; - private final List<ColumnDefinition.Raw> clusteringKeys; + private final List<ColumnMetadata.Raw> partitionKeys; + private final List<ColumnMetadata.Raw> clusteringKeys; public final CFProperties properties = new CFProperties(); private final boolean ifNotExists; @@ -60,8 +60,8 @@ public class CreateViewStatement extends SchemaAlteringStatement CFName baseName, List<RawSelector> selectClause, WhereClause whereClause, - List<ColumnDefinition.Raw> partitionKeys, - List<ColumnDefinition.Raw> clusteringKeys, + List<ColumnMetadata.Raw> partitionKeys, + List<ColumnMetadata.Raw> clusteringKeys, boolean ifNotExists) { super(viewName); @@ -91,11 +91,11 @@ public class CreateViewStatement extends SchemaAlteringStatement void add(ColumnIdentifier identifier, AbstractType<?> type); } - private void add(CFMetaData baseCfm, Iterable<ColumnIdentifier> columns, AddColumn adder) + private void add(TableMetadata baseCfm, Iterable<ColumnIdentifier> columns, AddColumn adder) { for (ColumnIdentifier column : columns) { - AbstractType<?> type = baseCfm.getColumnDefinition(column).type; + AbstractType<?> type = baseCfm.getColumn(column).type; if (properties.definedOrdering.containsKey(column)) { boolean desc = properties.definedOrdering.get(column); @@ -133,14 +133,14 @@ public class CreateViewStatement extends SchemaAlteringStatement if (!baseName.getKeyspace().equals(keyspace())) throw new InvalidRequestException("Cannot create a materialized view on a table in a separate keyspace"); - CFMetaData cfm = Validation.validateColumnFamily(baseName.getKeyspace(), baseName.getColumnFamily()); + TableMetadata metadata = Schema.instance.validateTable(baseName.getKeyspace(), baseName.getColumnFamily()); - if (cfm.isCounter()) + if (metadata.isCounter()) throw new InvalidRequestException("Materialized views are not supported on counter tables"); - if (cfm.isView()) + if (metadata.isView()) throw new InvalidRequestException("Materialized views cannot be created against other materialized views"); - if (cfm.params.gcGraceSeconds == 0) + if (metadata.params.gcGraceSeconds == 0) { throw new InvalidRequestException(String.format("Cannot create materialized view '%s' for base table " + "'%s' with gc_grace_seconds of 0, since this value is " + @@ -163,21 +163,21 @@ public class CreateViewStatement extends SchemaAlteringStatement if (selector.alias != null) throw new InvalidRequestException("Cannot use alias when defining a materialized view"); - Selectable s = selectable.prepare(cfm); + Selectable s = selectable.prepare(metadata); if (s instanceof Term.Raw) throw new InvalidRequestException("Cannot use terms in selection when defining a materialized view"); - ColumnDefinition cdef = (ColumnDefinition)s; + ColumnMetadata cdef = (ColumnMetadata)s; included.add(cdef.name); } - Set<ColumnDefinition.Raw> targetPrimaryKeys = new HashSet<>(); - for (ColumnDefinition.Raw identifier : Iterables.concat(partitionKeys, clusteringKeys)) + Set<ColumnMetadata.Raw> targetPrimaryKeys = new HashSet<>(); + for (ColumnMetadata.Raw identifier : Iterables.concat(partitionKeys, clusteringKeys)) { if (!targetPrimaryKeys.add(identifier)) throw new InvalidRequestException("Duplicate entry found in PRIMARY KEY: "+identifier); - ColumnDefinition cdef = identifier.prepare(cfm); + ColumnMetadata cdef = identifier.prepare(metadata); if (cdef.type.isMultiCell()) throw new InvalidRequestException(String.format("Cannot use MultiCell column '%s' in PRIMARY KEY of materialized view", identifier)); @@ -190,8 +190,8 @@ public class CreateViewStatement extends SchemaAlteringStatement } // build the select statement - Map<ColumnDefinition.Raw, Boolean> orderings = Collections.emptyMap(); - List<ColumnDefinition.Raw> groups = Collections.emptyList(); + Map<ColumnMetadata.Raw, Boolean> orderings = Collections.emptyMap(); + List<ColumnMetadata.Raw> groups = Collections.emptyList(); SelectStatement.Parameters parameters = new SelectStatement.Parameters(orderings, groups, false, true, false); SelectStatement.RawStatement rawSelect = new SelectStatement.RawStatement(baseName, parameters, selectClause, whereClause, null, null); @@ -212,7 +212,7 @@ public class CreateViewStatement extends SchemaAlteringStatement String whereClauseText = View.relationsToWhereClause(whereClause.relations); Set<ColumnIdentifier> basePrimaryKeyCols = new HashSet<>(); - for (ColumnDefinition definition : Iterables.concat(cfm.partitionKeyColumns(), cfm.clusteringColumns())) + for (ColumnMetadata definition : Iterables.concat(metadata.partitionKeyColumns(), metadata.clusteringColumns())) basePrimaryKeyCols.add(definition.name); List<ColumnIdentifier> targetClusteringColumns = new ArrayList<>(); @@ -220,11 +220,11 @@ public class CreateViewStatement extends SchemaAlteringStatement // This is only used as an intermediate state; this is to catch whether multiple non-PK columns are used boolean hasNonPKColumn = false; - for (ColumnDefinition.Raw raw : partitionKeys) - hasNonPKColumn |= getColumnIdentifier(cfm, basePrimaryKeyCols, hasNonPKColumn, raw, targetPartitionKeys, restrictions); + for (ColumnMetadata.Raw raw : partitionKeys) + hasNonPKColumn |= getColumnIdentifier(metadata, basePrimaryKeyCols, hasNonPKColumn, raw, targetPartitionKeys, restrictions); - for (ColumnDefinition.Raw raw : clusteringKeys) - hasNonPKColumn |= getColumnIdentifier(cfm, basePrimaryKeyCols, hasNonPKColumn, raw, targetClusteringColumns, restrictions); + for (ColumnMetadata.Raw raw : clusteringKeys) + hasNonPKColumn |= getColumnIdentifier(metadata, basePrimaryKeyCols, hasNonPKColumn, raw, targetClusteringColumns, restrictions); // We need to include all of the primary key columns from the base table in order to make sure that we do not // overwrite values in the view. We cannot support "collapsing" the base table into a smaller number of rows in @@ -234,7 +234,7 @@ public class CreateViewStatement extends SchemaAlteringStatement boolean missingClusteringColumns = false; StringBuilder columnNames = new StringBuilder(); List<ColumnIdentifier> includedColumns = new ArrayList<>(); - for (ColumnDefinition def : cfm.allColumns()) + for (ColumnMetadata def : metadata.columns()) { ColumnIdentifier identifier = def.name; boolean includeDef = included.isEmpty() || included.contains(identifier); @@ -281,21 +281,23 @@ public class CreateViewStatement extends SchemaAlteringStatement "the corresponding data in the parent table."); } - CFMetaData.Builder cfmBuilder = CFMetaData.Builder.createView(keyspace(), columnFamily()); - add(cfm, targetPartitionKeys, cfmBuilder::addPartitionKey); - add(cfm, targetClusteringColumns, cfmBuilder::addClusteringColumn); - add(cfm, includedColumns, cfmBuilder::addRegularColumn); - cfmBuilder.withId(properties.properties.getId()); - - CFMetaData viewCfm = cfmBuilder.build().params(params); - ViewDefinition definition = new ViewDefinition(keyspace(), - columnFamily(), - Schema.instance.getId(keyspace(), baseName.getColumnFamily()), - baseName.getColumnFamily(), - included.isEmpty(), - rawSelect, - whereClauseText, - viewCfm); + TableMetadata.Builder builder = + TableMetadata.builder(keyspace(), columnFamily(), properties.properties.getId()) + .isView(true) + .params(params); + + add(metadata, targetPartitionKeys, builder::addPartitionKeyColumn); + add(metadata, targetClusteringColumns, builder::addClusteringColumn); + add(metadata, includedColumns, builder::addRegularColumn); + + ViewMetadata definition = new ViewMetadata(keyspace(), + columnFamily(), + metadata.id, + metadata.name, + included.isEmpty(), + rawSelect, + whereClauseText, + builder.build()); try { @@ -310,14 +312,14 @@ public class CreateViewStatement extends SchemaAlteringStatement } } - private static boolean getColumnIdentifier(CFMetaData cfm, + private static boolean getColumnIdentifier(TableMetadata cfm, Set<ColumnIdentifier> basePK, boolean hasNonPKColumn, - ColumnDefinition.Raw raw, + ColumnMetadata.Raw raw, List<ColumnIdentifier> columns, StatementRestrictions restrictions) { - ColumnDefinition def = raw.prepare(cfm); + ColumnMetadata def = raw.prepare(cfm); boolean isPk = basePK.contains(def.name); if (!isPk && hasNonPKColumn) http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java b/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java index 10f3d6f..e880bf8 100644 --- a/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java @@ -19,8 +19,6 @@ package org.apache.cassandra.cql3.statements; import java.util.List; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.cql3.*; import org.apache.cassandra.cql3.conditions.ColumnCondition; import org.apache.cassandra.cql3.conditions.Conditions; @@ -29,6 +27,8 @@ import org.apache.cassandra.db.Clustering; import org.apache.cassandra.db.Slice; import org.apache.cassandra.db.partitions.PartitionUpdate; import org.apache.cassandra.exceptions.InvalidRequestException; +import org.apache.cassandra.schema.ColumnMetadata; +import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.utils.Pair; import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse; @@ -40,7 +40,7 @@ import static org.apache.cassandra.cql3.statements.RequestValidations.checkTrue; public class DeleteStatement extends ModificationStatement { private DeleteStatement(int boundTerms, - CFMetaData cfm, + TableMetadata cfm, Operations operations, StatementRestrictions restrictions, Conditions conditions, @@ -53,6 +53,8 @@ public class DeleteStatement extends ModificationStatement public void addUpdateForKey(PartitionUpdate update, Clustering clustering, UpdateParameters params) throws InvalidRequestException { + TableMetadata metadata = metadata(); + List<Operation> regularDeletions = getRegularOperations(); List<Operation> staticDeletions = getStaticOperations(); @@ -64,7 +66,7 @@ public class DeleteStatement extends ModificationStatement update.addPartitionDeletion(params.deletionTime()); } // ... or a row deletion ... - else if (clustering.size() == cfm.clusteringColumns().size()) + else if (clustering.size() == metadata.clusteringColumns().size()) { params.newRow(clustering); params.addRowDeletion(); @@ -73,7 +75,7 @@ public class DeleteStatement extends ModificationStatement // ... or a range of rows deletion. else { - update.add(params.makeRangeTombstone(cfm.comparator, clustering)); + update.add(params.makeRangeTombstone(metadata.comparator, clustering)); } } else @@ -83,7 +85,7 @@ public class DeleteStatement extends ModificationStatement // if the clustering size is zero but there are some clustering columns, it means that it's a // range deletion (the full partition) in which case we need to throw an error as range deletion // do not support specific columns - checkFalse(clustering.size() == 0 && cfm.clusteringColumns().size() != 0, + checkFalse(clustering.size() == 0 && metadata.clusteringColumns().size() != 0, "Range deletions are not supported for specific columns"); params.newRow(clustering); @@ -124,7 +126,7 @@ public class DeleteStatement extends ModificationStatement Attributes.Raw attrs, List<Operation.RawDeletion> deletions, WhereClause whereClause, - List<Pair<ColumnDefinition.Raw, ColumnCondition.Raw>> conditions, + List<Pair<ColumnMetadata.Raw, ColumnCondition.Raw>> conditions, boolean ifExists) { super(name, StatementType.DELETE, attrs, conditions, false, ifExists); @@ -134,7 +136,7 @@ public class DeleteStatement extends ModificationStatement @Override - protected ModificationStatement prepareInternal(CFMetaData cfm, + protected ModificationStatement prepareInternal(TableMetadata metadata, VariableSpecifications boundNames, Conditions conditions, Attributes attrs) @@ -143,25 +145,25 @@ public class DeleteStatement extends ModificationStatement for (Operation.RawDeletion deletion : deletions) { - ColumnDefinition def = getColumnDefinition(cfm, deletion.affectedColumn()); + ColumnMetadata def = getColumnDefinition(metadata, deletion.affectedColumn()); // For compact, we only have one value except the key, so the only form of DELETE that make sense is without a column // list. However, we support having the value name for coherence with the static/sparse case checkFalse(def.isPrimaryKeyColumn(), "Invalid identifier %s for deletion (should not be a PRIMARY KEY part)", def.name); - Operation op = deletion.prepare(cfm.ksName, def, cfm); + Operation op = deletion.prepare(metadata.keyspace, def, metadata); op.collectMarkerSpecification(boundNames); operations.add(op); } - StatementRestrictions restrictions = newRestrictions(cfm, + StatementRestrictions restrictions = newRestrictions(metadata, boundNames, operations, whereClause, conditions); DeleteStatement stmt = new DeleteStatement(boundNames.size(), - cfm, + metadata, operations, restrictions, conditions, http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java index 6f41af5..1a02903 100644 --- a/src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java @@ -22,16 +22,15 @@ import java.util.Collection; import java.util.List; import org.apache.cassandra.auth.Permission; -import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.CQL3Type; -import org.apache.cassandra.cql3.Validation; import org.apache.cassandra.cql3.functions.*; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.exceptions.RequestValidationException; import org.apache.cassandra.exceptions.UnauthorizedException; +import org.apache.cassandra.schema.MigrationManager; +import org.apache.cassandra.schema.Schema; import org.apache.cassandra.service.ClientState; -import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.transport.Event; @@ -64,7 +63,7 @@ public final class DropAggregateStatement extends SchemaAlteringStatement if (!functionName.hasKeyspace()) throw new InvalidRequestException("Functions must be fully qualified with a keyspace name if a keyspace is not set for the session"); - Validation.validateKeyspaceNotSystem(functionName.keyspace); + Schema.validateKeyspaceNotSystem(functionName.keyspace); } public void checkAccess(ClientState state) throws UnauthorizedException, InvalidRequestException @@ -92,7 +91,7 @@ public final class DropAggregateStatement extends SchemaAlteringStatement Function old = null; if (argsPresent) { - if (Schema.instance.getKSMetaData(functionName.keyspace) != null) + if (Schema.instance.getKeyspaceMetadata(functionName.keyspace) != null) { List<AbstractType<?>> argTypes = new ArrayList<>(argRawTypes.size()); for (CQL3Type.Raw rawType : argRawTypes) http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java index e098d0a..87bfff8 100644 --- a/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java @@ -25,17 +25,16 @@ import com.google.common.base.Joiner; import org.apache.cassandra.auth.FunctionResource; import org.apache.cassandra.auth.Permission; -import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.CQL3Type; -import org.apache.cassandra.cql3.Validation; import org.apache.cassandra.cql3.functions.*; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.exceptions.RequestValidationException; import org.apache.cassandra.exceptions.UnauthorizedException; import org.apache.cassandra.schema.KeyspaceMetadata; +import org.apache.cassandra.schema.MigrationManager; +import org.apache.cassandra.schema.Schema; import org.apache.cassandra.service.ClientState; -import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.transport.Event; @@ -65,7 +64,7 @@ public final class DropFunctionStatement extends SchemaAlteringStatement @Override public Prepared prepare() throws InvalidRequestException { - if (Schema.instance.getKSMetaData(functionName.keyspace) != null) + if (Schema.instance.getKeyspaceMetadata(functionName.keyspace) != null) { argTypes = new ArrayList<>(argRawTypes.size()); for (CQL3Type.Raw rawType : argRawTypes) @@ -94,7 +93,7 @@ public final class DropFunctionStatement extends SchemaAlteringStatement if (!functionName.hasKeyspace()) throw new InvalidRequestException("Functions must be fully qualified with a keyspace name if a keyspace is not set for the session"); - Validation.validateKeyspaceNotSystem(functionName.keyspace); + Schema.validateKeyspaceNotSystem(functionName.keyspace); } public void checkAccess(ClientState state) throws UnauthorizedException, InvalidRequestException @@ -139,7 +138,7 @@ public final class DropFunctionStatement extends SchemaAlteringStatement throw new InvalidRequestException(getMissingFunctionError()); } - KeyspaceMetadata ksm = Schema.instance.getKSMetaData(old.name().keyspace); + KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(old.name().keyspace); Collection<UDAggregate> referrers = ksm.functions.aggregatesUsingFunction(old); if (!referrers.isEmpty()) throw new InvalidRequestException(String.format("Function '%s' still referenced by %s", old, referrers)); http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java index fcd06d4..2420f3b 100644 --- a/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java @@ -18,15 +18,15 @@ package org.apache.cassandra.cql3.statements; import org.apache.cassandra.auth.Permission; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.Schema; +import org.apache.cassandra.schema.TableMetadata; +import org.apache.cassandra.schema.Schema; import org.apache.cassandra.cql3.IndexName; import org.apache.cassandra.cql3.QueryOptions; import org.apache.cassandra.db.KeyspaceNotDefinedException; import org.apache.cassandra.exceptions.*; import org.apache.cassandra.schema.KeyspaceMetadata; import org.apache.cassandra.service.ClientState; -import org.apache.cassandra.service.MigrationManager; +import org.apache.cassandra.schema.MigrationManager; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.transport.Event; import org.apache.cassandra.transport.messages.ResultMessage; @@ -45,17 +45,17 @@ public class DropIndexStatement extends SchemaAlteringStatement public String columnFamily() { - CFMetaData cfm = lookupIndexedTable(); - return cfm == null ? null : cfm.cfName; + TableMetadata metadata = lookupIndexedTable(); + return metadata == null ? null : metadata.name; } public void checkAccess(ClientState state) throws UnauthorizedException, InvalidRequestException { - CFMetaData cfm = lookupIndexedTable(); - if (cfm == null) + TableMetadata metadata = lookupIndexedTable(); + if (metadata == null) return; - state.hasColumnFamilyAccess(cfm.ksName, cfm.cfName, Permission.ALTER); + state.hasColumnFamilyAccess(metadata.keyspace, metadata.name, Permission.ALTER); } public void validate(ClientState state) @@ -72,17 +72,20 @@ public class DropIndexStatement extends SchemaAlteringStatement public Event.SchemaChange announceMigration(QueryState queryState, boolean isLocalOnly) throws InvalidRequestException, ConfigurationException { - CFMetaData cfm = lookupIndexedTable(); - if (cfm == null) + TableMetadata current = lookupIndexedTable(); + if (current == null) return null; - CFMetaData updatedCfm = cfm.copy(); - updatedCfm.indexes(updatedCfm.getIndexes().without(indexName)); - MigrationManager.announceColumnFamilyUpdate(updatedCfm, isLocalOnly); + TableMetadata updated = + current.unbuild() + .indexes(current.indexes.without(indexName)) + .build(); + + MigrationManager.announceTableUpdate(updated, isLocalOnly); // Dropping an index is akin to updating the CF // Note that we shouldn't call columnFamily() at this point because the index has been dropped and the call to lookupIndexedTable() // in that method would now throw. - return new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, Event.SchemaChange.Target.TABLE, cfm.ksName, cfm.cfName); + return new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, Event.SchemaChange.Target.TABLE, current.keyspace, current.name); } /** @@ -94,9 +97,9 @@ public class DropIndexStatement extends SchemaAlteringStatement * @throws InvalidRequestException if the index cannot be found and "IF EXISTS" is not * set on the statement. */ - private CFMetaData lookupIndexedTable() + private TableMetadata lookupIndexedTable() { - KeyspaceMetadata ksm = Schema.instance.getKSMetaData(keyspace()); + KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(keyspace()); if (ksm == null) throw new KeyspaceNotDefinedException("Keyspace " + keyspace() + " does not exist"); http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/DropKeyspaceStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/DropKeyspaceStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropKeyspaceStatement.java index 6930891..21040f9 100644 --- a/src/java/org/apache/cassandra/cql3/statements/DropKeyspaceStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/DropKeyspaceStatement.java @@ -18,13 +18,13 @@ package org.apache.cassandra.cql3.statements; import org.apache.cassandra.auth.Permission; -import org.apache.cassandra.cql3.Validation; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.exceptions.RequestValidationException; import org.apache.cassandra.exceptions.UnauthorizedException; +import org.apache.cassandra.schema.MigrationManager; +import org.apache.cassandra.schema.Schema; import org.apache.cassandra.service.ClientState; -import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.transport.Event; @@ -47,7 +47,7 @@ public class DropKeyspaceStatement extends SchemaAlteringStatement public void validate(ClientState state) throws RequestValidationException { - Validation.validateKeyspaceNotSystem(keyspace); + Schema.validateKeyspaceNotSystem(keyspace); } @Override http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/DropTableStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/DropTableStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropTableStatement.java index 5641185..83b787e 100644 --- a/src/java/org/apache/cassandra/cql3/statements/DropTableStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/DropTableStatement.java @@ -18,16 +18,16 @@ package org.apache.cassandra.cql3.statements; import org.apache.cassandra.auth.Permission; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.ViewDefinition; -import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.CFName; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.exceptions.UnauthorizedException; import org.apache.cassandra.schema.KeyspaceMetadata; +import org.apache.cassandra.schema.MigrationManager; +import org.apache.cassandra.schema.Schema; +import org.apache.cassandra.schema.TableMetadata; +import org.apache.cassandra.schema.ViewMetadata; import org.apache.cassandra.service.ClientState; -import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.transport.Event; @@ -63,25 +63,25 @@ public class DropTableStatement extends SchemaAlteringStatement { try { - KeyspaceMetadata ksm = Schema.instance.getKSMetaData(keyspace()); + KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(keyspace()); if (ksm == null) throw new ConfigurationException(String.format("Cannot drop table in unknown keyspace '%s'", keyspace())); - CFMetaData cfm = ksm.getTableOrViewNullable(columnFamily()); - if (cfm != null) + TableMetadata metadata = ksm.getTableOrViewNullable(columnFamily()); + if (metadata != null) { - if (cfm.isView()) + if (metadata.isView()) throw new InvalidRequestException("Cannot use DROP TABLE on Materialized View"); boolean rejectDrop = false; StringBuilder messageBuilder = new StringBuilder(); - for (ViewDefinition def : ksm.views) + for (ViewMetadata def : ksm.views) { - if (def.baseTableId.equals(cfm.cfId)) + if (def.baseTableId.equals(metadata.id)) { if (rejectDrop) messageBuilder.append(','); rejectDrop = true; - messageBuilder.append(def.viewName); + messageBuilder.append(def.name); } } if (rejectDrop) @@ -91,7 +91,7 @@ public class DropTableStatement extends SchemaAlteringStatement messageBuilder.toString())); } } - MigrationManager.announceColumnFamilyDrop(keyspace(), columnFamily(), isLocalOnly); + MigrationManager.announceTableDrop(keyspace(), columnFamily(), isLocalOnly); return new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, Event.SchemaChange.Target.TABLE, keyspace(), columnFamily()); } catch (ConfigurationException e) http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/DropTriggerStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/DropTriggerStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropTriggerStatement.java index 9342824..b9536fb 100644 --- a/src/java/org/apache/cassandra/cql3/statements/DropTriggerStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/DropTriggerStatement.java @@ -20,17 +20,16 @@ package org.apache.cassandra.cql3.statements; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.CFName; -import org.apache.cassandra.cql3.Validation; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.exceptions.RequestValidationException; import org.apache.cassandra.exceptions.UnauthorizedException; +import org.apache.cassandra.schema.MigrationManager; +import org.apache.cassandra.schema.Schema; +import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.schema.Triggers; import org.apache.cassandra.service.ClientState; -import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.transport.Event; @@ -56,13 +55,13 @@ public class DropTriggerStatement extends SchemaAlteringStatement public void validate(ClientState state) throws RequestValidationException { - Validation.validateColumnFamily(keyspace(), columnFamily()); + Schema.instance.validateTable(keyspace(), columnFamily()); } public Event.SchemaChange announceMigration(QueryState queryState, boolean isLocalOnly) throws ConfigurationException, InvalidRequestException { - CFMetaData cfm = Schema.instance.getCFMetaData(keyspace(), columnFamily()).copy(); - Triggers triggers = cfm.getTriggers(); + TableMetadata current = Schema.instance.getTableMetadata(keyspace(), columnFamily()); + Triggers triggers = current.triggers; if (!triggers.get(triggerName).isPresent()) { @@ -73,8 +72,14 @@ public class DropTriggerStatement extends SchemaAlteringStatement } logger.info("Dropping trigger with name {}", triggerName); - cfm.triggers(triggers.without(triggerName)); - MigrationManager.announceColumnFamilyUpdate(cfm, isLocalOnly); + + TableMetadata updated = + current.unbuild() + .triggers(triggers.without(triggerName)) + .build(); + + MigrationManager.announceTableUpdate(updated, isLocalOnly); + return new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, Event.SchemaChange.Target.TABLE, keyspace(), columnFamily()); } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/DropTypeStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/DropTypeStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropTypeStatement.java index cd6daae..5909888 100644 --- a/src/java/org/apache/cassandra/cql3/statements/DropTypeStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/DropTypeStatement.java @@ -18,14 +18,16 @@ package org.apache.cassandra.cql3.statements; import org.apache.cassandra.auth.Permission; -import org.apache.cassandra.config.*; import org.apache.cassandra.cql3.*; import org.apache.cassandra.cql3.functions.Function; import org.apache.cassandra.db.marshal.*; import org.apache.cassandra.exceptions.*; +import org.apache.cassandra.schema.ColumnMetadata; import org.apache.cassandra.schema.KeyspaceMetadata; +import org.apache.cassandra.schema.MigrationManager; +import org.apache.cassandra.schema.Schema; +import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.service.ClientState; -import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.transport.Event; @@ -54,7 +56,7 @@ public class DropTypeStatement extends SchemaAlteringStatement public void validate(ClientState state) throws RequestValidationException { - KeyspaceMetadata ksm = Schema.instance.getKSMetaData(name.getKeyspace()); + KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(name.getKeyspace()); if (ksm == null) { if (ifExists) @@ -92,10 +94,10 @@ public class DropTypeStatement extends SchemaAlteringStatement if (!ut.name.equals(name.getUserTypeName()) && ut.referencesUserType(name.getStringTypeName())) throw new InvalidRequestException(String.format("Cannot drop user type %s as it is still used by user type %s", name, ut.getNameAsString())); - for (CFMetaData cfm : ksm.tablesAndViews()) - for (ColumnDefinition def : cfm.allColumns()) + for (TableMetadata table : ksm.tablesAndViews()) + for (ColumnMetadata def : table.columns()) if (def.type.referencesUserType(name.getStringTypeName())) - throw new InvalidRequestException(String.format("Cannot drop user type %s as it is still used by table %s.%s", name, cfm.ksName, cfm.cfName)); + throw new InvalidRequestException(String.format("Cannot drop user type %s as it is still used by table %s", name, table.toString())); } @Override @@ -106,7 +108,7 @@ public class DropTypeStatement extends SchemaAlteringStatement public Event.SchemaChange announceMigration(QueryState queryState, boolean isLocalOnly) throws InvalidRequestException, ConfigurationException { - KeyspaceMetadata ksm = Schema.instance.getKSMetaData(name.getKeyspace()); + KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(name.getKeyspace()); if (ksm == null) return null; // do not assert (otherwise IF EXISTS case fails) http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/DropViewStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/DropViewStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropViewStatement.java index 2f393d3..1909e89 100644 --- a/src/java/org/apache/cassandra/cql3/statements/DropViewStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/DropViewStatement.java @@ -19,14 +19,14 @@ package org.apache.cassandra.cql3.statements; import org.apache.cassandra.auth.Permission; -import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.cql3.CFName; import org.apache.cassandra.db.view.View; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.exceptions.UnauthorizedException; +import org.apache.cassandra.schema.MigrationManager; +import org.apache.cassandra.schema.TableMetadataRef; import org.apache.cassandra.service.ClientState; -import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.transport.Event; @@ -42,9 +42,9 @@ public class DropViewStatement extends SchemaAlteringStatement public void checkAccess(ClientState state) throws UnauthorizedException, InvalidRequestException { - CFMetaData baseTable = View.findBaseTable(keyspace(), columnFamily()); + TableMetadataRef baseTable = View.findBaseTable(keyspace(), columnFamily()); if (baseTable != null) - state.hasColumnFamilyAccess(keyspace(), baseTable.cfName, Permission.ALTER); + state.hasColumnFamilyAccess(keyspace(), baseTable.name, Permission.ALTER); } public void validate(ClientState state) @@ -56,24 +56,6 @@ public class DropViewStatement extends SchemaAlteringStatement { try { -// ViewDefinition view = Schema.instance.getViewDefinition(keyspace(), columnFamily()); -// if (view == null) -// { -// if (Schema.instance.getCFMetaData(keyspace(), columnFamily()) != null) -// throw new ConfigurationException(String.format("Cannot drop table '%s' in keyspace '%s'.", columnFamily(), keyspace())); -// -// throw new ConfigurationException(String.format("Cannot drop non existing materialized view '%s' in keyspace '%s'.", columnFamily(), keyspace())); -// } -// -// CFMetaData baseCfm = Schema.instance.getCFMetaData(view.baseTableId); -// if (baseCfm == null) -// { -// if (ifExists) -// throw new ConfigurationException(String.format("Cannot drop materialized view '%s' in keyspace '%s' without base CF.", columnFamily(), keyspace())); -// else -// throw new InvalidRequestException(String.format("View '%s' could not be found in any of the tables of keyspace '%s'", cfName, keyspace())); -// } - MigrationManager.announceViewDrop(keyspace(), columnFamily(), isLocalOnly); return new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, Event.SchemaChange.Target.TABLE, keyspace(), columnFamily()); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/IndexTarget.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/IndexTarget.java b/src/java/org/apache/cassandra/cql3/statements/IndexTarget.java index 84af273..12d8022 100644 --- a/src/java/org/apache/cassandra/cql3/statements/IndexTarget.java +++ b/src/java/org/apache/cassandra/cql3/statements/IndexTarget.java @@ -19,8 +19,11 @@ package org.apache.cassandra.cql3.statements; import java.util.regex.Pattern; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.ColumnDefinition; +import com.google.common.collect.Iterables; + +import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.schema.ColumnMetadata; +import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.cql3.ColumnIdentifier; public class IndexTarget @@ -28,93 +31,72 @@ public class IndexTarget public static final String TARGET_OPTION_NAME = "target"; public static final String CUSTOM_INDEX_OPTION_NAME = "class_name"; - /** - * The name of the option used to specify that the index is on the collection keys. - */ - public static final String INDEX_KEYS_OPTION_NAME = "index_keys"; - - /** - * The name of the option used to specify that the index is on the collection (map) entries. - */ - public static final String INDEX_ENTRIES_OPTION_NAME = "index_keys_and_values"; - - /** - * Regex for *unquoted* column names, anything which does not match this pattern must be a quoted name - */ - private static final Pattern COLUMN_IDENTIFIER_PATTERN = Pattern.compile("[a-z_0-9]+"); - public final ColumnIdentifier column; - public final boolean quoteName; public final Type type; public IndexTarget(ColumnIdentifier column, Type type) { this.column = column; this.type = type; - - // if the column name contains anything other than lower case alphanumerics - // or underscores, then it must be quoted when included in the target string - quoteName = !COLUMN_IDENTIFIER_PATTERN.matcher(column.toString()).matches(); } - public String asCqlString(CFMetaData cfm) + public String asCqlString() { - if (!cfm.getColumnDefinition(column).type.isCollection()) - return column.toCQLString(); - - return String.format("%s(%s)", type.toString(), column.toCQLString()); + return type == Type.SIMPLE + ? column.toCQLString() + : String.format("%s(%s)", type.toString(), column.toCQLString()); } public static class Raw { - private final ColumnDefinition.Raw column; + private final ColumnMetadata.Raw column; private final Type type; - private Raw(ColumnDefinition.Raw column, Type type) + private Raw(ColumnMetadata.Raw column, Type type) { this.column = column; this.type = type; } - public static Raw simpleIndexOn(ColumnDefinition.Raw c) + public static Raw simpleIndexOn(ColumnMetadata.Raw c) { return new Raw(c, Type.SIMPLE); } - public static Raw valuesOf(ColumnDefinition.Raw c) + public static Raw valuesOf(ColumnMetadata.Raw c) { return new Raw(c, Type.VALUES); } - public static Raw keysOf(ColumnDefinition.Raw c) + public static Raw keysOf(ColumnMetadata.Raw c) { return new Raw(c, Type.KEYS); } - public static Raw keysAndValuesOf(ColumnDefinition.Raw c) + public static Raw keysAndValuesOf(ColumnMetadata.Raw c) { return new Raw(c, Type.KEYS_AND_VALUES); } - public static Raw fullCollection(ColumnDefinition.Raw c) + public static Raw fullCollection(ColumnMetadata.Raw c) { return new Raw(c, Type.FULL); } - public IndexTarget prepare(CFMetaData cfm) + public IndexTarget prepare(TableMetadata table) { // Until we've prepared the target column, we can't be certain about the target type // because (for backwards compatibility) an index on a collection's values uses the // same syntax as an index on a regular column (i.e. the 'values' in // 'CREATE INDEX on table(values(collection));' is optional). So we correct the target type // when the target column is a collection & the target type is SIMPLE. - ColumnDefinition columnDef = column.prepare(cfm); + ColumnMetadata columnDef = column.prepare(table); Type actualType = (type == Type.SIMPLE && columnDef.type.isCollection()) ? Type.VALUES : type; return new IndexTarget(columnDef.name, actualType); } } - public static enum Type + public enum Type { VALUES, KEYS, KEYS_AND_VALUES, FULL, SIMPLE; http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/KeyspaceAttributes.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/KeyspaceAttributes.java b/src/java/org/apache/cassandra/cql3/statements/KeyspaceAttributes.java index db6b0d6..d2280ce 100644 --- a/src/java/org/apache/cassandra/cql3/statements/KeyspaceAttributes.java +++ b/src/java/org/apache/cassandra/cql3/statements/KeyspaceAttributes.java @@ -21,6 +21,7 @@ import java.util.*; import com.google.common.collect.ImmutableSet; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.schema.KeyspaceParams; import org.apache.cassandra.schema.KeyspaceParams.Option; import org.apache.cassandra.schema.ReplicationParams; @@ -42,6 +43,10 @@ public final class KeyspaceAttributes extends PropertyDefinitions public void validate() { validate(validKeywords, obsoleteKeywords); + + Map<String, String> replicationOptions = getAllReplicationOptions(); + if (!replicationOptions.isEmpty() && !replicationOptions.containsKey(ReplicationParams.CLASS)) + throw new ConfigurationException("Missing replication strategy class"); } public String getReplicationStrategyClass() @@ -78,4 +83,9 @@ public final class KeyspaceAttributes extends PropertyDefinitions : ReplicationParams.fromMap(getAllReplicationOptions()); return new KeyspaceParams(durableWrites, replication); } + + public boolean hasOption(Option option) + { + return hasProperty(option.toString()); + } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/ListPermissionsStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/ListPermissionsStatement.java b/src/java/org/apache/cassandra/cql3/statements/ListPermissionsStatement.java index b8f2f92..be7fb5d 100644 --- a/src/java/org/apache/cassandra/cql3/statements/ListPermissionsStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/ListPermissionsStatement.java @@ -21,7 +21,7 @@ import java.util.*; import org.apache.cassandra.auth.*; import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.config.SchemaConstants; +import org.apache.cassandra.schema.SchemaConstants; import org.apache.cassandra.cql3.*; import org.apache.cassandra.db.marshal.UTF8Type; import org.apache.cassandra.exceptions.InvalidRequestException; http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/ListRolesStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/ListRolesStatement.java b/src/java/org/apache/cassandra/cql3/statements/ListRolesStatement.java index 3fee57a..0c0822c 100644 --- a/src/java/org/apache/cassandra/cql3/statements/ListRolesStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/ListRolesStatement.java @@ -26,7 +26,7 @@ import com.google.common.collect.Lists; import org.apache.cassandra.auth.*; import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.config.SchemaConstants; +import org.apache.cassandra.schema.SchemaConstants; import org.apache.cassandra.cql3.*; import org.apache.cassandra.db.marshal.BooleanType; import org.apache.cassandra.db.marshal.MapType; http://git-wip-us.apache.org/repos/asf/cassandra/blob/af3fe39d/src/java/org/apache/cassandra/cql3/statements/ListUsersStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/ListUsersStatement.java b/src/java/org/apache/cassandra/cql3/statements/ListUsersStatement.java index 0101363..9641333 100644 --- a/src/java/org/apache/cassandra/cql3/statements/ListUsersStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/ListUsersStatement.java @@ -23,7 +23,7 @@ import com.google.common.collect.ImmutableList; import org.apache.cassandra.auth.*; import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.config.SchemaConstants; +import org.apache.cassandra.schema.SchemaConstants; import org.apache.cassandra.cql3.ColumnIdentifier; import org.apache.cassandra.cql3.ColumnSpecification; import org.apache.cassandra.cql3.ResultSet;
