MME-4 Save summary text to db, fix queries, tweak backfill.

This commit is contained in:
Jesse Brault 2026-02-01 20:43:08 -06:00
parent fa7afbaa76
commit 8018301d3c
4 changed files with 15 additions and 14 deletions

View File

@ -3,8 +3,10 @@ package app.mealsmadeeasy.api;
import app.mealsmadeeasy.api.job.JobService; import app.mealsmadeeasy.api.job.JobService;
import app.mealsmadeeasy.api.recipe.Recipe; import app.mealsmadeeasy.api.recipe.Recipe;
import app.mealsmadeeasy.api.recipe.RecipeRepository; import app.mealsmadeeasy.api.recipe.RecipeRepository;
import app.mealsmadeeasy.api.recipe.RecipeSummary;
import app.mealsmadeeasy.api.recipe.job.RecipeSummaryJobHandler; import app.mealsmadeeasy.api.recipe.job.RecipeSummaryJobHandler;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.jetbrains.annotations.Nullable;
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner; import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@ -22,14 +24,16 @@ public class BackfillRecipeEmbeddings implements ApplicationRunner {
@Override @Override
public void run(ApplicationArguments args) { public void run(ApplicationArguments args) {
final List<Recipe> recipeEntities = this.recipeRepository.findAllBySummaryIsNull(); final List<Recipe> recipeEntities = this.recipeRepository.findAll();
for (final Recipe recipe : recipeEntities) { for (final Recipe recipe : recipeEntities) {
this.jobService.create( final @Nullable RecipeSummary summary = recipe.getSummary();
RecipeSummaryJobHandler.JOB_KEY, if (summary == null || summary.getSummary() == null || summary.getEmbedding() == null) {
new RecipeSummaryJobHandler.RecipeSummaryJobPayload(recipe.getId()) this.jobService.create(
); RecipeSummaryJobHandler.JOB_KEY,
new RecipeSummaryJobHandler.RecipeSummaryJobPayload(recipe.getId())
);
}
} }
this.recipeRepository.flush();
} }
} }

View File

@ -109,7 +109,7 @@ public class DevConfiguration {
.isPublic(frontMatter.isPublic) .isPublic(frontMatter.isPublic)
.mainImage(mainImage) .mainImage(mainImage)
.build(); .build();
final Recipe recipe = this.recipeService.create(testUser, recipeCreateSpec, false); final Recipe recipe = this.recipeService.create(testUser, recipeCreateSpec, true);
logger.info("Created recipe {}", recipe); logger.info("Created recipe {}", recipe);
} }
} }

View File

@ -41,12 +41,10 @@ public interface RecipeRepository extends JpaRepository<Recipe, Integer> {
@Query("SELECT r FROM Recipe r WHERE r.isPublic OR r.owner = ?1 OR ?1 MEMBER OF r.viewers") @Query("SELECT r FROM Recipe r WHERE r.isPublic OR r.owner = ?1 OR ?1 MEMBER OF r.viewers")
Slice<Recipe> findAllViewableBy(User viewer, Pageable pageable); Slice<Recipe> findAllViewableBy(User viewer, Pageable pageable);
List<Recipe> findAllBySummaryIsNull();
@Query( @Query(
nativeQuery = true, nativeQuery = true,
value = """ value = """
WITH distances AS (SELECT recipe_id, embedding <=> cast(?1 AS vector) AS distance FROM recipe_embedding) WITH distances AS (SELECT recipe_id, embedding <=> cast(?1 AS vector) AS distance FROM recipe_summary)
SELECT r.* FROM distances d SELECT r.* FROM distances d
INNER JOIN recipe r ON r.id = d.recipe_id INNER JOIN recipe r ON r.id = d.recipe_id
WHERE d.distance < ?2 AND ( WHERE d.distance < ?2 AND (
@ -62,7 +60,7 @@ public interface RecipeRepository extends JpaRepository<Recipe, Integer> {
@Query( @Query(
nativeQuery = true, nativeQuery = true,
value = """ value = """
WITH distances AS (SELECT recipe_id, embedding <=> cast(?1 AS vector) AS distance FROM recipe_embedding) WITH distances AS (SELECT recipe_id, embedding <=> cast(?1 AS vector) AS distance FROM recipe_summary)
SELECT r.* FROM distances d SELECT r.* FROM distances d
INNER JOIN recipe r ON r.id = d.recipe_id INNER JOIN recipe r ON r.id = d.recipe_id
WHERE d.distance < ?2 AND r.is_public = TRUE WHERE d.distance < ?2 AND r.is_public = TRUE

View File

@ -61,11 +61,10 @@ public class RecipeSummaryJobHandler implements JobHandler<RecipeSummaryJobHandl
} }
logger.debug("Summary of recipe with id {}: {}", recipe.getId(), summary); logger.debug("Summary of recipe with id {}: {}", recipe.getId(), summary);
// todo: save summary to db
final float[] summaryEmbedding = this.embeddingModel.embed(summary); final float[] summaryEmbedding = this.embeddingModel.embed(summary);
final RecipeSummary recipeSummary = new RecipeSummary(); final RecipeSummary recipeSummary = recipe.getSummary() != null ? recipe.getSummary() : new RecipeSummary();
recipeSummary.setSummary(summary);
recipeSummary.setEmbedding(summaryEmbedding); recipeSummary.setEmbedding(summaryEmbedding);
recipeSummary.setRecipe(recipe); recipeSummary.setRecipe(recipe);
recipeSummary.setTimestamp(OffsetDateTime.now()); recipeSummary.setTimestamp(OffsetDateTime.now());