Non-indexed JSONb operations
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Accessibilité débutants
- 30/100
Piste de recherche
Commencez dans lib/ecto/adapters/postgres/connection.ex vers la ligne 1054 et reproduisez les deux exemples de Repo.to_sql comparant des valeurs JSONB littérales et paramétrées. Examinez comment sont représentés les chemins JSONB de PostgreSQL, les valeurs paramétrées, l’égalité et la contenance ; le travail est considéré comme terminé lorsque les cas non littéraux proposés génèrent du SQL compatible avec les index GIN sans régression dans les requêtes littérales existantes.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Elixir version
Erlang/OTP 27 [erts-15.2.3] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit] Elixir 1.18.3 (compiled with Erlang/OTP 27)
Database and Version
PostgreSQL 17.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 14.2.1 20240912 (Red Hat 14.2.1-3), 64-bit
Ecto Versions
3.12.5
Database Adapter and Versions (postgrex, myxql, etc)
0.20.0
Current behavior
When comparing jsonb paths with literals in where, Ecto generates efficient query using @>:
iex(1)> q = from j in Oban.Job, where: j.args["event_id"] == "123"
iex(2)> Repo.to_sql(:all, q) |> elem(0) |> IO.puts()
SELECT ... FROM "oban_jobs" AS o0 WHERE ((o0."args"@>'{"event_id": "123"}'))
However, if doing the same, but interpolating the value, e.g.:
iex(1)> q = from j in Oban.Job, where: j.args["event_id"] == ^"123"
iex(2)> Repo.to_sql(:all, q) |> elem(0) |> IO.puts()
SELECT ... FROM "oban_jobs" AS o0 WHERE ((o0."args"#>'{"event_id"}') = $1)
Ecto generates the query using #> operator, which isn't supported by GIN indexes
Expected behavior
It seems that this inefficiency comes from https://github.com/elixir-ecto/ecto_sql/blob/ad5e31c13b034564ff8bf3783bfb2e8ab7c0e6d0/lib/ecto/adapters/postgres/connection.ex#L1054, which is restricted only to literals, and not interpolations.
My proposal is to add support for pinned vars and other db columns with following cases:
-
data known in elixir:
SELECT ... FROM "oban_jobs" AS o0 WHERE (o0."args" @@ '$.event_id #{operator} #{Jason.encode value}') -
equality comparison:
SELECT ... FROM "oban_jobs" AS o0 WHERE (o0."args" @> jsonb_build_object($1, jsonb_build_object($2, ...)))where $1..$n-1 is path items and $n is the value.
Maybe it would be more optimal case for elixir-data equality comparisons since the query can be prepared -
containment check
iex(1)> q = from j in Oban.Job, where: %{event_id: "123"} in j.args iex(2)> Repo.to_sql(:all, q) |> elem(0) |> IO.puts() SELECT ... FROM "oban_jobs" AS o0 WHERE (o0."args" @> jsonb_build_object('event_id', '123'))The idea is to re-build the object using
jsonb_build_objectandjsonb_build_arraywhich would allow for specific values to be non-literals
- Langage dominant
- Elixir
- Étoiles
- 657
- Forks
- 344
- Merge moyen
- 2 h 16 min
- PR mergées (30 j)
- 2
Préparer son environnement
Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de elixir-ecto/ecto_sql
-
Introduce Ecto.SQLRepoOuverteKind:Enhancement
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 25/100
elixir-ecto/ecto_sql#637 · 3 réactions ·
-
Kind:Bug
Difficulté 4/5 3-5 jours Accessibilité débutants 35/100
elixir-ecto/ecto_sql#602 · 4 commentaires ·
Toutes les issues de elixir-ecto/ecto_sql
Issues similaires
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 90/100
Les mainteneurs répondent en général sous 1 jour
-
CLI auth policy save crashes with NotFound when the AuthorizationSettings singleton is missingOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
carverauto/serviceradar#5009 ·
Les mainteneurs répondent en général sous 1 jour
-
help-wanted L: docker L: elm L: github:actions L: helm L: ruby:bundler
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
dependabot/dependabot-core#16425 ·
Les mainteneurs répondent en général sous 2 jours
-
bug javascript
Difficulté 2/5 1-3 heures Accessibilité débutants 86/100
Les mainteneurs répondent en général sous 1 jour