Class ReadCommand

All Implemented Interfaces:
Monitorable, ReadQuery
Direct Known Subclasses:
PartitionRangeReadCommand, SinglePartitionReadCommand

public abstract class ReadCommand extends MonitorableImpl
General interface for storage-engine read commands (common to both range and single partition commands).

This contains all the informations needed to do a local read.

  • Field Details

  • Constructor Details

  • Method Details

    • getCommand

      public static ReadCommand getCommand()
    • serializeSelection

      protected abstract void serializeSelection(DataOutputPlus out, int version) throws IOException
      Throws:
      IOException
    • selectionSerializedSize

      protected abstract long selectionSerializedSize(int version)
    • isLimitedToOnePartition

      public abstract boolean isLimitedToOnePartition()
    • isSinglePartitionRead

      public boolean isSinglePartitionRead()
      Whether this command is a single partition read
      Returns:
      true if the command is a single partition read, false otherwise
    • isRangeRequest

      public abstract boolean isRangeRequest()
    • withUpdatedLimit

      public abstract ReadCommand withUpdatedLimit(DataLimits newLimits)
      Creates a new ReadCommand instance with new limits.
      Parameters:
      newLimits - the new limits
      Returns:
      a new ReadCommand with the updated limits
    • getTimeout

      public abstract long getTimeout(TimeUnit unit)
      The configured timeout for this command.
      Returns:
      the configured timeout for this command.
    • isDigestQuery

      public boolean isDigestQuery()
      Whether this query is a digest one or not.
      Returns:
      Whether this query is a digest query.
    • digestVersion

      public int digestVersion()
      If the query is a digest one, the requested digest version.
      Returns:
      the requested digest version if the query is a digest. Otherwise, this can return anything.
    • setDigestVersion

      public ReadCommand setDigestVersion(int digestVersion)
      Sets the digest version, for when digest for that command is requested.

      Note that we allow setting this independently of setting the command as a digest query as this allows us to use the command as a carrier of the digest version even if we only call setIsDigestQuery on some copy of it.

      Parameters:
      digestVersion - the version for the digest is this command is used for digest query..
      Returns:
      this read command.
    • acceptsTransient

      public boolean acceptsTransient()
      Returns:
      Whether this query expects only a transient data response, or a full response
    • trackWarnings

      public void trackWarnings()
    • isTrackingWarnings

      public boolean isTrackingWarnings()
    • indexQueryPlan

      @Nullable public Index.QueryPlan indexQueryPlan()
      Index query plan chosen for this query. Can be null.
      Returns:
      index query plan chosen for this query
    • isTopK

      public boolean isTopK()
      Description copied from interface: ReadQuery
      The query is a top-k query if the query has an Index.QueryPlan that supports top-k ordering.
      Returns:
      true if this is a top-k query
    • indexSearcher

      public Index.Searcher indexSearcher()
    • clusteringIndexFilter

      public abstract ClusteringIndexFilter clusteringIndexFilter(DecoratedKey key)
      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.

      Parameters:
      key - a partition key queried by this command.
      Returns:
      the ClusteringIndexFilter to use for the partition of key key.
    • dataRange

      public DataRange dataRange()
    • copy

      public abstract ReadCommand copy()
      Returns a copy of this command.
      Returns:
      a copy of this command.
    • copyAsTransientQuery

      public ReadCommand copyAsTransientQuery(Replica replica)
      Returns a copy of this command with acceptsTransient set to true.
    • copyAsTransientQuery

      public ReadCommand copyAsTransientQuery(Iterable<Replica> replicas)
      Returns a copy of this command with acceptsTransient set to true.
    • copyAsTransientQuery

      protected abstract ReadCommand copyAsTransientQuery()
    • copyAsDigestQuery

      public ReadCommand copyAsDigestQuery(Replica replica)
      Returns a copy of this command with isDigestQuery set to true.
    • copyAsDigestQuery

      public ReadCommand copyAsDigestQuery(Iterable<Replica> replicas)
      Returns a copy of this command with isDigestQuery set to true.
    • copyAsDigestQuery

      protected abstract ReadCommand copyAsDigestQuery()
    • queryStorage

      protected abstract UnfilteredPartitionIterator queryStorage(ColumnFamilyStore cfs, ReadExecutionController executionController)
    • isReversed

      public abstract boolean isReversed()
      Whether the underlying ClusteringIndexFilter is reversed or not.
      Returns:
      whether the underlying ClusteringIndexFilter is reversed or not.
    • createResponse

      public ReadResponse createResponse(UnfilteredPartitionIterator iterator, org.apache.cassandra.db.RepairedDataInfo rdi)
    • createEmptyResponse

      public ReadResponse createEmptyResponse()
    • maybeValidateIndex

      public void maybeValidateIndex()
      If the index manager for the CFS determines that there's an applicable 2i that can be used to execute this command, call its (optional) validation method to check that nothing in this command's parameters violates the implementation specific validation rules.
    • executeLocally

      public UnfilteredPartitionIterator executeLocally(ReadExecutionController executionController)
      Executes this command on the local host.
      Parameters:
      executionController - the execution controller spanning this command
      Returns:
      an iterator over the result of executing this command locally.
    • recordLatency

      protected abstract void recordLatency(TableMetrics metric, long latencyNanos)
    • executionController

      public ReadExecutionController executionController(boolean trackRepairedStatus)
    • executionController

      public ReadExecutionController executionController()
      Description copied from interface: ReadQuery
      Starts a new read operation.

      This must be called before ReadQuery.executeInternal(org.apache.cassandra.db.ReadExecutionController) and passed to it to protect the read. The returned object must be closed on all path and it is thus strongly advised to use it in a try-with-ressource construction.

      Returns:
      a newly started execution controller for this ReadQuery.
    • createMessage

      public Message<ReadCommand> createMessage(boolean trackRepairedData, Dispatcher.RequestTime requestTime)
      Creates a message for this command.
    • intersects

      protected abstract boolean intersects(SSTableReader sstable)
    • hasRequiredStatics

      protected boolean hasRequiredStatics(SSTableReader sstable)
    • hasPartitionLevelDeletions

      protected boolean hasPartitionLevelDeletions(SSTableReader sstable)
    • verb

      public abstract Verb verb()
    • appendCQLWhereClause

      protected abstract void appendCQLWhereClause(StringBuilder sb)
    • withoutPurgeableTombstones

      protected UnfilteredPartitionIterator withoutPurgeableTombstones(UnfilteredPartitionIterator iterator, ColumnFamilyStore cfs, ReadExecutionController controller)
    • loggableTokens

      public abstract String loggableTokens()
      Return the queried token(s) for logging
    • name

      public String name()
      Specified by:
      name in interface Monitorable
    • 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.