AutoPagerizeMatchOrderAssigner.java

package net.sasasin.sreader.service.autopagerize;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import net.sasasin.sreader.domain.AutoPagerizeRule;

/**
 * Assigns deterministic {@code match_order}: longer {@code url_pattern} first, then lower input
 * ordinal. Does not deduplicate rules.
 */
public final class AutoPagerizeMatchOrderAssigner {

  private AutoPagerizeMatchOrderAssigner() {}

  public static List<AutoPagerizeRule> assign(
      long datasetId, List<AutoPagerizeParsedItem> acceptedItems) {
    Objects.requireNonNull(acceptedItems, "acceptedItems must not be null");
    List<AutoPagerizeParsedItem> sorted = new ArrayList<>(acceptedItems);
    sorted.sort(
        Comparator.comparingInt((AutoPagerizeParsedItem item) -> item.urlPattern().length())
            .reversed()
            .thenComparingInt(AutoPagerizeParsedItem::ordinal));

    List<AutoPagerizeRule> rules = new ArrayList<>(sorted.size());
    for (int matchOrder = 0; matchOrder < sorted.size(); matchOrder++) {
      AutoPagerizeParsedItem item = sorted.get(matchOrder);
      rules.add(
          new AutoPagerizeRule(
              datasetId,
              item.ordinal(),
              matchOrder,
              item.externalId(),
              item.resourceUrl(),
              item.name(),
              item.createdBy(),
              item.sourceCreatedAt(),
              item.sourceUpdatedAt(),
              item.urlPattern(),
              item.nextLinkXpath(),
              item.pageElementXpath(),
              item.insertBeforeXpath(),
              item.exampleUrl(),
              item.rawItemJson()));
    }
    return List.copyOf(rules);
  }
}