jamesaspinwall

jamesaspinwall

Issue generating a JSONB query with @>

I am having an issue with a JSONB query.
This works:

Repo.all from r in Review,
where: fragment(~s(review @> '{"product": {"category": "Fitness"}}'))

SQL generated:

WHERE (review @> '{"product": {"category": "Fitness"}}')

But this doesn’t

Repo.all from r in Review,
where: fragment(~s(review @> '{"product": {"category": ?}}'),"Fitness")

SQL generated

WHERE (review @> '{"product": {"category": 'Fitness'}}')

Notice the single and double quotes between the SQL generated.
How can I cast the value to double nstead of single quotes?

Marked As Solved

jamesaspinwall

jamesaspinwall

I think I solved my issue. I can use the map type itself.

p = %{product: %{category: "Fitness & Yoga"}}
Repo.all from r in Review, 
where: fragment("review @> ? ", ^p)

Beautiful and simple code.

Also Liked

OvermindDL1

OvermindDL1

Actually the problem here is that the ? is being put inside of a value instead of ‘being’ the value itself, and Ecto doesn’t support that. Rather you’d need to do something like build the json out of the query and put it in en-masse, something like:

where: fragment(~s(review @> ?), Jason.to_string_or_whatever!(%{product: %{category: "Fitness"}})

Or so.

jamesaspinwall

jamesaspinwall

This works:

Repo.all from r in Review, 
where: fragment(~s(review @> ?), ~s({"product": {"category": "Fitness & Yoga"}}))

generates:

WHERE (review @> '{"product": {"category": "Fitness & Yoga"}}') []

returns a list of structs

The second:

p = ~s({"product": {"category": "Fitness & Yoga"}})
Repo.all from r in Review, 
where: fragment(~s(review @> ?), ^p)

generates an SQL:

WHERE (review @> $1) ["{\"product\": {\"category\": \"Fitness & Yoga\"}}"]

returns empty list

Your suggestion

p = ~s({"product": {"category": "Fitness & Yoga"}})
Repo.all from r in Review, 
where: fragment(~s(review @> ?::jsonb), ^p)

generates:

WHERE (review @> $1::jsonb) ["{\"product\": {\"category\": \"Fitness & Yoga\"}}"]

returns empty result as the second.

jamesaspinwall

jamesaspinwall

For those interested in the jsonb performance:

debug] QUERY OK source="reviews" db=1.0ms
SELECT r0."id", r0."review" FROM "reviews" AS r0 WHERE (review @> $1 
) [%{product: %{category: "Fitness & Yoga"}}]

The table contains almost 600,000 records.
The typical review looks like:

%Review{
__meta__: #Ecto.Schema.Metadata<:loaded, "reviews">,
id: 398313,
review: %{
  "customer_id" => "A2VK03UD8VHFTT",
  "product" => %{
    "category" => "Fitness & Yoga",
    "group" => "DVD",
    "id" => "B00005T30Y",
    "sales_rank" => 22142,
    "similar_ids" => ["B00004U2MW", "006016848X", "B0007R4T3U",
     "B0002OXVBO"],
    "subcategory" => "General",
    "title" => "Men Are from Mars, Women Are from Venus"
  },
  "review" => %{
    "date" => "1998-09-15",
    "helpful_votes" => 6,
    "rating" => 5,
    "votes" => 6
  }
}
}
OvermindDL1

OvermindDL1

Ah I didn’t know it would accept that there, awesome!

And there are even ways to optimize it further, PostgreSQL is awesome. :slight_smile:

Where Next?

Popular in Questions Top

Tee
can someone please explain to me how Enum.reduce works with maps
New
lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
logicmason
Hi there, I'm working through my first release with elixir/phoenix. I've built a release with distillery and found that it crashes when I...
New
Jim
As a follow up to my earlier question: I have the code compiling and running but not getting a successful login from the rest server. ...
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
chewm
Hi guys, nice to meet you to the whole forum, I’m new here, I’m trying to configure visual studio code for elixir, right now the intellis...
New
hpopp
To simplify some tasks at work, I wrote and published this package yesterday. It’s a simple macro that enables Access behaviour on struct...
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New

Other popular topics Top

Tee
can someone please explain to me how Enum.reduce works with maps
New
New
Jim
As a follow up to my earlier question: I have the code compiling and running but not getting a successful login from the rest server. ...
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
shahryarjb
Hello, I have map which I want to convert it to string like this: the map: %{last_name: "tavakkoli", name: "shahryar"} the string I ne...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
chrisalley
ExUnit now has describe blocks which is a welcome addition coming from RSpec. In the docs, it states that nested hierarchies of describe ...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New

We're in Beta

About us Mission Statement