001 /* 002 // $Id: //open/mondrian/src/main/mondrian/rolap/StarColumnPredicate.java#2 $ 003 // This software is subject to the terms of the Common Public License 004 // Agreement, available at the following URL: 005 // http://www.opensource.org/licenses/cpl.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 java.util.Collection; 013 014 /** 015 * Refinement of {@link StarPredicate} which constrains precisely one column. 016 * 017 * @author jhyde 018 * @version $Id: //open/mondrian/src/main/mondrian/rolap/StarColumnPredicate.java#2 $ 019 * @since Jan 15, 2007 020 */ 021 public interface StarColumnPredicate extends StarPredicate { 022 /** 023 * Adds the values in this constraint to a collection. 024 * 025 * @param collection Collection to add values to 026 */ 027 void values(Collection<Object> collection); 028 029 /** 030 * Returns whether this constraint would return <code>true</code> for a 031 * given value. 032 * 033 * @param value Value 034 * @return Whether predicate is true 035 */ 036 boolean evaluate(Object value); 037 038 /** 039 * Returns the column constrained by this predicate. 040 * 041 * @return Column constrained by this predicate. 042 */ 043 RolapStar.Column getConstrainedColumn(); 044 045 /** 046 * Applies this predicate to a predicate from the axis of 047 * a segment, and tests for overlap. The result might be that there 048 * is no overlap, full overlap (so the constraint can be removed), 049 * or partial overlap (so the constraint will need to be replaced with 050 * a stronger constraint, say 'x > 10' is replaced with 'x > 20'). 051 * 052 * @param predicate Predicate 053 * @return description of overlap between predicates, if any 054 */ 055 Overlap intersect(StarColumnPredicate predicate); 056 057 /** 058 * Returns whether this predicate might intersect another predicate. 059 * That is, whether there might be a value which holds true for both 060 * constraints. 061 * 062 * @param other Other constraint 063 * @return Whether constraints intersect 064 */ 065 boolean mightIntersect(StarPredicate other); 066 067 // override with stricter return type 068 StarColumnPredicate minus(StarPredicate predicate); 069 070 /** 071 * Returns this union of this Predicate with another. 072 * 073 * <p>Unlike {@link #or}, the other predicate must be on this column, and 074 * the result is a column predicate. 075 * 076 * @param predicate Another predicate on this column 077 * @return Union predicate on this column 078 */ 079 StarColumnPredicate orColumn(StarColumnPredicate predicate); 080 081 /** 082 * This method is required because unfortunately some ColumnPredicate 083 * objects are created without a column. 084 * 085 * <p>We call this method to provide a fake column, then call 086 * {@link #toSql(mondrian.rolap.sql.SqlQuery, StringBuilder)}. 087 * 088 * <p>todo: remove this method when 089 * {@link mondrian.util.Bug#Bug1767775Fixed bug 1767776} and 090 * {@link mondrian.util.Bug#Bug1767779Fixed bug 1767779} are fixed. 091 */ 092 StarColumnPredicate cloneWithColumn(RolapStar.Column column); 093 094 /** 095 * Returned by 096 * {@link mondrian.rolap.StarColumnPredicate#intersect}, 097 * describes whether two predicates overlap, and if so, the remaining 098 * predicate. 099 */ 100 public static class Overlap { 101 public final boolean matched; 102 public final StarColumnPredicate remaining; 103 public final float selectivity; 104 105 public Overlap( 106 boolean matched, 107 StarColumnPredicate remaining, 108 float selectivity) 109 { 110 this.matched = matched; 111 this.remaining = remaining; 112 this.selectivity = selectivity; 113 } 114 } 115 } 116 117 // End StarColumnPredicate.java