Class: ReactiveRecord::ServerDataCache::CacheItem
- Defined in:
- lib/reactive_record/server_data_cache.rb
Instance Attribute Summary collapse
-
#absolute_vector ⇒ Object
readonly
Returns the value of attribute absolute_vector.
-
#acting_user ⇒ Object
readonly
Returns the value of attribute acting_user.
-
#record_chain ⇒ Object
readonly
Returns the value of attribute record_chain.
-
#root ⇒ Object
readonly
Returns the value of attribute root.
-
#vector ⇒ Object
readonly
Returns the value of attribute vector.
Class Method Summary collapse
Instance Method Summary collapse
- #aggregation?(method) ⇒ Boolean
- #apply_method(method) ⇒ Object
- #apply_method_to_cache(method) ⇒ Object
- #apply_star ⇒ Object
- #as_hash(children = nil) ⇒ Object
- #build_new_cache_item(new_ar_object, method, absolute_method) ⇒ Object
-
#initialize(db_cache, acting_user, klass, preloaded_records) ⇒ CacheItem
constructor
A new instance of CacheItem.
- #jsonize(method) ⇒ Object
- #method ⇒ Object
- #value ⇒ Object
Constructor Details
#initialize(db_cache, acting_user, klass, preloaded_records) ⇒ CacheItem
Returns a new instance of CacheItem.
159 160 161 162 163 164 165 166 167 168 169 170 |
# File 'lib/reactive_record/server_data_cache.rb', line 159 def initialize(db_cache, acting_user, klass, preloaded_records) klass = klass.constantize @db_cache = db_cache @acting_user = acting_user @vector = @absolute_vector = [klass] @ar_object = klass @record_chain = [] @parent = nil @root = self @preloaded_records = preloaded_records db_cache << self end |
Instance Attribute Details
#absolute_vector ⇒ Object (readonly)
Returns the value of attribute absolute_vector.
138 139 140 |
# File 'lib/reactive_record/server_data_cache.rb', line 138 def absolute_vector @absolute_vector end |
#acting_user ⇒ Object (readonly)
Returns the value of attribute acting_user.
141 142 143 |
# File 'lib/reactive_record/server_data_cache.rb', line 141 def acting_user @acting_user end |
#record_chain ⇒ Object (readonly)
Returns the value of attribute record_chain.
139 140 141 |
# File 'lib/reactive_record/server_data_cache.rb', line 139 def record_chain @record_chain end |
#root ⇒ Object (readonly)
Returns the value of attribute root.
140 141 142 |
# File 'lib/reactive_record/server_data_cache.rb', line 140 def root @root end |
#vector ⇒ Object (readonly)
Returns the value of attribute vector.
137 138 139 |
# File 'lib/reactive_record/server_data_cache.rb', line 137 def vector @vector end |
Class Method Details
.new(db_cache, acting_user, klass, preloaded_records) ⇒ Object
151 152 153 154 155 156 157 |
# File 'lib/reactive_record/server_data_cache.rb', line 151 def self.new(db_cache, acting_user, klass, preloaded_records) klass_constant = klass.constantize if existing = db_cache.detect { |cached_item| cached_item.vector == [klass_constant] } return existing end super end |
Instance Method Details
#aggregation?(method) ⇒ Boolean
206 207 208 209 210 211 212 213 |
# File 'lib/reactive_record/server_data_cache.rb', line 206 def aggregation?(method) if method.is_a?(String) && value.class.respond_to?(:reflect_on_aggregation) aggregation = value.class.reflect_on_aggregation(method.to_sym) if aggregation && !(aggregation.klass < ActiveRecord::Base) && value.send(method) aggregation end end end |
#apply_method(method) ⇒ Object
244 245 246 247 248 249 250 251 252 |
# File 'lib/reactive_record/server_data_cache.rb', line 244 def apply_method(method) if method.is_a? Array and method.first == "find_by_id" method[0] = "find" elsif method.is_a? String and method =~ /^\*[0-9]+$/ method = "*" end new_vector = vector + [method] @db_cache.detect { |cached_item| cached_item.vector == new_vector} || apply_method_to_cache(method) end |
#apply_method_to_cache(method) ⇒ Object
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 |
# File 'lib/reactive_record/server_data_cache.rb', line 172 def apply_method_to_cache(method) @db_cache.inject(nil) do | representative, cache_item | if cache_item.vector == vector if @ar_object.class < ActiveRecord::Base and @ar_object.attributes.has_key?(method) @ar_object.(acting_user, :view_permitted?, method) end if method == "*" cache_item.apply_star || representative elsif method == "*all" cache_item.build_new_cache_item(cache_item.value.collect { |record| record.id }, method, method) elsif method == "*count" cache_item.build_new_cache_item(cache_item.value.count, method, method) elsif preloaded_value = @preloaded_records[cache_item.absolute_vector + [method]] cache_item.build_new_cache_item(preloaded_value, method, method) elsif aggregation = cache_item.aggregation?(method) cache_item.build_new_cache_item(aggregation.mapping.collect { |attribute, accessor| cache_item.value[attribute] }, method, method) else begin cache_item.build_new_cache_item(cache_item.value.send(*method), method, method) rescue Exception => e if cache_item.value and cache_item.value != [] ReactiveRecord::Pry::rescued(e) raise e, "ReactiveRecord exception caught when applying #{method} to db object #{cache_item.value}: #{e}", e.backtrace else representative end end end else representative end end end |
#apply_star ⇒ Object
215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 |
# File 'lib/reactive_record/server_data_cache.rb', line 215 def apply_star if value && value.length > 0 i = -1 value.inject(nil) do | representative, ar_object | i += 1 if preloaded_value = @preloaded_records[absolute_vector + ["*#{i}"]] build_new_cache_item(preloaded_value, "*", "*#{i}") else build_new_cache_item(ar_object, "*", "*#{i}") end end else build_new_cache_item([], "*", "*") end end |
#as_hash(children = nil) ⇒ Object
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 |
# File 'lib/reactive_record/server_data_cache.rb', line 261 def as_hash(children = nil) unless children return {} if @ar_object.is_a?(Class) and (@ar_object < ActiveRecord::Base) children = [@ar_object.is_a?(BigDecimal) ? @ar_object.to_f : @ar_object] end if @parent if method == "*" if @ar_object.is_a? Array # this happens when a scope is empty there is test case, but @parent.as_hash({}) # does it work for all edge cases? else @parent.as_hash({@ar_object.id => children}) end elsif @ar_object.class < ActiveRecord::Base and children.is_a? Hash @parent.as_hash({jsonize(method) => children.merge({ :id => (method.is_a?(Array) && method.first == "new") ? [nil] : [@ar_object.id], @ar_object.class.inheritance_column => [@ar_object[@ar_object.class.inheritance_column]], })}) elsif method == "*all" @parent.as_hash({jsonize(method) => children.first}) else @parent.as_hash({jsonize(method) => children}) end else {method.name => children} end end |
#build_new_cache_item(new_ar_object, method, absolute_method) ⇒ Object
231 232 233 234 235 236 237 238 239 240 241 242 |
# File 'lib/reactive_record/server_data_cache.rb', line 231 def build_new_cache_item(new_ar_object, method, absolute_method) new_parent = self self.clone.instance_eval do @vector = @vector + [method] # don't push it on since you need a new vector! @absolute_vector = @absolute_vector + [absolute_method] @ar_object = new_ar_object @db_cache << self @parent = new_parent @root = new_parent.root self end end |
#jsonize(method) ⇒ Object
254 255 256 257 258 259 |
# File 'lib/reactive_record/server_data_cache.rb', line 254 def jsonize(method) # sadly standard json converts {[:foo, nil] => 123} to {"['foo', nil]": 123} # luckily [:foo, nil] does convert correctly # so we check the methods and force proper conversion method.is_a?(Array) ? method.to_json : method end |
#method ⇒ Object
147 148 149 |
# File 'lib/reactive_record/server_data_cache.rb', line 147 def method vector.last end |
#value ⇒ Object
143 144 145 |
# File 'lib/reactive_record/server_data_cache.rb', line 143 def value @ar_object end |