AutoPagerizeDatasetRepository.java

package net.sasasin.sreader.repository;

import static net.sasasin.sreader.jooq.Tables.AUTOPAGERIZE_DATASET;

import java.util.List;
import java.util.Optional;
import net.sasasin.sreader.domain.AutoPagerizeDataset;
import net.sasasin.sreader.domain.AutoPagerizeDatasetCreate;
import net.sasasin.sreader.domain.AutoPagerizeDatasetSummary;
import org.jooq.DSLContext;
import org.jooq.JSONB;
import org.jooq.Record;
import org.springframework.stereotype.Repository;

/**
 * Persistence for immutable AutoPagerize dataset metadata. Transaction boundaries belong to the
 * import service that may also write rules, rejections, and active state in one unit of work.
 */
@Repository
public class AutoPagerizeDatasetRepository {

  private final DSLContext dsl;

  public AutoPagerizeDatasetRepository(DSLContext dsl) {
    this.dsl = dsl;
  }

  public Optional<AutoPagerizeDataset> findByIdentity(
      String format, String sourceSha256, int importerVersion) {
    return dsl.selectFrom(AUTOPAGERIZE_DATASET)
        .where(AUTOPAGERIZE_DATASET.FORMAT.eq(format))
        .and(AUTOPAGERIZE_DATASET.SOURCE_SHA256.eq(sourceSha256))
        .and(AUTOPAGERIZE_DATASET.IMPORTER_VERSION.eq(importerVersion))
        .fetchOptional(this::mapDataset);
  }

  public Optional<AutoPagerizeDataset> findById(long id) {
    return dsl.selectFrom(AUTOPAGERIZE_DATASET)
        .where(AUTOPAGERIZE_DATASET.ID.eq(id))
        .fetchOptional(this::mapDataset);
  }

  public boolean existsById(long id) {
    return dsl.fetchExists(
        dsl.selectOne().from(AUTOPAGERIZE_DATASET).where(AUTOPAGERIZE_DATASET.ID.eq(id)));
  }

  public List<AutoPagerizeDatasetSummary> listNewestFirst() {
    return dsl.select(
            AUTOPAGERIZE_DATASET.ID,
            AUTOPAGERIZE_DATASET.FORMAT,
            AUTOPAGERIZE_DATASET.SOURCE_FILENAME,
            AUTOPAGERIZE_DATASET.SOURCE_URI,
            AUTOPAGERIZE_DATASET.SOURCE_SHA256,
            AUTOPAGERIZE_DATASET.IMPORTER_VERSION,
            AUTOPAGERIZE_DATASET.IMPORTED_AT,
            AUTOPAGERIZE_DATASET.INPUT_ITEM_COUNT,
            AUTOPAGERIZE_DATASET.ACCEPTED_RULE_COUNT,
            AUTOPAGERIZE_DATASET.REJECTED_RULE_COUNT)
        .from(AUTOPAGERIZE_DATASET)
        .orderBy(AUTOPAGERIZE_DATASET.IMPORTED_AT.desc(), AUTOPAGERIZE_DATASET.ID.desc())
        .fetch(
            record ->
                new AutoPagerizeDatasetSummary(
                    record.get(AUTOPAGERIZE_DATASET.ID),
                    record.get(AUTOPAGERIZE_DATASET.FORMAT),
                    record.get(AUTOPAGERIZE_DATASET.SOURCE_FILENAME),
                    record.get(AUTOPAGERIZE_DATASET.SOURCE_URI),
                    record.get(AUTOPAGERIZE_DATASET.SOURCE_SHA256),
                    record.get(AUTOPAGERIZE_DATASET.IMPORTER_VERSION),
                    record.get(AUTOPAGERIZE_DATASET.IMPORTED_AT),
                    record.get(AUTOPAGERIZE_DATASET.INPUT_ITEM_COUNT),
                    record.get(AUTOPAGERIZE_DATASET.ACCEPTED_RULE_COUNT),
                    record.get(AUTOPAGERIZE_DATASET.REJECTED_RULE_COUNT)));
  }

  /**
   * Inserts dataset metadata and returns the generated id. Callers must insert rules/rejections
   * separately (typically in the same transaction).
   */
  public long insert(AutoPagerizeDatasetCreate create) {
    return dsl.insertInto(AUTOPAGERIZE_DATASET)
        .set(AUTOPAGERIZE_DATASET.FORMAT, create.format())
        .set(AUTOPAGERIZE_DATASET.SOURCE_FILENAME, create.sourceFilename())
        .set(AUTOPAGERIZE_DATASET.SOURCE_URI, create.sourceUri())
        .set(AUTOPAGERIZE_DATASET.SOURCE_SHA256, create.sourceSha256())
        .set(AUTOPAGERIZE_DATASET.IMPORTER_VERSION, create.importerVersion())
        .set(AUTOPAGERIZE_DATASET.INPUT_ITEM_COUNT, create.inputItemCount())
        .set(AUTOPAGERIZE_DATASET.ACCEPTED_RULE_COUNT, create.acceptedRuleCount())
        .set(AUTOPAGERIZE_DATASET.REJECTED_RULE_COUNT, create.rejectedRuleCount())
        .set(AUTOPAGERIZE_DATASET.METADATA, JSONB.valueOf(create.metadataJson()))
        .returning(AUTOPAGERIZE_DATASET.ID)
        .fetchSingle(AUTOPAGERIZE_DATASET.ID);
  }

  private AutoPagerizeDataset mapDataset(Record record) {
    return new AutoPagerizeDataset(
        record.get(AUTOPAGERIZE_DATASET.ID),
        record.get(AUTOPAGERIZE_DATASET.FORMAT),
        record.get(AUTOPAGERIZE_DATASET.SOURCE_FILENAME),
        record.get(AUTOPAGERIZE_DATASET.SOURCE_URI),
        record.get(AUTOPAGERIZE_DATASET.SOURCE_SHA256),
        record.get(AUTOPAGERIZE_DATASET.IMPORTER_VERSION),
        record.get(AUTOPAGERIZE_DATASET.IMPORTED_AT),
        record.get(AUTOPAGERIZE_DATASET.INPUT_ITEM_COUNT),
        record.get(AUTOPAGERIZE_DATASET.ACCEPTED_RULE_COUNT),
        record.get(AUTOPAGERIZE_DATASET.REJECTED_RULE_COUNT),
        record.get(AUTOPAGERIZE_DATASET.METADATA).data());
  }
}