http://git-wip-us.apache.org/repos/asf/cassandra/blob/0d1d3bca/src/java/org/apache/cassandra/config/ColumnDefinition.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/config/ColumnDefinition.java b/src/java/org/apache/cassandra/config/ColumnDefinition.java index f6d8209..bfd9481 100644 --- a/src/java/org/apache/cassandra/config/ColumnDefinition.java +++ b/src/java/org/apache/cassandra/config/ColumnDefinition.java @@ -48,39 +48,51 @@ public class ColumnDefinition private Map<String,String> index_options; private String index_name; - public ColumnDefinition(ByteBuffer name, AbstractType<?> validator, IndexType index_type, Map<String, String> index_options, String index_name) + /* + * If the column comparator is a composite type, indicates to which + * component this definition refers to. If null, the definition refers to + * the full column name. + */ + public final Integer componentIndex; + + public ColumnDefinition(ByteBuffer name, AbstractType<?> validator, IndexType index_type, Map<String, String> index_options, String index_name, Integer componentIndex) { assert name != null && validator != null; this.name = name; this.index_name = index_name; this.validator = validator; - + this.componentIndex = componentIndex; this.setIndexType(index_type, index_options); } - public static ColumnDefinition ascii(String name) + public static ColumnDefinition ascii(String name, Integer cidx) + { + return new ColumnDefinition(ByteBufferUtil.bytes(name), AsciiType.instance, null, null, null, cidx); + } + + public static ColumnDefinition bool(String name, Integer cidx) { - return new ColumnDefinition(ByteBufferUtil.bytes(name), AsciiType.instance, null, null, null); + return new ColumnDefinition(ByteBufferUtil.bytes(name), BooleanType.instance, null, null, null, cidx); } - public static ColumnDefinition bool(String name) + public static ColumnDefinition utf8(String name, Integer cidx) { - return new ColumnDefinition(ByteBufferUtil.bytes(name), BooleanType.instance, null, null, null); + return new ColumnDefinition(ByteBufferUtil.bytes(name), UTF8Type.instance, null, null, null, cidx); } - public static ColumnDefinition utf8(String name) + public static ColumnDefinition int32(String name, Integer cidx) { - return new ColumnDefinition(ByteBufferUtil.bytes(name), UTF8Type.instance, null, null, null); + return new ColumnDefinition(ByteBufferUtil.bytes(name), Int32Type.instance, null, null, null, cidx); } - public static ColumnDefinition int32(String name) + public static ColumnDefinition double_(String name, Integer cidx) { - return new ColumnDefinition(ByteBufferUtil.bytes(name), Int32Type.instance, null, null, null); + return new ColumnDefinition(ByteBufferUtil.bytes(name), DoubleType.instance, null, null, null, cidx); } - public static ColumnDefinition double_(String name) + public ColumnDefinition clone() { - return new ColumnDefinition(ByteBufferUtil.bytes(name), DoubleType.instance, null, null, null); + return new ColumnDefinition(name, validator, index_type, index_options, index_name, componentIndex); } @Override @@ -100,6 +112,8 @@ public class ColumnDefinition return false; if (!name.equals(that.name)) return false; + if (componentIndex != null ? !componentIndex.equals(that.componentIndex) : that.componentIndex != null) + return false; return !(validator != null ? !validator.equals(that.validator) : that.validator != null); } @@ -111,6 +125,7 @@ public class ColumnDefinition result = 31 * result + (index_type != null ? index_type.hashCode() : 0); result = 31 * result + (index_options != null ? index_options.hashCode() : 0); result = 31 * result + (index_name != null ? index_name.hashCode() : 0); + result = 31 * result + (componentIndex != null ? componentIndex.hashCode() : 0); return result; } @@ -136,7 +151,8 @@ public class ColumnDefinition TypeParser.parse(thriftColumnDef.validation_class), thriftColumnDef.index_type, thriftColumnDef.index_options, - thriftColumnDef.index_name); + thriftColumnDef.index_name, + null); } public static Map<ByteBuffer, ColumnDefinition> fromThrift(List<ColumnDef> thriftDefs) throws ConfigurationException @@ -181,6 +197,8 @@ public class ColumnDefinition : Column.create(json(index_options), timestamp, cfName, comparator.getString(name), "index_options")); cf.addColumn(index_name == null ? DeletedColumn.create(ldt, timestamp, cfName, comparator.getString(name), "index_name") : Column.create(index_name, timestamp, cfName, comparator.getString(name), "index_name")); + cf.addColumn(componentIndex == null ? DeletedColumn.create(ldt, timestamp, cfName, comparator.getString(name), "component_index") + : Column.create(componentIndex, timestamp, cfName, comparator.getString(name), "component_index")); } public void apply(ColumnDefinition def, AbstractType<?> comparator) throws ConfigurationException @@ -196,6 +214,10 @@ public class ColumnDefinition throw new ConfigurationException("Cannot modify index name"); } + if ((componentIndex != null && !componentIndex.equals(def.componentIndex)) + || (componentIndex == null && def.componentIndex != null)) + throw new ConfigurationException(String.format("Cannot modify component index for column %s", comparator.getString(name))); + setValidator(def.getValidator()); setIndexType(def.getIndexType(), def.getIndexOptions()); setIndexName(def.getIndexName()); @@ -207,7 +229,7 @@ public class ColumnDefinition * @return Thrift-based deserialized representation of the column * @param row */ - public static List<ColumnDefinition> fromSchema(Row row, AbstractType<?> comparator) + public static List<ColumnDefinition> fromSchema(Row row, CFMetaData cfm) { if (row.cf == null) return Collections.emptyList(); @@ -220,6 +242,7 @@ public class ColumnDefinition IndexType index_type = null; Map<String,String> index_options = null; String index_name = null; + Integer componentIndex = null; if (result.has("index_type")) index_type = IndexType.valueOf(result.getString("index_type")); @@ -227,12 +250,15 @@ public class ColumnDefinition index_options = FBUtilities.fromJsonMap(result.getString("index_options")); if (result.has("index_name")) index_name = result.getString("index_name"); + if (result.has("component_index")) + componentIndex = result.getInt("component_index"); - cds.add(new ColumnDefinition(comparator.fromString(result.getString("column")), + cds.add(new ColumnDefinition(cfm.getColumnDefinitionComparator(componentIndex).fromString(result.getString("column")), TypeParser.parse(result.getString("validator")), index_type, index_options, - index_name)); + index_name, + componentIndex)); } catch (ConfigurationException e) { @@ -264,6 +290,7 @@ public class ColumnDefinition ", validator=" + validator + ", index_type=" + index_type + ", index_name='" + index_name + '\'' + + (componentIndex != null ? ", component_index=" + componentIndex : "") + '}'; }
http://git-wip-us.apache.org/repos/asf/cassandra/blob/0d1d3bca/src/java/org/apache/cassandra/config/KSMetaData.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/config/KSMetaData.java b/src/java/org/apache/cassandra/config/KSMetaData.java index 71230ec..e739a1f 100644 --- a/src/java/org/apache/cassandra/config/KSMetaData.java +++ b/src/java/org/apache/cassandra/config/KSMetaData.java @@ -295,7 +295,7 @@ public final class KSMetaData for (CFMetaData cfm : cfms.values()) { Row columnRow = ColumnDefinition.readSchema(cfm.ksName, cfm.cfName); - for (ColumnDefinition cd : ColumnDefinition.fromSchema(columnRow, cfm.getColumnDefinitionComparator())) + for (ColumnDefinition cd : ColumnDefinition.fromSchema(columnRow, cfm)) cfm.column_metadata.put(cd.name, cd); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/0d1d3bca/src/java/org/apache/cassandra/cql/AlterTableStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql/AlterTableStatement.java b/src/java/org/apache/cassandra/cql/AlterTableStatement.java index 46493b9..4267340 100644 --- a/src/java/org/apache/cassandra/cql/AlterTableStatement.java +++ b/src/java/org/apache/cassandra/cql/AlterTableStatement.java @@ -88,6 +88,7 @@ public class AlterTableStatement TypeParser.parse(validator), null, null, + null, null)); break; http://git-wip-us.apache.org/repos/asf/cassandra/blob/0d1d3bca/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java b/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java index edeb260..0895e02 100644 --- a/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java +++ b/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java @@ -133,7 +133,7 @@ public class CreateColumnFamilyStatement ? CFPropDefs.comparators.get(col.getValue()) : col.getValue(); AbstractType<?> validator = TypeParser.parse(validatorClassName); - columnDefs.put(columnName, new ColumnDefinition(columnName, validator, null, null, null)); + columnDefs.put(columnName, new ColumnDefinition(columnName, validator, null, null, null, null)); } catch (ConfigurationException e) { http://git-wip-us.apache.org/repos/asf/cassandra/blob/0d1d3bca/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java b/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java index 8dc19a8..1ecbd8a 100644 --- a/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java @@ -24,6 +24,7 @@ import java.util.*; import org.apache.cassandra.cql3.*; import org.apache.cassandra.config.*; import org.apache.cassandra.io.compress.CompressionParameters; +import org.apache.cassandra.db.marshal.CompositeType; import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.thrift.CfDef; import org.apache.cassandra.thrift.ColumnDef; @@ -78,7 +79,8 @@ public class AlterTableStatement extends SchemaAlteringStatement CFPropDefs.parseType(validator), null, null, - null)); + null, + cfDef.isComposite ? ((CompositeType)meta.comparator).types.size() - 1 : null)); break; case ALTER: http://git-wip-us.apache.org/repos/asf/cassandra/blob/0d1d3bca/src/java/org/apache/cassandra/cql3/statements/CreateColumnFamilyStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateColumnFamilyStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateColumnFamilyStatement.java index 23bafd1..ad217f4 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CreateColumnFamilyStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/CreateColumnFamilyStatement.java @@ -66,12 +66,13 @@ public class CreateColumnFamilyStatement extends SchemaAlteringStatement private Map<ByteBuffer, ColumnDefinition> getColumns() throws InvalidRequestException { Map<ByteBuffer, ColumnDefinition> columnDefs = new HashMap<ByteBuffer, ColumnDefinition>(); + Integer componentIndex = comparator instanceof CompositeType ? ((CompositeType)comparator).types.size() - 1 : null; for (Map.Entry<ColumnIdentifier, String> col : columns.entrySet()) { AbstractType<?> validator = CFPropDefs.parseType(col.getValue()); - columnDefs.put(col.getKey().key, new ColumnDefinition(col.getKey().key, validator, null, null, null)); + columnDefs.put(col.getKey().key, new ColumnDefinition(col.getKey().key, validator, null, null, null, componentIndex)); } return columnDefs; http://git-wip-us.apache.org/repos/asf/cassandra/blob/0d1d3bca/test/unit/org/apache/cassandra/SchemaLoader.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/SchemaLoader.java b/test/unit/org/apache/cassandra/SchemaLoader.java index 4edd8b0..8087ea6 100644 --- a/test/unit/org/apache/cassandra/SchemaLoader.java +++ b/test/unit/org/apache/cassandra/SchemaLoader.java @@ -129,6 +129,7 @@ public class SchemaLoader UTF8Type.instance, null, null, + null, null)); Map<ByteBuffer, ColumnDefinition> utf8Column = new HashMap<ByteBuffer, ColumnDefinition>(); utf8Column.put(UTF8Type.instance.fromString("fortytwo"), new ColumnDefinition( @@ -136,6 +137,7 @@ public class SchemaLoader IntegerType.instance, null, null, + null, null)); // Keyspace 1 @@ -307,7 +309,7 @@ public class SchemaLoader {{ ByteBuffer cName = ByteBuffer.wrap("birthdate".getBytes(Charsets.UTF_8)); IndexType keys = withIdxType ? IndexType.KEYS : null; - put(cName, new ColumnDefinition(cName, LongType.instance, keys, null, withIdxType ? ByteBufferUtil.bytesToHex(cName) : null)); + put(cName, new ColumnDefinition(cName, LongType.instance, keys, null, withIdxType ? ByteBufferUtil.bytesToHex(cName) : null, null)); }}); } private static CFMetaData jdbcCFMD(String ksName, String cfName, AbstractType comp) http://git-wip-us.apache.org/repos/asf/cassandra/blob/0d1d3bca/test/unit/org/apache/cassandra/config/ColumnDefinitionTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/config/ColumnDefinitionTest.java b/test/unit/org/apache/cassandra/config/ColumnDefinitionTest.java index 7e3d698..c7ba1df 100644 --- a/test/unit/org/apache/cassandra/config/ColumnDefinitionTest.java +++ b/test/unit/org/apache/cassandra/config/ColumnDefinitionTest.java @@ -37,12 +37,14 @@ public class ColumnDefinitionTest BytesType.instance, IndexType.KEYS, null, - "random index name 0"); + "random index name 0", + null); ColumnDefinition cd1 = new ColumnDefinition(ByteBufferUtil.bytes("TestColumnDefinition1"), LongType.instance, null, null, + null, null); testSerializeDeserialize(cd0); http://git-wip-us.apache.org/repos/asf/cassandra/blob/0d1d3bca/test/unit/org/apache/cassandra/config/DefsTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/config/DefsTest.java b/test/unit/org/apache/cassandra/config/DefsTest.java index 862483f..69db1f6 100644 --- a/test/unit/org/apache/cassandra/config/DefsTest.java +++ b/test/unit/org/apache/cassandra/config/DefsTest.java @@ -64,7 +64,7 @@ public class DefsTest extends SchemaLoader for (int i = 0; i < 5; i++) { ByteBuffer name = ByteBuffer.wrap(new byte[] { (byte)i }); - indexes.put(name, new ColumnDefinition(name, BytesType.instance, IndexType.KEYS, null, Integer.toString(i))); + indexes.put(name, new ColumnDefinition(name, BytesType.instance, IndexType.KEYS, null, Integer.toString(i), null)); } CFMetaData cfm = new CFMetaData("Keyspace1", "TestApplyCFM_CF", @@ -91,7 +91,8 @@ public class DefsTest extends SchemaLoader BytesType.instance, IndexType.KEYS, null, - "5"); + "5", + null); cfNew.addColumnDefinition(addIndexDef); // remove one. @@ -99,7 +100,8 @@ public class DefsTest extends SchemaLoader BytesType.instance, IndexType.KEYS, null, - "0"); + "0", + null); assert cfNew.removeColumnDefinition(removeIndexDef); cfm.apply(cfNew); @@ -531,7 +533,7 @@ public class DefsTest extends SchemaLoader // drop the index CFMetaData meta = cfs.metadata.clone(); ColumnDefinition cdOld = meta.getColumn_metadata().values().iterator().next(); - ColumnDefinition cdNew = new ColumnDefinition(cdOld.name, cdOld.getValidator(), null, null, null); + ColumnDefinition cdNew = new ColumnDefinition(cdOld.name, cdOld.getValidator(), null, null, null, null); meta.columnMetadata(Collections.singletonMap(cdOld.name, cdNew)); MigrationManager.announceColumnFamilyUpdate(meta); http://git-wip-us.apache.org/repos/asf/cassandra/blob/0d1d3bca/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java b/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java index 18dea98..e3fed41 100644 --- a/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java +++ b/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java @@ -458,7 +458,7 @@ public class ColumnFamilyStoreTest extends SchemaLoader ColumnFamilyStore cfs = table.getColumnFamilyStore("Indexed2"); ColumnDefinition old = cfs.metadata.getColumn_metadata().get(ByteBufferUtil.bytes("birthdate")); - ColumnDefinition cd = new ColumnDefinition(old.name, old.getValidator(), IndexType.KEYS, null, "birthdate_index"); + ColumnDefinition cd = new ColumnDefinition(old.name, old.getValidator(), IndexType.KEYS, null, "birthdate_index", null); Future<?> future = cfs.indexManager.addIndexedColumn(cd); future.get(); // we had a bug (CASSANDRA-2244) where index would get created but not flushed -- check for that http://git-wip-us.apache.org/repos/asf/cassandra/blob/0d1d3bca/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java b/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java index 0166e4f..9c131f9 100644 --- a/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java +++ b/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java @@ -124,7 +124,7 @@ public class ThriftValidationTest extends SchemaLoader assert !gotException : "got unexpected ConfigurationException"; // add a column with name = "id" - newMetadata.addColumnDefinition(ColumnDefinition.utf8("id")); + newMetadata.addColumnDefinition(ColumnDefinition.utf8("id", null)); gotException = false;