Class SinglePartitionReadCommand

All Implemented Interfaces:
Monitorable, ReadQuery, SinglePartitionReadQuery
Direct Known Subclasses:
SinglePartitionReadCommand.VirtualTableSinglePartitionReadCommand

public class SinglePartitionReadCommand extends ReadCommand implements SinglePartitionReadQuery
A read command that selects a (part of a) single partition.
  • Field Details

  • Constructor Details

  • Method Details

    • create

      public static SinglePartitionReadCommand create(TableMetadata metadata, long nowInSec, ColumnFilter columnFilter, RowFilter rowFilter, DataLimits limits, DecoratedKey partitionKey, ClusteringIndexFilter clusteringIndexFilter, Index.QueryPlan indexQueryPlan)
      Creates a new read command on a single partition.
      Parameters:
      metadata - the table to query.
      nowInSec - the time in seconds to use are "now" for this query.
      columnFilter - the column filter to use for the query.
      rowFilter - the row filter to use for the query.
      limits - the limits to use for the query.
      partitionKey - the partition key for the partition to query.
      clusteringIndexFilter - the clustering index filter to use for the query.
      indexQueryPlan - explicitly specified index to use for the query
      Returns:
      a newly created read command.
    • create

      public static SinglePartitionReadCommand create(TableMetadata metadata, long nowInSec, ColumnFilter columnFilter, RowFilter rowFilter, DataLimits limits, DecoratedKey partitionKey, ClusteringIndexFilter clusteringIndexFilter)
      Creates a new read command on a single partition.
      Parameters:
      metadata - the table to query.
      nowInSec - the time in seconds to use are "now" for this query.
      columnFilter - the column filter to use for the query.
      rowFilter - the row filter to use for the query.
      limits - the limits to use for the query.
      partitionKey - the partition key for the partition to query.
      clusteringIndexFilter - the clustering index filter to use for the query.
      Returns:
      a newly created read command.
    • create

      public static SinglePartitionReadCommand create(TableMetadata metadata, long nowInSec, DecoratedKey key, ColumnFilter columnFilter, ClusteringIndexFilter filter)
      Creates a new read command on a single partition.
      Parameters:
      metadata - the table to query.
      nowInSec - the time in seconds to use are "now" for this query.
      key - the partition key for the partition to query.
      columnFilter - the column filter to use for the query.
      filter - the clustering index filter to use for the query.
      Returns:
      a newly created read command. The returned command will use no row filter and have no limits.
    • fullPartitionRead

      public static SinglePartitionReadCommand fullPartitionRead(TableMetadata metadata, long nowInSec, DecoratedKey key)
      Creates a new read command that queries a single partition in its entirety.
      Parameters:
      metadata - the table to query.
      nowInSec - the time in seconds to use are "now" for this query.
      key - the partition key for the partition to query.
      Returns:
      a newly created read command that queries all the rows of key.
    • fullPartitionRead

      public static SinglePartitionReadCommand fullPartitionRead(TableMetadata metadata, long nowInSec, ByteBuffer key)
      Creates a new read command that queries a single partition in its entirety.
      Parameters:
      metadata - the table to query.
      nowInSec - the time in seconds to use are "now" for this query.
      key - the partition key for the partition to query.
      Returns:
      a newly created read command that queries all the rows of key.
    • create

      public static SinglePartitionReadCommand create(TableMetadata metadata, long nowInSec, DecoratedKey key, Slice slice)
      Creates a new single partition slice command for the provided single slice.
      Parameters:
      metadata - the table to query.
      nowInSec - the time in seconds to use are "now" for this query.
      key - the partition key for the partition to query.
      slice - the slice of rows to query.
      Returns:
      a newly created read command that queries slice in key. The returned query will query every columns for the table (without limit or row filtering) and be in forward order.
    • create

      public static SinglePartitionReadCommand create(TableMetadata metadata, long nowInSec, DecoratedKey key, Slices slices)
      Creates a new single partition slice command for the provided slices.
      Parameters:
      metadata - the table to query.
      nowInSec - the time in seconds to use are "now" for this query.
      key - the partition key for the partition to query.
      slices - the slices of rows to query.
      Returns:
      a newly created read command that queries the slices in key. The returned query will query every columns for the table (without limit or row filtering) and be in forward order.
    • create

      public static SinglePartitionReadCommand create(TableMetadata metadata, long nowInSec, ByteBuffer key, Slices slices)
      Creates a new single partition slice command for the provided slices.
      Parameters:
      metadata - the table to query.
      nowInSec - the time in seconds to use are "now" for this query.
      key - the partition key for the partition to query.
      slices - the slices of rows to query.
      Returns:
      a newly created read command that queries the slices in key. The returned query will query every columns for the table (without limit or row filtering) and be in forward order.
    • create

      public static SinglePartitionReadCommand create(TableMetadata metadata, long nowInSec, DecoratedKey key, NavigableSet<Clustering<?>> names)
      Creates a new single partition name command for the provided rows.
      Parameters:
      metadata - the table to query.
      nowInSec - the time in seconds to use are "now" for this query.
      key - the partition key for the partition to query.
      names - the clustering for the rows to query.
      Returns:
      a newly created read command that queries the names in key. The returned query will query every columns (without limit or row filtering) and be in forward order.
    • create

      public static SinglePartitionReadCommand create(TableMetadata metadata, long nowInSec, DecoratedKey key, Clustering<?> name)
      Creates a new single partition name command for the provided row.
      Parameters:
      metadata - the table to query.
      nowInSec - the time in seconds to use are "now" for this query.
      key - the partition key for the partition to query.
      name - the clustering for the row to query.
      Returns:
      a newly created read command that queries name in key. The returned query will query every columns (without limit or row filtering).
    • copy

      Description copied from class: ReadCommand
      Returns a copy of this command.
      Specified by:
      copy in class ReadCommand
      Returns:
      a copy of this command.
    • copyAsDigestQuery

      protected SinglePartitionReadCommand copyAsDigestQuery()
      Specified by:
      copyAsDigestQuery in class ReadCommand
    • copyAsTransientQuery

      protected SinglePartitionReadCommand copyAsTransientQuery()
      Specified by:
      copyAsTransientQuery in class ReadCommand
    • withUpdatedLimit

      public SinglePartitionReadCommand withUpdatedLimit(DataLimits newLimits)
      Description copied from class: ReadCommand
      Creates a new ReadCommand instance with new limits.
      Specified by:
      withUpdatedLimit in interface SinglePartitionReadQuery
      Specified by:
      withUpdatedLimit in class ReadCommand
      Parameters:
      newLimits - the new limits
      Returns:
      a new ReadCommand with the updated limits
    • partitionKey

      public DecoratedKey partitionKey()
      Description copied from interface: SinglePartitionReadQuery
      Returns the key of the partition queried by this ReadQuery
      Specified by:
      partitionKey in interface SinglePartitionReadQuery
      Returns:
      the key of the partition queried
    • clusteringIndexFilter

      public ClusteringIndexFilter clusteringIndexFilter()
      Specified by:
      clusteringIndexFilter in interface SinglePartitionReadQuery
    • clusteringIndexFilter

      public ClusteringIndexFilter clusteringIndexFilter(DecoratedKey key)
      Description copied from class: ReadCommand
      The clustering index filter this command to use for the provided key.

      Note that that method should only be called on a key actually queried by this command and in practice, this will almost always return the same filter, but for the sake of paging, the filter on the first key of a range command might be slightly different.

      Specified by:
      clusteringIndexFilter in class ReadCommand
      Parameters:
      key - a partition key queried by this command.
      Returns:
      the ClusteringIndexFilter to use for the partition of key key.
    • getTimeout

      public long getTimeout(TimeUnit unit)
      Description copied from class: ReadCommand
      The configured timeout for this command.
      Specified by:
      getTimeout in class ReadCommand
      Returns:
      the configured timeout for this command.
    • isReversed

      public boolean isReversed()
      Description copied from class: ReadCommand
      Whether the underlying ClusteringIndexFilter is reversed or not.
      Specified by:
      isReversed in class ReadCommand
      Returns:
      whether the underlying ClusteringIndexFilter is reversed or not.
    • forPaging

      public SinglePartitionReadCommand forPaging(Clustering<?> lastReturned, DataLimits limits)
      Description copied from interface: SinglePartitionReadQuery
      Returns a new SinglePartitionReadQuery suitable to paging from the last returned row.
      Specified by:
      forPaging in interface SinglePartitionReadQuery
      Parameters:
      lastReturned - the last row returned by the previous page. The newly created query will only query row that comes after this (in query order). This can be null if this is the first page.
      limits - the limits to use for the page to query.
      Returns:
      the newly create query.
    • execute

      public PartitionIterator execute(ConsistencyLevel consistency, ClientState state, Dispatcher.RequestTime requestTime) throws RequestExecutionException
      Description copied from interface: ReadQuery
      Executes the query at the provided consistency level.
      Specified by:
      execute in interface ReadQuery
      Parameters:
      consistency - the consistency level to achieve for the query.
      state - client state
      requestTime - request enqueue / and start times
      Returns:
      the result of the query.
      Throws:
      RequestExecutionException
    • recordLatency

      protected void recordLatency(TableMetrics metric, long latencyNanos)
      Specified by:
      recordLatency in class ReadCommand
    • queryStorage

      protected UnfilteredPartitionIterator queryStorage(ColumnFamilyStore cfs, ReadExecutionController executionController)
      Specified by:
      queryStorage in class ReadCommand
    • queryMemtableAndDisk

      public UnfilteredRowIterator queryMemtableAndDisk(ColumnFamilyStore cfs, ReadExecutionController executionController)
      Queries both memtable and sstables to fetch the result of this query.

      Please note that this method: 1) does not check the row cache. 2) does not apply the query limit, nor the row filter (and so ignore 2ndary indexes). Those are applied in ReadCommand.executeLocally(org.apache.cassandra.db.ReadExecutionController). 3) does not record some of the read metrics (latency, scanned cells histograms) nor throws TombstoneOverwhelmingException. It is publicly exposed because there is a few places where that is exactly what we want, but it should be used only where you know you don't need thoses things.

      Also note that one must have created a ReadExecutionController on the queried table and we require it as a parameter to enforce that fact, even though it's not explicitlly used by the method.

    • queryMemtableAndDisk

    • intersects

      protected boolean intersects(SSTableReader sstable)
      Specified by:
      intersects in class ReadCommand
    • selectsFullPartition

      public boolean selectsFullPartition()
      Description copied from interface: ReadQuery
      Checks if this ReadQuery selects full partitions, that is it has no filtering on clustering or regular columns.
      Specified by:
      selectsFullPartition in interface ReadQuery
      Returns:
      true if this ReadQuery selects full partitions, false otherwise.
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • verb

      public Verb verb()
      Specified by:
      verb in class ReadCommand
    • appendCQLWhereClause

      protected void appendCQLWhereClause(StringBuilder sb)
      Specified by:
      appendCQLWhereClause in class ReadCommand
    • loggableTokens

      public String loggableTokens()
      Description copied from class: ReadCommand
      Return the queried token(s) for logging
      Specified by:
      loggableTokens in class ReadCommand
    • serializeSelection

      protected void serializeSelection(DataOutputPlus out, int version) throws IOException
      Specified by:
      serializeSelection in class ReadCommand
      Throws:
      IOException
    • selectionSerializedSize

      protected long selectionSerializedSize(int version)
      Specified by:
      selectionSerializedSize in class ReadCommand
    • isLimitedToOnePartition

      public boolean isLimitedToOnePartition()
      Specified by:
      isLimitedToOnePartition in class ReadCommand
    • isRangeRequest

      public boolean isRangeRequest()
      Specified by:
      isRangeRequest in class ReadCommand
    • metadata

      public TableMetadata metadata()
      Description copied from interface: ReadQuery
      The metadata for the table this is a query on.
      Specified by:
      metadata in interface ReadQuery
      Returns:
      the metadata for the table this is a query on.
    • executeInternal

      public PartitionIterator executeInternal(ReadExecutionController controller)
      Description copied from interface: ReadQuery
      Execute the query for internal queries (that is, it basically executes the query locally).
      Specified by:
      executeInternal in interface ReadQuery
      Parameters:
      controller - the ReadExecutionController protecting the read.
      Returns:
      the result of the query.
    • limits

      public DataLimits limits()
      Description copied from interface: ReadQuery
      The limits for the query.
      Specified by:
      limits in interface ReadQuery
      Returns:
      The limits for the query.
    • nowInSec

      public long nowInSec()
      Description copied from interface: ReadQuery
      The time in seconds to use as "now" for this query.

      We use the same time as "now" for the whole query to avoid considering different values as expired during the query, which would be buggy (would throw of counting amongst other things).

      Specified by:
      nowInSec in interface ReadQuery
      Returns:
      the time (in seconds) to use as "now".
    • rowFilter

      public RowFilter rowFilter()
      Description copied from interface: ReadQuery
      Filters/Resrictions on CQL rows.

      This contains the restrictions that are not directly handled by the ClusteringIndexFilter. More specifically, this includes any non-PK column restrictions and can include some PK columns restrictions when those can't be satisfied entirely by the clustering index filter (because not all clustering columns have been restricted for instance). If there is 2ndary indexes on the table, one of this restriction might be handled by a 2ndary index.

      Specified by:
      rowFilter in interface ReadQuery
      Returns:
      the filter holding the expression that rows must satisfy.
    • columnFilter

      public ColumnFilter columnFilter()
      Description copied from interface: ReadQuery
      A filter on which (non-PK) columns must be returned by the query.
      Specified by:
      columnFilter in interface ReadQuery
      Returns:
      which columns must be fetched by this query.
    • toCQLString

      public String toCQLString()
      Recreate the CQL string corresponding to this query.

      Note that in general the returned string will not be exactly the original user string, first because there isn't always a single syntax for a given query, but also because we don't have all the information needed (we know the non-PK columns queried but not the PK ones as internally we query them all). So this shouldn't be relied too strongly, but this should be good enough for debugging purpose which is what this is for.