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 <bdeggles...@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-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to