Class BinaryComparisonOperatorNode

    • Field Detail

      • forQueryRewrite

        private boolean forQueryRewrite
      • betweenSelectivity

        private boolean betweenSelectivity
    • Constructor Detail

      • BinaryComparisonOperatorNode

        BinaryComparisonOperatorNode​(ValueNode leftOperand,
                                     ValueNode rightOperand,
                                     java.lang.String operator,
                                     java.lang.String methodName,
                                     boolean forQueryRewrite,
                                     ContextManager cm)
                              throws StandardException
        Constructor for a BinaryComparisonOperatorNode
        Parameters:
        leftOperand - The left operand of the comparison
        rightOperand - The right operand of the comparison
        operator - The name of the operator
        methodName - The name of the method to call in the generated class
        forQueryRewrite - Can be true only if if this node has been added by an internal rewrite of the query. This allows binding to be more liberal when checking it against allowed syntax. This parameter will be passed FALSE when a new instance of the node is being created(which is the majority of the cases). But when an existing node is getting cloned, the value of this parameter should be passed as the originalNode.getForQueryRewrite(). Examples of this can be found in Predicate.Java and PredicateList.java
        cm - The context manager
        Throws:
        StandardException
    • Method Detail

      • setForQueryRewrite

        void setForQueryRewrite​(boolean val)
        This node was generated as part of a query rewrite. Bypass the normal comparability checks.
        Parameters:
        val - true if this was for a query rewrite
      • getForQueryRewrite

        boolean getForQueryRewrite()
        Was this node generated in a query rewrite?
        Returns:
        true if it was generated in a query rewrite.
      • setBetweenSelectivity

        void setBetweenSelectivity()
        Use between selectivity when calculating the selectivity.
      • getBetweenSelectivity

        boolean getBetweenSelectivity()
        Return whether or not to use the between selectivity for this node.
        Returns:
        Whether or not to use the between selectivity for this node.
      • bindExpression

        ValueNode bindExpression​(FromList fromList,
                                 SubqueryList subqueryList,
                                 java.util.List<AggregateNode> aggregates)
                          throws StandardException
        Bind this comparison operator. All that has to be done for binding a comparison operator is to bind the operands, check the compatibility of the types, and set the result type to SQLBoolean.
        Overrides:
        bindExpression in class BinaryOperatorNode
        Parameters:
        fromList - The query's FROM list
        subqueryList - The subquery list being built as we find SubqueryNodes
        aggregates - The aggregate list being built as we find AggregateNodes
        Returns:
        The new top of the expression tree.
        Throws:
        StandardException - Thrown on error
      • bindComparisonOperator

        void bindComparisonOperator()
                             throws StandardException
        Test the type compatability of the operands and set the type info for this node. This method is useful both during binding and when we generate nodes within the language module outside of the parser.
        Throws:
        StandardException - Thrown on error
      • preprocess

        ValueNode preprocess​(int numTables,
                             FromList outerFromList,
                             SubqueryList outerSubqueryList,
                             PredicateList outerPredicateList)
                      throws StandardException
        Preprocess an expression tree. We do a number of transformations here (including subqueries, IN lists, LIKE and BETWEEN) plus subquery flattening. NOTE: This is done before the outer ResultSetNode is preprocessed.
        Overrides:
        preprocess in class BinaryOperatorNode
        Parameters:
        numTables - Number of tables in the DML Statement
        outerFromList - FromList from outer query block
        outerSubqueryList - SubqueryList from outer query block
        outerPredicateList - PredicateList from outer query block
        Returns:
        The modified expression
        Throws:
        StandardException - Thrown on error
      • eliminateNots

        ValueNode eliminateNots​(boolean underNotNode)
                         throws StandardException
        Eliminate NotNodes in the current query block. We traverse the tree, inverting ANDs and ORs and eliminating NOTs as we go. We stop at ComparisonOperators and boolean expressions. We invert ComparisonOperators and replace boolean expressions with boolean expression = false. NOTE: Since we do not recurse under ComparisonOperators, there still could be NotNodes left in the tree.
        Overrides:
        eliminateNots in class ValueNode
        Parameters:
        underNotNode - Whether or not we are under a NotNode.
        Returns:
        The modified expression
        Throws:
        StandardException - Thrown on error
      • getNegation

        abstract BinaryOperatorNode getNegation​(ValueNode leftOperand,
                                                ValueNode rightOperand)
                                         throws StandardException
        Negate the comparison.
        Parameters:
        leftOperand - The left operand of the comparison operator
        rightOperand - The right operand of the comparison operator
        Returns:
        BinaryOperatorNode The negated expression
        Throws:
        StandardException - Thrown on error
      • getSwappedEquivalent

        abstract BinaryOperatorNode getSwappedEquivalent()
                                                  throws StandardException

        Return a node equivalent to this node, but with the left and right operands swapped. The node type may also be changed if the operator is not symmetric.

        This method may for instance be used to normalize a predicate by moving constants to the right-hand side of the comparison. Example: 1 = A will be transformed to A = 1, and 10 < B will be transformed to B > 10.

        Returns:
        an equivalent expression with the operands swapped
        Throws:
        StandardException - if an error occurs
      • changeToCNF

        ValueNode changeToCNF​(boolean underTopAndNode)
                       throws StandardException
        Finish putting an expression into conjunctive normal form. An expression tree in conjunctive normal form meets the following criteria: o If the expression tree is not null, the top level will be a chain of AndNodes terminating in a true BooleanConstantNode. o The left child of an AndNode will never be an AndNode. o Any right-linked chain that includes an AndNode will be entirely composed of AndNodes terminated by a true BooleanConstantNode. o The left child of an OrNode will never be an OrNode. o Any right-linked chain that includes an OrNode will be entirely composed of OrNodes terminated by a false BooleanConstantNode. o ValueNodes other than AndNodes and OrNodes are considered leaf nodes for purposes of expression normalization. In other words, we won't do any normalization under those nodes. In addition, we track whether or not we are under a top level AndNode. SubqueryNodes need to know this for subquery flattening.
        Overrides:
        changeToCNF in class ValueNode
        Parameters:
        underTopAndNode - Whether or not we are under a top level AndNode.
        Returns:
        The modified expression
        Throws:
        StandardException - Thrown on error