001: /*
002:
003: Derby - Class org.apache.derby.iapi.sql.compile.OptimizablePredicate
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to you under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: the License. You may obtain a copy of the License at
011:
012: http://www.apache.org/licenses/LICENSE-2.0
013:
014: Unless required by applicable law or agreed to in writing, software
015: distributed under the License is distributed on an "AS IS" BASIS,
016: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: See the License for the specific language governing permissions and
018: limitations under the License.
019:
020: */
021:
022: package org.apache.derby.iapi.sql.compile;
023:
024: import org.apache.derby.iapi.error.StandardException;
025:
026: import org.apache.derby.iapi.types.DataValueDescriptor;
027:
028: import org.apache.derby.iapi.util.JBitSet;
029:
030: /**
031: * OptimizablePredicate provides services for optimizing predicates in a query.
032: */
033:
034: public interface OptimizablePredicate {
035: /**
036: * Get the map of referenced tables for this OptimizablePredicate.
037: *
038: * @return JBitSet Referenced table map.
039: */
040: JBitSet getReferencedMap();
041:
042: /**
043: * Return whether or not an OptimizablePredicate contains a subquery.
044: *
045: * @return boolean Whether or not an OptimizablePredicate includes a subquery.
046: */
047: boolean hasSubquery();
048:
049: /**
050: * Return whether or not an OptimizablePredicate contains a method call.
051: *
052: * @return boolean Whether or not an OptimizablePredicate includes a method call.
053: */
054: boolean hasMethodCall();
055:
056: /**
057: * Tell the predicate that it is to be used as a column in the start key
058: * value for an index scan.
059: */
060: void markStartKey();
061:
062: /** Is this predicate a start key? */
063: boolean isStartKey();
064:
065: /**
066: * Tell the predicate that it is to be used as a column in the stop key
067: * value for an index scan.
068: */
069: void markStopKey();
070:
071: /** Is this predicate a stop key? */
072: boolean isStopKey();
073:
074: /**
075: * Tell the predicate that it is to be used as a qualifier in an index
076: * scan.
077: */
078: void markQualifier();
079:
080: /** Is this predicate a qualifier? */
081: boolean isQualifier();
082:
083: /**
084: * Is this predicate a comparison with a known constant value?
085: *
086: * @param optTable The Optimizable that we want to know whether we
087: * are comparing to a known constant.
088: * @param considerParameters Whether or not to consider parameters with defaults
089: * as known constants.
090: */
091: boolean compareWithKnownConstant(Optimizable optTable,
092: boolean considerParameters);
093:
094: /**
095: * Get an Object representing the known constant value that the given
096: * Optimizable is being compared to.
097: *
098: * @exception StandardException Thrown on error
099: */
100: DataValueDescriptor getCompareValue(Optimizable optTable)
101: throws StandardException;
102:
103: /**
104: * Is this predicate an equality comparison with a constant expression?
105: * (IS NULL is considered to be an = comparison with a constant expression).
106: *
107: * @param optTable The Optimizable for which we want to know whether
108: * it is being equality-compared to a constant expression.
109: */
110: boolean equalsComparisonWithConstantExpression(Optimizable optTable);
111:
112: /**
113: * Returns if the predicate involves an equal operator on one of the
114: * columns specified in the baseColumnPositions.
115: *
116: * @param baseColumnPositions the column numbers on which the user wants
117: * to check if the equality condition exists.
118: * @param optTable the table for which baseColumnPositions are given.
119:
120: @return returns the index into baseColumnPositions of the column that has the
121: equality operator.
122: */
123: int hasEqualOnColumnList(int[] baseColumnPositions,
124: Optimizable optTable) throws StandardException;
125:
126: /**
127: * Get a (crude) estimate of the selectivity of this predicate.
128: * This is to be used when no better technique is available for
129: * estimating the selectivity - this method's estimate is a hard-
130: * wired number based on the type of predicate and the datatype
131: * (the selectivity of boolean is always 50%).
132: *
133: * @param optTable The Optimizable that this predicate restricts
134: */
135: double selectivity(Optimizable optTable) throws StandardException;
136:
137: /**
138: * Get the position of the index column that this predicate restricts.
139: * NOTE: This assumes that this predicate is part of an
140: * OptimizablePredicateList, and that classify() has been called
141: * on the OptimizablePredicateList.
142: *
143: * @return The index position that this predicate restricts (zero-based)
144: */
145: int getIndexPosition();
146: }
|