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