| Modifier and Type | Field and Description |
|---|---|
| pack-priv AndNode | |
| pack-priv int | |
| pack-priv int | |
| protected boolean | |
| pack-priv boolean | |
| pack-priv JBitSet | |
| private boolean | |
| private Set | |
| protected boolean | |
| protected boolean |
| Access | Constructor and Description |
|---|---|
| pack-priv | Predicate(AndNode
The top of the predicate andNode, JBitSet Bit map of referenced tables referencedSet, ContextManager The context manager cm)Constructor. |
| Modifier and Type | Method and Description |
|---|---|
| pack-priv void | acceptChildren(Visitor
the visitor v)Overrides org. Accept the visitor for all visitable children of this node. |
| pack-priv String | binaryRelOpColRefsToString()
Get a string version of the column references for this predicate IF it's a binary relational operator. |
| pack-priv void | |
| pack-priv void | |
| public int | compareTo(Predicate
the object to be compared. other)Implements java. Compares this object with the specified object for order. |
| public boolean | compareWithKnownConstant(Optimizable
The Optimizable that we want to know whether we
are comparing to a known constant. optTable, boolean Whether or not to consider parameters with defaults
as known constants. considerParameters)Implements org. Is this predicate a comparison with a known constant value? |
| pack-priv void | copyFields(Predicate otherPred)
Copy all fields of this Predicate (except the two that are set from 'init'). |
| public boolean | equalsComparisonWithConstantExpression(Optimizable
The Optimizable for which we want to know whether
it is being equality-compared to a constant expression. optTable)Implements org. Is this predicate an equality comparison with a constant expression? |
| pack-priv void | generateExpressionOperand(Optimizable optTable, int columnPosition, ExpressionClassBuilder acb, MethodBuilder mb)
|
| pack-priv AndNode | |
| public DataValueDescriptor | getCompareValue(Optimizable optTable)
Implements org. Get an Object representing the known constant value that the given Optimizable is being compared to. |
| pack-priv int | Returns: The equivalenceClass for this predicate.Get the equivalenceClass for this predicate. |
| public int | getIndexPosition()
Implements org. Get the position of the index column that this predicate restricts. |
| protected Predicate | Returns: A new predicate whose operands have been scoped to the received childRSN.Set of all table numbers referenced by
the ResultSetNode that is _parent_ to the received childRSN.
We need this to make sure we don't scope the operands to a
ResultSetNode to which they don't apply. parentRSNsTables, ResultSetNode The result set node for which we want to create
a scoped predicate. childRSN, int[] If not -1 then this tells us which ResultColumn
in the received childRSN we need to use for the scoped predicate;
if -1 then the column position of the scoped column reference
will be stored in this array and passed back to the caller. whichRC)If this predicate's operator is a BinaryRelationalOperatorNode, then look at the operands and return a new, equivalent predicate that is "scoped" to the received ResultSetNode. |
| pack-priv boolean | |
| public JBitSet | getReferencedMap()
Implements org. Get the map of referenced tables for this OptimizablePredicate. |
| pack-priv JBitSet | |
| pack-priv RelationalOperator | Returns: The RelationalOperator on the left side of the AND node, if any.Get the RelationalOperator on the left side of the AND node, if there is one. |
| protected InListOperatorNode | getSourceInList()
If this predicate corresponds to an IN-list, return the underlying InListOperatorNode from which it was built. |
| protected InListOperatorNode | Returns: Underlying InListOp for this predicate (depending on the value of probePredOnly), or null if this predicate does not correspond to an IN-list in any way.If true, only get the source IN list for this
predicate *if* it is an IN-list probe predicate. If false,
return the underlying InListOperatorNode (if it exists) regardless
of whether this is a probe predicate or an un-transformed IN-list
pred. probePredOnly)Does the work of getSourceInList() above, but can also be called directly with an argument to indicate whether or not we should limit ourselves to probe predicates. |
| pack-priv int | Returns: The start operator for a start key on this column.The optimizable table, so we can tell which side of
the operator the search column is on. optTable)Get the start operator for this predicate for a scan. |
| pack-priv int | |
| public int | hasEqualOnColumnList(int[]
the column numbers on which the user wants
to check if the equality condition exists. baseColumnPositions, Optimizable the table for which baseColumnPositions are given. optTable)Implements org. Returns if the predicate involves an equal operator on one of the columns specified in the baseColumnPositions. |
| public boolean | hasMethodCall()
Implements org. Return whether or not an OptimizablePredicate contains a method call. |
| public boolean | hasSubquery()
Implements org. Return whether or not an OptimizablePredicate contains a subquery. |
| protected boolean | |
| protected boolean | Returns: Whether or not this is a join predicate.Is this predicate a join predicate? |
| pack-priv final boolean | |
| pack-priv final boolean | Returns: true if the predicate is a pushable set of OR clauses.Is this predicate an pushable OR list? |
| public boolean | isQualifier()
Implements org. Is this predicate a qualifier? |
| protected boolean | Returns: False if there is no relational operator for this predicate OR if this predicate is an internal "probe predicate" (in which case it "looks" like we have a relational operator but in truth it's a disguised IN-list operator). True otherwise.Return whether or not this predicate corresponds to a legitimate relational operator. |
| protected boolean | |
| protected boolean | isScopedToSourceResultSet()
Return true if this predicate is scoped AND the scoped operand is a ColumnReference that points to a source result set. |
| public boolean | isStartKey()
Implements org. Is this predicate a start key? |
| public boolean | isStopKey()
Implements org. Is this predicate a stop key? |
| pack-priv final boolean | Returns: true if term is wither a AND of a RelationalOperator, or an OR of one or more Relational Operators.Is this predicate a possible Qualifier for store? |
| protected void | markAsScopedForPush()
Indicate that this predicate is a scoped copy of some other predicate (i.e. it was created as the result of a call to getPredScopedForResultSet() on some other predicate). |
| public void | markQualifier()
Implements org. Tell the predicate that it is to be used as a qualifier in an index scan. |
| public void | markStartKey()
Implements org. Tell the predicate that it is to be used as a column in the start key value for an index scan. |
| public void | markStopKey()
Implements org. Tell the predicate that it is to be used as a column in the stop key value for an index scan. |
| pack-priv void | printSubNodes(int
The depth of this node in the tree depth)Overrides org. Prints the sub-nodes of this object. |
| protected boolean | Returns: Whether or not this predicate is eligible to be pushed into subqueries.Determine whether or not this predicate is eligible for push-down into subqueries. |
| protected boolean | Returns: True if this predicate is a scoped predicate, in which case we performed a one-sided remap. False if the predicate is not scoped; the caller can then make the calls to perform a "normal" remap on this predicate.When remapping a "normal" (i.e. non-scoped) predicate both of the predicate's operands are remapped and that's it. |
| public double | selectivity(Optimizable
The Optimizable that this predicate restricts optTable)Implements org. Get a (crude) estimate of the selectivity of this predicate. |
| pack-priv void | |
| pack-priv void | setEquivalenceClass(int
The equivalence class for this predicate. equivalenceClass)Set the equivalence class, if any, for this predicate. |
| pack-priv void | setIndexPosition(int
The position of the index column that this
predicate restricts. indexPosition)Set the position of the index column that this predicate restricts |
| pack-priv void | setPushable(boolean
Whether or not the predicate is pushable. pushable)Set whether or not this predicate is pushable. |
| pack-priv void | setTransitiveSearchClauseAdded(RelationalOperator
The search clause that we are currently considering
as the source for transitive closure ro)Mark this predicate as having been used to add a new predicate of the specified type via transitive closure on search clauses. |
| public String | Returns: This object as a StringOverrides org. Convert this object to a String. |
| pack-priv boolean | Returns: Whether or not this predicate has been used to add a new search clause of the specified type via transitive closure.The search clause that we are currently considering
as the source for transitive closure ro)Return whether or not this predicate has been used to add a new search clause of the specified type via transitive closure. |
| andNode | back to summary |
|---|---|
| pack-priv AndNode andNode | |
| equivalenceClass | back to summary |
|---|---|
| pack-priv int equivalenceClass | |
| indexPosition | back to summary |
|---|---|
| pack-priv int indexPosition | |
| isQualifier | back to summary |
|---|---|
| protected boolean isQualifier | |
| pushable | back to summary |
|---|---|
| pack-priv boolean pushable | |
| referencedSet | back to summary |
|---|---|
| pack-priv JBitSet referencedSet | |
| scoped | back to summary |
|---|---|
| private boolean scoped | |
| searchClauses | back to summary |
|---|---|
| private Set<Integer> searchClauses | |
| startKey | back to summary |
|---|---|
| protected boolean startKey | |
| stopKey | back to summary |
|---|---|
| protected boolean stopKey | |
| Predicate | back to summary |
|---|---|
| pack-priv Predicate(AndNode andNode, JBitSet referencedSet, ContextManager cm) Constructor.
| |
| acceptChildren | back to summary |
|---|---|
| pack-priv void acceptChildren(Visitor v) throws StandardException Overrides org. Accept the visitor for all visitable children of this node.
| |
| binaryRelOpColRefsToString | back to summary |
|---|---|
| pack-priv String binaryRelOpColRefsToString() Get a string version of the column references for this predicate IF it's a binary relational operator. We only print out the names of the operands if they are column references; otherwise we just print a dummy value. This is for debugging purposes only--it's a convenient way to see what columns the predicate is referencing, especially when tracing through code and printing assert failure. | |
| categorize | back to summary |
|---|---|
| pack-priv void categorize() throws StandardException Categorize this predicate. Initially, this means building a bit map of the referenced tables for each predicate.
| |
| clearScanFlags | back to summary |
|---|---|
| pack-priv void clearScanFlags() Clear the start/stop position and qualifier flags | |
| compareTo | back to summary |
|---|---|
| public int compareTo(Predicate other) Implements java. Doc from java. Compares this object with the specified object for order. Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object. The implementor must ensure The implementor must also ensure that the relation is transitive:
Finally, the implementor must ensure that
| |
| compareWithKnownConstant | back to summary |
|---|---|
| public boolean compareWithKnownConstant(Optimizable optTable, boolean considerParameters) Implements org. Doc from org. Is this predicate a comparison with a known constant value?
| |
| copyFields | back to summary |
|---|---|
| pack-priv void copyFields(Predicate otherPred) Copy all fields of this Predicate (except the two that are set from 'init'). | |
| equalsComparisonWithConstantExpression | back to summary |
|---|---|
| public boolean equalsComparisonWithConstantExpression(Optimizable optTable) Implements org. Doc from org. Is this predicate an equality comparison with a constant expression? (IS NULL is considered to be an = comparison with a constant expression).
| |
| generateExpressionOperand | back to summary |
|---|---|
| pack-priv void generateExpressionOperand(Optimizable optTable, int columnPosition, ExpressionClassBuilder acb, MethodBuilder mb) throws StandardException | |
| getAndNode | back to summary |
|---|---|
| pack-priv AndNode getAndNode() Return the andNode.
| |
| getCompareValue | back to summary |
|---|---|
| public DataValueDescriptor getCompareValue(Optimizable optTable) throws StandardException Implements org. Doc from org. Get an Object representing the known constant value that the given Optimizable is being compared to.
| |
| getEquivalenceClass | back to summary |
|---|---|
| pack-priv int getEquivalenceClass() Get the equivalenceClass for this predicate.
| |
| getIndexPosition | back to summary |
|---|---|
| public int getIndexPosition() Implements org. Doc from org. Get the position of the index column that this predicate restricts. Note This assumes that this predicate is part of an OptimizablePredicateList, and that classify() has been called on the OptimizablePredicateList.
| |
| getPredScopedForResultSet | back to summary |
|---|---|
| protected Predicate getPredScopedForResultSet(JBitSet parentRSNsTables, ResultSetNode childRSN, int[] whichRC) throws StandardException If this predicate's operator is a BinaryRelationalOperatorNode, then look at the operands and return a new, equivalent predicate that is "scoped" to the received ResultSetNode. By "scoped" we mean that the operands, which shold be column references, have been mapped to the appropriate result columns in the received RSN. This is useful for pushing predicates from outer queries down into inner queries, in which case the column references need to be remapped. For example, let V1 represent select i,j from t1 UNION select i,j from t2 and V2 represent select a,b from t3 UNION select a,b from t4 Then assume we have the following query: select * from V1, V2 where V1.j = V2.b Let's further assume that this Predicate object represents the "V1.j = V2.b" operator and that the childRSN we received as a parameter represents one of the subqueries to which we want to push the predicate; let's say it's: select i,j from t1 Then this method will return a new predicate whose binary operator represents the expression "T1.j = V2.b" (that is, V1.j will be mapped to the corresponding column in T1). For more on how that mapping is made, see the "getScopedOperand()" method in BinaryRelationalOperatorNode.java. ASSUMPTION: We should only get to this method if we know that at least one operand in this predicate can and should be mapped to the received childRSN. For an example of where that check is made, see the pushOptPredicate() method in SetOperatorNode.java.
| |
| getPushable | back to summary |
|---|---|
| pack-priv boolean getPushable() Return the pushable.
| |
| getReferencedMap | back to summary |
|---|---|
| public JBitSet getReferencedMap() Implements org. Doc from org. Get the map of referenced tables for this OptimizablePredicate.
| |
| getReferencedSet | back to summary |
|---|---|
| pack-priv JBitSet getReferencedSet() Return the referencedSet.
| |
| getRelop | back to summary |
|---|---|
| pack-priv RelationalOperator getRelop() Get the RelationalOperator on the left side of the AND node, if there is one. If the left side is not a RelationalOperator, return null.
| |
| getSourceInList | back to summary |
|---|---|
| protected InListOperatorNode getSourceInList() If this predicate corresponds to an IN-list, return the underlying InListOperatorNode from which it was built. There are two forms to check for: 1. This predicate is an IN-list "probe predicate", in which case the underlying InListOpNode is stored within the binary relational operator that is the left operand of this predicate's AND node. 2. This predicate corresponds to an IN-list that could _not_ be transformed into a "probe predicate" (i.e. the IN-list contains one or more non-parameter, non-constant values). In that case the underlying InListOpNode is simply the left operand of this predicate's AND node. If this predicate does not correspond to an IN-list in any way, this method will return null. | |
| getSourceInList | back to summary |
|---|---|
| protected InListOperatorNode getSourceInList(boolean probePredOnly) Does the work of getSourceInList() above, but can also be called directly with an argument to indicate whether or not we should limit ourselves to probe predicates.
| |
| getStartOperator | back to summary |
|---|---|
| pack-priv int getStartOperator(Optimizable optTable) Get the start operator for this predicate for a scan.
| |
| getStopOperator | back to summary |
|---|---|
| pack-priv int getStopOperator(Optimizable optTable) | |
| hasEqualOnColumnList | back to summary |
|---|---|
| public int hasEqualOnColumnList(int[] baseColumnPositions, Optimizable optTable) throws StandardException Implements org. Doc from org. Returns if the predicate involves an equal operator on one of the columns specified in the baseColumnPositions.
| |
| hasMethodCall | back to summary |
|---|---|
| public boolean hasMethodCall() Implements org. Doc from org. Return whether or not an OptimizablePredicate contains a method call.
| |
| hasSubquery | back to summary |
|---|---|
| public boolean hasSubquery() Implements org. Doc from org. Return whether or not an OptimizablePredicate contains a subquery.
| |
| isInListProbePredicate | back to summary |
|---|---|
| protected boolean isInListProbePredicate() Return whether or not this predicate is an IN-list probe predicate. | |
| isJoinPredicate | back to summary |
|---|---|
| protected boolean isJoinPredicate() Is this predicate a join predicate? In order to be so, it must be a binary relational operator node that has a column reference on both sides.
| |
| isOrList | back to summary |
|---|---|
| pack-priv final boolean isOrList() | |
| isPushableOrClause | back to summary |
|---|---|
| pack-priv final boolean isPushableOrClause(Optimizable optTable) throws StandardException Is this predicate an pushable OR list? Does the predicate represent a AND'd list of OR term's, all of which are pushable. To be pushable each of OR terms must be a legal qualifier, which is a column reference on one side of a Relational operator and a constant on the other.
| |
| isQualifier | back to summary |
|---|---|
| public boolean isQualifier() Implements org. Doc from org. Is this predicate a qualifier?
| |
| isRelationalOpPredicate | back to summary |
|---|---|
| protected boolean isRelationalOpPredicate() Return whether or not this predicate corresponds to a legitimate relational operator.
| |
| isScopedForPush | back to summary |
|---|---|
| protected boolean isScopedForPush() Return whether or not this predicate is a scoped copy of another predicate. | |
| isScopedToSourceResultSet | back to summary |
|---|---|
| protected boolean isScopedToSourceResultSet() throws StandardException Return true if this predicate is scoped AND the scoped operand is a ColumnReference that points to a source result set. If the scoped operand is not a ColumnReference that points to a source result set then it must be pointing to some kind of expression, such as a literal (ex. 'strlit'), an aggregate value (ex. "count(*)"), or the result of a function (ex. "sin(i)") or operator (ex. "i+1"). This method is used when pushing predicates to determine how far down the query tree a scoped predicate needs to be pushed to allow for successful evaluation of the scoped operand. If the scoped operand is not pointing to a source result set then it should not be pushed any further down tree. The reason is that evaluation of the expression to which the operand is pointing may depend on other values from the current level in the tree (ex. "sin(i)" depends on the value of "i", which could be a column at the predicate's current level). If we pushed the predicate further down, those values could become inaccessible, leading to execution-time errors. If, on the other hand, the scoped operand *is* pointing to a source result set, then we want to push it further down the tree until it reaches that result set, which allows evaluation of this predicate to occur as close to store as possible. This method doesn't actually do the push, it just returns "true" and then the caller can push as appropriate. | |
| isStartKey | back to summary |
|---|---|
| public boolean isStartKey() Implements org. Doc from org. Is this predicate a start key?
| |
| isStopKey | back to summary |
|---|---|
| public boolean isStopKey() Implements org. Doc from org. Is this predicate a stop key?
| |
| isStoreQualifier | back to summary |
|---|---|
| pack-priv final boolean isStoreQualifier() Is this predicate a possible Qualifier for store? Current 2 types of predicates can be pushed to store: 1) RelationalOperator - represented with by left operand as instance of RelationalOperator. 2) A single And'd term of a list of OR terms represented by left operand as instance of OrNode. More checking specific operator's terms to see if they are finally pushable to store. In the final push at execution each term of the AND or OR must be a Relational operator with a column reference on one side and a constant on the other.
| |
| markAsScopedForPush | back to summary |
|---|---|
| protected void markAsScopedForPush() Indicate that this predicate is a scoped copy of some other predicate (i.e. it was created as the result of a call to getPredScopedForResultSet() on some other predicate). | |
| markQualifier | back to summary |
|---|---|
| public void markQualifier() Implements org. Doc from org. Tell the predicate that it is to be used as a qualifier in an index scan.
| |
| markStartKey | back to summary |
|---|---|
| public void markStartKey() Implements org. Doc from org. Tell the predicate that it is to be used as a column in the start key value for an index scan.
| |
| markStopKey | back to summary |
|---|---|
| public void markStopKey() Implements org. Doc from org. Tell the predicate that it is to be used as a column in the stop key value for an index scan.
| |
| printSubNodes | back to summary |
|---|---|
| pack-priv void printSubNodes(int depth) Overrides org. Prints the sub-nodes of this object. See QueryTreeNode.java for how tree printing is supposed to work.
| |
| pushableToSubqueries | back to summary |
|---|---|
| protected boolean pushableToSubqueries() throws StandardException Determine whether or not this predicate is eligible for push-down into subqueries. Right now the only predicates we consider to be eligible are those which 1) are Binary Relational operator nodes and 2) have a column reference on BOTH sides, each of which has a reference to a base table somewhere beneath it.
| |
| remapScopedPred | back to summary |
|---|---|
| protected boolean remapScopedPred() When remapping a "normal" (i.e. non-scoped) predicate both
of the predicate's operands are remapped and that's it.
But when remapping a scoped predicate, things are slightly
different. This method handles remapping of scoped predicates.
We know that, for a scoped predicate, exactly one operand has
been scoped for a specific target result set; the other operand
is pointing to some other instance of FromTable with which the
target result set is to be joined (see getScopedOperand() in
BinaryRelationalOperatorNode.java). For every level of the
query through which the scoped predicate is pushed, we have
to perform a remap operation of the scoped operand. We do
*not*, however, remap the non-scoped operand. The reason
is that the non-scoped operand is already pointing to the
result set against which it must be evaluated. As the scoped
predicate is pushed down the query tree, the non-scoped
operand should not change where it's pointing and thus should
not be remapped. For example, assume we have a query whose
tree has the following form:
SELECT[0]
/ \
PRN PRN
| |
SELECT[4] UNION
| / \
PRN SELECT[1] SELECT[2]
| | |
[FBT:T1] PRN PRN
| |
SELECT[3] [FromBaseTable:T2]
|
PRN
|
[FromBaseTable:T3]
Assume also that we have some predicate "SELECT[4].i = True if this predicate is a scoped predicate, in which
case we performed a one-sided remap. False if the predicate is
not scoped; the caller can then make the calls to perform a
"normal" remap on this predicate.
| |
| selectivity | back to summary |
|---|---|
| public double selectivity(Optimizable optTable) throws StandardException Implements org. Doc from org. Get a (crude) estimate of the selectivity of this predicate. This is to be used when no better technique is available for estimating the selectivity - this method's estimate is a hard- wired number based on the type of predicate and the datatype (the selectivity of boolean is always 50%).
| |
| setAndNode | back to summary |
|---|---|
| pack-priv void setAndNode(AndNode andNode) Set the andNode.
| |
| setEquivalenceClass | back to summary |
|---|---|
| pack-priv void setEquivalenceClass(int equivalenceClass) Set the equivalence class, if any, for this predicate.
| |
| setIndexPosition | back to summary |
|---|---|
| pack-priv void setIndexPosition(int indexPosition) Set the position of the index column that this predicate restricts
| |
| setPushable | back to summary |
|---|---|
| pack-priv void setPushable(boolean pushable) Set whether or not this predicate is pushable. This method is intended for use when creating a copy of the predicate, ex for predicate pushdown. We choose not to add this assignment to copyFields() because the comments for that method say that it should copy all fields _except_ the two specified at init time; "pushable" is one of the two specified at init time.
| |
| setTransitiveSearchClauseAdded | back to summary |
|---|---|
| pack-priv void setTransitiveSearchClauseAdded(RelationalOperator ro) Mark this predicate as having been used to add a new predicate of the specified type via transitive closure on search clauses.
| |
| toString | back to summary |
|---|---|
| public String toString() Overrides org. Convert this object to a String. See comments in QueryTreeNode.java for how this should be done for tree printing. | |
| transitiveSearchClauseAdded | back to summary |
|---|---|
| pack-priv boolean transitiveSearchClauseAdded(RelationalOperator ro) Return whether or not this predicate has been used to add a new search clause of the specified type via transitive closure. Note This can only be true if this is an equijoin between 2 column references.
| |