A small library to build Ecto query from map

I have just released a small library that help to build query from a map with structure similar to Mongo DB filter like this:

Filtery.apply(Post, %{name: {:like, "elixir"}, is_draft: false, tags: {:has, "ecto"} })

Here is the repo:

It’s quite simple and supports filtering on a single table only.
It supports basic operators eq, :gt, :gte, :in, :lt, :lte, :ne, :nin, :and, :or and some other helpful operators. And you can define your own operators too.

Please try and leave your feedback. Thank you.

Update v0.2.0

I have added a special operator ref to join multiple table

query = Filtery.apply(Post, %{comments: {:ref, %{
                                    approved: true,
                                    content: {:like, "filtery"}
                                 }}})

comments field must be the association name in your Post schema

6 Likes

This is neat. It will work well for simple use cases. Its also good in way that you can build filters progressively as its a map. But its use will be limited as most production use-cases will involve multi-table filtering.

1 Like

Filtery.apply return a query so you can chain as many time as you want like this

Post
|> Filtery.apply(%{title: {:not, {:like, "elixir"}}})
|> Filtery.apply(%{is_draft: false, comment_count: {:gt, 10}})
|> Repo.all()

I have been thinking of a simple specification to define a join filter but there is not good enough solution.
Do you have any suggestion?

1 Like

I have added new operator for querying join table. Please check update above.

2 Likes

That’s very nice!

1 Like

This looks similar to my library QueryBuilder :grin:
It’s possible to have joins.

Possible to make a query out of a keyword list with QueryBuilder.from_list/2.

3 Likes

Thanks for your library, I didn’t know it before. It has lots of cool features.

This module is actually a part of my projects. I have to write lots of code to build query from request parameter so its goal is to help building query conditions. And I want to keep it simple so my colleges can learn to use it quickly.

1 Like

It’s really nice to have ways of building queries using a more data-driven approach. It’s really awesome

3 Likes