public void fetchFeatureArrayForNode()

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();
        }
      }
    }
  }