module Sequel::Plugins::EagerGraphEager

  1. lib/sequel/plugins/eager_graph_eager.rb

The eager_graph_eager plugin allows for chaining eager loads after eager_graph loads. Given the following model associations:

Band.one_to_many :albums
Album.one_to_many :tracks

Let's say you wanted to return bands ordered by album name, and eagerly load those albums, you can do that using:

Band.eager_graph(:albums).order{albums[:name]}

Let's say you also wanted to eagerly load the tracks for each album. You could just add them to the eager_graph call:

Band.eager_graph(albums: :tracks).order{albums[:name]}

However, the bloats the result set, and you aren't ordering by the track information, so a join is not required. The eager_graph_eager plugin allows you to specify that the tracks be eagerly loaded in a separate query after the eager_graph load of albums:

Band.eager_graph(:albums).eager_graph_eager([:albums], :tracks).order{albums[:name]}

Dataset#eager_graph_eager's first argument is a dependency chain, specified as an array of symbols. This specifies the point at which to perform the eager load. The remaining arguments are arguments that could be passed to Dataset#eager to specify what dependent associations should be loaded at that point.

If you also have the following model association:

Track.one_to_many :lyrics

Here's some different ways of performing eager loading:

# 4 Queries: bands, albums, tracks, lyrics
Band.eager(albums: {tracks: :lyrics})

# 1 Query: bands+albums+tracks+lyrics
Band.eager_graph(albums: {tracks: :lyrics})

# 3 Queries: bands+albums, tracks, lyrics
Band.eager_graph(:albums).eager_graph_eager([:albums], tracks: :lyrics)

# 2 Queries: bands+albums+tracks, lyrics
Band.eager_graph(albums: :tracks).eager_graph_eager([:albums, :tracks], :lyrics)

# 2 Queries: bands+albums, tracks+lyrics
Band.eager_graph(:albums).eager_graph_eager([:albums], tracks: proc{|ds| ds.eager_graph(:lyrics)})

Usage:

# Support eager_graph_eager in all subclass datasets (called before loading subclasses)
Sequel::Model.plugin :eager_graph_eager

# Support eager_graph_eager in Album class datasets
Album.plugin :eager_graph_eager