示例#1
0
  /**
   * @return the unused section of the page, or null if fully applied. pagesIndex guaranteed to have
   *     at least one row after this method returns
   */
  private Page updatePagesIndex(Page page) {
    checkArgument(page.getPositionCount() > 0);

    // TODO: Fix pagesHashStrategy to allow specifying channels for comparison, it currently
    // requires us to rearrange the right side blocks in consecutive channel order
    Page preGroupedPage = rearrangePage(page, preGroupedChannels);
    if (pagesIndex.getPositionCount() == 0
        || pagesIndex.positionEqualsRow(
            preGroupedPartitionHashStrategy, 0, 0, preGroupedPage.getBlocks())) {
      // Find the position where the pre-grouped columns change
      int groupEnd = findGroupEnd(preGroupedPage, preGroupedPartitionHashStrategy, 0);

      // Add the section of the page that contains values for the current group
      pagesIndex.addPage(page.getRegion(0, groupEnd));

      if (page.getPositionCount() - groupEnd > 0) {
        // Save the remaining page, which may contain multiple partitions
        return page.getRegion(groupEnd, page.getPositionCount() - groupEnd);
      } else {
        // Page fully consumed
        return null;
      }
    } else {
      // We had previous results buffered, but the new page starts with new group values
      return page;
    }
  }