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