perry 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,69 +0,0 @@
1
- module Perry::AssociationPreload
2
- module ClassMethods
3
-
4
- def eager_load_associations(original_results, relation)
5
- relation.includes_values.each do |association_id|
6
- association = self.defined_associations[association_id.to_sym]
7
- force_fresh = relation.fresh_value
8
-
9
- unless association
10
- raise(
11
- Perry::AssociationNotFound,
12
- "no such association (#{association_id})"
13
- )
14
- end
15
-
16
- unless association.eager_loadable?
17
- raise(
18
- Perry::AssociationPreloadNotSupported,
19
- "delayed execution options (block options) cannot be used for eager loaded associations"
20
- )
21
- end
22
-
23
- options = association.options
24
-
25
- case association.type
26
- when :has_many, :has_one
27
- fks = original_results.collect { |record| record.send(association.primary_key) }.compact
28
-
29
- pre_records = association.target_klass.where(association.foreign_key => fks).all(:fresh => force_fresh)
30
-
31
- original_results.each do |record|
32
- pk = record.send(association.primary_key)
33
- relevant_records = pre_records.select { |r| r.send(association.foreign_key) == pk }
34
-
35
- relevant_records = if association.collection?
36
- scope = association.scope(record).where(association.foreign_key => pk)
37
- scope.records = relevant_records
38
- scope
39
- else
40
- relevant_records.first
41
- end
42
-
43
- record.send("#{association.id}=", relevant_records)
44
- end
45
-
46
- when :belongs_to
47
- fks = original_results.collect { |record| record.send(association.foreign_key) }.compact
48
-
49
- pre_records = association.target_klass.where(association.primary_key => fks).all(:fresh => force_fresh)
50
-
51
- original_results.each do |record|
52
- fk = record.send(association.foreign_key)
53
- relevant_records = pre_records.select { |r| r.send(association.primary_key) == fk }.first
54
- record.send("#{association.id}=", relevant_records)
55
- end
56
- end
57
- end
58
- end
59
-
60
- end
61
-
62
- module InstanceMethods
63
- end
64
-
65
- def self.included(receiver)
66
- receiver.extend ClassMethods
67
- receiver.send :include, InstanceMethods
68
- end
69
- end
@@ -1,80 +0,0 @@
1
- require 'perry/cacheable/store'
2
- require 'perry/cacheable/entry'
3
- require 'digest/md5'
4
-
5
- module Perry::Cacheable
6
-
7
- module ClassMethods
8
-
9
- # TRP: Default to a 5 minute cache
10
- DEFAULT_LONGEVITY = 5*60
11
- @@cache_store = nil
12
-
13
- def reset_cache_store(default_longevity=DEFAULT_LONGEVITY)
14
- @@cache_store = Perry::Cacheable::Store.new(default_longevity)
15
- end
16
-
17
- def cache_store
18
- @@cache_store
19
- end
20
-
21
- protected
22
-
23
- def fetch_records_with_caching(relation)
24
- options = relation.to_hash
25
- key = Digest::MD5.hexdigest(self.to_s + options.to_a.sort { |a,b| a.to_s.first <=> b.to_s.first }.inspect)
26
- cache_hit = self.cache_store.read(key)
27
- get_fresh = options.delete(:fresh)
28
-
29
- if cache_hit && !get_fresh
30
- self.read_adapter.log(options, "CACHE #{self.name}")
31
- cache_hit.each { |fv| fv.fresh = false.freeze }
32
- cache_hit
33
- else
34
- fresh_value = fetch_records_without_caching(relation)
35
-
36
- # TRP: Only store in cache if record count is below the cache_record_count_threshold (if it is set)
37
- if !self.cache_record_count_threshold || fresh_value.size <= self.cache_record_count_threshold
38
- self.cache_store.write(key, fresh_value, (self.cache_expires) ? fresh_value[0].send(self.cache_expires) : Time.now + DEFAULT_LONGEVITY) unless fresh_value.empty?
39
- fresh_value.each { |fv| fv.fresh = true.freeze }
40
- end
41
-
42
- fresh_value
43
- end
44
- end
45
-
46
- def enable_caching(options)
47
- reset_cache_store unless cache_store
48
- self.cacheable = true
49
- self.cache_expires = options[:expires]
50
- self.cache_record_count_threshold = options[:record_count_threshold]
51
- end
52
-
53
- end
54
-
55
- module InstanceMethods
56
-
57
- def fresh?
58
- @fresh
59
- end
60
-
61
- end
62
-
63
- def self.included(receiver)
64
- receiver.class_inheritable_accessor :cache_expires, :cache_record_count_threshold
65
- receiver.send :attr_accessor, :fresh
66
-
67
- receiver.extend ClassMethods
68
- receiver.send :include, InstanceMethods
69
-
70
- # TRP: Remap calls for RPC through the caching mechanism
71
- receiver.class_eval do
72
- class << self
73
- alias_method :fetch_records_without_caching, :fetch_records
74
- alias_method :fetch_records, :fetch_records_with_caching
75
- end
76
- end
77
-
78
- end
79
-
80
- end