Files
fizzy/app/models/search/record/sqlite.rb
T
Donal McBreen 4f6ec19491 Drop comments
2025-11-21 09:15:19 +00:00

79 lines
2.4 KiB
Ruby

module Search::Record::SQLite
extend ActiveSupport::Concern
included do
# Override the UUID id attribute from ApplicationRecord
# FTS tables require integer rowids
attribute :id, :integer, default: nil
after_save :upsert_to_fts5_table
after_destroy :delete_from_fts5_table
end
class_methods do
def for_account(account_id)
self
end
def matching_scope(query)
joins("INNER JOIN search_records_fts ON search_records_fts.rowid = #{table_name}.id")
.where("search_records_fts MATCH ?", query)
end
def search_scope(relation, query)
opening_mark = connection.quote(Search::Highlighter::OPENING_MARK)
closing_mark = connection.quote(Search::Highlighter::CLOSING_MARK)
ellipsis = connection.quote(Search::Highlighter::ELIPSIS)
relation.select(
"#{table_name}.id",
"#{table_name}.account_id",
"#{table_name}.searchable_type",
"#{table_name}.searchable_id",
"#{table_name}.card_id",
"#{table_name}.board_id",
"#{table_name}.title",
"#{table_name}.content",
"#{table_name}.created_at",
"highlight(search_records_fts, 0, #{opening_mark}, #{closing_mark}) AS highlighted_title",
"highlight(search_records_fts, 1, #{opening_mark}, #{closing_mark}) AS highlighted_content",
"snippet(search_records_fts, 1, #{opening_mark}, #{closing_mark}, #{ellipsis}, 20) AS content_snippet",
"#{connection.quote(query.terms)} AS query"
)
end
end
def card_title
if card_id
if has_attribute?(:highlighted_title) && highlighted_title.present?
highlighted_title.html_safe
else
card.title
end
end
end
def card_description
if card_id && has_attribute?(:content_snippet) && content_snippet.present?
content_snippet.html_safe
end
end
def comment_body
if comment && has_attribute?(:content_snippet) && content_snippet.present?
content_snippet.html_safe
end
end
private
def upsert_to_fts5_table
self.class.connection.execute(
"INSERT OR REPLACE INTO search_records_fts(rowid, title, content) VALUES (#{id}, #{self.class.connection.quote(title)}, #{self.class.connection.quote(content)})"
)
end
def delete_from_fts5_table
self.class.connection.execute("DELETE FROM search_records_fts WHERE rowid = #{id}")
end
end