in graphjet-core/src/main/java/com/twitter/graphjet/bipartite/RightNodeMetadataMultiSegmentIterator.java [74:116]
public void fetchFeatureArrayForNode(
long rightNode,
int metadataIndex,
int[] features,
int numAdditionalIntegerToUnpackShort
) {
boolean setImmutableFeatures = false;
for (int i = oldestSegmentId; i <= liveSegmentId; i++) {
RightNodeMetadataLeftIndexedBipartiteGraphSegment segment = readerAccessibleInfo.getSegments().get(i);
if (segment == null) {
continue;
}
int rightNodeIndex = segment.getRightNodesToIndexBiMap().get(rightNode);
// Default value is -1, which means the rightNode is not in the index map.
if (rightNodeIndex == -1) {
continue;
}
IntArrayIterator metadataIterator = (IntArrayIterator)
segment.getRightNodesToMetadataMap().get(metadataIndex).get(rightNodeIndex);
int packedMetadataSize = metadataIterator.size();
// Sum up mutable features, and each of them takes the size of two bytes.
for (int j = 0; j < numAdditionalIntegerToUnpackShort; j++) {
int featureInShortFormat = metadataIterator.nextInt();
// Extract the value from the higher two bytes of the integer.
features[SPACE_RATIO_BETWEEN_INTEGER_AND_SHORT * j] += featureInShortFormat >> 16;
// Extract the value from the lower two bytes of the integer.
features[SPACE_RATIO_BETWEEN_INTEGER_AND_SHORT * j + 1] += featureInShortFormat & 0xffff;
}
// For the immutable features, only set them once.
if (!setImmutableFeatures) {
setImmutableFeatures = true;
int startIndex = SPACE_RATIO_BETWEEN_INTEGER_AND_SHORT * numAdditionalIntegerToUnpackShort;
int endIndex = packedMetadataSize + numAdditionalIntegerToUnpackShort;
for (int j = startIndex; j < endIndex; j++) {
features[j] = metadataIterator.nextInt();
}
}
}
}