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