public boolean isNullId(int id) { int nullId = NULL_ID[getSizeOfId()]; return (nullId & id) == nullId; }
public int nullId() { return NULL_ID[getSizeOfId()]; }
public void writeColumn(TblColRef column, byte[] value, int valueLen, int roundingFlag, byte dft, byte[] output, int outputOffset) { Dictionary<String> dict = getDictionary(column); int columnLen = getColumnLength(column); // non-dict value if (dict == null) { byte[] valueBytes = padFixLen(columnLen, value); System.arraycopy(valueBytes, 0, output, outputOffset, columnLen); return; } // dict value try { int id = dict.getIdFromValueBytes(value, 0, valueLen, roundingFlag); BytesUtil.writeUnsigned(id, output, outputOffset, dict.getSizeOfId()); } catch (IllegalArgumentException ex) { for (int i = outputOffset; i < outputOffset + columnLen; i++) output[i] = dft; logger.error("Can't translate value " + Bytes.toString(value, 0, valueLen) + " to dictionary ID, roundingFlag " + roundingFlag + ". Using default value " + String.format("\\x%02X", dft)); } }
@Override public int getColumnLength(TblColRef col) { Dictionary<?> dict = getDictionary(col); if (dict == null) { return this.getCubeDesc().getRowkey().getColumnLength(col); } else { return dict.getSizeOfId(); } }
private TableRecordInfoDigest createDigest() { // isMetric boolean[] isMetric = new boolean[nColumns]; for (int i = 0; i < nColumns; ++i) { isMetric[i] = desc.isMetricsCol(i); } // lengths int[] lengths = new int[nColumns]; for (int i = 0; i < nColumns; ++i) { lengths[i] = isMetric[i] ? measureSerializers[i].getLength() : dictionaries[i].getSizeOfId(); } // dict max id int[] dictMaxIds = new int[nColumns]; for (int i = 0; i < nColumns; ++i) { if (!isMetric[i]) dictMaxIds[i] = dictionaries[i].getMaxId(); } // offsets int pos = 0; int[] offsets = new int[nColumns]; for (int i = 0; i < nColumns; i++) { offsets[i] = pos; pos += lengths[i]; } int byteFormLen = pos; return new TableRecordInfoDigest(nColumns, byteFormLen, offsets, dictMaxIds, lengths, isMetric, measureSerializers); }
BytesUtil.writeUnsigned(idInMergedDict, newKeyBuf, bufOffset, mergedDict.getSizeOfId()); bufOffset += mergedDict.getSizeOfId(); } else {
Dictionary<String> dict = info.dict(0); byte[] buf = new byte[dict.getSizeOfId()]; ImmutableBytesWritable bytes = new ImmutableBytesWritable(buf); BytesUtil.writeUnsigned(v, buf, 0, dict.getSizeOfId()); container.append(bytes); BytesUtil.writeUnsigned(Dictionary.NULL_ID[dict.getSizeOfId()], buf, 0, dict.getSizeOfId()); container.append(bytes); container.closeForChange(); int value = BytesUtil.readUnsigned(bytes.get(), bytes.getOffset(), bytes.getLength()); assertEquals(Dictionary.NULL_ID[dict.getSizeOfId()], value); assertEquals(container, container2);
@Test public void testBitMapContainer() { // create container BitMapContainer container = new BitMapContainer(info.getDigest(), 0); Dictionary<String> dict = info.dict(0); for (int v = dict.getMinId(); v <= dict.getMaxId(); v++) { container.append(v); } container.append(Dictionary.NULL_ID[dict.getSizeOfId()]); container.closeForChange(); // copy by serialization List<ImmutableBytesWritable> bytes = container.toBytes(); BitMapContainer container2 = new BitMapContainer(info.getDigest(), 0); container2.fromBytes(bytes); // check the copy int i = 0; for (int v = dict.getMinId(); v <= dict.getMaxId(); v++) { int value = container2.getValueIntAt(i++); assertEquals(v, value); } assertEquals(Dictionary.NULL_ID[dict.getSizeOfId()], container2.getValueIntAt(i++)); assertEquals(container, container2); }