:speedboat: Better streaming for Ecto.
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)
bourne
to your list of dependencies in mix.exs
:def deps do
[{:bourne, "~> 1.0"}]
end
mix do deps.get bourne, deps.compile
Drink your :tea:
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
.