You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by bd...@apache.org on 2019/08/06 17:26:17 UTC

[cassandra] branch trunk updated (2117e2a -> 69b36a5)

This is an automated email from the ASF dual-hosted git repository.

bdeggleston pushed a change to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git.


    from 2117e2a  Make repair coordination less expensive by moving MerkleTrees off heap
     new da8d41f  Use mean row count instead of mean column count for index selectivity calculation
     new 6b0b792  Merge branch 'cassandra-3.0' into cassandra-3.11
     new 69b36a5  Merge branch 'cassandra-3.11' into trunk

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 CHANGES.txt                                        |  1 +
 .../org/apache/cassandra/db/ColumnFamilyStore.java | 13 ++++++++++
 .../cassandra/index/internal/CassandraIndex.java   |  2 +-
 test/unit/org/apache/cassandra/SchemaLoader.java   | 29 ++++++++++++++++++++++
 .../apache/cassandra/db/SecondaryIndexTest.java    | 26 +++++++++++++++++++
 5 files changed, 70 insertions(+), 1 deletion(-)


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org


[cassandra] 01/01: Merge branch 'cassandra-3.11' into trunk

Posted by bd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

bdeggleston pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git

commit 69b36a54f764a852ae707597f984b0fd8ae0f6b9
Merge: 2117e2a 6b0b792
Author: Blake Eggleston <bd...@gmail.com>
AuthorDate: Tue Aug 6 10:22:29 2019 -0700

    Merge branch 'cassandra-3.11' into trunk

 CHANGES.txt                                        |  1 +
 .../org/apache/cassandra/db/ColumnFamilyStore.java | 13 ++++++++++
 .../cassandra/index/internal/CassandraIndex.java   |  2 +-
 test/unit/org/apache/cassandra/SchemaLoader.java   | 29 ++++++++++++++++++++++
 .../apache/cassandra/db/SecondaryIndexTest.java    | 26 +++++++++++++++++++
 5 files changed, 70 insertions(+), 1 deletion(-)

diff --cc src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index 5414f23,41b5e73..981bc05
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@@ -2410,6 -2471,6 +2410,19 @@@ public class ColumnFamilyStore implemen
          return count > 0 ? sum * 1.0 / count : 0;
      }
  
