From 8a60f17d13b688fbdcb1451925693d5848192f04 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Tue, 7 Jul 2026 09:41:37 +0300 Subject: [PATCH] optimize created_at filter --- lib/submissions/filter.rb | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) 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?