Skip to content

Commit e1e9821

Browse files
committed
Delegate callsite signature and columns to updateable result set, making scrooged attributes lighter. Only dup columns set when needed.
1 parent dbf541a commit e1e9821

File tree

4 files changed

+38
-20
lines changed

4 files changed

+38
-20
lines changed

lib/optimizations/columns/attributes_proxy.rb

+26-13
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,12 @@ class ScroogedAttributes < Hash
3131
# Hash container for attributes with scrooge monitoring of attribute access
3232
#
3333

34-
attr_accessor :callsite_signature, :scrooge_columns, :fully_fetched, :klass, :updateable_result_set
34+
attr_accessor :fully_fetched, :klass, :updateable_result_set
3535

36-
def self.setup(record, scrooge_columns, klass, callsite_signature, updateable_result_set)
36+
def self.setup(record, klass, updateable_result_set)
3737
hash = new.replace(record)
38-
hash.scrooge_columns = scrooge_columns.dup
3938
hash.fully_fetched = false
4039
hash.klass = klass
41-
hash.callsite_signature = callsite_signature
4240
hash.updateable_result_set = updateable_result_set
4341
hash
4442
end
@@ -65,7 +63,7 @@ def [](attr_name)
6563
if interesting_for_scrooge?( attr_name )
6664
augment_callsite!( attr_name )
6765
fetch_remaining
68-
@scrooge_columns << attr_name
66+
add_to_scrooge_columns(attr_name)
6967
end
7068
super
7169
end
@@ -76,7 +74,7 @@ def fetch(*args, &block)
7674
end
7775

7876
def []=(attr_name, value)
79-
@scrooge_columns << attr_name
77+
add_to_scrooge_columns(attr_name)
8078
super
8179
end
8280

@@ -110,35 +108,50 @@ def update(hash)
110108

111109
def fetch_remaining
112110
unless @fully_fetched
113-
columns_to_fetch = @klass.column_names - @scrooge_columns.to_a
111+
columns_to_fetch = @klass.column_names - scrooge_columns.to_a
114112
unless columns_to_fetch.empty?
115113
fetch_remaining!( columns_to_fetch )
116114
end
117115
@fully_fetched = true
118116
end
119117
end
120-
118+
119+
def callsite_signature
120+
@updateable_result_set.callsite_signature
121+
end
122+
123+
def scrooge_columns
124+
@scrooge_columns || @updateable_result_set.scrooge_columns
125+
end
126+
121127
protected
122128

123129
def fetch_remaining!( columns_to_fetch )
124130
@updateable_result_set.updaters_attributes = self # for after_initialize & after_find
125131
@updateable_result_set.reload_columns!(columns_to_fetch)
126132
end
127133

128-
def interesting_for_scrooge?( attr_s )
129-
@klass.columns_hash.has_key?(attr_s) && !@scrooge_columns.include?(attr_s)
134+
def interesting_for_scrooge?( attr_name )
135+
@klass.columns_hash.has_key?(attr_name) && !scrooge_columns.include?(attr_name)
136+
end
137+
138+
def augment_callsite!( attr_name )
139+
@klass.scrooge_seen_column!(callsite_signature, attr_name)
130140
end
131141

132-
def augment_callsite!( attr_s )
133-
@klass.scrooge_seen_column!(callsite_signature, attr_s)
142+
def add_to_scrooge_columns(attr_name)
143+
unless frozen?
144+
@scrooge_columns ||= @updateable_result_set.scrooge_columns.dup
145+
@scrooge_columns << attr_name
146+
end
134147
end
135148

136149
def primary_key_name
137150
@klass.primary_key
138151
end
139152

140153
def dup_self
141-
@scrooge_columns = @scrooge_columns.dup
154+
@scrooge_columns = @scrooge_columns.dup if @scrooge_columns
142155
self
143156
end
144157
end

lib/optimizations/columns/macro.rb

+7-5
Original file line numberDiff line numberDiff line change
@@ -75,17 +75,17 @@ def find_by_sql_with_scrooge(sql)
7575
callsite_sig = callsite_signature( caller, callsite_sql( sql ) )
7676
callsite = scrooge_callsite(callsite_sig)
7777
callsite.reset
78+
site_columns = callsite.columns
7879

79-
sql = sql.gsub(scrooge_select_regex, "SELECT #{scrooge_select_sql(callsite.columns)} FROM")
80+
sql = sql.gsub(scrooge_select_regex, "SELECT #{scrooge_select_sql(site_columns)} FROM")
8081

8182
results = connection.select_all(sanitize_sql(sql), "#{name} Load Scrooged")
8283

8384
result_set = ResultSets::ResultArray.new
84-
updateable = ResultSets::UpdateableResultSet.new(result_set, self)
85-
site_columns = callsite.columns
85+
updateable = ResultSets::UpdateableResultSet.new(result_set, self, callsite_sig, site_columns.dup)
8686

8787
results.collect! do |record|
88-
instantiate(ScroogedAttributes.setup(record, site_columns, self, callsite_sig, updateable))
88+
instantiate(ScroogedAttributes.setup(record, self, updateable))
8989
end
9090
result_set.replace(results)
9191

@@ -217,7 +217,9 @@ def scrooge_fetch_remaining
217217
# Dumped objects should not contain object_ids of old result sets
218218
#
219219
def scrooge_invalidate_updateable_result_set
220-
@attributes.updateable_result_set = ResultSets::UpdateableResultSet.new(nil, self) if scrooged?
220+
if scrooged?
221+
@attributes.updateable_result_set = ResultSets::UpdateableResultSet.new(nil, self, callsite_signature, @attributes.scrooge_columns)
222+
end
221223
end
222224

223225
# New objects should get an UnscroogedAttributes as their @attributes hash

lib/optimizations/result_sets/updateable_result_set.rb

+4-1
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,16 @@ class UpdateableResultSet
77
#
88

99
attr_accessor :updaters_attributes
10+
attr_reader :callsite_signature, :scrooge_columns
1011

11-
def initialize(result_set_array, klass)
12+
def initialize(result_set_array, klass, callsite_signature, scrooge_columns)
1213
if result_set_array
1314
@result_set_object_id = result_set_array.object_id
1415
@unique_id = result_set_array.unique_id ||= "#{Time.now.to_f}#{object_id}" # avoid recycled object ids
1516
end
1617
@klass = klass # expected class of items in the array
18+
@callsite_signature = callsite_signature
19+
@scrooge_columns = scrooge_columns
1720
end
1821

1922
# Called by a ScroogedAttributes hash when it is asked for a column

lib/scrooge.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class << self
2727
#
2828
def find_by_sql(sql)
2929
if scope_with_scrooge?(sql)
30-
find_by_sql_with_scrooge(sql)
30+
find_by_sql_without_scrooge(sql)
3131
else
3232
find_by_sql_without_scrooge(sql)
3333
end

0 commit comments

Comments
 (0)