++    public int getMeanRowCount()
++    {
++        long totalRows = 0;
++        long totalPartitions = 0;
++        for (SSTableReader sstable : getSSTables(SSTableSet.CANONICAL))
++        {
++            totalPartitions += sstable.getEstimatedPartitionSize().count();
++            totalRows += sstable.getTotalRows();
++        }
++
++        return totalPartitions > 0 ? (int) (totalRows / totalPartitions) : 0;
++    }
++
      public long estimateKeys()
      {
          long n = 0;
diff --cc src/java/org/apache/cassandra/index/internal/CassandraIndex.java
index ecd25fd,e23882f..58056b9
--- a/src/java/org/apache/cassandra/index/internal/CassandraIndex.java
+++ b/src/java/org/apache/cassandra/index/internal/CassandraIndex.java
@@@ -270,7 -270,26 +270,7 @@@ public abstract class CassandraIndex im
  
      public long getEstimatedResultRows()
      {
-         return indexCfs.getMeanColumns();
 -        long totalRows = 0;
 -        long totalPartitions = 0;
 -        for (SSTableReader sstable : indexCfs.getSSTables(SSTableSet.CANONICAL))
 -        {
 -            if (sstable.descriptor.version.storeRows())
 -            {
 -                totalPartitions += sstable.getEstimatedPartitionSize().count();
 -                totalRows += sstable.getTotalRows();
 -            } else
 -            {
 -                // for legacy sstables we don't have a total row count so we approximate it
 -                // using estimated column count (which is the same logic as pre-3.0
 -                // see CASSANDRA-15259
 -                long colCount = sstable.getEstimatedColumnCount().count();
 -                totalPartitions += colCount;
 -                totalRows += sstable.getEstimatedColumnCount().mean() * colCount;
 -            }
 -        }
 -
 -        return totalPartitions > 0 ? (int) (totalRows / totalPartitions) : 0;
++        return indexCfs.getMeanRowCount();
      }
  
      /**
diff --cc test/unit/org/apache/cassandra/SchemaLoader.java
index 41f8095,48b8af3..2bc9bda
--- a/test/unit/org/apache/cassandra/SchemaLoader.java
+++ b/test/unit/org/apache/cassandra/SchemaLoader.java
@@@ -461,183 -446,225 +461,212 @@@ public class SchemaLoade
  
          if (withStaticIndex)
          {
 -            cfm.indexes(
 -                    cfm.getIndexes()
 -                       .with(IndexMetadata.fromIndexTargets(cfm,
 -                                                            Collections.singletonList(
 -                                                                new IndexTarget(new ColumnIdentifier("static", true),
 -                                                                                IndexTarget.Type.VALUES)),
 -                                                            "static_index",
 -                                                            IndexMetadata.Kind.COMPOSITES,
 -                                                            Collections.EMPTY_MAP)));
 +            indexes.add(IndexMetadata.fromIndexTargets(
 +            Collections.singletonList(
 +                                                           new IndexTarget(new ColumnIdentifier("static", true),
 +                                                                           IndexTarget.Type.VALUES)),
 +                                                       cfName + "_static_index",
 +                                                       IndexMetadata.Kind.COMPOSITES,
 +                                                       Collections.EMPTY_MAP));
          }
  
 -        return cfm.compression(getCompressionParameters());
 +        return builder.indexes(indexes.build());
+     }
+ 
 -    public static CFMetaData compositeMultipleIndexCFMD(String ksName, String cfName) throws ConfigurationException
++    public static TableMetadata.Builder compositeMultipleIndexCFMD(String ksName, String cfName) throws ConfigurationException
+     {
 -        // the withIndex flag exists to allow tests index creation
 -        // on existing columns
 -        CFMetaData cfm = CFMetaData.Builder.create(ksName, cfName)
 -                                           .addPartitionKey("key", AsciiType.instance)
 -                                           .addClusteringColumn("c1", AsciiType.instance)
 -                                           .addRegularColumn("birthdate", LongType.instance)
 -                                           .addRegularColumn("notbirthdate", LongType.instance)
 -                                           .build();
 -
 -        cfm.indexes(
 -        cfm.getIndexes()
 -           .with(IndexMetadata.fromIndexTargets(cfm,
 -                                                Collections.singletonList(
 -                                                new IndexTarget(new ColumnIdentifier("birthdate", true),
 -                                                                IndexTarget.Type.VALUES)),
 -                                                "birthdate_key_index",
 -                                                IndexMetadata.Kind.COMPOSITES,
 -                                                Collections.EMPTY_MAP))
 -           .with(IndexMetadata.fromIndexTargets(cfm,
 -                                                Collections.singletonList(
 -                                                new IndexTarget(new ColumnIdentifier("notbirthdate", true),
 -                                                                IndexTarget.Type.VALUES)),
 -                                                "notbirthdate_key_index",
 -                                                IndexMetadata.Kind.COMPOSITES,
 -                                                Collections.EMPTY_MAP))
 -        );
 -
 -
 -        return cfm.compression(getCompressionParameters());
 -    }
 -
 -    public static CFMetaData keysIndexCFMD(String ksName, String cfName, boolean withIndex) throws ConfigurationException
 -    {
 -        CFMetaData cfm = CFMetaData.Builder.createDense(ksName, cfName, false, false)
 -                                           .addPartitionKey("key", AsciiType.instance)
 -                                           .addClusteringColumn("c1", AsciiType.instance)
 -                                           .addStaticColumn("birthdate", LongType.instance)
 -                                           .addStaticColumn("notbirthdate", LongType.instance)
 -                                           .addRegularColumn("value", LongType.instance)
 -                                           .build();
++        TableMetadata.Builder builder = TableMetadata.builder(ksName, cfName)
++                                                     .addPartitionKeyColumn("key", AsciiType.instance)
++                                                     .addClusteringColumn("c1", AsciiType.instance)
++                                                     .addRegularColumn("birthdate", LongType.instance)
++                                                     .addRegularColumn("notbirthdate", LongType.instance)
++                                                     .compression(getCompressionParameters());
++
++
++        Indexes.Builder indexes = Indexes.builder();
++
++        indexes.add(IndexMetadata.fromIndexTargets(Collections.singletonList(
++                                                   new IndexTarget(new ColumnIdentifier("birthdate", true),
++                                                                   IndexTarget.Type.VALUES)),
++                                                   "birthdate_key_index",
++                                                   IndexMetadata.Kind.COMPOSITES,
++                                                   Collections.EMPTY_MAP));
++        indexes.add(IndexMetadata.fromIndexTargets(Collections.singletonList(
++                                                   new IndexTarget(new ColumnIdentifier("notbirthdate", true),
++                                                                   IndexTarget.Type.VALUES)),
++                                                   "notbirthdate_key_index",
++                                                   IndexMetadata.Kind.COMPOSITES,
++                                                   Collections.EMPTY_MAP));
++
++
++        return builder.indexes(indexes.build());
 +    }
 +
 +    public static TableMetadata.Builder keysIndexCFMD(String ksName, String cfName, boolean withIndex)
 +    {
 +        TableMetadata.Builder builder =
 +            TableMetadata.builder(ksName, cfName)
 +                         .isCompound(false)
 +                         .isDense(true)
 +                         .addPartitionKeyColumn("key", AsciiType.instance)
 +                         .addClusteringColumn("c1", AsciiType.instance)
 +                         .addStaticColumn("birthdate", LongType.instance)
 +                         .addStaticColumn("notbirthdate", LongType.instance)
 +                         .addRegularColumn("value", LongType.instance)
 +                         .compression(getCompressionParameters());
  
          if (withIndex)
 -            cfm.indexes(
 -                cfm.getIndexes()
 -                   .with(IndexMetadata.fromIndexTargets(cfm,
 -                                                        Collections.singletonList(
 -                                                            new IndexTarget(new ColumnIdentifier("birthdate", true),
 -                                                                            IndexTarget.Type.VALUES)),
 -                                                         "birthdate_composite_index",
 -                                                         IndexMetadata.Kind.KEYS,
 -                                                         Collections.EMPTY_MAP)));
 -
 -
 -        return cfm.compression(getCompressionParameters());
 -    }
 -
 -    public static CFMetaData customIndexCFMD(String ksName, String cfName) throws ConfigurationException
 -    {
 -        CFMetaData cfm = CFMetaData.Builder.createDense(ksName, cfName, false, false)
 -                                           .addPartitionKey("key", AsciiType.instance)
 -                                           .addClusteringColumn("c1", AsciiType.instance)
 -                                           .addRegularColumn("value", LongType.instance)
 -                                           .build();
 -
 -            cfm.indexes(
 -                cfm.getIndexes()
 -                .with(IndexMetadata.fromIndexTargets(cfm,
 -                                                     Collections.singletonList(
 -                                                             new IndexTarget(new ColumnIdentifier("value", true),
 -                                                                             IndexTarget.Type.VALUES)),
 -                                                     "value_index",
 -                                                     IndexMetadata.Kind.CUSTOM,
 -                                                     Collections.singletonMap(
 -                                                             IndexTarget.CUSTOM_INDEX_OPTION_NAME,
 -                                                             StubIndex.class.getName()))));
 -
 -
 -        return cfm.compression(getCompressionParameters());
 -    }
 -
 -    public static CFMetaData jdbcCFMD(String ksName, String cfName, AbstractType comp)
 -    {
 -        return CFMetaData.Builder.create(ksName, cfName).addPartitionKey("key", BytesType.instance)
 -                                                        .build()
 -                                                        .compression(getCompressionParameters());
 -    }
 -
 -    public static CFMetaData sasiCFMD(String ksName, String cfName)
 -    {
 -        CFMetaData cfm = CFMetaData.Builder.create(ksName, cfName)
 -                                           .addPartitionKey("id", UTF8Type.instance)
 -                                           .addRegularColumn("first_name", UTF8Type.instance)
 -                                           .addRegularColumn("last_name", UTF8Type.instance)
 -                                           .addRegularColumn("age", Int32Type.instance)
 -                                           .addRegularColumn("height", Int32Type.instance)
 -                                           .addRegularColumn("timestamp", LongType.instance)
 -                                           .addRegularColumn("address", UTF8Type.instance)
 -                                           .addRegularColumn("score", DoubleType.instance)
 -                                           .addRegularColumn("comment", UTF8Type.instance)
 -                                           .addRegularColumn("comment_suffix_split", UTF8Type.instance)
 -                                           .addRegularColumn("/output/full-name/", UTF8Type.instance)
 -                                           .addRegularColumn("/data/output/id", UTF8Type.instance)
 -                                           .addRegularColumn("first_name_prefix", UTF8Type.instance)
 -                                           .build();
 -
 -        cfm.indexes(cfm.getIndexes()
 -                        .with(IndexMetadata.fromSchemaMetadata("first_name", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 -                        {{
 -                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 -                            put(IndexTarget.TARGET_OPTION_NAME, "first_name");
 -                            put("mode", OnDiskIndexBuilder.Mode.CONTAINS.toString());
 -                        }}))
 -                        .with(IndexMetadata.fromSchemaMetadata("last_name", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 -                        {{
 -                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 -                            put(IndexTarget.TARGET_OPTION_NAME, "last_name");
 -                            put("mode", OnDiskIndexBuilder.Mode.CONTAINS.toString());
 -                        }}))
 -                        .with(IndexMetadata.fromSchemaMetadata("age", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 -                        {{
 -                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 -                            put(IndexTarget.TARGET_OPTION_NAME, "age");
 -
 -                        }}))
 -                        .with(IndexMetadata.fromSchemaMetadata("timestamp", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 -                        {{
 -                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 -                            put(IndexTarget.TARGET_OPTION_NAME, "timestamp");
 -                            put("mode", OnDiskIndexBuilder.Mode.SPARSE.toString());
 -
 -                        }}))
 -                        .with(IndexMetadata.fromSchemaMetadata("address", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 -                        {{
 -                            put("analyzer_class", "org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer");
 -                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 -                            put(IndexTarget.TARGET_OPTION_NAME, "address");
 -                            put("mode", OnDiskIndexBuilder.Mode.PREFIX.toString());
 -                            put("case_sensitive", "false");
 -                        }}))
 -                        .with(IndexMetadata.fromSchemaMetadata("score", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 -                        {{
 -                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 -                            put(IndexTarget.TARGET_OPTION_NAME, "score");
 -                        }}))
 -                        .with(IndexMetadata.fromSchemaMetadata("comment", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 -                        {{
 -                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 -                            put(IndexTarget.TARGET_OPTION_NAME, "comment");
 -                            put("mode", OnDiskIndexBuilder.Mode.CONTAINS.toString());
 -                            put("analyzed", "true");
 -                        }}))
 -                        .with(IndexMetadata.fromSchemaMetadata("comment_suffix_split", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 -                        {{
 -                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 -                            put(IndexTarget.TARGET_OPTION_NAME, "comment_suffix_split");
 -                            put("mode", OnDiskIndexBuilder.Mode.CONTAINS.toString());
 -                            put("analyzed", "false");
 -                        }}))
 -                        .with(IndexMetadata.fromSchemaMetadata("output_full_name", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 -                        {{
 -                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 -                            put(IndexTarget.TARGET_OPTION_NAME, "/output/full-name/");
 -                            put("analyzed", "true");
 -                            put("analyzer_class", "org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer");
 -                            put("case_sensitive", "false");
 -                        }}))
 -                        .with(IndexMetadata.fromSchemaMetadata("data_output_id", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 -                        {{
 -                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 -                            put(IndexTarget.TARGET_OPTION_NAME, "/data/output/id");
 -                            put("mode", OnDiskIndexBuilder.Mode.CONTAINS.toString());
 -                        }}))
 -                        .with(IndexMetadata.fromSchemaMetadata("first_name_prefix", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 -                        {{
 -                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 -                            put(IndexTarget.TARGET_OPTION_NAME, "first_name_prefix");
 -                            put("analyzed", "true");
 -                            put("tokenization_normalize_lowercase", "true");
 -                        }})));
 -
 -        return cfm;
 -    }
 -
 -    public static CFMetaData clusteringSASICFMD(String ksName, String cfName)
 -    {
 -        return clusteringSASICFMD(ksName, cfName, "location", "age", "height", "score");
 -    }
 -
 -    public static CFMetaData clusteringSASICFMD(String ksName, String cfName, String...indexedColumns)
 -    {
 -        CFMetaData cfm = CFMetaData.Builder.create(ksName, cfName)
 -                                           .addPartitionKey("name", UTF8Type.instance)
 -                                           .addClusteringColumn("location", UTF8Type.instance)
 -                                           .addClusteringColumn("age", Int32Type.instance)
 -                                           .addRegularColumn("height", Int32Type.instance)
 -                                           .addRegularColumn("score", DoubleType.instance)
 -                                           .addStaticColumn("nickname", UTF8Type.instance)
 -                                           .build();
 -
 -        Indexes indexes = cfm.getIndexes();
 +        {
 +            IndexMetadata index =
 +                IndexMetadata.fromIndexTargets(
 +                Collections.singletonList(new IndexTarget(new ColumnIdentifier("birthdate", true),
 +                                                                                         IndexTarget.Type.VALUES)),
 +                                                                                         cfName + "_birthdate_composite_index",
 +                                                                                         IndexMetadata.Kind.KEYS,
 +                                                                                         Collections.EMPTY_MAP);
 +            builder.indexes(Indexes.builder().add(index).build());
 +        }
 +
 +        return builder;
 +    }
 +
 +    public static TableMetadata.Builder customIndexCFMD(String ksName, String cfName)
 +    {
 +        TableMetadata.Builder builder  =
 +            TableMetadata.builder(ksName, cfName)
 +                         .isCompound(false)
 +                         .isDense(true)
 +                         .addPartitionKeyColumn("key", AsciiType.instance)
 +                         .addClusteringColumn("c1", AsciiType.instance)
 +                         .addRegularColumn("value", LongType.instance)
 +                         .compression(getCompressionParameters());
 +
 +        IndexMetadata index =
 +            IndexMetadata.fromIndexTargets(
 +            Collections.singletonList(new IndexTarget(new ColumnIdentifier("value", true), IndexTarget.Type.VALUES)),
 +                                           cfName + "_value_index",
 +                                           IndexMetadata.Kind.CUSTOM,
 +                                           Collections.singletonMap(IndexTarget.CUSTOM_INDEX_OPTION_NAME, StubIndex.class.getName()));
 +
 +        builder.indexes(Indexes.of(index));
 +
 +        return builder;
 +    }
 +
 +    public static TableMetadata.Builder jdbcCFMD(String ksName, String cfName, AbstractType comp)
 +    {
 +        return TableMetadata.builder(ksName, cfName)
 +                            .addPartitionKeyColumn("key", BytesType.instance)
 +                            .compression(getCompressionParameters());
 +    }
 +
 +    public static TableMetadata.Builder sasiCFMD(String ksName, String cfName)
 +    {
 +        TableMetadata.Builder builder =
 +            TableMetadata.builder(ksName, cfName)
 +                         .addPartitionKeyColumn("id", UTF8Type.instance)
 +                         .addRegularColumn("first_name", UTF8Type.instance)
 +                         .addRegularColumn("last_name", UTF8Type.instance)
 +                         .addRegularColumn("age", Int32Type.instance)
 +                         .addRegularColumn("height", Int32Type.instance)
 +                         .addRegularColumn("timestamp", LongType.instance)
 +                         .addRegularColumn("address", UTF8Type.instance)
 +                         .addRegularColumn("score", DoubleType.instance)
 +                         .addRegularColumn("comment", UTF8Type.instance)
 +                         .addRegularColumn("comment_suffix_split", UTF8Type.instance)
 +                         .addRegularColumn("/output/full-name/", UTF8Type.instance)
 +                         .addRegularColumn("/data/output/id", UTF8Type.instance)
 +                         .addRegularColumn("first_name_prefix", UTF8Type.instance);
 +
 +        Indexes.Builder indexes = Indexes.builder();
 +
 +        indexes.add(IndexMetadata.fromSchemaMetadata(cfName + "_first_name", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 +                    {{
 +                        put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 +                        put(IndexTarget.TARGET_OPTION_NAME, "first_name");
 +                        put("mode", OnDiskIndexBuilder.Mode.CONTAINS.toString());
 +                    }}))
 +               .add(IndexMetadata.fromSchemaMetadata(cfName + "_last_name", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 +                    {{
 +                        put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 +                        put(IndexTarget.TARGET_OPTION_NAME, "last_name");
 +                        put("mode", OnDiskIndexBuilder.Mode.CONTAINS.toString());
 +                    }}))
 +               .add(IndexMetadata.fromSchemaMetadata(cfName + "_age", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 +                    {{
 +                        put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 +                        put(IndexTarget.TARGET_OPTION_NAME, "age");
 +                    }}))
 +               .add(IndexMetadata.fromSchemaMetadata(cfName + "_timestamp", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 +                    {{
 +                        put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 +                        put(IndexTarget.TARGET_OPTION_NAME, "timestamp");
 +                        put("mode", OnDiskIndexBuilder.Mode.SPARSE.toString());
 +
 +                    }}))
 +               .add(IndexMetadata.fromSchemaMetadata(cfName + "_address", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 +                    {{
 +                        put("analyzer_class", "org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer");
 +                        put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 +                        put(IndexTarget.TARGET_OPTION_NAME, "address");
 +                        put("mode", OnDiskIndexBuilder.Mode.PREFIX.toString());
 +                        put("case_sensitive", "false");
 +                    }}))
 +               .add(IndexMetadata.fromSchemaMetadata(cfName + "_score", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 +                    {{
 +                        put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 +                        put(IndexTarget.TARGET_OPTION_NAME, "score");
 +                    }}))
 +               .add(IndexMetadata.fromSchemaMetadata(cfName + "_comment", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 +                    {{
 +                        put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 +                        put(IndexTarget.TARGET_OPTION_NAME, "comment");
 +                        put("mode", OnDiskIndexBuilder.Mode.CONTAINS.toString());
 +                        put("analyzed", "true");
 +                    }}))
 +               .add(IndexMetadata.fromSchemaMetadata(cfName + "_comment_suffix_split", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 +                    {{
 +                        put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 +                        put(IndexTarget.TARGET_OPTION_NAME, "comment_suffix_split");
 +                        put("mode", OnDiskIndexBuilder.Mode.CONTAINS.toString());
 +                        put("analyzed", "false");
 +                    }}))
 +               .add(IndexMetadata.fromSchemaMetadata(cfName + "_output_full_name", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 +                    {{
 +                        put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 +                        put(IndexTarget.TARGET_OPTION_NAME, "/output/full-name/");
 +                        put("analyzed", "true");
 +                        put("analyzer_class", "org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer");
 +                        put("case_sensitive", "false");
 +                    }}))
 +               .add(IndexMetadata.fromSchemaMetadata(cfName + "_data_output_id", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 +                    {{
 +                        put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 +                        put(IndexTarget.TARGET_OPTION_NAME, "/data/output/id");
 +                        put("mode", OnDiskIndexBuilder.Mode.CONTAINS.toString());
 +                    }}))
 +               .add(IndexMetadata.fromSchemaMetadata(cfName + "_first_name_prefix", IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 +                    {{
 +                        put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
 +                        put(IndexTarget.TARGET_OPTION_NAME, "first_name_prefix");
 +                        put("analyzed", "true");
 +                        put("tokenization_normalize_lowercase", "true");
 +                    }}));
 +
 +    return builder.indexes(indexes.build());
 +}
 +
 +public static TableMetadata.Builder clusteringSASICFMD(String ksName, String cfName)
 +{
 +    return clusteringSASICFMD(ksName, cfName, "location", "age", "height", "score");
 +}
 +
 +    public static TableMetadata.Builder clusteringSASICFMD(String ksName, String cfName, String...indexedColumns)
 +    {
 +        Indexes.Builder indexes = Indexes.builder();
          for (String indexedColumn : indexedColumns)
          {
 -            indexes = indexes.with(IndexMetadata.fromSchemaMetadata(indexedColumn, IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
 +            indexes.add(IndexMetadata.fromSchemaMetadata(cfName + "_" + indexedColumn, IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
              {{
                  put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, SASIIndex.class.getName());
                  put(IndexTarget.TARGET_OPTION_NAME, indexedColumn);
diff --cc test/unit/org/apache/cassandra/db/SecondaryIndexTest.java
index 5dadc11,e9a0db6..c09b16c
--- a/test/unit/org/apache/cassandra/db/SecondaryIndexTest.java
+++ b/test/unit/org/apache/cassandra/db/SecondaryIndexTest.java
@@@ -523,6 -513,29 +526,29 @@@ public class SecondaryIndexTes
          assertIndexedCount(cfs, ByteBufferUtil.bytes("birthdate"), 1l, 10);
      }
  
+     @Test
+     public void testSelectivityWithMultipleIndexes()
+     {
+         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(WITH_MULTIPLE_COMPOSITE_INDEX);
+ 
+         // creates rows such that birthday_index has 1 partition (key = 1L) with 4 rows -- mean row count = 4, and notbirthdate_index has 2 partitions with 2 rows each -- mean row count = 2
 -        new RowUpdateBuilder(cfs.metadata, 0, "k1").clustering("c").add("birthdate", 1L).add("notbirthdate", 2L).build().applyUnsafe();
 -        new RowUpdateBuilder(cfs.metadata, 0, "k2").clustering("c").add("birthdate", 1L).add("notbirthdate", 2L).build().applyUnsafe();
 -        new RowUpdateBuilder(cfs.metadata, 0, "k3").clustering("c").add("birthdate", 1L).add("notbirthdate", 3L).build().applyUnsafe();
 -        new RowUpdateBuilder(cfs.metadata, 0, "k4").clustering("c").add("birthdate", 1L).add("notbirthdate", 3L).build().applyUnsafe();
++        new RowUpdateBuilder(cfs.metadata(), 0, "k1").clustering("c").add("birthdate", 1L).add("notbirthdate", 2L).build().applyUnsafe();
++        new RowUpdateBuilder(cfs.metadata(), 0, "k2").clustering("c").add("birthdate", 1L).add("notbirthdate", 2L).build().applyUnsafe();
++        new RowUpdateBuilder(cfs.metadata(), 0, "k3").clustering("c").add("birthdate", 1L).add("notbirthdate", 3L).build().applyUnsafe();
++        new RowUpdateBuilder(cfs.metadata(), 0, "k4").clustering("c").add("birthdate", 1L).add("notbirthdate", 3L).build().applyUnsafe();
+ 
+         cfs.forceBlockingFlush();
+         ReadCommand rc = Util.cmd(cfs)
+                              .fromKeyIncl("k1")
+                              .toKeyIncl("k3")
+                              .columns("birthdate")
+                              .filterOn("birthdate", Operator.EQ, 1L)
+                              .filterOn("notbirthdate", Operator.EQ, 0L)
+                              .build();
+ 
+         assertEquals("notbirthdate_key_index", rc.indexMetadata().name);
+     }
+ 
      private void assertIndexedNone(ColumnFamilyStore cfs, ByteBuffer col, Object val)
      {
          assertIndexedCount(cfs, col, val, 0);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org