@@ -7,70 +7,77 @@ class RelationReader < ::Module
7
7
extend ::Dry ::Core ::ClassAttributes
8
8
9
9
# @api private
10
- attr_reader :klass
11
-
12
- # @api private
13
- attr_reader :relations
14
-
15
10
defines :relation_readers
16
11
17
- defines :mutex
18
- mutex ( Mutex . new )
19
-
20
- defines :relation_cache
21
- relation_cache ( Concurrent ::Hash . new )
22
-
23
12
module InstanceMethods
24
13
# @api private
25
- def set_relation ( name ) # rubocop:disable Naming/AccessorMethodName
14
+ def prepare_relation ( name )
26
15
container
27
16
. relations [ name ]
28
- . with ( auto_struct : auto_struct , struct_namespace : struct_namespace )
17
+ . with (
18
+ auto_struct : auto_struct ,
19
+ struct_namespace : struct_namespace
20
+ )
29
21
end
30
22
23
+ # @api private
31
24
def relation_reader ( name , relation_cache )
32
25
key = [ name , auto_struct , struct_namespace ]
33
- relation_cache [ key ] ||= set_relation ( name )
26
+ relation_cache [ key ] ||= prepare_relation ( name )
34
27
end
35
28
end
36
29
37
30
# @api private
38
- def mutex
39
- ROM :: Repository :: RelationReader . mutex
40
- end
31
+ class Readers < :: Module
32
+ # @api private
33
+ attr_reader :cache
41
34
42
- # @api private
43
- def initialize ( klass , relations )
44
- super ( )
45
- @relations = relations
46
- mutex . synchronize do
47
- unless self . class . relation_readers
48
- self . class . relation_readers (
49
- build_relation_readers ( relations , self . class . relation_cache )
50
- )
35
+ def initialize ( relations )
36
+ super ( )
37
+ cache = ::Concurrent ::Hash . new
38
+
39
+ relations . each do |name |
40
+ define_readers_for_relation ( name , cache )
41
+ end
42
+ end
43
+
44
+ # @api private
45
+ def define_readers_for_relation ( name , cache )
46
+ define_method ( name ) do
47
+ relation_reader ( name , cache )
51
48
end
52
49
end
53
- klass . include self . class . relation_readers
54
50
end
55
51
56
52
# @api private
57
- def included ( klass )
58
- super
59
- klass . include ( InstanceMethods )
60
- end
53
+ def initialize ( relations :, lock :)
54
+ super ( )
61
55
62
- private
56
+ include relation_readers ( relations :, lock :)
57
+ end
63
58
64
59
# @api private
65
- def build_relation_readers ( relations , relation_cache )
66
- Module . new do
67
- relations . each do |name |
68
- define_method ( name ) do
69
- relation_reader ( name , relation_cache )
60
+ def relation_readers ( relations :, lock :)
61
+ existing = self . class . relation_readers
62
+
63
+ if existing . nil?
64
+ lock . synchronize do
65
+ unless self . class . relation_readers
66
+ self . class . relation_readers Readers . new ( relations )
70
67
end
71
68
end
69
+
70
+ self . class . relation_readers
71
+ else
72
+ existing
72
73
end
73
74
end
75
+
76
+ # @api private
77
+ def included ( klass )
78
+ super
79
+ klass . include ( InstanceMethods )
80
+ end
74
81
end
75
82
end
76
83
end
0 commit comments