001 /*
002 // $Id: //open/mondrian-release/3.2/src/main/mondrian/rolap/agg/AbstractColumnPredicate.java#2 $
003 // This software is subject to the terms of the Eclipse Public License v1.0
004 // Agreement, available at the following URL:
005 // http://www.eclipse.org/legal/epl-v10.html.
006 // Copyright (C) 2004-2005 TONBELLER AG
007 // Copyright (C) 2006-2010 Julian Hyde and others
008 // All Rights Reserved.
009 // You must accept the terms of that agreement to use this software.
010 */
011 package mondrian.rolap.agg;
012
013 import mondrian.rolap.StarColumnPredicate;
014 import mondrian.rolap.RolapStar;
015 import mondrian.rolap.StarPredicate;
016 import mondrian.rolap.sql.SqlQuery;
017 import mondrian.rolap.BitKey;
018 import mondrian.olap.Util;
019
020 import java.util.List;
021 import java.util.Collections;
022 import java.util.ArrayList;
023
024 /**
025 * A <code>AbstractColumnPredicate</code> is an abstract implementation for
026 * {@link mondrian.rolap.StarColumnPredicate}.
027 *
028 * @version $Id: //open/mondrian-release/3.2/src/main/mondrian/rolap/agg/AbstractColumnPredicate.java#2 $
029 */
030 public abstract class AbstractColumnPredicate implements StarColumnPredicate {
031 protected final RolapStar.Column constrainedColumn;
032 private final BitKey constrainedColumnBitKey;
033
034 /**
035 * Creates an AbstractColumnPredicate.
036 *
037 * @param constrainedColumn Constrained column
038 */
039 protected AbstractColumnPredicate(RolapStar.Column constrainedColumn) {
040 this.constrainedColumn = constrainedColumn;
041
042 // Check whether constrainedColumn are null.
043 // Example: FastBatchingCellReaderTest.testAggregateDistinctCount5().
044 if (constrainedColumn != null && constrainedColumn.getTable() != null) {
045 constrainedColumnBitKey =
046 BitKey.Factory.makeBitKey(
047 constrainedColumn.getStar().getColumnCount());
048 constrainedColumnBitKey.set(constrainedColumn.getBitPosition());
049 } else {
050 constrainedColumnBitKey = null;
051 }
052 }
053
054 public String toString() {
055 final StringBuilder buf = new StringBuilder();
056 buf.append(constrainedColumn.getExpression().getGenericExpression());
057 describe(buf);
058 return buf.toString();
059 }
060
061 public RolapStar.Column getConstrainedColumn() {
062 return constrainedColumn;
063 }
064
065 public List<RolapStar.Column> getConstrainedColumnList() {
066 return Collections.singletonList(constrainedColumn);
067 }
068
069 public BitKey getConstrainedColumnBitKey() {
070 return constrainedColumnBitKey;
071 }
072
073 public boolean evaluate(List<Object> valueList) {
074 assert valueList.size() == 1;
075 return evaluate(valueList.get(0));
076 }
077
078 public boolean equalConstraint(StarPredicate that) {
079 return false;
080 }
081
082 public StarPredicate or(StarPredicate predicate) {
083 if (predicate instanceof StarColumnPredicate) {
084 StarColumnPredicate starColumnPredicate =
085 (StarColumnPredicate) predicate;
086 if (starColumnPredicate.getConstrainedColumn()
087 == getConstrainedColumn())
088 {
089 return orColumn(starColumnPredicate);
090 }
091 }
092 final List<StarPredicate> list = new ArrayList<StarPredicate>(2);
093 list.add(this);
094 list.add(predicate);
095 return new OrPredicate(list);
096 }
097
098 public StarColumnPredicate orColumn(StarColumnPredicate predicate) {
099 assert predicate.getConstrainedColumn() == getConstrainedColumn();
100 if (predicate instanceof ListColumnPredicate) {
101 ListColumnPredicate that = (ListColumnPredicate) predicate;
102 final List<StarColumnPredicate> list =
103 new ArrayList<StarColumnPredicate>();
104 list.add(this);
105 list.addAll(that.getPredicates());
106 return new ListColumnPredicate(
107 getConstrainedColumn(),
108 list);
109 } else {
110 final List<StarColumnPredicate> list =
111 new ArrayList<StarColumnPredicate>(2);
112 list.add(this);
113 list.add(predicate);
114 return new ListColumnPredicate(
115 getConstrainedColumn(),
116 list);
117 }
118 }
119
120 public StarPredicate and(StarPredicate predicate) {
121 final List<StarPredicate> list = new ArrayList<StarPredicate>(2);
122 list.add(this);
123 list.add(predicate);
124 return new AndPredicate(list);
125 }
126
127 public void toSql(SqlQuery sqlQuery, StringBuilder buf) {
128 throw Util.needToImplement(this);
129 }
130
131 protected static List<StarColumnPredicate> cloneListWithColumn(
132 RolapStar.Column column,
133 List<StarColumnPredicate> list)
134 {
135 List<StarColumnPredicate> newList =
136 new ArrayList<StarColumnPredicate>(list.size());
137 for (StarColumnPredicate predicate : list) {
138 newList.add(predicate.cloneWithColumn(column));
139 }
140 return newList;
141 }
142
143 /**
144 * Factory for {@link mondrian.rolap.StarPredicate}s and
145 * {@link mondrian.rolap.StarColumnPredicate}s.
146 */
147 public static class Factory {
148 /**
149 * Returns a predicate which tests whether the column's
150 * value is equal to a given constant.
151 *
152 * @param column Constrained column
153 * @param value Value
154 * @return Predicate which tests whether the column's value is equal
155 * to a column constraint's value
156 */
157 public static StarColumnPredicate equal(
158 RolapStar.Column column,
159 Object value)
160 {
161 return new ValueColumnPredicate(column, value);
162 }
163
164 /**
165 * Returns predicate which is the OR of a list of predicates.
166 *
167 * @param column Column being constrained
168 * @param list List of predicates
169 * @return Predicate which is an OR of the list of predicates
170 */
171 public static StarColumnPredicate or(
172 RolapStar.Column column,
173 List<StarColumnPredicate> list)
174 {
175 return new ListColumnPredicate(column, list);
176 }
177
178 /**
179 * Returns a predicate which always evaluates to TRUE or FALSE.
180 * @param b Truth value
181 * @return Predicate which always evaluates to truth value
182 */
183 public static LiteralStarPredicate bool(boolean b) {
184 return b ? LiteralStarPredicate.TRUE : LiteralStarPredicate.FALSE;
185 }
186
187 /**
188 * Returns a predicate which tests whether the column's
189 * value is equal to column predicate's value.
190 *
191 * @param predicate Column predicate
192 * @return Predicate which tests whether the column's value is equal
193 * to a column predicate's value
194 */
195 public static StarColumnPredicate equal(
196 ValueColumnPredicate predicate)
197 {
198 return equal(
199 predicate.getConstrainedColumn(),
200 predicate.getValue());
201 }
202 }
203 }
204
205 // End AbstractColumnPredicate.java