1 13 package mondrian.rolap.agg; 14 15 import mondrian.rolap.CellKey; 16 17 import java.util.Map ; 18 import java.util.Iterator ; 19 20 32 class DenseSegmentDataset implements SegmentDataset { 33 private final Segment segment; 34 private final Object [] values; 36 DenseSegmentDataset(Segment segment, Object [] values) { 37 this.segment = segment; 38 this.values = values; 39 } 40 41 public Object get(CellKey key) { 42 int offset = getOffset(key.getOrdinals()); 43 return values[offset]; 44 } 45 46 public double getBytes() { 47 return values.length * 12; 49 } 50 51 public void put(CellKey key, Object value) { 52 int offset = getOffset(key.getOrdinals()); 53 values[offset] = value; 54 } 55 56 public Iterator <Map.Entry <CellKey, Object >> iterator() { 57 return new Itr(); 58 } 59 60 boolean contains(Object [] keys) { 61 return getOffset(keys) >= 0; 62 } 63 64 Object get(Object [] keys) { 65 int offset = getOffset(keys); 66 return keys[offset]; 67 } 68 69 void put(Object [] keys, Object value) { 70 int offset = getOffset(keys); 71 keys[offset] = value; 72 } 73 74 private int getOffset(int[] keys) { 75 int offset = 0; 76 for (int i = 0; i < keys.length; i++) { 77 Aggregation.Axis axis = segment.axes[i]; 78 Object [] ks = axis.getKeys(); 79 offset *= ks.length; 80 offset += keys[i]; 81 } 82 return offset; 83 } 84 85 private int getOffset(Object [] keys) { 86 int offset = 0; 87 outer: 88 for (int i = 0; i < keys.length; i++) { 89 Aggregation.Axis axis = segment.axes[i]; 90 Object [] ks = axis.getKeys(); 91 offset *= ks.length; 92 Object value = keys[i]; 93 for (int j = 0, axisLength = ks.length; j < axisLength; j++) { 94 if (ks[j].equals(value)) { 95 offset += j; 96 continue outer; 97 } 98 } 99 return -1; } 101 return offset; 102 } 103 104 void set(int k, Object o) { 105 values[k] = o; 106 } 107 108 116 private class Itr implements 117 Iterator <Map.Entry <CellKey, Object >>, 118 Map.Entry <CellKey, Object > 119 { 120 private int i = -1; 121 private final int[] ordinals; 122 private final CellKey key; 123 124 Itr() { 125 ordinals = new int[segment.axes.length]; 126 ordinals[ordinals.length - 1] = -1; 127 key = CellKey.Generator.newRefCellKey(ordinals); 128 } 129 130 public boolean hasNext() { 131 return i < values.length - 1; 132 } 133 134 public Map.Entry <CellKey, Object > next() { 135 ++i; 136 int k = ordinals.length - 1; 137 while (k >= 0) { 138 if (ordinals[k] < segment.axes[k].getKeys().length - 1) { 139 ++ordinals[k]; 140 break; 141 } else { 142 ordinals[k] = 0; 143 --k; 144 } 145 } 146 return this; 147 } 148 149 public void remove() { 151 throw new UnsupportedOperationException (); 152 } 153 154 public CellKey getKey() { 156 return key; 157 } 158 159 public Object getValue() { 161 return values[i]; 162 } 163 164 public Object setValue(Object value) { 166 throw new UnsupportedOperationException (); 167 } 168 } 169 } 170 171 | Popular Tags |