module Sequel::Plugins::PreparedStatementsAssociations::InstanceMethods

Private Instance Methods

_load_associated_object(opts, dynamic_opts) click to toggle source

Use a prepared statement if possible to load the associated object, unless a dynamic callback is given.

Calls superclass method
# File lib/sequel/plugins/prepared_statements_associations.rb, line 87
def _load_associated_object(opts, dynamic_opts)
  if !dynamic_opts[:callback] && (bv = association_bound_variables(opts)) && (ps ||= association_prepared_statement(opts, bv))
    ps.call(bv)
  else
    super
  end
end
_load_associated_object_array(opts, dynamic_opts) click to toggle source

Use a prepared statement if possible to load the associated objects, unless a dynamic callback is given.

Calls superclass method
# File lib/sequel/plugins/prepared_statements_associations.rb, line 107
def _load_associated_object_array(opts, dynamic_opts)
  if !dynamic_opts[:callback] && (bv = association_bound_variables(opts)) && (ps ||= association_prepared_statement(opts, bv))
    ps.call(bv)
  else
    super
  end
end
_load_associated_object_via_primary_key(opts) click to toggle source

Use a prepared statement if possible to load the associated object, unless the associated model uses caching.

Calls superclass method
# File lib/sequel/plugins/prepared_statements_associations.rb, line 97
def _load_associated_object_via_primary_key(opts)
  if !opts.associated_class.respond_to?(:cache_get_pk) && (bv = association_bound_variables(opts)) && (ps ||= association_prepared_statement(opts, bv))
    ps.call(bv)
  else
    super
  end
end
association_bound_variable_hash(table, ks, vs) click to toggle source

Return a bound variable hash that maps the keys in ks (qualified by the table) to the values of the results of sending the methods in vs.

# File lib/sequel/plugins/prepared_statements_associations.rb, line 30
def association_bound_variable_hash(table, ks, vs)
  Hash[*ks.zip(vs).map{|k, v| [:"#{table}.#{k}", get_column_value(v)]}.flatten]
end
association_bound_variables(opts) click to toggle source

Given an association reflection, return a bound variable hash for the given association for this instance's values.

# File lib/sequel/plugins/prepared_statements_associations.rb, line 36
def association_bound_variables(opts)
  case opts[:type]
  when :many_to_one
    association_bound_variable_hash(opts.associated_class.table_name, opts.primary_keys, opts[:keys])
  when :one_to_many, :one_to_one
    association_bound_variable_hash(opts.associated_class.table_name, opts[:keys], opts[:primary_keys])
  when :many_to_many, :one_through_one
    association_bound_variable_hash(opts.join_table_alias, opts[:left_keys], opts[:left_primary_keys])
  when :many_through_many, :one_through_many
    association_bound_variable_hash(opts.final_reverse_edge[:alias], Array(opts[:left_key]), opts[:left_primary_keys])
  end
end
association_prepared_statement(opts, assoc_bv) click to toggle source

Given an association reflection, return and cache a prepared statement for this association such that, given appropriate bound variables, the prepared statement will work correctly for any instance. Return false if such a prepared statement cannot be created.

# File lib/sequel/plugins/prepared_statements_associations.rb, line 52
def association_prepared_statement(opts, assoc_bv)
  return unless model.cache_associations
  opts.send(:cached_fetch, :prepared_statement) do
    unless opts[:instance_specific]
      ds, bv = _associated_dataset(opts, {}).unbind

      f = ds.opts[:from]
      if f && f.length == 1
        s = ds.opts[:select]
        if ds.opts[:join]
          if opts.eager_loading_use_associated_key? && s && s.length == 1 && s.first.is_a?(SQL::ColumnAll)
            table = s.first.table
            ds = ds.select(*opts.associated_class.columns.map{|c| Sequel.identifier(c).qualify(table)})
          end
        elsif !s || s.empty?
          ds = ds.select(*opts.associated_class.columns.map{|c| Sequel.identifier(c)})
        end
      end 
  
      if bv.length != assoc_bv.length
        h = {}
        bv.each do |k,v|
          h[k] = v unless assoc_bv.has_key?(k)
        end
        ds = ds.bind(h)
      end
      ps = ds.prepare(opts.returns_array? ? :select : :first, :"smpsap_#{NEXT.call}")
      ps.log_sql = true
      ps
    end
  end
end