BackfillRepositoryImplPostgres.java
package jasper.repository;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Repository
@Profile("!sqlite")
@Transactional
public class BackfillRepositoryImplPostgres implements BackfillRepository {
@PersistenceContext
private EntityManager em;
@Override
public int backfillMetadata(String origin, int batchSize) {
String sql = """
WITH rows as (
SELECT url, origin from ref
WHERE (metadata IS NULL OR metadata->>'regen' = 'true')
AND (:origin = '' OR origin = :origin OR origin LIKE concat(:origin, '.%'))
LIMIT :batchSize
)
UPDATE ref r
SET metadata = jsonb_strip_nulls(jsonb_build_object(
'modified', COALESCE(r.metadata->>'modified', to_char(NOW(), 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"')),
'responses', (SELECT jsonb_agg(re.url) FROM ref re WHERE jsonb_exists(re.sources, r.url) AND NOT jsonb_exists(re.metadata->'expandedTags', 'internal') = false),
'internalResponses', (SELECT jsonb_agg(ire.url) FROM Ref ire WHERE jsonb_exists(ire.sources, r.url) AND jsonb_exists(ire.metadata->'expandedTags', 'internal') = true),
'plugins', jsonb_strip_nulls((SELECT jsonb_object_agg(
p.tag,
(SELECT jsonb_agg(pre.url) FROM ref pre WHERE jsonb_exists(pre.sources, r.url) AND jsonb_exists(pre.metadata->'expandedTags', p.tag) = true)
) FROM plugin p WHERE p.origin = :origin)),
'obsolete', (SELECT count(*) from ref n WHERE n.url = r.url AND n.modified > r.modified AND (:origin = '' OR n.origin = :origin OR n.origin LIKE concat(:origin, '.%')))
))
WHERE EXISTS (SELECT * from rows WHERE r.url = rows.url AND r.origin = rows.origin)
""";
int updated = em.createNativeQuery(sql)
.setParameter("origin", origin)
.setParameter("batchSize", batchSize)
.executeUpdate();
em.flush();
em.clear();
return updated;
}
}