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