README.md

# EctoFlex

EctoFlex is a flexible way to query schemas.

It's in very early development and is not yet ready for production use,
missing a lot of features that will be added hopefully fairly quickly.

PRs are welcome.

## Installation

Please note that `v0.2.0` contains breaking changes

```elixir
def deps do
  [
    {:ecto_flex, "~> 0.2.0"}
  ]
end
```

## Usage

Assuming you have an Employee schema, get all employees whose last names is "Example" aged between 40 and 42, married, and their description contains the term "motivated".

```elixir
alias EctoFlex.FlexQuery

conditions = %{
  "name" => %{"last_name" => "Example"},
  "age" => %{"is" => [40, 41, 42]},
  "married" => %{"is" => true},
  "description" => %{"contains" => "motivated"}
}

# this returns an %Ecto.Query{}
FlexQuery.filter(Employee, conditions)
```

### Associations

Get all young employees who work in HR and Marketing.

```elixir
conditions = %{
  "age" => %{"is" => [20, 21, 22, 23, 24]},
  "@department" => %{
    "name" => %{"is" => ["HR", "Marketing"]}
  },
  "married" => %{"is" => true}
}

FlexQuery.filter(Employee, conditions)
```

### Simple pagination

Get the 2nd page of employees whose salary is higher than $40,000, ordered descendingly by salary.

```elixir
conditions = %{
  "flex" => %{"page" => 2, "per_page" => 50, "order" => "-salary"}
  "salary" => %{"greater_than" => 40_000}
}

FlexQuery.filter(Employee, conditions)
```