module Sequel::Plugins::HybridTableInheritance::DatasetMethods

Public Instance Methods

eager() click to toggle source

Set dataset to use eager loading

# File lib/sequel/plugins/hybrid_table_inheritance.rb, line 404
def eager
  raise Error, "eager loading disabled" if model.cti_subclass_load == :lazy_only
  clone(:eager_load => true)
end
lazy() click to toggle source

Set dataset to use lazy loading

# File lib/sequel/plugins/hybrid_table_inheritance.rb, line 410
def lazy
  raise Error, "lazy loading disabled" if model.cti_subclass_load == :eager_only
  clone(:eager_load => false)
end
single_record() click to toggle source
Calls superclass method
# File lib/sequel/plugins/hybrid_table_inheritance.rb, line 395
def single_record
  post_load_record(super)
end
uses_eager_load?() click to toggle source

Return true if eager loading will be used, false/nil for lazy loading

# File lib/sequel/plugins/hybrid_table_inheritance.rb, line 416
def uses_eager_load?
  return opts[:eager_load] unless opts[:eager_load].nil?
  [:eager, :eager_only].include?(model.cti_subclass_load)
end
with_sql_first(sql) click to toggle source
Calls superclass method
# File lib/sequel/plugins/hybrid_table_inheritance.rb, line 399
def with_sql_first(sql)
  post_load_record(super)
end

Private Instance Methods

post_load(records) click to toggle source
Calls superclass method
# File lib/sequel/plugins/hybrid_table_inheritance.rb, line 436
def post_load(records)
  super
  return unless uses_eager_load?

  subclass_datasets = model.cti_subclass_datasets

  table_key_map = Hash.new
  records.each do |r|
    model = r.model.cti_table_model
    next unless subclass_datasets.key?(model)
    table_key_map[model] = { } unless table_key_map.key?(model)
    table_key_map[model][r.pk] = r
  end

  pkc = model.primary_key
  table_key_map.each do |model, id_map|
    ds = subclass_dataset(model, id_map.keys)
    applied_set = {}
    ds.all do |r|
      pkv = pkc.is_a?(Array) ? pkc.map{|k| r[k]} : r[pkc]
      m = id_map[pkv]
      if applied_set.key?(pkv)
        # Multiple rows for one row in original query
        # insert is O(n) but needed if dataset is ordered.
        # This code path should seldom if ever get used
        records.insert(records.index(m)+1, m = m.dup)
      end
      applied_set[pkv] = true
      m.values.merge!(r)
    end
  end
end
post_load_record(r) click to toggle source
# File lib/sequel/plugins/hybrid_table_inheritance.rb, line 429
def post_load_record(r)
  return r unless r && uses_eager_load?
  ds = subclass_dataset(r.model.cti_table_model, r.pk)
  r.values.merge!(ds.limit(1).first)
  r
end
subclass_dataset(m, keys) click to toggle source
# File lib/sequel/plugins/hybrid_table_inheritance.rb, line 423
def subclass_dataset(m, keys)
  ds = model.cti_subclass_datasets[m]
  ds = ds.filter(m.qualified_primary_key_hash(keys, ds.first_source_alias))
  ds
end