Skip to content

Bullet throws "avoid eager loading" when using AssociationLoader  #107

@gopeter

Description

@gopeter

I don't know if this is a bug or just a dumb question, but let me explain it 😄

Starting with this simple type:

class Types::ProjectType < Types::BaseNode
  graphql_name 'Project'

  field :title, String, null: false
  field :milestones, Types::MilestoneType.connection_type, null: false

  def milestones
    object.milestones
  end
end

And running this query:

query {
  projects(perPage: 10) {
    edges {
      node {
        title
        milestones {
          edges {
            node {
              title
            }
          }
        }
      }
    }
  }
}

Returns the desired result, but leads to this:

  Milestone Load (0.9ms)  SELECT milestones.*, milestones.id AS cursor_0 FROM "milestones" WHERE "milestones"."project_id" = $1 ORDER BY milestones.id asc  [["project_id", 1]]
  Milestone Load (0.5ms)  SELECT milestones.*, milestones.id AS cursor_0 FROM "milestones" WHERE "milestones"."project_id" = $1 ORDER BY milestones.id asc  [["project_id", 2]]
  Milestone Load (0.7ms)  SELECT milestones.*, milestones.id AS cursor_0 FROM "milestones" WHERE "milestones"."project_id" = $1 ORDER BY milestones.id asc  [["project_id", 3]]
  Milestone Load (0.6ms)  SELECT milestones.*, milestones.id AS cursor_0 FROM "milestones" WHERE "milestones"."project_id" = $1 ORDER BY milestones.id asc  [["project_id", 4]]
  Milestone Load (0.6ms)  SELECT milestones.*, milestones.id AS cursor_0 FROM "milestones" WHERE "milestones"."project_id" = $1 ORDER BY milestones.id asc  [["project_id", 5]]
  Milestone Load (0.7ms)  SELECT milestones.*, milestones.id AS cursor_0 FROM "milestones" WHERE "milestones"."project_id" = $1 ORDER BY milestones.id asc  [["project_id", 6]]
  Milestone Load (0.5ms)  SELECT milestones.*, milestones.id AS cursor_0 FROM "milestones" WHERE "milestones"."project_id" = $1 ORDER BY milestones.id asc  [["project_id", 7]]
  Milestone Load (0.5ms)  SELECT milestones.*, milestones.id AS cursor_0 FROM "milestones" WHERE "milestones"."project_id" = $1 ORDER BY milestones.id asc  [["project_id", 8]]
  Milestone Load (0.8ms)  SELECT milestones.*, milestones.id AS cursor_0 FROM "milestones" WHERE "milestones"."project_id" = $1 ORDER BY milestones.id asc  [["project_id", 9]]
  Milestone Load (0.8ms)  SELECT milestones.*, milestones.id AS cursor_0 FROM "milestones" WHERE "milestones"."project_id" = $1 ORDER BY milestones.id asc  [["project_id", 10]]

So I thought it would be good to use the AssociationLoader to eager load the milestones using this:

def milestones
  Loaders::AssociationLoader.for(Project, :milestones).load(object)
end

But this ends up in this:

  Milestone Load (0.7ms)  SELECT "milestones".* FROM "milestones" WHERE "milestones"."project_id" IN ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)  [["project_id", 1], ["project_id", 2], ["project_id", 3], ["project_id", 4], ["project_id", 5], ["project_id", 6], ["project_id", 7], ["project_id", 8], ["project_id", 9], ["project_id", 10]]
  Milestone Load (0.5ms)  SELECT milestones.*, milestones.id AS cursor_0 FROM "milestones" WHERE "milestones"."project_id" = $1 ORDER BY milestones.id asc  [["project_id", 1]]
  Milestone Load (0.5ms)  SELECT milestones.*, milestones.id AS cursor_0 FROM "milestones" WHERE "milestones"."project_id" = $1 ORDER BY milestones.id asc  [["project_id", 2]]
  Milestone Load (0.4ms)  SELECT milestones.*, milestones.id AS cursor_0 FROM "milestones" WHERE "milestones"."project_id" = $1 ORDER BY milestones.id asc  [["project_id", 3]]
  Milestone Load (0.7ms)  SELECT milestones.*, milestones.id AS cursor_0 FROM "milestones" WHERE "milestones"."project_id" = $1 ORDER BY milestones.id asc  [["project_id", 4]]
  Milestone Load (0.5ms)  SELECT milestones.*, milestones.id AS cursor_0 FROM "milestones" WHERE "milestones"."project_id" = $1 ORDER BY milestones.id asc  [["project_id", 5]]
  Milestone Load (0.5ms)  SELECT milestones.*, milestones.id AS cursor_0 FROM "milestones" WHERE "milestones"."project_id" = $1 ORDER BY milestones.id asc  [["project_id", 6]]
  Milestone Load (1.0ms)  SELECT milestones.*, milestones.id AS cursor_0 FROM "milestones" WHERE "milestones"."project_id" = $1 ORDER BY milestones.id asc  [["project_id", 7]]
  Milestone Load (0.5ms)  SELECT milestones.*, milestones.id AS cursor_0 FROM "milestones" WHERE "milestones"."project_id" = $1 ORDER BY milestones.id asc  [["project_id", 8]]
  Milestone Load (0.5ms)  SELECT milestones.*, milestones.id AS cursor_0 FROM "milestones" WHERE "milestones"."project_id" = $1 ORDER BY milestones.id asc  [["project_id", 9]]
  Milestone Load (0.6ms)  SELECT milestones.*, milestones.id AS cursor_0 FROM "milestones" WHERE "milestones"."project_id" = $1 ORDER BY milestones.id asc  [["project_id", 10]]
Completed 200 OK in 497ms (Views: 0.4ms | ActiveRecord: 34.6ms)


user: peter_goebel
POST /graphql
AVOID eager loading detected
  Project => [:milestones]
  Remove from your finder: :includes => [:milestones]
Call stack

Why are all milestones still queried individually even with eager loading/preloading?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions