1 13 14 package mondrian.rolap.agg; 15 16 import mondrian.rolap.*; 17 import mondrian.olap.Util; 18 19 import java.util.ArrayList ; 20 import java.util.List ; 21 22 23 31 public class CellRequest { 32 private final RolapStar.Measure measure; 33 public final boolean extendedContext; 34 public final boolean drillThrough; 35 41 private final List constrainedColumnList = new ArrayList (); 42 private List <StarColumnPredicate> valueList = 43 new ArrayList <StarColumnPredicate>(); 44 45 54 private RolapStar.Column[] columnsCache = null; 55 56 63 private final BitKey constrainedColumnsBitKey; 64 65 72 private boolean unsatisfiable; 73 74 79 private boolean isDirty = true; 80 81 84 public CellRequest( 85 RolapStar.Measure measure, 86 boolean extendedContext, 87 boolean drillThrough) { 88 this.measure = measure; 89 this.extendedContext = extendedContext; 90 this.drillThrough = drillThrough; 91 this.constrainedColumnList.add(measure.getStar()); 92 this.constrainedColumnsBitKey = 93 BitKey.Factory.makeBitKey(measure.getStar().getColumnCount()); 94 } 95 96 103 public void addConstrainedColumn( 104 RolapStar.Column column, 105 StarColumnPredicate predicate) { 106 107 assert columnsCache == null; 108 109 final int bitPosition = column.getBitPosition(); 110 if (this.constrainedColumnsBitKey.get(bitPosition)) { 111 int index = constrainedColumnList.indexOf(column); 115 Util.assertTrue(index >= 0); 116 --index; 118 final StarColumnPredicate prevValue = valueList.get(index); 119 if (prevValue == null) { 120 } else if (predicate == null) { 122 return; 124 } else if (predicate.equalConstraint(prevValue)) { 125 return; 127 } else { 128 predicate = null; 130 unsatisfiable = true; 131 } 132 valueList.set(index, predicate); 133 134 } else { 135 this.constrainedColumnList.add(column); 136 this.constrainedColumnsBitKey.set(bitPosition); 137 this.valueList.add(predicate); 138 } 139 } 140 141 public RolapStar.Measure getMeasure() { 142 return measure; 143 } 144 145 public RolapStar.Column[] getConstrainedColumns() { 146 if (this.columnsCache == null) { 147 check(); 150 } 151 return this.columnsCache; 152 } 153 154 157 public BitKey getConstrainedColumnsBitKey() { 158 return constrainedColumnsBitKey; 159 } 160 161 165 private void check() { 166 if (isDirty) { 167 final int size = constrainedColumnList.size(); 168 this.columnsCache = new RolapStar.Column[size - 1]; 169 List <StarColumnPredicate> vl = new ArrayList <StarColumnPredicate>(); 170 int cnt = 0; 171 for (int bitPos : constrainedColumnsBitKey) { 172 for (int j = 1; j < size; j++) { 176 RolapStar.Column rc = 177 (RolapStar.Column) constrainedColumnList.get(j); 178 if (rc.getBitPosition() == bitPos) { 179 int index = constrainedColumnList.indexOf(rc) - 1; 180 final StarColumnPredicate value = valueList.get(index); 181 vl.add(value); 182 columnsCache[cnt++] = rc; 183 break; 184 } 185 } 186 } 187 valueList = vl; 188 189 isDirty = false; 190 } 191 } 192 public List <StarColumnPredicate> getValueList() { 193 check(); 194 return valueList; 195 } 196 197 public Object [] getSingleValues() { 198 check(); 199 Object [] a = new Object [valueList.size()]; 202 for (int i = 0, n = valueList.size(); i < n; i++) { 203 ValueColumnPredicate constr = 204 (ValueColumnPredicate) valueList.get(i); 205 a[i] = constr.getValue(); 206 } 207 return a; 208 } 209 210 215 public boolean isUnsatisfiable() { 216 return unsatisfiable; 217 } 218 } 219 220 | Popular Tags |