Class ReadCommand
- java.lang.Object
-
- org.apache.cassandra.db.monitoring.MonitorableImpl
-
- org.apache.cassandra.db.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.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description protected static class
ReadCommand.Kind
protected static class
ReadCommand.SelectionDeserializer
static class
ReadCommand.Serializer
-
Field Summary
Fields Modifier and Type Field Description protected static org.slf4j.Logger
logger
static IVersionedSerializer<ReadCommand>
serializer
-
Constructor Summary
Constructors Modifier Constructor Description protected
ReadCommand(ReadCommand.Kind kind, boolean isDigestQuery, int digestVersion, boolean acceptsTransient, TableMetadata metadata, long nowInSec, ColumnFilter columnFilter, RowFilter rowFilter, DataLimits limits, Index.QueryPlan indexQueryPlan, boolean trackWarnings)
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description boolean
acceptsTransient()
protected abstract void
appendCQLWhereClause(java.lang.StringBuilder sb)
abstract ClusteringIndexFilter
clusteringIndexFilter(DecoratedKey key)
The clustering index filter this command to use for the provided key.ColumnFilter
columnFilter()
A filter on which (non-PK) columns must be returned by the query.abstract ReadCommand
copy()
Returns a copy of this command.protected abstract ReadCommand
copyAsDigestQuery()
ReadCommand
copyAsDigestQuery(java.lang.Iterable<Replica> replicas)
Returns a copy of this command with isDigestQuery set to true.ReadCommand
copyAsDigestQuery(Replica replica)
Returns a copy of this command with isDigestQuery set to true.protected abstract ReadCommand
copyAsTransientQuery()
ReadCommand
copyAsTransientQuery(java.lang.Iterable<Replica> replicas)
Returns a copy of this command with acceptsTransient set to true.ReadCommand
copyAsTransientQuery(Replica replica)
Returns a copy of this command with acceptsTransient set to true.ReadResponse
createEmptyResponse()
Message<ReadCommand>
createMessage(boolean trackRepairedData, Dispatcher.RequestTime requestTime)
Creates a message for this command.ReadResponse
createResponse(UnfilteredPartitionIterator iterator, org.apache.cassandra.db.RepairedDataInfo rdi)
int
digestVersion()
If the query is a digest one, the requested digest version.PartitionIterator
executeInternal(ReadExecutionController controller)
Execute the query for internal queries (that is, it basically executes the query locally).UnfilteredPartitionIterator
executeLocally(ReadExecutionController executionController)
Executes this command on the local host.ReadExecutionController
executionController()
Starts a new read operation.ReadExecutionController
executionController(boolean trackRepairedStatus)
static ReadCommand
getCommand()
abstract long
getTimeout(java.util.concurrent.TimeUnit unit)
The configured timeout for this command.protected boolean
hasPartitionLevelDeletions(SSTableReader sstable)
protected boolean
hasRequiredStatics(SSTableReader sstable)
Index.QueryPlan
indexQueryPlan()
Index query plan chosen for this query.Index.Searcher
indexSearcher()
protected abstract boolean
intersects(SSTableReader sstable)
boolean
isDigestQuery()
Whether this query is a digest one or not.abstract boolean
isLimitedToOnePartition()
abstract boolean
isRangeRequest()
abstract boolean
isReversed()
Whether the underlyingClusteringIndexFilter
is reversed or not.boolean
isSinglePartitionRead()
Whether this command is a single partition readboolean
isTopK()
The query is a top-k query if the query has anIndex.QueryPlan
that supports top-k ordering.boolean
isTrackingWarnings()
DataLimits
limits()
The limits for the query.abstract java.lang.String
loggableTokens()
Return the queried token(s) for loggingvoid
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.TableMetadata
metadata()
The metadata for the table this is a query on.java.lang.String
name()
long
nowInSec()
The time in seconds to use as "now" for this query.protected abstract UnfilteredPartitionIterator
queryStorage(ColumnFamilyStore cfs, ReadExecutionController executionController)
protected abstract void
recordLatency(TableMetrics metric, long latencyNanos)
RowFilter
rowFilter()
Filters/Resrictions on CQL rows.protected abstract long
selectionSerializedSize(int version)
protected abstract void
serializeSelection(DataOutputPlus out, int version)
ReadCommand
setDigestVersion(int digestVersion)
Sets the digest version, for when digest for that command is requested.java.lang.String
toCQLString()
Recreate the CQL string corresponding to this query.void
trackWarnings()
abstract Verb
verb()
protected UnfilteredPartitionIterator
withoutPurgeableTombstones(UnfilteredPartitionIterator iterator, ColumnFamilyStore cfs, ReadExecutionController controller)
abstract ReadCommand
withUpdatedLimit(DataLimits newLimits)
Creates a newReadCommand
instance with new limits.-
Methods inherited from class org.apache.cassandra.db.monitoring.MonitorableImpl
abort, complete, creationTimeNanos, isAborted, isCompleted, isCrossNode, isInProgress, isSlow, setMonitoringTime, slowTimeoutNanos, timeoutNanos
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface org.apache.cassandra.db.ReadQuery
execute, getPager, isEmpty, selectsClustering, selectsFullPartition, selectsKey
-
-
-
-
Field Detail
-
logger
protected static final org.slf4j.Logger logger
-
serializer
public static final IVersionedSerializer<ReadCommand> serializer
-
-
Constructor Detail
-
ReadCommand
protected ReadCommand(ReadCommand.Kind kind, boolean isDigestQuery, int digestVersion, boolean acceptsTransient, TableMetadata metadata, long nowInSec, ColumnFilter columnFilter, RowFilter rowFilter, DataLimits limits, Index.QueryPlan indexQueryPlan, boolean trackWarnings)
-
-
Method Detail
-
getCommand
public static ReadCommand getCommand()
-
serializeSelection
protected abstract void serializeSelection(DataOutputPlus out, int version) throws java.io.IOException
- Throws:
java.io.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 newReadCommand
instance with new limits.- Parameters:
newLimits
- the new limits- Returns:
- a new
ReadCommand
with the updated limits
-
getTimeout
public abstract long getTimeout(java.util.concurrent.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 anIndex.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 keykey
.
-
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(java.lang.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(java.lang.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 underlyingClusteringIndexFilter
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(java.lang.StringBuilder sb)
-
withoutPurgeableTombstones
protected UnfilteredPartitionIterator withoutPurgeableTombstones(UnfilteredPartitionIterator iterator, ColumnFamilyStore cfs, ReadExecutionController controller)
-
loggableTokens
public abstract java.lang.String loggableTokens()
Return the queried token(s) for logging
-
name
public java.lang.String name()
- Specified by:
name
in interfaceMonitorable
-
metadata
public TableMetadata metadata()
Description copied from interface:ReadQuery
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 interfaceReadQuery
- Parameters:
controller
- theReadExecutionController
protecting the read.- Returns:
- the result of the query.
-
limits
public DataLimits limits()
Description copied from interface:ReadQuery
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).
-
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.
-
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 interfaceReadQuery
- Returns:
- which columns must be fetched by this query.
-
toCQLString
public java.lang.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.
-
-