Class RecordQueryIntersectionPlan
- java.lang.Object
-
- com.apple.foundationdb.record.query.plan.plans.RecordQueryIntersectionPlan
-
- All Implemented Interfaces:
PlanHashable
,QueryPlan<FDBQueriedRecord<Message>>
,RecordQueryPlan
,RecordQueryPlanWithChildren
,RecordQueryPlanWithRequiredFields
,Bindable
,Correlated<RelationalExpression>
,PlannerGraphRewritable
,RelationalExpressionWithChildren
,RelationalExpression
@API(INTERNAL) public class RecordQueryIntersectionPlan extends Object implements RecordQueryPlanWithChildren, RecordQueryPlanWithRequiredFields
A query plan that executes by taking the union of records from two or more compatibly-sorted child plans. To work, each child cursor must order its children the same way according to the comparison key.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface com.apple.foundationdb.record.query.plan.temp.RelationalExpression
RelationalExpression.CombineFunction<R,S>, RelationalExpression.CombinePredicate
-
-
Field Summary
Fields Modifier and Type Field Description static org.slf4j.Logger
LOGGER
-
Constructor Summary
Constructors Constructor Description RecordQueryIntersectionPlan(RecordQueryPlan left, RecordQueryPlan right, KeyExpression comparisonKey, boolean reverse)
Deprecated.RecordQueryIntersectionPlan(List<RecordQueryPlan> plans, KeyExpression comparisonKey, boolean reverse)
Deprecated.in favor offrom(List, KeyExpression)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description boolean
equals(Object other)
boolean
equalsWithoutChildren(RelationalExpression otherExpression, AliasMap equivalencesMap)
<M extends Message>
RecordCursor<FDBQueriedRecord<M>>execute(FDBRecordStoreBase<M> store, EvaluationContext context, byte[] continuation, ExecuteProperties executeProperties)
Execute this query plan.static RecordQueryIntersectionPlan
from(RecordQueryPlan left, RecordQueryPlan right, KeyExpression comparisonKey)
Construct a new union of two compatibly-ordered plans.static RecordQueryIntersectionPlan
from(List<RecordQueryPlan> children, KeyExpression comparisonKey)
Construct a new union of two or more compatibly-ordered plans.AvailableFields
getAvailableFields()
List<RecordQueryPlan>
getChildren()
Returns the (zero or more)RecordQueryPlan
children of this plan.KeyExpression
getComparisonKey()
int
getComplexity()
Returns an integer representing the "complexity" of the generated plan.Set<CorrelationIdentifier>
getCorrelatedToWithoutChildren()
List<? extends Quantifier>
getQuantifiers()
Return an iterator of references to the children of this planner expression.int
getRelationalChildCount()
Set<KeyExpression>
getRequiredFields()
int
hashCode()
int
hashCodeWithoutChildren()
boolean
isReverse()
Indicates whether this plan will return values in "reverse" order from the natural order of results of this plan.void
logPlanStructure(StoreTimer timer)
Adds one to an appropriateStoreTimer
counter for each plan and subplan of this plan, allowing tracking of which plans are being chosen (e.g.int
planHash()
Return a hash similar tohashCode
, but with the additional guarantee that is is stable across JVMs.RecordQueryIntersectionPlan
rebaseWithRebasedQuantifiers(AliasMap translationMap, List<Quantifier> rebasedQuantifiers)
PlannerGraph
rewritePlannerGraph(List<? extends PlannerGraph> childGraphs)
Method to rewrite the planner graph.String
toString()
-
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface com.apple.foundationdb.record.query.plan.plans.QueryPlan
execute, execute
-
Methods inherited from interface com.apple.foundationdb.record.query.plan.plans.RecordQueryPlan
accept, execute, execute, execute, getQueryPlanChildren, structuralEquals, structuralEquals, structuralHashCode
-
Methods inherited from interface com.apple.foundationdb.record.query.plan.plans.RecordQueryPlanWithChildren
getUsedIndexes, hasFullRecordScan, hasIndexScan, hasLoadBykeys, hasRecordScan
-
Methods inherited from interface com.apple.foundationdb.record.query.plan.temp.RelationalExpression
acceptPropertyVisitor, bindIdentities, bindTo, canCorrelate, enumerateUnboundCorrelatedTo, findMatches, match, semanticEquals, semanticEquals, semanticHashCode, show
-
Methods inherited from interface com.apple.foundationdb.record.query.plan.temp.expressions.RelationalExpressionWithChildren
getCorrelatedTo, rebase
-
-
-
-
Constructor Detail
-
RecordQueryIntersectionPlan
@Deprecated public RecordQueryIntersectionPlan(@Nonnull RecordQueryPlan left, @Nonnull RecordQueryPlan right, @Nonnull KeyExpression comparisonKey, boolean reverse)
Deprecated.Construct a new intersection of two compatibly-ordered plans. This constructor has been deprecated in favor of the static initializerfrom(RecordQueryPlan, RecordQueryPlan, KeyExpression)
.- Parameters:
left
- the first plan to intersectright
- the second plan to intersectcomparisonKey
- a key expression by which the results of both plans are orderedreverse
- whether both plans return results in reverse (i.e., descending) order by the comparison key
-
RecordQueryIntersectionPlan
@Deprecated public RecordQueryIntersectionPlan(@Nonnull List<RecordQueryPlan> plans, @Nonnull KeyExpression comparisonKey, boolean reverse)
Deprecated.in favor offrom(List, KeyExpression)
Construct a new intersection of two or more compatibly-ordered plans. This constructor has been deprecated in favor of the static initializerfrom(List, KeyExpression)
.- Parameters:
plans
- the list of plans to take the intersection ofcomparisonKey
- a key expression by which the results of both plans are orderedreverse
- whether all plans return results in reverse (i.e., descending) order by the comparison key
-
-
Method Detail
-
execute
@Nonnull public <M extends Message> RecordCursor<FDBQueriedRecord<M>> execute(@Nonnull FDBRecordStoreBase<M> store, @Nonnull EvaluationContext context, @Nullable byte[] continuation, @Nonnull ExecuteProperties executeProperties)
Description copied from interface:RecordQueryPlan
Execute this query plan.- Specified by:
execute
in interfaceRecordQueryPlan
- Type Parameters:
M
- type used to represent stored records- Parameters:
store
- record store from which to fetch recordscontext
- evaluation context containing parameter bindingscontinuation
- continuation from a previous execution of this same planexecuteProperties
- limits on execution- Returns:
- a cursor of records that match the query criteria
-
isReverse
public boolean isReverse()
Description copied from interface:QueryPlan
Indicates whether this plan will return values in "reverse" order from the natural order of results of this plan. The return value istrue
if the plan returns elements in descending order andfalse
if the elements are returned in ascending order.- Specified by:
isReverse
in interfaceQueryPlan<FDBQueriedRecord<Message>>
- Returns:
true
if this plan returns elements in reverse order
-
getChildren
@Nonnull public List<RecordQueryPlan> getChildren()
Description copied from interface:RecordQueryPlan
Returns the (zero or more)RecordQueryPlan
children of this plan.Warning: This part of the API is undergoing active development. At some point in the future, the return type of this method will change to allow it to return a list of generic
QueryPlan
s. At current, everyRecordQueryPlan
can only have otherRecordQueryPlan
s as children. However, this is not guaranteed to be the case in the future. This method has been marked asAPI.Status.UNSTABLE
as of version 2.5.- Specified by:
getChildren
in interfaceRecordQueryPlan
- Returns:
- the child plans
-
getComparisonKey
@Nonnull public KeyExpression getComparisonKey()
-
getQuantifiers
@Nonnull public List<? extends Quantifier> getQuantifiers()
Description copied from interface:RelationalExpression
Return an iterator of references to the children of this planner expression. The iterators returned by different calls are guaranteed to be independent (i.e., advancing one will not advance another). However, they might point to the same object, as whenCollections.emptyIterator()
is returned. The returned iterator should be treated as an immutable object and may throw an exception ifIterator.remove()
is called. The iterator must return its elements in a consistent order.- Specified by:
getQuantifiers
in interfaceRelationalExpression
- Returns:
- an iterator of references to the children of this planner expression
-
getCorrelatedToWithoutChildren
@Nonnull public Set<CorrelationIdentifier> getCorrelatedToWithoutChildren()
- Specified by:
getCorrelatedToWithoutChildren
in interfaceRelationalExpressionWithChildren
-
rebaseWithRebasedQuantifiers
@Nonnull public RecordQueryIntersectionPlan rebaseWithRebasedQuantifiers(@Nonnull AliasMap translationMap, @Nonnull List<Quantifier> rebasedQuantifiers)
- Specified by:
rebaseWithRebasedQuantifiers
in interfaceRelationalExpressionWithChildren
-
equalsWithoutChildren
public boolean equalsWithoutChildren(@Nonnull RelationalExpression otherExpression, @Nonnull AliasMap equivalencesMap)
- Specified by:
equalsWithoutChildren
in interfaceRelationalExpression
-
getAvailableFields
@Nonnull public AvailableFields getAvailableFields()
- Specified by:
getAvailableFields
in interfaceRecordQueryPlan
-
hashCodeWithoutChildren
public int hashCodeWithoutChildren()
- Specified by:
hashCodeWithoutChildren
in interfaceRelationalExpression
-
planHash
public int planHash()
Description copied from interface:PlanHashable
Return a hash similar tohashCode
, but with the additional guarantee that is is stable across JVMs.- Specified by:
planHash
in interfacePlanHashable
- Returns:
- a stable hash code
-
logPlanStructure
public void logPlanStructure(StoreTimer timer)
Description copied from interface:QueryPlan
Adds one to an appropriateStoreTimer
counter for each plan and subplan of this plan, allowing tracking of which plans are being chosen (e.g. index scan vs. full scan).- Specified by:
logPlanStructure
in interfaceQueryPlan<FDBQueriedRecord<Message>>
- Parameters:
timer
- the counters to increment
-
getComplexity
public int getComplexity()
Description copied from interface:QueryPlan
Returns an integer representing the "complexity" of the generated plan. Currently, this should simply be the number of plans in the plan tree with this plan as the root (i.e. the number of descendants of this plan, including itself).- Specified by:
getComplexity
in interfaceQueryPlan<FDBQueriedRecord<Message>>
- Returns:
- the complexity of this plan
-
getRelationalChildCount
public int getRelationalChildCount()
- Specified by:
getRelationalChildCount
in interfaceRelationalExpressionWithChildren
-
getRequiredFields
@Nonnull public Set<KeyExpression> getRequiredFields()
- Specified by:
getRequiredFields
in interfaceRecordQueryPlanWithRequiredFields
-
from
@Nonnull public static RecordQueryIntersectionPlan from(@Nonnull RecordQueryPlan left, @Nonnull RecordQueryPlan right, @Nonnull KeyExpression comparisonKey)
Construct a new union of two compatibly-ordered plans. The resulting plan will return all results that are returned by both theleft
orright
child plans. Each plan should return results in the same order according to the providedcomparisonKey
. The two children should also either both return results in forward order, or they should both return results in reverse order. (That is,left.isReverse()
should equalright.isReverse()
.)- Parameters:
left
- the first plan to intersectright
- the second plan to intersectcomparisonKey
- a key expression by which the results of both plans are ordered- Returns:
- a new plan that will return the intersection of all results from both child plans
-
from
@Nonnull public static RecordQueryIntersectionPlan from(@Nonnull List<RecordQueryPlan> children, @Nonnull KeyExpression comparisonKey)
Construct a new union of two or more compatibly-ordered plans. The resulting plan will return all results that are returned by all of the child plans. Each plan should return results in the same order according to the providedcomparisonKey
. The children should also either all return results in forward order, or they should all return results in reverse order. (That is,QueryPlan.isReverse()
should return the same value for each child.)- Parameters:
children
- the list of plans to take the intersection ofcomparisonKey
- a key expression by which the results of both plans are ordered- Returns:
- a new plan that will return the intersection of all results from both child plans
-
rewritePlannerGraph
@Nonnull public PlannerGraph rewritePlannerGraph(@Nonnull List<? extends PlannerGraph> childGraphs)
Description copied from interface:PlannerGraphRewritable
Method to rewrite the planner graph.- Specified by:
rewritePlannerGraph
in interfacePlannerGraphRewritable
- Parameters:
childGraphs
- planner graphs of children expression that already have been computed- Returns:
- a new planner graph that can combine the
childGraph
s in a meaningful way. Note that there is no obligation to use thechildGraph
s at all, this method can create a new independent planner graph completely from scratch.
-
-