lib/delorean/model.rb in delorean_lang-0.4.6 vs lib/delorean/model.rb in delorean_lang-0.4.7
- old
+ new
@@ -20,8 +20,54 @@
sig = [sig, sig] if sig.is_a? Integer
raise "Bad signature" unless (sig.is_a? Array and sig.length==2)
self.const_set(name.to_s.upcase+Delorean::SIG, sig)
end
end
+
+ # FIXME IDEA: we just make :cache an argument to delorean_fn.
+ # That way, we don't need the cached_ flavors. It'll make all
+ # this code a lot simpler. We should also just add the :private
+ # mechanism here.
+
+ # By default implements a VERY HACKY class-based (per process) caching
+ # mechanism for database lookup results. Issues include: cached
+ # values are ActiveRecord objects. Query results can be very
+ # large lists which we count as one item in the cache. Caching
+ # mechanism will result in large processes.
+ def cached_delorean_fn(name, options = {}, &block)
+ delorean_fn(name, options) do |args|
+ delorean_cache_adapter = ::Delorean::Cache.adapter
+ # Check if caching should be performed
+ next block.call(args) unless delorean_cache_adapter.cache_item?(
+ klass: self, method_name: name, args: args
+ )
+
+ cache_key = delorean_cache_adapter.cache_key(
+ klass: self, method_name: name, args: [args]
+ )
+ cached_item = delorean_cache_adapter.fetch_item(
+ klass: self, cache_key: cache_key
+ )
+
+ next cached_item if cached_item
+
+ res = block.call(args)
+
+ delorean_cache_adapter.cache_item(
+ klass: self, cache_key: cache_key, item: res
+ )
+
+ # Since we're caching this object and don't want anyone
+ # changing it. FIXME: ideally should freeze this object
+ # recursively.
+ res.freeze if res.respond_to?(:freeze)
+
+ res
+ end
+ end
+
+ def clear_lookup_cache!
+ ::Delorean::Cache.adapter.clear!(klass: self)
+ end
end
end
end