From ee5d8fba0c629b03b0e438d45c940a0bf33e43ae Mon Sep 17 00:00:00 2001
From: Guo Xiang Tan <gxtan1990@gmail.com>
Date: Thu, 6 Aug 2020 09:53:10 +0800
Subject: [PATCH] PERF: Optimize `ActionView::Helpers::TextHelper#excerpt`.

---
 lib/search/grouped_search_results.rb | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/lib/search/grouped_search_results.rb b/lib/search/grouped_search_results.rb
index 7f22c16f6f6..23a4b126432 100644
--- a/lib/search/grouped_search_results.rb
+++ b/lib/search/grouped_search_results.rb
@@ -9,6 +9,27 @@ class Search
 
     class TextHelper
       extend ActionView::Helpers::TextHelper
+
+      private
+
+      # TODO: Remove when https://github.com/rails/rails/pull/39979 is merged
+      # For a 10_000 words string, speeds up excerpts by 85X.
+      def self.cut_excerpt_part(part_position, part, separator, options)
+        return "", "" unless part
+
+        radius   = options.fetch(:radius, 100)
+        omission = options.fetch(:omission, "...")
+
+        if separator != ""
+          part = part.split(separator)
+          part.delete("")
+        end
+
+        affix = part.length > radius ? omission : ""
+        part = part.public_send(part_position == :first ? :last : :first, radius)
+        part = part.join(separator) if separator != ""
+        return affix, part
+      end
     end
 
     attr_reader(