You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by al...@apache.org on 2017/01/27 22:18:37 UTC
[31/37] cassandra git commit: Make TableMetadata immutable,
optimize Schema
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;