001 /*
002 // $Id: //open/mondrian-release/3.2/src/main/mondrian/rolap/StarPredicate.java#1 $
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) 2007-2007 Julian Hyde
007 // All Rights Reserved.
008 // You must accept the terms of that agreement to use this software.
009 */
010 package mondrian.rolap;
011
012 import mondrian.rolap.sql.SqlQuery;
013
014 import java.util.List;
015
016 /**
017 * Condition which constrains a set of values of a single
018 * {@link mondrian.rolap.RolapStar.Column} or a set of columns.
019 *
020 * <p>For example, the predicate
021 * <code>Range([Time].[1997].[Q3], [Time].[1998].[Q2])</code>
022 * constrains the <code>year</code> and <code>quarter</code> columns:
023 *
024 * <blockquote><code>
025 * ((year = 1997 and quarter >= 'Q3')<br/>
026 * or (year > 1997))<br/>
027 * and ((year = 1998 and quarter <= 'Q2')<br/>
028 * or (year < 1998))</code></blockquote>
029 *
030 * @author jhyde
031 * @version $Id: //open/mondrian-release/3.2/src/main/mondrian/rolap/StarPredicate.java#1 $
032 * @since Jan 15, 2007
033 */
034 public interface StarPredicate {
035 /**
036 * Returns a list of constrained columns.
037 *
038 * @return List of constrained columns
039 */
040 public List<RolapStar.Column> getConstrainedColumnList();
041
042 /**
043 * Returns a bitmap of constrained columns to speed up comparison
044 * @return bitmap representing all constraining columns.
045 */
046 public BitKey getConstrainedColumnBitKey();
047
048 /**
049 * Appends a description of this predicate to a <code>StringBuilder</code>.
050 * For example:<ul>
051 * <li>=any</li>
052 * <li>=5</li>
053 * <li>in (2, 4, 6)</li>
054 * </ul>
055 *
056 * @param buf Builder to append to
057 */
058 public abstract void describe(StringBuilder buf);
059
060 /**
061 * Evaluates a constraint against a list of values.
062 *
063 * <p>If one of the values is {@link #WILDCARD}, returns true if constraint is
064 * true for all possible values of that column.
065 *
066 * @param valueList List of values, one for each constrained column
067 * @return Whether constraint holds for given set of values
068 */
069 public boolean evaluate(List<Object> valueList);
070
071 /**
072 * Returns whether this Predicate has the same constraining effect as the
073 * other constraint. This is weaker than {@link Object#equals(Object)}: it
074 * is possible for two different members to constrain the same column in the
075 * same way.
076 *
077 * @param that Other predicate
078 * @return whether the other predicate is equivalent
079 */
080 boolean equalConstraint(StarPredicate that);
081
082 /**
083 * Returns the logical inverse of this Predicate. The result is a Predicate
084 * which holds whenever this predicate holds but the other does not.
085 *
086 * @pre predicate != null
087 * @param predicate Predicate
088 * @return Combined predicate
089 */
090 StarPredicate minus(StarPredicate predicate);
091
092 /**
093 * Returns this union of this Predicate with another. The result is a
094 * Predicate which holds whenever either predicate holds.
095 *
096 * @pre predicate != null
097 * @param predicate Predicate
098 * @return Combined predicate
099 */
100 StarPredicate or(StarPredicate predicate);
101
102 /**
103 * Returns this intersection of this Predicate with another. The result is a
104 * Predicate which holds whenever both predicates hold.
105 *
106 * @pre predicate != null
107 * @param predicate Predicate
108 * @return Combined predicate
109 */
110 StarPredicate and(StarPredicate predicate);
111
112 /**
113 * Wildcard value for {@link #evaluate(java.util.List)}.
114 */
115 Object WILDCARD = new Object();
116
117 void toSql(SqlQuery sqlQuery, StringBuilder buf);
118 }
119
120 // End StarPredicate.java