optimize created_at filter
This commit is contained in:
@@ -19,6 +19,8 @@ module Submissions
|
||||
created_at_to
|
||||
].freeze
|
||||
|
||||
BIGINT_MAX = (2**63) - 1
|
||||
|
||||
module_function
|
||||
|
||||
def call(submissions, current_user, params)
|
||||
@@ -71,15 +73,39 @@ module Submissions
|
||||
end
|
||||
|
||||
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?
|
||||
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
|
||||
|
||||
submissions
|
||||
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)
|
||||
return submissions if filters[:folder].blank?
|
||||
|
||||
|
||||
Reference in New Issue
Block a user