README.md

# Ectoo

[![Build Status](https://secure.travis-ci.org/henrik/ectoo.svg?branch=master "Build Status")](https://travis-ci.org/henrik/ectoo)

[Ecto](https://github.com/elixir-lang/ecto) is powerful, but a relatively low-level abstraction in some respects. Not all simple things are easy to do.

(This was more true of Ecto 1 than it is of Ecto 2. See examples below.)

This library aims to remedy that by building some convenient abstractions on top of Ecto.

Counting all records with Ecto 1:

``` elixir
require Ecto.Query
MyRepo.one(Ecto.Query.from m in MyModel, select: count(m.id))
```

Counting all records with Ecto 2:

``` elixir
MyRepo.aggregate(MyModel, :count, :id)
```

Counting all records with Ectoo:

``` elixir
MyRepo |> Ectoo.count(MyModel)
```

Ectoo does not aim to replace Ecto. Use Ectoo when you have simple needs, and Ecto for the rest.

If you want a query that is not executed immediately, just skip the repo:

``` elixir
Ectoo.count(MyModel)
```

You can use a more complex query instead of `MyModel`:

``` elixir
query = Ecto.Query.from m in MyModel, where: id > 5
Ectoo.count(query)
```

Ectoo currently includes these functions:

``` elixir
Ectoo.count(MyModel)
Ectoo.max(MyModel, :age)
Ectoo.min(MyModel, :age)
Ectoo.avg(MyModel, :age)
Ectoo.sum(MyModel, :age)
```

Each of these can optionally take a repo as the first argument, to execute the query immediately.


## Installation

Add Ectoo to your list of dependencies in `mix.exs`:

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

Note that if you're using Ecto 1, you need Ectoo 0.0.4. Later versions of Ectoo are only tested against Ecto 2 and so may not work with Ecto 1.

Ensure Ectoo is started before your application:

``` elixir
def application do
  [applications: [
    :ectoo,
  ]]
end
```


## Development

You must have Postgres installed to run the tests. If the Postgres user does not share your username, you can set the `ECTOO_DB_USER` environment variable.

Install the deps:

    mix deps.get

Create the test DB:

    MIX_ENV=test mix test.setup

Run the tests:

    mix test

If you need to drop the test DB and set it up anew, do:

    MIX_ENV=test mix test.reset


## TODO

- [ ] Hex docs
- [ ] Handle composite primary keys?
- [ ] Moar?


## Credits and license

By Henrik Nyh 2015-11-21 under the MIT license.