README.md

# Simple filters

Simple filters for Ecto from query params.


## Usage

```elixir
def MySchema do
  import SimpleFilters

  schema "myschema" do
    # your fields
  end

  filter_boolean("enabled", [m], m)
  filter_range("age", [m], m)
  filter_string("name", [m], m)
  filter_like("description", [m], m)
  filter_string("foreign", [n: n], n)
  filter_list("color", [m], m)

  def filter_by_params(query, params) do
    # plug the filters where ever you are handling where statements
    # I find it convenient to put them in one function
    query
    |> filter_by_enabled(params)
    |> filter_by_age(params)
    |> filter_by_name(params)
    |> filter_by_description(params)
    |> filter_by_foreign(params)
    |> filter_by_color(params)
  end
end
```

Now you can query `MySchema` like so:

```elixir
 MySchema 
 |> MySchema.filter_by_params(params)
```

Supported queries for boolean filters:

```elixir
%{"field" => "true"|"false"|true|false}
```

Supported queries for range filters:

```elixir
%{"from_field" => 0, "to_field" => 100}


# Strings will be converted to integers,
# or 0 when that can't be done
%{"from_field" => "15", "to_field" => "weird"}

# Works with only one side too:
%{"from_field" => 55}
%{"to_field" => 25}
```

Supported queries for string filters:

```elixir
%{"name" => "some name"}

# Supports != by prefixing !
%{"name" => "!some name"}
```

Supported queries for list filters:

```elixir
%{"color" => "red"}

# To get multiple colors:
%{"color" => ["red", "blue"]}
```

Supported queries for like filters:

```elixir
# Results in an ilike(:description, "%hello world%") where
%{"description" => "hello world"} 

# Supports != by prefixing !
%{"description" => "!hello world"}

# Supports matching only at the end with ^
# i.e. ilike(:description, "hello world%")
%{"description" => "^hello world"}
```