@Override public Block apply(Block block) { ColumnarMap mapBlock = toColumnarMap(block); Block keysBlock = keyCoercer == null ? mapBlock.getKeysBlock() : keyCoercer.apply(mapBlock.getKeysBlock()); Block valuesBlock = valueCoercer == null ? mapBlock.getValuesBlock() : valueCoercer.apply(mapBlock.getValuesBlock()); boolean[] valueIsNull = new boolean[mapBlock.getPositionCount()]; int[] offsets = new int[mapBlock.getPositionCount() + 1]; for (int i = 0; i < mapBlock.getPositionCount(); i++) { valueIsNull[i] = mapBlock.isNull(i); offsets[i + 1] = offsets[i] + mapBlock.getEntryCount(i); } return ((MapType) toType).createBlockFromKeyValue(Optional.of(valueIsNull), offsets, keysBlock, valuesBlock); } }
private void writeColumnarMap(ColumnarMap columnarMap) { // write nulls and lengths for (int position = 0; position < columnarMap.getPositionCount(); position++) { boolean present = !columnarMap.isNull(position); presentStream.writeBoolean(present); if (present) { nonNullValueCount++; lengthStream.writeLong(columnarMap.getEntryCount(position)); } } // write keys and value Block keysBlock = columnarMap.getKeysBlock(); if (keysBlock.getPositionCount() > 0) { keyWriter.writeBlock(keysBlock); valueWriter.writeBlock(columnarMap.getValuesBlock()); } }
private static void assertColumnarMap(Block block, Slice[][][] expectedValues) { ColumnarMap columnarMap = toColumnarMap(block); assertEquals(columnarMap.getPositionCount(), expectedValues.length); Block keysBlock = columnarMap.getKeysBlock(); Block valuesBlock = columnarMap.getValuesBlock(); int keysPosition = 0; int valuesPosition = 0; for (int position = 0; position < expectedValues.length; position++) { Slice[][] expectedMap = expectedValues[position]; assertEquals(columnarMap.isNull(position), expectedMap == null); if (expectedMap == null) { assertEquals(columnarMap.getEntryCount(position), 0); continue; } assertEquals(columnarMap.getEntryCount(position), expectedMap.length); for (int i = 0; i < columnarMap.getEntryCount(position); i++) { Slice[] expectedEntry = expectedMap[i]; Slice expectedKey = expectedEntry[0]; assertBlockPosition(keysBlock, keysPosition, expectedKey); keysPosition++; Slice expectedValue = expectedEntry[1]; assertBlockPosition(valuesBlock, valuesPosition, expectedValue); valuesPosition++; } } }
private void writeColumnarMap(ColumnarMap columnarMap) { // write nulls and lengths for (int position = 0; position < columnarMap.getPositionCount(); position++) { boolean present = !columnarMap.isNull(position); presentStream.writeBoolean(present); if (present) { nonNullValueCount++; lengthStream.writeLong(columnarMap.getEntryCount(position)); } } // write keys and value Block keysBlock = columnarMap.getKeysBlock(); if (keysBlock.getPositionCount() > 0) { keyWriter.writeBlock(keysBlock); valueWriter.writeBlock(columnarMap.getValuesBlock()); } }