org.apache.cassandra.db.index

## Class SecondaryIndex

- java.lang.Object
- - org.apache.cassandra.db.index.SecondaryIndex

Direct Known Subclasses:
  PerColumnSecondaryIndex, PerRowSecondaryIndex

    public abstract class SecondaryIndex
    extends java.lang.Object

Abstract base class for different types of secondary indexes. Do not extend this directly, please pick from PerColumnSecondaryIndex or PerRowSecondaryIndex

### Field Summary

Fields
`protected ColumnFamilyStore` `baseCfs` Base CF that has many indexes
`protected java.util.Set<ColumnDefinition>` `columnDefs` The column definitions which this index is responsible for
`static java.lang.String` `CUSTOM_INDEX_OPTION_NAME`
`static java.lang.String` `INDEX_ENTRIES_OPTION_NAME` The name of the option used to specify that the index is on the collection (map) entries.
`static java.lang.String` `INDEX_KEYS_OPTION_NAME` The name of the option used to specify that the index is on the collection keys.
`static java.lang.String` `INDEX_VALUES_OPTION_NAME` The name of the option used to specify that the index is on the collection values.
`static AbstractType<?>` `keyComparator`
`protected static org.slf4j.Logger` `logger`

### Constructor Summary

Constructors
Constructor and Description
`SecondaryIndex()`

### Method Summary

All Methods Static Methods Instance Methods Abstract Methods Concrete Methods
`java.util.concurrent.Future<?>` `buildIndexAsync()` Builds the index using the data in the underlying CF, non blocking
`protected void` `buildIndexBlocking()` Builds the index using the data in the underlying CFS Blocks till it's complete
`static SecondaryIndex` `createInstance(ColumnFamilyStore baseCfs, ColumnDefinition cdef)` This is the primary way to create a secondary index instance for a CF column.
`protected abstract SecondaryIndexSearcher` `createSecondaryIndexSearcher(java.util.Set<java.nio.ByteBuffer> columns)` Called at query time Creates a implementation specific searcher instance for this index type
`abstract long` `estimateResultRows()`
`abstract void` `forceBlockingFlush()` Forces this indexes' in memory data to disk
`ColumnFamilyStore` `getBaseCfs()`
`java.util.Set<ColumnDefinition>` `getColumnDefs()`
`abstract ColumnFamilyStore` `getIndexCfs()` Allow access to the underlying column family store if there is one
`static CellNameType` `getIndexComparator(CFMetaData baseMetadata, ColumnDefinition cdef)` Returns the index comparator for index backed by CFS, or null.
`DecoratedKey` `getIndexKeyFor(java.nio.ByteBuffer value)` Returns the decoratedKey for a column value.
`abstract java.lang.String` `getIndexName()`
`abstract java.lang.String` `getNameForSystemKeyspace(java.nio.ByteBuffer columnName)` Return the unique name for this index and column to be stored in the SystemKeyspace that tracks if each column is built
`abstract boolean` `indexes(CellName name)` Returns true if the provided cell name is indexed by this secondary index.
`boolean` `indexes(ColumnDefinition cdef)` Returns true if the provided column definition is indexed by this secondary index.
`abstract void` `init()` Perform any initialization work
`abstract void` `invalidate()` Remove the index and unregisters this index's mbean if one exists
`boolean` `isIndexBuilt(java.nio.ByteBuffer columnName)` Checks if the index for specified column is fully built
`boolean` `isQueryable()` Checks if the index is ready.
`abstract void` `reload()` Reload an existing index following a change to its configuration, or that of the indexed column(s).
`abstract void` `removeIndex(java.nio.ByteBuffer columnName)` Delete all files and references to this index
`void` `setIndexBuilt()`
`void` `setIndexRemoved()`
`boolean` `supportsOperator(Operator operator)` Returns true if the index supports lookups for the given operator, false otherwise.
`java.lang.String` `toString()`
`abstract void` `truncateBlocking(long truncatedAt)` Truncate all the data from the current index
`abstract boolean` `validate(java.nio.ByteBuffer rowKey, Cell cell)`
`abstract void` `validateOptions()` Validates the index_options passed in the ColumnDef

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

### Field Detail

#### logger

    protected static final org.slf4j.Logger logger

#### CUSTOM_INDEX_OPTION_NAME

    public static final java.lang.String CUSTOM_INDEX_OPTION_NAME

See Also:
  Constant Field Values

#### INDEX_KEYS_OPTION_NAME

    public static final java.lang.String INDEX_KEYS_OPTION_NAME

The name of the option used to specify that the index is on the collection keys.

See Also:
  Constant Field Values

#### INDEX_VALUES_OPTION_NAME

    public static final java.lang.String INDEX_VALUES_OPTION_NAME

The name of the option used to specify that the index is on the collection values.

See Also:
  Constant Field Values

#### INDEX_ENTRIES_OPTION_NAME

    public static final java.lang.String INDEX_ENTRIES_OPTION_NAME

The name of the option used to specify that the index is on the collection (map) entries.

See Also:
  Constant Field Values

#### keyComparator

    public static final AbstractType<?> keyComparator

