densesegmentdataset.java
来自「数据仓库展示程序」· Java 代码 · 共 91 行
JAVA
91 行
/*
// $Id: //open/mondrian/src/main/mondrian/rolap/agg/DenseSegmentDataset.java#5 $
// (C) Copyright 2002-2005 Kana Software, Inc.
// This software is subject to the terms of the Common Public License
// Agreement, available at the following URL:
// http://www.opensource.org/licenses/cpl.html.
// (C) Copyright 2002-2005 Kana Software, Inc. and others.
// All Rights Reserved.
// You must accept the terms of that agreement to use this software.
//
// jhyde, 21 March, 2002
*/
package mondrian.rolap.agg;
import mondrian.rolap.CellKey;
/**
* A <code>DenseSegmentDataset</code> is a means of storing segment values
* which is suitable when most of the combinations of keys have a value
* present.
*
* <p>The storage requirements are as follows. Table requires 1 word per
* cell.</p>
*
* @author jhyde
* @since 21 March, 2002
* @version $Id: //open/mondrian/src/main/mondrian/rolap/agg/DenseSegmentDataset.java#5 $
**/
class DenseSegmentDataset implements SegmentDataset {
private final Segment segment;
private final Object[] values; // length == m[0] * ... * m[axes.length-1]
DenseSegmentDataset(Segment segment, Object[] values) {
this.segment = segment;
this.values = values;
}
public Object get(CellKey keys) {
int offset = getOffset(keys.ordinals);
return values[offset];
}
public double getBytes() {
// assume a slot, key, and value are each 4 bytes
return values.length * 12;
}
boolean contains(Object[] keys) {
return (getOffset(keys) >= 0);
}
Object get(Object[] keys) {
int offset = getOffset(keys);
return keys[offset];
}
void put(Object[] keys, Object value) {
int offset = getOffset(keys);
keys[offset] = value;
}
private int getOffset(int[] keys) {
int offset = 0;
for (int i = 0; i < keys.length; i++) {
Aggregation.Axis axis = segment.axes[i];
Object[] ks = axis.getKeys();
offset *= ks.length;
offset += keys[i];
}
return offset;
}
private int getOffset(Object[] keys) {
int offset = 0;
outer:
for (int i = 0; i < keys.length; i++) {
Aggregation.Axis axis = segment.axes[i];
Object[] ks = axis.getKeys();
offset *= ks.length;
Object value = keys[i];
for (int j = 0, axisLength = ks.length; j < axisLength; j++) {
if (ks[j].equals(value)) {
offset += j;
continue outer;
}
}
return -1; // not found
}
return offset;
}
void set(int k, Object o) {
values[k] = o;
}
}
// End DenseSegmentDataset.java
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?