From ee2e807666eef7c416a60b62d6ccbe6416439abd Mon Sep 17 00:00:00 2001 From: Matt Date: Fri, 18 Jul 2025 15:00:07 +0200 Subject: [PATCH 1/3] fix: compute include, handle through assocations & smart_fields --- app/services/forest_liana/base_getter.rb | 3 +-- app/services/forest_liana/has_many_getter.rb | 2 -- app/services/forest_liana/resources_getter.rb | 21 +++++++++++-------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/services/forest_liana/base_getter.rb b/app/services/forest_liana/base_getter.rb index 52e02530..b72023f7 100644 --- a/app/services/forest_liana/base_getter.rb +++ b/app/services/forest_liana/base_getter.rb @@ -19,12 +19,11 @@ def includes_for_serialization def compute_includes @includes = ForestLiana::QueryHelper.get_one_association_names_symbol(@resource) - @optional_includes = [] end def optimize_record_loading(resource, records, force_preload = true) polymorphic, preload_loads = analyze_associations(resource) - result = records.eager_load(@includes.uniq - preload_loads - polymorphic - @optional_includes) + result = records.eager_load(@includes.uniq - preload_loads - polymorphic) result = result.preload(preload_loads) if Rails::VERSION::MAJOR >= 7 && force_preload diff --git a/app/services/forest_liana/has_many_getter.rb b/app/services/forest_liana/has_many_getter.rb index bc189dcf..849bc962 100644 --- a/app/services/forest_liana/has_many_getter.rb +++ b/app/services/forest_liana/has_many_getter.rb @@ -37,8 +37,6 @@ def records private def compute_includes - @optional_includes = [] - @includes = @association.klass .reflect_on_all_associations .select do |association| diff --git a/app/services/forest_liana/resources_getter.rb b/app/services/forest_liana/resources_getter.rb index d39183de..e0f74a32 100644 --- a/app/services/forest_liana/resources_getter.rb +++ b/app/services/forest_liana/resources_getter.rb @@ -31,7 +31,7 @@ def self.get_ids_from_request(params, user) def perform polymorphic_association, preload_loads = analyze_associations(@resource) - includes = @includes.uniq - polymorphic_association - preload_loads - @optional_includes + includes = @includes.uniq - polymorphic_association - preload_loads has_smart_fields = Array(@params.dig(:fields, @collection_name)&.split(',')).any? do |field| ForestLiana::SchemaHelper.is_smart_field?(@resource, field) end @@ -137,19 +137,22 @@ def columns_for_cross_database_association(association_name) def compute_includes associations_has_one = ForestLiana::QueryHelper.get_one_associations(@resource) - - @optional_includes = [] + includes = [] if @field_names_requested && @params['searchExtended'].to_i != 1 - includes = associations_has_one.map do |association| + associations_has_one.map do |association| association_name = association.name.to_s fields = @params[:fields]&.[](association_name)&.split(',') - if fields&.size == 1 && fields.include?(association.klass.primary_key) - @field_names_requested << association.foreign_key - @optional_includes << association.name + + has_smart_fields = Array(@params.dig(:fields, @collection_name)&.split(',')).any? do |field| + ForestLiana::SchemaHelper.is_smart_field?(@resource, field) end - association.name + if fields&.size == 1 && fields.include?(association.klass.primary_key) || has_smart_fields + @field_names_requested << association.foreign_key if association.foreign_key.present? + includes << association.options[:through] if association.options[:through].present? + includes << association.name + end end includes_for_smart_search = [] @@ -165,7 +168,7 @@ def compute_includes includes_for_smart_search = includes_for_smart_search & includes_has_many end - @includes = (includes & @field_names_requested).concat(includes_for_smart_search) + @includes = includes.concat(includes_for_smart_search).uniq else @includes = associations_has_one # Avoid eager loading has_one associations pointing to a different database as ORM can't join cross databases From f213b9e9ebd15656a2a9d924f227f44e763fd333 Mon Sep 17 00:00:00 2001 From: Matt Date: Fri, 18 Jul 2025 15:20:16 +0200 Subject: [PATCH 2/3] refactor: check smart fields on compute method --- app/services/forest_liana/resources_getter.rb | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/services/forest_liana/resources_getter.rb b/app/services/forest_liana/resources_getter.rb index e0f74a32..631e87b0 100644 --- a/app/services/forest_liana/resources_getter.rb +++ b/app/services/forest_liana/resources_getter.rb @@ -139,15 +139,14 @@ def compute_includes associations_has_one = ForestLiana::QueryHelper.get_one_associations(@resource) includes = [] if @field_names_requested && @params['searchExtended'].to_i != 1 + has_smart_fields = Array(@params.dig(:fields, @collection_name)&.split(',')).any? do |field| + ForestLiana::SchemaHelper.is_smart_field?(@resource, field) + end + associations_has_one.map do |association| association_name = association.name.to_s - fields = @params[:fields]&.[](association_name)&.split(',') - has_smart_fields = Array(@params.dig(:fields, @collection_name)&.split(',')).any? do |field| - ForestLiana::SchemaHelper.is_smart_field?(@resource, field) - end - if fields&.size == 1 && fields.include?(association.klass.primary_key) || has_smart_fields @field_names_requested << association.foreign_key if association.foreign_key.present? includes << association.options[:through] if association.options[:through].present? From 284666bb99be8348abe12f41c9c2d040eadbd9e3 Mon Sep 17 00:00:00 2001 From: Matt Date: Fri, 18 Jul 2025 15:56:17 +0200 Subject: [PATCH 3/3] refactor: compute include --- app/services/forest_liana/resources_getter.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/services/forest_liana/resources_getter.rb b/app/services/forest_liana/resources_getter.rb index 631e87b0..2b9fd1c4 100644 --- a/app/services/forest_liana/resources_getter.rb +++ b/app/services/forest_liana/resources_getter.rb @@ -136,21 +136,21 @@ def columns_for_cross_database_association(association_name) end def compute_includes - associations_has_one = ForestLiana::QueryHelper.get_one_associations(@resource) - includes = [] + associations = ForestLiana::QueryHelper.get_one_associations(@resource) + required_relations = [] if @field_names_requested && @params['searchExtended'].to_i != 1 has_smart_fields = Array(@params.dig(:fields, @collection_name)&.split(',')).any? do |field| ForestLiana::SchemaHelper.is_smart_field?(@resource, field) end - associations_has_one.map do |association| + associations.map do |association| association_name = association.name.to_s fields = @params[:fields]&.[](association_name)&.split(',') if fields&.size == 1 && fields.include?(association.klass.primary_key) || has_smart_fields @field_names_requested << association.foreign_key if association.foreign_key.present? - includes << association.options[:through] if association.options[:through].present? - includes << association.name + required_relations << association.options[:through] if association.options[:through].present? + required_relations << association.name end end @@ -167,9 +167,9 @@ def compute_includes includes_for_smart_search = includes_for_smart_search & includes_has_many end - @includes = includes.concat(includes_for_smart_search).uniq + @includes = required_relations.concat(includes_for_smart_search).uniq else - @includes = associations_has_one + @includes = associations # Avoid eager loading has_one associations pointing to a different database as ORM can't join cross databases .reject { |association| separate_database?(@resource, association) } .map(&:name)