001: /*
002:
003: Derby - Class org.apache.derby.impl.sql.execute.BaseExpressionActivation
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.impl.sql.execute;
023:
024: import org.apache.derby.iapi.error.StandardException;
025:
026: import org.apache.derby.iapi.services.sanity.SanityManager;
027:
028: import org.apache.derby.iapi.types.DataValueDescriptor;
029: import org.apache.derby.catalog.types.UserDefinedTypeIdImpl;
030:
031: import org.apache.derby.iapi.services.context.ContextManager;
032: import org.apache.derby.iapi.services.context.Context;
033:
034: import org.apache.derby.iapi.jdbc.ConnectionContext;
035:
036: import org.apache.derby.iapi.types.DataValueFactory;
037: import org.apache.derby.iapi.types.TypeId;
038:
039: import org.apache.derby.iapi.sql.execute.ExecutionContext;
040: import org.apache.derby.iapi.sql.execute.ExecutionFactory;
041:
042: import org.apache.derby.iapi.sql.conn.LanguageConnectionContext;
043: import org.apache.derby.iapi.store.access.TransactionController;
044: import org.apache.derby.iapi.reference.Attribute;
045:
046: import org.apache.derby.iapi.sql.ResultSet;
047:
048: import java.sql.Connection;
049: import java.sql.SQLException;
050:
051: /**
052: * BaseExpressionActivation
053: *
054: * Support needed by Expression evaluators (Filters) and by
055: * ResultSet materializers (Activations)
056: */
057: public abstract class BaseExpressionActivation {
058:
059: //
060: // constructors
061: //
062: BaseExpressionActivation() {
063: super ();
064: }
065:
066: /**
067: * Get the minimum value of 4 input values. If less than 4 values, input
068: * NULL. If more than 4 input values, call this multiple times to
069: * accumulate results. Also have judge's type as parameter to have a base
070: * upon which the comparison is based. An example use is for code
071: * generation in bug 3858.
072: *
073: * @param v1 1st value
074: * @param v2 2nd value
075: * @param v3 3rd value
076: * @param v4 4th value
077: * @param judgeTypeFormatId type format id of the judge
078: * @param judgeUserJDBCTypeId JDBC type id if judge is user type;
079: * -1 if not user type
080: *
081: * @return The minimum value of the 4.
082: */
083: public static DataValueDescriptor minValue(DataValueDescriptor v1,
084: DataValueDescriptor v2, DataValueDescriptor v3,
085: DataValueDescriptor v4, int judgeTypeFormatId,
086: int judgeUserJDBCTypeId) throws StandardException {
087: DataValueDescriptor judge;
088: if (judgeUserJDBCTypeId == -1)
089: judge = (DataValueDescriptor) new TypeId(judgeTypeFormatId,
090: null).getNull();
091: else
092: judge = (DataValueDescriptor) new TypeId(judgeTypeFormatId,
093: new UserDefinedTypeIdImpl()).getNull();
094:
095: DataValueDescriptor minVal = v1;
096: if (v2 != null && judge.lessThan(v2, minVal).equals(true))
097: minVal = v2;
098: if (v3 != null && judge.lessThan(v3, minVal).equals(true))
099: minVal = v3;
100: if (v4 != null && judge.lessThan(v4, minVal).equals(true))
101: minVal = v4;
102: return minVal;
103: }
104:
105: /**
106: * Get the maximum value of 4 input values. If less than 4 values, input
107: * NULL. If more than 4 input values, call this multiple times to
108: * accumulate results. Also have judge's type as parameter to have a base
109: * upon which the comparison is based. An example use is for code
110: * generation in bug 3858.
111: *
112: * @param v1 1st value
113: * @param v2 2nd value
114: * @param v3 3rd value
115: * @param v4 4th value
116: * @param judgeTypeFormatId type format id of the judge
117: * @param judgeUserJDBCTypeId JDBC type id if judge is user type;
118: * -1 if not user type
119: *
120: * @return The maximum value of the 4.
121: */
122: public static DataValueDescriptor maxValue(DataValueDescriptor v1,
123: DataValueDescriptor v2, DataValueDescriptor v3,
124: DataValueDescriptor v4, int judgeTypeFormatId,
125: int judgeUserJDBCTypeId) throws StandardException {
126: DataValueDescriptor judge;
127: if (judgeUserJDBCTypeId == -1)
128: judge = new TypeId(judgeTypeFormatId, null).getNull();
129: else
130: judge = new TypeId(judgeTypeFormatId,
131: new UserDefinedTypeIdImpl()).getNull();
132:
133: DataValueDescriptor maxVal = v1;
134: if (v2 != null && judge.greaterThan(v2, maxVal).equals(true))
135: maxVal = v2;
136: if (v3 != null && judge.greaterThan(v3, maxVal).equals(true))
137: maxVal = v3;
138: if (v4 != null && judge.greaterThan(v4, maxVal).equals(true))
139: maxVal = v4;
140: return maxVal;
141: }
142:
143: }
|