forest_admin_datasource_customizer 1.19.2 → 1.19.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f43fa61b5aaac9ad0976882fc55385429a8f0eee4b9df3160005fe277721a50b
4
- data.tar.gz: 1f239c9af95d7b504151e5ef4eb2a36159e46e5e9355b62a7971c373a1450ccd
3
+ metadata.gz: e85433ad43ff5fea2fef19a0ee2e0466c1840f32b6730199c440097e02a40c1b
4
+ data.tar.gz: 2126dcae42daf440a3bf80177706673a02e362ec144dd3fb7e7ed01795af12de
5
5
  SHA512:
6
- metadata.gz: e489bb7ef6d7c5ca2cfa934a6a7ac6b1bcfe57f5b1b700b4a6f1616889afcf6bd4226cfe21d7ad1a3f4478e44a6385636bf85b681667c1edc47a08c425c3cb77
7
- data.tar.gz: 3b931f864f32c42cbf44b60e6540b87e08051b0e7e24c98edc955533b0477c16944aab7fc03d742c9ad0f788ce8c591b72a22f6fbe6af1410d0bfe058cf6160a
6
+ metadata.gz: 1670e87d7814a2470c2be888767fee6f7aed9101d90d10ef690d753cfda4e655fe62a415f9b0dd3ee6bc916eca400502d7929b4997b3a24fab337de096dabba1
7
+ data.tar.gz: 1deba10f8312f1f2cad3ec54c96cf1cf2c986ba2e8f524b048c137abef8eb3d9f72ccc545c0d46030209b688d2abd3122678fa9e8de6405c4e718bccbe26de52
@@ -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
- new_projection << "#{parts.slice(0, index + 1).join(":")}:#{MARKER_NAME}"
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.uniq
35
+ new_projection
30
36
  end
31
37
 
32
38
  def self.flatten(records, projection)
@@ -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
- ids = records.filter_map { |record| record[field_schema.foreign_key] }.uniq
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
- ids = records.filter_map { |record| record[field_schema.origin_key_target] }.uniq
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
@@ -1,3 +1,3 @@
1
1
  module ForestAdminDatasourceCustomizer
2
- VERSION = "1.19.2"
2
+ VERSION = "1.19.3"
3
3
  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.19.2
4
+ version: 1.19.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthieu