Bourne provides more powerful streaming mechanisms than those offered by Ecto or Tributary. Notably, it provides both cursor and keyset pagination methods, as well as the ability to create a GenStage
producer with similar semantics to GenStage.from_enumerable
.
defmodule My.Repo do
use Ecto.Repo, otp_app: :mine
use Bourne
end
import Ecto.Query
q = from(actor in Actor, where: actor.born <= 1980)
# You can stream through an `Enumerable`:
My.Repo.stream(q) |> Stream.each(&IO.inspect) |> Stream.run
# Alternatively, you can stream through a GenStage producer:
defmodule InspectorConsumer do
use GenStage
def start_link do
GenStage.start_link(InspectorConsumer, [])
end
def init([]) do
{:consumer, :ok}
end
def handle_events(rows, _from, state) do
Enum.each(rows, &IO.inspect/1)
{:noreply, [], state}
end
end
method = Enum.take_random(~W{cursor keyset}a, 1)
{:ok, producer} = My.Repo.streamer(q, method: method)
{:ok, consumer} = InspectorConsumer.start_link
GenStage.sync_subscribe(consumer, to: producer)
- Add
bourne
to your list of dependencies inmix.exs
:
def deps do
[{:bourne, "~> 1.0"}]
end
- Fetch and compile your new dependency:
mix do deps.get bourne, deps.compile
-
Drink your 🍵
-
That's it!
Refer to the documentation.
Bourne is free and unencumbered software released into the public domain, with fallback provisions for jurisdictions that don't recognize the public domain.
For details, see LICENSE.md
.