private int putIfAbsent(int position, Page page) { long rawHash = hashGenerator.hashPosition(position, page); return putIfAbsent(position, page, rawHash); }
private int getGroupId(HashGenerator hashGenerator, Page page, int positionInDictionary) { if (dictionaryLookBack.isProcessed(positionInDictionary)) { return dictionaryLookBack.getGroupId(positionInDictionary); } int groupId = putIfAbsent(positionInDictionary, page, hashGenerator.hashPosition(positionInDictionary, page)); dictionaryLookBack.setProcessed(positionInDictionary, groupId); return groupId; }
@Override public int putIfAbsent(int position, Page page) { int rawHash = hashGenerator.hashPosition(position, page); return putIfAbsent(position, page, rawHash); }
private int getGroupId(HashGenerator hashGenerator, Page page, int positionInDictionary) { if (dictionaryLookBack.isProcessed(positionInDictionary)) { return dictionaryLookBack.getGroupId(positionInDictionary); } int groupId = putIfAbsent(positionInDictionary, page, hashGenerator.hashPosition(positionInDictionary, page)); dictionaryLookBack.setProcessed(positionInDictionary, groupId); return groupId; }
@Override public void addPage(Page page) { Block maskBlock = null; if (maskChannel >= 0) { maskBlock = page.getBlock(maskChannel); } if (canProcessDictionary(page)) { addDictionaryPage(page); return; } // get the group id for each position int positionCount = page.getPositionCount(); for (int position = 0; position < positionCount; position++) { // skip masked rows if (maskBlock != null && !BOOLEAN.getBoolean(maskBlock, position)) { continue; } // get the group for the current row putIfAbsent(position, page); } }
@Override public GroupByIdBlock getGroupIds(Page page) { int positionCount = page.getPositionCount(); // we know the exact size required for the block BlockBuilder blockBuilder = BIGINT.createFixedSizeBlockBuilder(positionCount); Block maskBlock = null; if (maskChannel >= 0) { maskBlock = page.getBlock(maskChannel); } if (canProcessDictionary(page)) { Block groupIds = processDictionary(page); return new GroupByIdBlock(nextGroupId, groupIds); } // get the group id for each position for (int position = 0; position < positionCount; position++) { // skip masked rows if (maskBlock != null && !BOOLEAN.getBoolean(maskBlock, position)) { blockBuilder.appendNull(); continue; } // get the group for the current row int groupId = putIfAbsent(position, page); // output the group id for this row BIGINT.writeLong(blockBuilder, groupId); } return new GroupByIdBlock(nextGroupId, blockBuilder.build()); }