diff --git a/lib/submissions/filter.rb b/lib/submissions/filter.rb index 7da3f534..f338a877 100644 --- a/lib/submissions/filter.rb +++ b/lib/submissions/filter.rb @@ -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?