forest_admin_datasource_customizer 1.19.2 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/forest_admin_datasource_customizer/composite_datasource.rb +2 -0
- data/lib/forest_admin_datasource_customizer/datasource_customizer.rb +1 -1
- data/lib/forest_admin_datasource_customizer/decorators/computed/utils/flattener.rb +8 -2
- data/lib/forest_admin_datasource_customizer/decorators/relation/relation_collection_decorator.rb +23 -17
- data/lib/forest_admin_datasource_customizer/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9ee49b58e6a895d834d1f572efcdd8e1a74f18900e82276216023ef9532616c1
|
|
4
|
+
data.tar.gz: 886e2aaca491fa532ecc05de5aca3a449fcfc46e00d74c23e91e2cf6b27da42a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 26da0e8526c58463aae326d6c5f89fa3b5647094c7d8bf07f86212649619c35efdadf0aa28da189925cbe9544999202962d3c45af160f6707f5907e7a920d1c9
|
|
7
|
+
data.tar.gz: bfd5409cb06f37d77659535231f415b93275140d42e47df5616fe7246f829502a6e4e7bce391167e218af9f7ec2c1de742c33ba90e9e919398745707bc2dcc42
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module ForestAdminDatasourceCustomizer
|
|
2
2
|
class DatasourceCustomizer
|
|
3
3
|
include DSL::DatasourceHelpers
|
|
4
|
-
attr_reader :stack, :
|
|
4
|
+
attr_reader :stack, :composite_datasource
|
|
5
5
|
|
|
6
6
|
def initialize(_db_config = {})
|
|
7
7
|
@composite_datasource = ForestAdminDatasourceCustomizer::CompositeDatasource.new
|
|
@@ -17,16 +17,22 @@ module ForestAdminDatasourceCustomizer
|
|
|
17
17
|
|
|
18
18
|
MARKER_NAME = '__null_marker'.freeze
|
|
19
19
|
def self.with_null_marker(projection)
|
|
20
|
+
seen = Set.new(projection)
|
|
20
21
|
new_projection = Projection.new(projection)
|
|
22
|
+
|
|
21
23
|
projection.each do |path|
|
|
22
24
|
parts = path.split(':')
|
|
23
25
|
|
|
24
26
|
parts.slice(1, parts.size).each_with_index do |_item, index|
|
|
25
|
-
|
|
27
|
+
marker = "#{parts.slice(0, index + 1).join(":")}:#{MARKER_NAME}"
|
|
28
|
+
next if seen.include?(marker)
|
|
29
|
+
|
|
30
|
+
seen << marker
|
|
31
|
+
new_projection << marker
|
|
26
32
|
end
|
|
27
33
|
end
|
|
28
34
|
|
|
29
|
-
new_projection
|
|
35
|
+
new_projection
|
|
30
36
|
end
|
|
31
37
|
|
|
32
38
|
def self.flatten(records, projection)
|
data/lib/forest_admin_datasource_customizer/decorators/relation/relation_collection_decorator.rb
CHANGED
|
@@ -240,31 +240,37 @@ module ForestAdminDatasourceCustomizer
|
|
|
240
240
|
|
|
241
241
|
def re_project_relation_in_place(caller, records, name, projection)
|
|
242
242
|
field_schema = schema[:fields][name]
|
|
243
|
-
|
|
244
243
|
return if field_schema.type == 'PolymorphicManyToOne'
|
|
245
244
|
|
|
246
|
-
association = datasource.get_collection(field_schema.foreign_collection)
|
|
247
|
-
|
|
248
245
|
if !@relations[name]
|
|
246
|
+
association = datasource.get_collection(field_schema.foreign_collection)
|
|
249
247
|
association.re_project_in_place(caller, records.filter_map { |r| r[name] }, projection)
|
|
250
248
|
elsif field_schema.type == 'ManyToOne'
|
|
251
|
-
|
|
252
|
-
sub_filter = Filter.new(condition_tree: ConditionTreeLeaf.new(field_schema.foreign_key_target, 'In', ids))
|
|
253
|
-
sub_records = association.list(caller, sub_filter, projection.union([field_schema.foreign_key_target]))
|
|
254
|
-
|
|
255
|
-
records.each do |record|
|
|
256
|
-
record[name] = sub_records.find { |sr| sr[field_schema.foreign_key_target] == record[field_schema.foreign_key] }
|
|
257
|
-
end
|
|
249
|
+
assign_many_to_one_records(caller, records, name, field_schema, projection)
|
|
258
250
|
elsif ['OneToOne', 'OneToMany'].include?(field_schema.type)
|
|
259
|
-
|
|
260
|
-
sub_filter = Filter.new(condition_tree: ConditionTreeLeaf.new(field_schema.origin_key, 'In', ids))
|
|
261
|
-
sub_records = association.list(caller, sub_filter, projection.union([field_schema.origin_key]))
|
|
262
|
-
|
|
263
|
-
records.each do |record|
|
|
264
|
-
record[name] = sub_records.find { |sr| sr[field_schema.origin_key] == record[field_schema.origin_key_target] }
|
|
265
|
-
end
|
|
251
|
+
assign_to_one_or_many_records(caller, records, name, field_schema, projection)
|
|
266
252
|
end
|
|
267
253
|
end
|
|
254
|
+
|
|
255
|
+
def assign_many_to_one_records(caller, records, name, field_schema, projection)
|
|
256
|
+
association = datasource.get_collection(field_schema.foreign_collection)
|
|
257
|
+
ids = records.each_with_object(Set.new) { |record, set| set << record[field_schema.foreign_key] }.delete(nil).to_a
|
|
258
|
+
sub_filter = Filter.new(condition_tree: ConditionTreeLeaf.new(field_schema.foreign_key_target, 'In', ids))
|
|
259
|
+
sub_records = association.list(caller, sub_filter, projection.union([field_schema.foreign_key_target]))
|
|
260
|
+
sub_records_by_key = sub_records.to_h { |sr| [sr[field_schema.foreign_key_target], sr] }
|
|
261
|
+
|
|
262
|
+
records.each { |record| record[name] = sub_records_by_key[record[field_schema.foreign_key]] }
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
def assign_to_one_or_many_records(caller, records, name, field_schema, projection)
|
|
266
|
+
association = datasource.get_collection(field_schema.foreign_collection)
|
|
267
|
+
ids = records.each_with_object(Set.new) { |record, set| set << record[field_schema.origin_key_target] }.delete(nil).to_a
|
|
268
|
+
sub_filter = Filter.new(condition_tree: ConditionTreeLeaf.new(field_schema.origin_key, 'In', ids))
|
|
269
|
+
sub_records = association.list(caller, sub_filter, projection.union([field_schema.origin_key]))
|
|
270
|
+
sub_records_by_key = sub_records.to_h { |sr| [sr[field_schema.origin_key], sr] }
|
|
271
|
+
|
|
272
|
+
records.each { |record| record[name] = sub_records_by_key[record[field_schema.origin_key_target]] }
|
|
273
|
+
end
|
|
268
274
|
end
|
|
269
275
|
end
|
|
270
276
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: forest_admin_datasource_customizer
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.20.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Matthieu
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: exe
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2026-01-
|
|
12
|
+
date: 2026-01-07 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: activesupport
|