ContentHeaderRepository.java

package net.sasasin.sreader.repository;

import static net.sasasin.sreader.jooq.Tables.CONTENT_FULL_TEXT;
import static net.sasasin.sreader.jooq.Tables.CONTENT_HEADER;
import static net.sasasin.sreader.jooq.Tables.FEED_URL;

import java.time.OffsetDateTime;
import java.util.List;
import net.sasasin.sreader.domain.ContentHeader;
import net.sasasin.sreader.domain.FullTextMethod;
import net.sasasin.sreader.domain.PendingFullTextTarget;
import org.jooq.DSLContext;
import org.springframework.stereotype.Repository;

@Repository
public class ContentHeaderRepository {

  private final DSLContext dsl;

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

  public boolean insertIfAbsent(ContentHeader header) {
    OffsetDateTime now = OffsetDateTime.now();
    return dsl.insertInto(CONTENT_HEADER)
            .set(CONTENT_HEADER.ID, header.id())
            .set(CONTENT_HEADER.FEED_URL_ID, header.feedUrlId())
            .set(CONTENT_HEADER.URL, header.url())
            .set(CONTENT_HEADER.TITLE, header.title())
            .set(CONTENT_HEADER.PUBLISHED_AT, header.publishedAt())
            .set(CONTENT_HEADER.FEED_TEXT, header.feedText())
            .set(CONTENT_HEADER.CREATED_AT, now)
            .set(CONTENT_HEADER.UPDATED_AT, now)
            .onConflict(CONTENT_HEADER.ID)
            .doNothing()
            .execute()
        == 1;
  }

  public List<ContentHeader> findWithoutFullText(int limit) {
    return dsl.select(
            CONTENT_HEADER.ID,
            CONTENT_HEADER.FEED_URL_ID,
            CONTENT_HEADER.URL,
            CONTENT_HEADER.TITLE,
            CONTENT_HEADER.PUBLISHED_AT,
            CONTENT_HEADER.FEED_TEXT)
        .from(CONTENT_HEADER)
        .leftJoin(CONTENT_FULL_TEXT)
        .on(CONTENT_HEADER.ID.eq(CONTENT_FULL_TEXT.CONTENT_HEADER_ID))
        .where(CONTENT_FULL_TEXT.ID.isNull())
        .orderBy(CONTENT_HEADER.CREATED_AT.asc())
        .limit(limit)
        .fetch(
            record ->
                new ContentHeader(
                    record.get(CONTENT_HEADER.ID),
                    record.get(CONTENT_HEADER.FEED_URL_ID),
                    record.get(CONTENT_HEADER.URL),
                    record.get(CONTENT_HEADER.TITLE),
                    record.get(CONTENT_HEADER.PUBLISHED_AT),
                    record.get(CONTENT_HEADER.FEED_TEXT)));
  }

  public List<PendingFullTextTarget> findWithoutFullTextForUrlExtraction(int limit) {
    return dsl.select(
            CONTENT_HEADER.ID,
            CONTENT_HEADER.FEED_URL_ID,
            CONTENT_HEADER.URL,
            CONTENT_HEADER.TITLE,
            CONTENT_HEADER.PUBLISHED_AT,
            CONTENT_HEADER.FEED_TEXT,
            FEED_URL.FULL_TEXT_METHOD)
        .from(CONTENT_HEADER)
        .join(FEED_URL)
        .on(CONTENT_HEADER.FEED_URL_ID.eq(FEED_URL.ID))
        .leftJoin(CONTENT_FULL_TEXT)
        .on(CONTENT_HEADER.ID.eq(CONTENT_FULL_TEXT.CONTENT_HEADER_ID))
        .where(CONTENT_FULL_TEXT.ID.isNull())
        .orderBy(CONTENT_HEADER.CREATED_AT.asc())
        .limit(limit)
        .fetch(
            record ->
                new PendingFullTextTarget(
                    new ContentHeader(
                        record.get(CONTENT_HEADER.ID),
                        record.get(CONTENT_HEADER.FEED_URL_ID),
                        record.get(CONTENT_HEADER.URL),
                        record.get(CONTENT_HEADER.TITLE),
                        record.get(CONTENT_HEADER.PUBLISHED_AT),
                        record.get(CONTENT_HEADER.FEED_TEXT)),
                    toFullTextMethod(record.get(FEED_URL.FULL_TEXT_METHOD))));
  }

  private FullTextMethod toFullTextMethod(String value) {
    return value == null ? FullTextMethod.HTTP : FullTextMethod.fromValue(value);
  }
}