optimize select

pull/696/head
Pete Matsyburka 1 month ago
parent e54d76f0e2
commit 3cb37748e9

@ -2,6 +2,10 @@
module Api module Api
class SubmissionsController < ApiBaseController class SubmissionsController < ApiBaseController
SUBMISSION_COLUMNS = %i[id name slug source submitters_order expire_at created_at updated_at
archived_at variables template_id template_submitters created_by_user_id].freeze
TEMPLATE_COLUMNS = %i[id name external_id created_at updated_at folder_id submitters].freeze
load_and_authorize_resource :template, only: :create load_and_authorize_resource :template, only: :create
load_and_authorize_resource :submission, only: %i[show index destroy] load_and_authorize_resource :submission, only: %i[show index destroy]
@ -13,10 +17,22 @@ module Api
submissions = Submissions.search(current_user, @submissions, params[:q]) submissions = Submissions.search(current_user, @submissions, params[:q])
submissions = filter_submissions(submissions, params) submissions = filter_submissions(submissions, params)
submissions = paginate(submissions.preload(:created_by_user, :submitters, with_fields = params[:include].to_s.include?('fields')
template: { folder: :parent_folder },
combined_document_attachment: :blob, submissions = paginate(
audit_trail_attachment: :blob)) submissions.select(with_fields ? SUBMISSION_COLUMNS + %i[template_fields] : SUBMISSION_COLUMNS)
.preload(:created_by_user, :submitters, combined_document_attachment: :blob,
audit_trail_attachment: :blob)
)
ActiveRecord::Associations::Preloader.new(
records: submissions,
associations: :template,
scope: Template.select(with_fields ? TEMPLATE_COLUMNS + %i[fields] : TEMPLATE_COLUMNS)
).call
ActiveRecord::Associations::Preloader.new(records: submissions.filter_map(&:template),
associations: { folder: :parent_folder }).call
expires_at = Accounts.link_expires_at(current_account) expires_at = Accounts.link_expires_at(current_account)

@ -7,7 +7,7 @@ class SubmissionsArchivedController < ApplicationController
@submissions = @submissions.left_joins(:template) @submissions = @submissions.left_joins(:template)
@submissions = @submissions.where.not(archived_at: nil) @submissions = @submissions.where.not(archived_at: nil)
.or(@submissions.where.not(templates: { archived_at: nil })) .or(@submissions.where.not(templates: { archived_at: nil }))
.preload(:template_accesses, :created_by_user, template: :author) .preload(:template_accesses, :created_by_user)
@submissions = Submissions.search(current_user, @submissions, params[:q], search_template: true) @submissions = Submissions.search(current_user, @submissions, params[:q], search_template: true)
@submissions = Submissions::Filter.call(@submissions, current_user, params) @submissions = Submissions::Filter.call(@submissions, current_user, params)
@ -18,6 +18,15 @@ class SubmissionsArchivedController < ApplicationController
@submissions.order(id: :desc) @submissions.order(id: :desc)
end end
@pagy, @submissions = pagy_auto(@submissions.preload(submitters: :start_form_submission_events)) @pagy, @submissions = pagy_auto(@submissions.select_for_list.preload(submitters: :start_form_submission_events))
template_scope = @submissions.all?(&:template_submitters) ? Template.select_for_list : nil
ActiveRecord::Associations::Preloader.new(records: @submissions,
associations: :template,
scope: template_scope).call
ActiveRecord::Associations::Preloader.new(records: @submissions.filter_map(&:template),
associations: :author).call
end end
end end

@ -8,7 +8,7 @@ class SubmissionsDashboardController < ApplicationController
@submissions = @submissions.where(archived_at: nil) @submissions = @submissions.where(archived_at: nil)
.where(templates: { archived_at: nil }) .where(templates: { archived_at: nil })
.preload(:template_accesses, :created_by_user, template: :author) .preload(:template_accesses, :created_by_user)
@submissions = Submissions.search(current_user, @submissions, params[:q], search_template: true) @submissions = Submissions.search(current_user, @submissions, params[:q], search_template: true)
@submissions = Submissions::Filter.call(@submissions, current_user, params) @submissions = Submissions::Filter.call(@submissions, current_user, params)
@ -19,6 +19,15 @@ class SubmissionsDashboardController < ApplicationController
@submissions.order(id: :desc) @submissions.order(id: :desc)
end end
@pagy, @submissions = pagy_auto(@submissions.preload(submitters: :start_form_submission_events)) @pagy, @submissions = pagy_auto(@submissions.select_for_list.preload(submitters: :start_form_submission_events))
template_scope = @submissions.all?(&:template_submitters) ? Template.select_for_list : nil
ActiveRecord::Associations::Preloader.new(records: @submissions,
associations: :template,
scope: template_scope).call
ActiveRecord::Associations::Preloader.new(records: @submissions.filter_map(&:template),
associations: :author).call
end end
end end

@ -30,7 +30,7 @@ class TemplateFoldersController < ApplicationController
(@template_folders.size < 7 ? 9 : 6) (@template_folders.size < 7 ? 9 : 6)
end end
@pagy, @templates = pagy_auto(@templates, limit:) @pagy, @templates = pagy_auto(@templates.select_for_list, limit:)
if params[:q].present? && @templates.blank? if params[:q].present? && @templates.blank?
@related_submissions_pagy, @related_submissions = load_related_submissions(@template_folder) @related_submissions_pagy, @related_submissions = load_related_submissions(@template_folder)
@ -82,6 +82,6 @@ class TemplateFoldersController < ApplicationController
related_submissions = Submissions.search(current_user, related_submissions, params[:q]) related_submissions = Submissions.search(current_user, related_submissions, params[:q])
.order(id: :desc) .order(id: :desc)
pagy_auto(related_submissions, limit: 5) pagy_auto(related_submissions.select_for_list, limit: 5)
end end
end end