#### baseCfs

    protected ColumnFamilyStore baseCfs

Base CF that has many indexes

#### columnDefs

    protected final java.util.Set<ColumnDefinition> columnDefs

The column definitions which this index is responsible for

### Constructor Detail

#### SecondaryIndex

    public SecondaryIndex()

### Method Detail

#### init

    public abstract void init()

Perform any initialization work

#### reload

    public abstract void reload()

Reload an existing index following a change to its configuration, or that of the indexed column(s). Differs from init() in that we expect expect new resources (such as CFS for a KEYS index) to be created by init() but not here

#### validateOptions

    public abstract void validateOptions()
                                  throws ConfigurationException

Validates the index_options passed in the ColumnDef

Throws:
  `ConfigurationException`

#### getIndexName

    public abstract java.lang.String getIndexName()

Returns:
  The name of the index

#### getNameForSystemKeyspace

    public abstract java.lang.String getNameForSystemKeyspace(java.nio.ByteBuffer columnName)

Return the unique name for this index and column to be stored in the SystemKeyspace that tracks if each column is built

Parameters:
  `columnName` - the name of the column
Returns:
  the unique name

#### isIndexBuilt

    public boolean isIndexBuilt(java.nio.ByteBuffer columnName)

Checks if the index for specified column is fully built

Parameters:
  `columnName` - the column
Returns:
  true if the index is fully built

#### isQueryable

    public boolean isQueryable()

Checks if the index is ready.

Returns:
  `true` if the index is ready, `false` otherwise

#### setIndexBuilt

    public void setIndexBuilt()

#### setIndexRemoved

    public void setIndexRemoved()

#### createSecondaryIndexSearcher

    protected abstract SecondaryIndexSearcher createSecondaryIndexSearcher(java.util.Set<java.nio.ByteBuffer> columns)

Called at query time Creates a implementation specific searcher instance for this index type

Parameters:
  `columns` - the list of columns which belong to this index type
Returns:
  the secondary index search impl

#### forceBlockingFlush

    public abstract void forceBlockingFlush()

Forces this indexes' in memory data to disk

#### getIndexCfs

    public abstract ColumnFamilyStore getIndexCfs()

Allow access to the underlying column family store if there is one

Returns:
  the underlying column family store or null

#### removeIndex

    public abstract void removeIndex(java.nio.ByteBuffer columnName)

Delete all files and references to this index

Parameters:
  `columnName` - the indexed column to remove

#### invalidate

    public abstract void invalidate()

Remove the index and unregisters this index's mbean if one exists

#### truncateBlocking

    public abstract void truncateBlocking(long truncatedAt)

Truncate all the data from the current index

Parameters:
  `truncatedAt` - The truncation timestamp, all data before that timestamp should be rejected.

#### buildIndexBlocking

    protected void buildIndexBlocking()

Builds the index using the data in the underlying CFS Blocks till it's complete

#### buildIndexAsync

    public final java.util.concurrent.Future<?> buildIndexAsync()

Builds the index using the data in the underlying CF, non blocking

Returns:
  A future object which the caller can block on (optional)

#### getBaseCfs

    public ColumnFamilyStore getBaseCfs()

#### getColumnDefs

    public java.util.Set<ColumnDefinition> getColumnDefs()

#### supportsOperator

    public boolean supportsOperator(Operator operator)

Returns true if the index supports lookups for the given operator, false otherwise.

#### getIndexKeyFor

    public DecoratedKey getIndexKeyFor(java.nio.ByteBuffer value)

Returns the decoratedKey for a column value. Assumes an index CFS is present.

Parameters:
  `value` - column value
Returns:
  decorated key

#### indexes

    public abstract boolean indexes(CellName name)

Returns true if the provided cell name is indexed by this secondary index. The default implementation checks whether the name is one the columnDef name, but this should be overriden but subclass if needed.

#### indexes

    public boolean indexes(ColumnDefinition cdef)

Returns true if the provided column definition is indexed by this secondary index. The default implementation checks whether it is contained in this index column definitions set.

#### createInstance

    public static SecondaryIndex createInstance(ColumnFamilyStore baseCfs,
                                                ColumnDefinition cdef)
                                         throws ConfigurationException

This is the primary way to create a secondary index instance for a CF column. It will validate the index_options before initializing.

Parameters:
  `baseCfs` - the source of data for the Index
  `cdef` - the meta information about this column (index_type, index_options, name, etc...)
Returns:
  The secondary index instance for this column
Throws:
  `ConfigurationException`

#### validate

    public abstract boolean validate(java.nio.ByteBuffer rowKey,
                                     Cell cell)

#### estimateResultRows

    public abstract long estimateResultRows()

#### getIndexComparator

    public static CellNameType getIndexComparator(CFMetaData baseMetadata,
                                                  ColumnDefinition cdef)

Returns the index comparator for index backed by CFS, or null. Note: it would be cleaner to have this be a member method. However we need this when opening indexes sstables, but by then the CFS won't be fully initiated, so the SecondaryIndex object won't be accessible.

#### toString

    public java.lang.String toString()

Overrides:
  `toString` in class `java.lang.Object`