/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (c) 2002-2015 Pentaho Corporation.. All rights reserved. */ package mondrian.rolap.agg; import mondrian.util.Pair; import java.util.*; /** * Implementation of a segment body which stores the data inside * a dense primitive array of double precision numbers. * * @author LBoudreau */ class DenseDoubleSegmentBody extends AbstractSegmentBody { private static final long serialVersionUID = 5775717165497921144L; private final double[] values; private final BitSet nullValues; /** * Creates a DenseDoubleSegmentBody. * * <p>Stores the given array of cell values and null indicators; caller must * not modify them afterwards.</p> * * @param nullValues A bit-set indicating whether values are null. Each * position in the bit-set corresponds to an offset in the * value array. If position is null, the corresponding * entry in the value array will also be 0. * @param values Cell values * @param axes Axes */ DenseDoubleSegmentBody( BitSet nullValues, double[] values, List<Pair<SortedSet<Comparable>, Boolean>> axes) { super(axes); this.values = values; this.nullValues = nullValues; } @Override public Object getValueArray() { return values; } @Override public BitSet getNullValueIndicators() { return nullValues; } @Override protected int getSize() { return values.length; } @Override protected int getEffectiveSize() { return values.length - nullValues.cardinality(); } @Override protected Object getObject(int i) { double value = values[i]; if (value == 0d && nullValues.get(i)) { return null; } return value; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("DenseDoubleSegmentBody(size="); sb.append(values.length); sb.append(", data="); sb.append(Arrays.toString(values)); sb.append(", notNullZeroValues=").append(nullValues); sb.append(", axisValueSets="); sb.append(Arrays.toString(getAxisValueSets())); sb.append(", nullAxisFlags="); sb.append(Arrays.toString(getNullAxisFlags())); if (getAxisValueSets().length > 0) { if (getAxisValueSets()[0].iterator().hasNext()) { sb.append(", aVS[0]="); sb.append(getAxisValueSets()[0].getClass()); sb.append(", aVS[0][0]="); sb.append(getAxisValueSets()[0].iterator().next().getClass()); } } sb.append(")"); return sb.toString(); } } // End DenseDoubleSegmentBody.java