@ -10,7 +10,7 @@ class TemplatesArchivedController < ApplicationController
@templates = Templates.search(current_user, @templates, params[:q]) @templates = Templates.search(current_user, @templates, params[:q])
@pagy, @templates = pagy_auto(@templates, limit: 12) @pagy, @templates = pagy_auto(@templates.select_for_list, limit: 12)
return unless params[:q].present? && @templates.blank? return unless params[:q].present? && @templates.blank?
@ -31,6 +31,6 @@ class TemplatesArchivedController < ApplicationController
related_submissions = Submissions.search(current_user, related_submissions, params[:q]) related_submissions = Submissions.search(current_user, related_submissions, params[:q])
.order(id: :desc) .order(id: :desc)
pagy_auto(related_submissions, limit: 5) pagy_auto(related_submissions.select_for_list, limit: 5)
end end
end end

@ -15,7 +15,7 @@ class TemplatesArchivedSubmissionsController < ApplicationController
@submissions.order(id: :desc) @submissions.order(id: :desc)
end end
@pagy, @submissions = pagy_auto(@submissions.preload(submitters: :start_form_submission_events)) @pagy, @submissions = pagy_auto(@submissions.select_for_list.preload(submitters: :start_form_submission_events))
rescue ActiveRecord::RecordNotFound rescue ActiveRecord::RecordNotFound
redirect_to root_path redirect_to root_path
end end

@ -19,7 +19,7 @@ class TemplatesController < ApplicationController
submissions.order(id: :desc) submissions.order(id: :desc)
end end
@pagy, @submissions = pagy_auto(submissions.preload(:template_accesses, submitters: :start_form_submission_events)) @pagy, @submissions = pagy_auto(submissions.select_for_list.preload(:template_accesses, submitters: :start_form_submission_events))
rescue ActiveRecord::RecordNotFound rescue ActiveRecord::RecordNotFound
redirect_to root_path redirect_to root_path
end end

@ -36,7 +36,8 @@ class TemplatesDashboardController < ApplicationController
@templates = @templates.where(folder_id: @default_folder.id) if params[:q].blank? @templates = @templates.where(folder_id: @default_folder.id) if params[:q].blank?
end end
@pagy, @templates = load_templates(@templates, @pagy.count, show_shared_inline: @show_shared_inline) @pagy, @templates = load_templates(@templates.select_for_list, @pagy.count,
show_shared_inline: @show_shared_inline)
if params[:q].present? && @templates.blank? if params[:q].present? && @templates.blank?
@related_submissions_pagy, @related_submissions = load_related_submissions @related_submissions_pagy, @related_submissions = load_related_submissions
@ -130,6 +131,6 @@ class TemplatesDashboardController < ApplicationController
related_submissions = Submissions.search(current_user, related_submissions, params[:q]) related_submissions = Submissions.search(current_user, related_submissions, params[:q])
.order(id: :desc) .order(id: :desc)
pagy_auto(related_submissions, limit: 5) pagy_auto(related_submissions.select_for_list, limit: 5)
end end
end end

@ -17,7 +17,7 @@ class TemplatesSharedController < ApplicationController
@templates = Templates.search_shared(current_user, @templates, params[:q]) @templates = Templates.search_shared(current_user, @templates, params[:q])
@pagy, @templates = pagy_auto(@templates, limit: 12) @pagy, @templates = pagy_auto(@templates.select_for_list, limit: 12)
return unless params[:q].present? && @templates.blank? return unless params[:q].present? && @templates.blank?
@ -42,6 +42,6 @@ class TemplatesSharedController < ApplicationController
related_submissions = Submissions.search(current_user, related_submissions, params[:q]) related_submissions = Submissions.search(current_user, related_submissions, params[:q])
.order(id: :desc) .order(id: :desc)
pagy_auto(related_submissions, limit: 5) pagy_auto(related_submissions.select_for_list, limit: 5)
end end
end end

@ -107,6 +107,11 @@ class Submission < ApplicationRecord
.and(Submitter.arel_table[:completed_at].eq(nil))).select(1).arel.exists) .and(Submitter.arel_table[:completed_at].eq(nil))).select(1).arel.exists)
} }
scope :select_for_list, lambda {
select(:id, :name, :created_by_user_id, :account_id,
:created_at, :archived_at, :expire_at, :template_id, :template_submitters)
}
enum :source, { enum :source, {
invite: 'invite', invite: 'invite',
bulk: 'bulk', bulk: 'bulk',

@ -81,6 +81,8 @@ class Template < ApplicationRecord
scope :active, -> { where(archived_at: nil) } scope :active, -> { where(archived_at: nil) }
scope :archived, -> { where.not(archived_at: nil) } scope :archived, -> { where.not(archived_at: nil) }
scope :select_for_list, -> { select(:id, :name, :author_id, :account_id, :created_at, :archived_at, :folder_id) }
def application_key def application_key
external_id external_id
end end

Loading…
Cancel
Save