Interface RelationalOperator
-
- All Known Implementing Classes:
BinaryRelationalOperatorNode
,IsNullNode
interface RelationalOperator
This interface is an abstraction of a relational operator. It was created for optimization, to allow binary comparison operators and IS NULL to be treated the same.
-
-
Field Summary
Fields Modifier and Type Field Description static int
EQUALS_RELOP
static int
GREATER_EQUALS_RELOP
static int
GREATER_THAN_RELOP
static int
IS_NOT_NULL_RELOP
static int
IS_NULL_RELOP
static int
LESS_EQUALS_RELOP
static int
LESS_THAN_RELOP
static int
NOT_EQUALS_RELOP
-
Method Summary
All Methods Instance Methods Abstract Methods Modifier and Type Method Description boolean
compareWithKnownConstant(Optimizable optTable, boolean considerParameters)
Return whether this operator compares the given Optimizable with a constant whose value is known at compile time.boolean
equalsComparisonWithConstantExpression(Optimizable optTable)
Return whether this operator is an equality comparison of the given optimizable with a constant expression.void
generateAbsoluteColumnId(MethodBuilder mb, Optimizable optTable)
Generate the absolute column id for the ColumnReference that appears on one side of this RelationalOperator or the other, and that refers to the given table.void
generateExpressionOperand(Optimizable optTable, int columnPosition, ExpressionClassBuilderInterface acb, MethodBuilder mb)
Check whether this RelationalOperator is a comparison of the given column with an expression.void
generateNegate(MethodBuilder mb, Optimizable optTable)
Generate an expression that evaluates to true if the result of the comparison should be negated.void
generateOperator(MethodBuilder mb, Optimizable optTable)
Generate the comparison operator for this RelationalOperator.void
generateOrderedNulls(MethodBuilder mb)
Generate an expression that evaluates to true if this RelationalOperator uses ordered null semantics, false if it doesn't.void
generateQualMethod(ExpressionClassBuilderInterface acb, MethodBuilder mb, Optimizable optTable)
Generate the method to evaluate a Qualifier.void
generateRelativeColumnId(MethodBuilder mb, Optimizable optTable)
Generate the relative column id for the ColumnReference that appears on one side of this RelationalOperator or the other, and that refers to the given table.ColumnReference
getColumnOperand(Optimizable optTable)
Get the ColumnReference for the given table on one side of this RelationalOperator.ColumnReference
getColumnOperand(Optimizable optTable, int columnPosition)
Check whether this RelationalOperator is a comparison of the given column with an expression.DataValueDescriptor
getCompareValue(Optimizable optTable)
Return an Object representing the known value that this relational operator is comparing to a column in the given Optimizable.ValueNode
getExpressionOperand(int tableNumber, int columnPosition, Optimizable ft)
Check whether this RelationalOperator is a comparison of the given column with an expression.ValueNode
getOperand(ColumnReference cRef, int refSetSize, boolean otherSide)
Find the operand (left or right) that points to the same table as the received ColumnReference, and then return either that operand or the "other" operand, depending on the value of otherSide.int
getOperator()
Return the operator (as an int) for this RelationalOperator.int
getOrderableVariantType(Optimizable optTable)
Return the variant type for the Qualifier's Orderable.int
getStartOperator(Optimizable optTable)
Get the start operator for a scan (at the store level) for this RelationalOperator.int
getStopOperator(Optimizable optTable)
Get the stop operator for a scan (at the store level) for this RelationalOperator.RelationalOperator
getTransitiveSearchClause(ColumnReference otherCR)
Return a relational operator which matches the current one but with the passed in ColumnReference as the (left) operand.boolean
isQualifier(Optimizable optTable, boolean forPush)
Return true if this operator can be compiled into a Qualifier for the given Optimizable table.boolean
orderedNulls()
Return true if this operator uses ordered null semanticsboolean
selfComparison(ColumnReference cr)
Check whether this RelationalOperator compares the given ColumnReference to any columns in the same table as the ColumnReference.boolean
usefulStartKey(Optimizable optTable)
Tell whether this relop is a useful start key for the given table.boolean
usefulStopKey(Optimizable optTable)
Tell whether this relop is a useful stop key for the given table.
-
-
-
Field Detail
-
EQUALS_RELOP
static final int EQUALS_RELOP
- See Also:
- Constant Field Values
-
NOT_EQUALS_RELOP
static final int NOT_EQUALS_RELOP
- See Also:
- Constant Field Values
-
GREATER_THAN_RELOP
static final int GREATER_THAN_RELOP
- See Also:
- Constant Field Values
-
GREATER_EQUALS_RELOP
static final int GREATER_EQUALS_RELOP
- See Also:
- Constant Field Values
-
LESS_THAN_RELOP
static final int LESS_THAN_RELOP
- See Also:
- Constant Field Values
-
LESS_EQUALS_RELOP
static final int LESS_EQUALS_RELOP
- See Also:
- Constant Field Values
-
IS_NULL_RELOP
static final int IS_NULL_RELOP
- See Also:
- Constant Field Values
-
IS_NOT_NULL_RELOP
static final int IS_NOT_NULL_RELOP
- See Also:
- Constant Field Values
-
-
Method Detail
-
getColumnOperand
ColumnReference getColumnOperand(Optimizable optTable, int columnPosition)
Check whether this RelationalOperator is a comparison of the given column with an expression. If so, return the ColumnReference that corresponds to the given column, and that is on one side of this RelationalOperator or the other (this method copes with the column being on either side of the operator). If the given column does not appear by itself on one side of the comparison, the method returns null.- Parameters:
optTable
- An Optimizable for the base table the column is incolumnPosition
- The ordinal position of the column (one-based)- Returns:
- The ColumnReference on one side of this RelationalOperator that represents the given columnPosition. Returns null if no such ColumnReference exists by itself on one side of this RelationalOperator.
-
getColumnOperand
ColumnReference getColumnOperand(Optimizable optTable)
Get the ColumnReference for the given table on one side of this RelationalOperator. This presumes it will be found only on one side. If not found, it will return null.
-
getOperand
ValueNode getOperand(ColumnReference cRef, int refSetSize, boolean otherSide)
Find the operand (left or right) that points to the same table as the received ColumnReference, and then return either that operand or the "other" operand, depending on the value of otherSide. This presumes it will be found only on one side. If not found, it will return null.- Parameters:
cRef
- The ColumnReference for which we're searching.refSetSize
- Size of the referenced map for the predicate represented by this RelationalOperator node. This is used for storing base table numbers when searching for cRef.otherSide
- Assuming we find an operand that points to the same table as cRef, then we will return the *other* operand if otherSide is true; else we'll return the operand that matches cRef.
-
getExpressionOperand
ValueNode getExpressionOperand(int tableNumber, int columnPosition, Optimizable ft)
Check whether this RelationalOperator is a comparison of the given column with an expression. If so, return the expression the column is being compared to.- Parameters:
tableNumber
- The table number of the base table the column is incolumnPosition
- The ordinal position of the column (one-based)ft
- We'll look for the column in all tables at and beneath ft. This is useful if ft is, say, a ProjectRestrictNode over a subquery-- then we want to look at all of the FROM tables in the subquery to try to find the right column.- Returns:
- The ValueNode for the expression the column is being compared to - null if the column is not being compared to anything.
-
generateExpressionOperand
void generateExpressionOperand(Optimizable optTable, int columnPosition, ExpressionClassBuilderInterface acb, MethodBuilder mb) throws StandardException
Check whether this RelationalOperator is a comparison of the given column with an expression. If so, generate the Expression for the ValueNode that the column is being compared to.- Parameters:
optTable
- An Optimizable for the base table the column is incolumnPosition
- The ordinal position of the column (one-based)acb
- The ExpressionClassBuilder for the class we're buildingmb
- The method the expression will go into- Throws:
StandardException
- Thrown on error
-
selfComparison
boolean selfComparison(ColumnReference cr) throws StandardException
Check whether this RelationalOperator compares the given ColumnReference to any columns in the same table as the ColumnReference.- Parameters:
cr
- The ColumnReference that is being compared to some expression.- Returns:
- true if the given ColumnReference is being compared to any columns from the same table
- Throws:
StandardException
- Thrown on error
-
usefulStartKey
boolean usefulStartKey(Optimizable optTable)
Tell whether this relop is a useful start key for the given table. It has already been determined that the relop has a column from the given table on one side or the other.- Parameters:
optTable
- The Optimizable table for which we want to know whether this is a useful start key.- Returns:
- true if this is a useful start key
-
usefulStopKey
boolean usefulStopKey(Optimizable optTable)
Tell whether this relop is a useful stop key for the given table. It has already been determined that the relop has a column from the given table on one side or the other.- Parameters:
optTable
- The Optimizable table for which we want to know whether this is a useful stop key.- Returns:
- true if this is a useful stop key
-
getStartOperator
int getStartOperator(Optimizable optTable)
Get the start operator for a scan (at the store level) for this RelationalOperator.- Parameters:
optTable
- The optimizable table we're doing the scan on. This parameter is so we can tell which side of the operator the table's column is on.- Returns:
- Either ScanController.GT or ScanController.GE
- See Also:
TransactionController.openScan(long, boolean, int, int, int, org.apache.derby.iapi.services.io.FormatableBitSet, org.apache.derby.iapi.types.DataValueDescriptor[], int, org.apache.derby.iapi.store.access.Qualifier[][], org.apache.derby.iapi.types.DataValueDescriptor[], int)
-
getStopOperator
int getStopOperator(Optimizable optTable)
Get the stop operator for a scan (at the store level) for this RelationalOperator.- Parameters:
optTable
- The optimizable table we're doing the scan on. This parameter is so we can tell which side of the operator the table's column is on.- Returns:
- Either ScanController.GT or ScanController.GE
- See Also:
TransactionController.openScan(long, boolean, int, int, int, org.apache.derby.iapi.services.io.FormatableBitSet, org.apache.derby.iapi.types.DataValueDescriptor[], int, org.apache.derby.iapi.store.access.Qualifier[][], org.apache.derby.iapi.types.DataValueDescriptor[], int)
-
generateAbsoluteColumnId
void generateAbsoluteColumnId(MethodBuilder mb, Optimizable optTable)
Generate the absolute column id for the ColumnReference that appears on one side of this RelationalOperator or the other, and that refers to the given table. (Absolute column id means column id within the row stored on disk.)- Parameters:
mb
- The method the generated code is to go intooptTable
- The optimizable table we're doing the scan on.
-
generateRelativeColumnId
void generateRelativeColumnId(MethodBuilder mb, Optimizable optTable)
Generate the relative column id for the ColumnReference that appears on one side of this RelationalOperator or the other, and that refers to the given table. (Relative column id means column id within the partial row returned by the store.)- Parameters:
mb
- The method the generated code is to go intooptTable
- The optimizable table we're doing the scan on.
-
generateOperator
void generateOperator(MethodBuilder mb, Optimizable optTable)
Generate the comparison operator for this RelationalOperator. The operator can depend on which side of this operator the optimizable column is.- Parameters:
mb
- The method the generated code is to go intooptTable
- The optimizable table we're doing the scan on.
-
generateQualMethod
void generateQualMethod(ExpressionClassBuilderInterface acb, MethodBuilder mb, Optimizable optTable) throws StandardException
Generate the method to evaluate a Qualifier. The factory method for a Qualifier takes a GeneratedMethod that returns the Orderable that Qualifier.getOrderable() returns.- Parameters:
acb
- The ExpressionClassBuilder for the class we're buildingmb
- The method the generated code is to go intooptTable
- The Optimizable table the Qualifier will qualify- Throws:
StandardException
- Thrown on error.
-
generateOrderedNulls
void generateOrderedNulls(MethodBuilder mb)
Generate an expression that evaluates to true if this RelationalOperator uses ordered null semantics, false if it doesn't.- Parameters:
mb
- The method the generated code is to go into
-
generateNegate
void generateNegate(MethodBuilder mb, Optimizable optTable)
Generate an expression that evaluates to true if the result of the comparison should be negated. For example, col > 1 generates a comparison operator of <= and a negation of true, while col < 1 generates a comparison operator of < and a negation of false.- Parameters:
mb
- The method the generated code is to go intooptTable
- The Optimizable table the Qualifier will qualify
-
orderedNulls
boolean orderedNulls()
Return true if this operator uses ordered null semantics
-
isQualifier
boolean isQualifier(Optimizable optTable, boolean forPush) throws StandardException
Return true if this operator can be compiled into a Qualifier for the given Optimizable table. This means that there is a column from that table on one side of this relop, and an expression that does not refer to the table on the other side of the relop. Note that this method has two uses: 1) see if this operator (or more specifically, the predicate to which this operator belongs) can be used as a join predicate (esp. for a hash join), and 2) see if this operator can be pushed to the target optTable. We use the parameter "forPush" to distinguish between the two uses because in some cases (esp. situations where we have subqueries) the answer to "is this a qualifier?" can differ depending on whether or not we're pushing. In particular, for binary ops that are join predicates, if we're just trying to find an equijoin predicate then this op qualifies if it references either the target table OR any of the base tables in the table's subtree. But if we're planning to push the predicate down to the target table, this op only qualifies if it references the target table directly. This difference in behavior is required because in case 1 (searching for join predicates), the operator remains at its current level in the tree even if its operands reference nodes further down; in case 2, though, we'll end up pushing the operator down the tree to child node(s) and that requires additional logic, such as "scoping" consideration. Until that logic is in place, we don't search a subtree if the intent is to push the predicate to which this operator belongs further down that subtree. See BinaryRelationalOperatorNode for an example of where this comes into play.- Parameters:
optTable
- The Optimizable table in question.forPush
- Are we asking because we're trying to push?- Returns:
- true if this operator can be compiled into a Qualifier for the given Optimizable table.
- Throws:
StandardException
- Thrown on error
-
getOperator
int getOperator()
Return the operator (as an int) for this RelationalOperator.- Returns:
- int The operator for this RelationalOperator.
-
getOrderableVariantType
int getOrderableVariantType(Optimizable optTable) throws StandardException
Return the variant type for the Qualifier's Orderable. (Is the Orderable invariant within a scan or within a query?)- Parameters:
optTable
- The Optimizable table the Qualifier will qualify- Returns:
- int The variant type for the Qualifier's Orderable.
- Throws:
StandardException
- thrown on error
-
compareWithKnownConstant
boolean compareWithKnownConstant(Optimizable optTable, boolean considerParameters)
Return whether this operator compares the given Optimizable with a constant whose value is known at compile time.
-
getCompareValue
DataValueDescriptor getCompareValue(Optimizable optTable) throws StandardException
Return an Object representing the known value that this relational operator is comparing to a column in the given Optimizable.- Throws:
StandardException
- Thrown on error
-
equalsComparisonWithConstantExpression
boolean equalsComparisonWithConstantExpression(Optimizable optTable)
Return whether this operator is an equality comparison of the given optimizable with a constant expression.
-
getTransitiveSearchClause
RelationalOperator getTransitiveSearchClause(ColumnReference otherCR) throws StandardException
Return a relational operator which matches the current one but with the passed in ColumnReference as the (left) operand.- Parameters:
otherCR
- The ColumnReference for the new (left) operand.- Returns:
- A relational operator which matches the current one but with the passed in ColumnReference as the (left) operand.
- Throws:
StandardException
- Thrown on error
-
-