Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions app/services/forest_liana/base_getter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 0 additions & 2 deletions app/services/forest_liana/has_many_getter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,6 @@ def records
private

def compute_includes
@optional_includes = []

@includes = @association.klass
.reflect_on_all_associations
.select do |association|
Expand Down
28 changes: 15 additions & 13 deletions app/services/forest_liana/resources_getter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -136,20 +136,22 @@ def columns_for_cross_database_association(association_name)
end

def compute_includes
associations_has_one = ForestLiana::QueryHelper.get_one_associations(@resource)

@optional_includes = []
associations = ForestLiana::QueryHelper.get_one_associations(@resource)
required_relations = []
if @field_names_requested && @params['searchExtended'].to_i != 1
includes = associations_has_one.map do |association|
association_name = association.name.to_s
has_smart_fields = Array(@params.dig(:fields, @collection_name)&.split(',')).any? do |field|
ForestLiana::SchemaHelper.is_smart_field?(@resource, field)
end

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)
@field_names_requested << association.foreign_key
@optional_includes << association.name
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?
required_relations << association.options[:through] if association.options[:through].present?
required_relations << association.name
end
end

includes_for_smart_search = []
Expand All @@ -165,9 +167,9 @@ 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 = 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)
Expand Down
Loading