Skip to content

fix: support joined fields in --fields and chunk Meilisearch streaming - #79

Merged
toxicity1985 merged 1 commit into
mainfrom
fix/meilisearch-partial-joined-fields
Oct 6, 2026
Merged

toxicity1985 merged 1 commit into
mainfrom
fix/meilisearch-partial-joined-fields

Conversation

@toxicity1985

Copy link
Copy Markdown
Collaborator

Problèmes

  1. php bin/console app:meilisearch:index --fields=card_type plante en prod :
    SQLSTATE[42703]: column c.card_type does not exist. Le mode partiel préfixait chaque champ par c., alors que card_type, faction_code, rarity, set_reference, les coûts/puissances et les flags ban/suspend/errata viennent de jointures.
  2. L'index complet (et potentiellement le partiel) lance une seule requête sur les 5,4 M de cartes → Postgres remplit pgsql_tmp (SQLSTATE[53100]: Disk full).

Changements

  • --fields accepte les champs joints via une map PARTIAL_FIELDS (expression SQL, jointures nécessaires, cast int/bool), alignée sur buildSql() pour que doc partiel = doc complet. set_date utilise maintenant le même COALESCE(c.set_date, cs.date) que l'index complet.
  • Champs non supportés (name_*, main_effect_*, sub_types…) : rejetés par la commande avant toute action, avec un message clair, au lieu d'une erreur SQL.
  • Streaming par tranches d'id (c.id BETWEEN :fromId AND :toId, 2000 ids par requête) pour l'index complet et le partiel : plus de gros tri / GROUP BY sur toute la table.
  • --set : récupère d'abord les ids des cartes des sets puis les requête par paquets IN (:ids) (le scan par tranches coûtait 236 s pour 89 cartes → ~3 s).

Mesures en local (base complète, 5,46 M cartes, sans Meilisearch)

Mode Mesure Estimation totale côté DB
--fields=card_type 40 000 docs en 1,1 s ~2-3 min
index complet 40 000 docs en 18,5 s ~40 min
--set=EOLECB,EOLEOP,EOLETOP 89 docs en 3,3 s —

Tests

php bin/phpunit --testsuite Unit → OK (33 tests). Nouveaux tests sur : découpage par tranches, table vide, filtre par set en IN, champs joints (card_type), casts, rejet des champs non supportés avant toute action.

Après déploiement

php bin/console app:meilisearch:index --fields=card_type --env=prod
php bin/console cache:pool:clear cache.card_counts --env=prod

🤖 Generated with Claude Code

`app:meilisearch:index --fields=card_type` crashed with
"column c.card_type does not exist": partial updates prefixed every field
with `c.`, but card_type / faction_code / rarity / set_reference / costs /
powers / ban flags come from joined tables.

- PARTIAL_FIELDS map: field => SQL expression, required joins, cast
  (mirrors buildSql so partial and full documents match)
- unsupported fields (name_*, sub_types, ...) are rejected by the command
  before any action instead of failing in SQL
- streamDocuments / streamPartialDocuments read the card table in id-range
  chunks (BETWEEN) so Postgres never sorts/groups 5.4M rows at once
  (full index filled pgsql_tmp on prod)
- --set fetches the matching ids first and queries them by IN chunks
  (89 cards: 236s with range scan -> ~3s)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@toxicity1985
toxicity1985 merged commit dcebfaa into main Oct 6, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant