Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

Non-indexed JSONb operations

Ouverte
#666 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
5/5
Temps estimé
Plus d'une semaine
Accessibilité débutants
30/100
Type d'issue
Fonctionnalité
Clarté
Plutôt claire
Activité
À l'abandon
Stack technique
elixir, postgresql
Domaine
databases

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

Kind:Enhancement Note:Discussion
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:

  1. data known in elixir:

    SELECT ... FROM "oban_jobs" AS o0 WHERE (o0."args" @@ '$.event_id #{operator} #{Jason.encode value}')
    
  2. 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

  3. 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_object and jsonb_build_array which 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

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de elixir-ecto/ecto_sql

Toutes les issues de elixir-ecto/ecto_sql

Issues similaires

Plus d'issues Elixir

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.