Module: Pluckr

Defined in:
lib/pluckr.rb,
lib/pluckr/batch.rb,
lib/pluckr/query.rb,
lib/pluckr/errors.rb,
lib/pluckr/aliases.rb,
lib/pluckr/version.rb,
lib/pluckr/relation.rb,
lib/pluckr/schema/one.rb,
lib/pluckr/schema/node.rb,
lib/pluckr/compiler/sql.rb,
lib/pluckr/schema/field.rb,
lib/pluckr/schema/scope.rb,
lib/pluckr/result/object.rb,
lib/pluckr/schema/exists.rb,
lib/pluckr/result/builder.rb,
lib/pluckr/schema/aggregate.rb,
lib/pluckr/schema/conditions.rb,
lib/pluckr/schema/definition.rb,
lib/pluckr/reflection/association.rb

Overview

A declarative read-query layer for ActiveRecord.

DSL -> schema AST -> reflection -> SQL compiler -> flat row -> result object

Defined Under Namespace

Modules: Aliases, Compiler, Reflection, Result, Schema Classes: Batch, ConfigurationError, Error, InvalidAssociation, MissingSource, Query, Relation, UnknownAssociation, UnknownField, UnsupportedAssociation

Constant Summary collapse

VERSION =
"0.1.0"

Class Method Summary collapse

Class Method Details

.batch(&block) ⇒ Object

See Also:



213
214
215
# File 'lib/pluckr/batch.rb', line 213

def self.batch(&block)
  Batch.build(&block).fetch
end

.select_all(connection, sql, name:, label: "#{name} Pluckr") ⇒ Object

Every read of a read model goes through here, so one subscription covers fetch, find, for and Pluckr.batch alike. The statements Pluckr does not compile are absent by design: count/exists? and the primary keys of a paginated .for are ActiveRecord's own, and arrive as sql.active_record.

ActiveSupport::Notifications.subscribe("fetch.pluckr") do |*, payload|
payload[:name]  # => "UserSummary"
payload[:sql]   # => "SELECT ..."
payload[:rows]  # => 100
end


40
41
42
43
44
# File 'lib/pluckr.rb', line 40

def self.select_all(connection, sql, name:, label: "#{name} Pluckr")
  ActiveSupport::Notifications.instrument("fetch.pluckr", name: name, sql: sql) do |payload|
    connection.select_all(sql, label).tap { |result| payload[:rows] = result.length }
  end
end