optimize created_at filter

pull/698/merge
Pete Matsyburka 4 weeks ago
parent e1d860a42c
commit 8a60f17d13

@ -19,6 +19,8 @@ module Submissions
created_at_to created_at_to
].freeze ].freeze
BIGINT_MAX = (2**63) - 1
module_function module_function
def call(submissions, current_user, params) def call(submissions, current_user, params)
@ -71,15 +73,39 @@ module Submissions
end end
def filter_by_created_at(submissions, filters) def filter_by_created_at(submissions, filters)
submissions = submissions.where(created_at: filters[:created_at_from]..) if filters[:created_at_from].present? if filters[:created_at_from].present?
submissions = submissions.where(min_created_at_id_arel(filters[:created_at_from]))
end
if filters[:created_at_to].present? if filters[:created_at_to].present?
submissions = submissions.where(created_at: ..filters[:created_at_to].end_of_day) submissions = submissions.where(max_created_at_id_arel(filters[:created_at_to].end_of_day))
end end
submissions submissions
end end
def min_created_at_id_arel(time)
submissions = Submission.arel_table
first_id = submissions.project(submissions[:id])
.where(submissions[:created_at].gteq(time))
.order(submissions[:created_at].asc, submissions[:id].asc)
.take(1)
submissions[:id].gteq(Arel::Nodes::NamedFunction.new('COALESCE', [first_id, BIGINT_MAX]))
end
def max_created_at_id_arel(time)
submissions = Submission.arel_table
last_id = submissions.project(submissions[:id])
.where(submissions[:created_at].lteq(time))
.order(submissions[:created_at].desc, submissions[:id].desc)
.take(1)
submissions[:id].lteq(Arel::Nodes::NamedFunction.new('COALESCE', [last_id, 0]))
end
def filter_by_folder(submissions, filters, current_user) def filter_by_folder(submissions, filters, current_user)
return submissions if filters[:folder].blank? return submissions if filters[:folder].blank?

Loading…
Cancel
Save