redis-memo 0.0.0.beta.1 → 0.0.0.beta.2
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bfc639839800aa1290622d733d9fd23619de8ccd63f2129e4570eb41a295884b
|
4
|
+
data.tar.gz: 26e2d86776244ba5cb0a8cebbc18e468ccf737888de9990c3a2bb9fc931bd4d5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3c6950a588fbf448d4b88e126ee9b32753ef314225d3aa5f69430d7e386a9a1085b517a08f4f6de2725810f35b493c20e2af62729f547891bcc78aaf4ce73ef2
|
7
|
+
data.tar.gz: 1e380d3ff6d457a6c93dcdebcbf9be072e919b2f5ff25377f169287ed8ac6c379f9a8db29a494d9174cff91e815e680201970ece43baba69b627678b628a3d77
|
@@ -12,25 +12,37 @@ class RedisMemo::Memoizable::Dependency
|
|
12
12
|
@nodes.values
|
13
13
|
end
|
14
14
|
|
15
|
-
def depends_on(
|
16
|
-
|
15
|
+
def depends_on(dependency, **conditions)
|
16
|
+
case dependency
|
17
|
+
when self.class
|
18
|
+
nodes.merge!(dependency.nodes)
|
19
|
+
when RedisMemo::Memoizable
|
20
|
+
memo = dependency
|
21
|
+
return if nodes.include?(memo.cache_key)
|
22
|
+
nodes[memo.cache_key] = memo
|
23
|
+
|
24
|
+
if memo.depends_on
|
25
|
+
# Extract dependencies from the current memoizable and recurse
|
26
|
+
instance_exec(&memo.depends_on)
|
27
|
+
end
|
28
|
+
when UsingActiveRecord
|
17
29
|
[
|
18
|
-
|
19
|
-
RedisMemo::MemoizeQuery.create_memo(
|
30
|
+
dependency.redis_memo_class_memoizable,
|
31
|
+
RedisMemo::MemoizeQuery.create_memo(dependency, **conditions),
|
20
32
|
].each do |memo|
|
21
33
|
nodes[memo.cache_key] = memo
|
22
34
|
end
|
23
|
-
|
24
|
-
|
35
|
+
else
|
36
|
+
raise(
|
37
|
+
RedisMemo::ArgumentError,
|
38
|
+
"Invalid dependency #{dependency}"
|
39
|
+
)
|
25
40
|
end
|
41
|
+
end
|
26
42
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
if memo.depends_on
|
32
|
-
# Extract dependencies from the current memoizable and recurse
|
33
|
-
instance_exec(&memo.depends_on)
|
43
|
+
class UsingActiveRecord
|
44
|
+
def self.===(dependency)
|
45
|
+
RedisMemo::MemoizeQuery.using_active_record?(dependency)
|
34
46
|
end
|
35
47
|
end
|
36
48
|
end
|
@@ -40,6 +40,20 @@ module RedisMemo::MemoizeMethod
|
|
40
40
|
end
|
41
41
|
|
42
42
|
alias_method method_name, method_name_with_memo
|
43
|
+
|
44
|
+
@__redis_memo_method_dependencies ||= Hash.new
|
45
|
+
@__redis_memo_method_dependencies[method_name] = depends_on
|
46
|
+
|
47
|
+
define_method :dependency_of do |method_name, *method_args|
|
48
|
+
method_depends_on = self.class.instance_variable_get(:@__redis_memo_method_dependencies)[method_name]
|
49
|
+
unless method_depends_on
|
50
|
+
raise(
|
51
|
+
RedisMemo::ArgumentError,
|
52
|
+
"#{method_name} is not a memoized method"
|
53
|
+
)
|
54
|
+
end
|
55
|
+
RedisMemo::MemoizeMethod.extract_dependencies(self, *method_args, &method_depends_on)
|
56
|
+
end
|
43
57
|
end
|
44
58
|
|
45
59
|
def self.method_id(ref, method_name)
|
@@ -49,15 +63,19 @@ module RedisMemo::MemoizeMethod
|
|
49
63
|
"#{class_name}#{is_class_method ? '::' : '#'}#{method_name}"
|
50
64
|
end
|
51
65
|
|
66
|
+
def self.extract_dependencies(ref, *method_args, &depends_on)
|
67
|
+
dependency = RedisMemo::Memoizable::Dependency.new
|
68
|
+
|
69
|
+
# Resolve the dependency recursively
|
70
|
+
dependency.instance_exec(ref, *method_args, &depends_on)
|
71
|
+
dependency
|
72
|
+
end
|
73
|
+
|
52
74
|
def self.method_cache_keys(future_contexts)
|
53
75
|
memos = Array.new(future_contexts.size)
|
54
76
|
future_contexts.each_with_index do |(ref, _, method_args, depends_on), i|
|
55
77
|
if depends_on
|
56
|
-
dependency =
|
57
|
-
|
58
|
-
# Resolve the dependency recursively
|
59
|
-
dependency.instance_exec(ref, *method_args, &depends_on)
|
60
|
-
|
78
|
+
dependency = extract_dependencies(ref, *method_args, &depends_on)
|
61
79
|
memos[i] = dependency.memos
|
62
80
|
end
|
63
81
|
end
|
@@ -44,11 +44,15 @@ if defined?(ActiveRecord)
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def self.using_active_record!(model_class)
|
47
|
-
unless
|
47
|
+
unless using_active_record?(model_class)
|
48
48
|
raise RedisMemo::ArgumentError, "'#{model_class.name}' does not use ActiveRecord"
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
+
def self.using_active_record?(model_class)
|
53
|
+
model_class.respond_to?(:<) && model_class < ActiveRecord::Base
|
54
|
+
end
|
55
|
+
|
52
56
|
@@memoized_columns = Hash.new { |h, k| h[k] = [Set.new, Set.new] }
|
53
57
|
|
54
58
|
def self.memoized_columns(model_or_table, editable_only: false)
|
@@ -68,26 +72,23 @@ if defined?(ActiveRecord)
|
|
68
72
|
)
|
69
73
|
end
|
70
74
|
|
71
|
-
extra_props.each do |key,
|
75
|
+
extra_props.each do |key, value|
|
72
76
|
# The data type is ensured by the database, thus we don't need to cast
|
73
77
|
# types here for better performance
|
74
78
|
column_name = key.to_s
|
75
|
-
values = [values] unless values.is_a?(Enumerable)
|
76
79
|
extra_props[key] =
|
77
80
|
if model_class.defined_enums.include?(column_name)
|
78
81
|
enum_mapping = model_class.defined_enums[column_name]
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
(enum_mapping[value.to_s] || value).to_s
|
83
|
-
end
|
82
|
+
# Assume a value is a converted enum if it does not exist in the
|
83
|
+
# enum mapping
|
84
|
+
(enum_mapping[value.to_s] || value).to_s
|
84
85
|
else
|
85
|
-
|
86
|
+
value.to_s
|
86
87
|
end
|
87
88
|
end
|
88
89
|
|
89
90
|
RedisMemo::Memoizable.new(
|
90
|
-
|
91
|
+
__redis_memo_memoize_query_table_name__: model_class.table_name,
|
91
92
|
**extra_props,
|
92
93
|
)
|
93
94
|
end
|
@@ -33,7 +33,7 @@ class RedisMemo::MemoizeQuery::Invalidation
|
|
33
33
|
# Methods that won't trigger model callbacks
|
34
34
|
# https://guides.rubyonrails.org/active_record_callbacks.html#skipping-callbacks
|
35
35
|
%i(
|
36
|
-
import
|
36
|
+
import import!
|
37
37
|
decrement_counter
|
38
38
|
delete_all delete_by
|
39
39
|
increment_counter
|