Files
fizzy/app/models/search/record/sqlite.rb
T
Donal McBreen b571303385 Don't use Current.account for search records
It doesn't actually work, and even if we could make it work reliably
we are better off if the records always know to go to the right shard.

It does make the interface a bit more complicated as we need to select
the right shard class with `for(account_id)`.
2025-11-25 11:34:41 +00:00

60 lines
1.8 KiB
Ruby

module Search::Record::SQLite
extend ActiveSupport::Concern
included do
# Override default UUID id attribute, as FTS5 uses rowid integer primary key
attribute :id, :integer, default: nil
attribute :result_title, :string
attribute :result_content, :string
has_one :search_records_fts, -> { with_rowid },
class_name: "Search::Record::SQLite::Fts", foreign_key: :rowid, primary_key: :id, dependent: :destroy
after_save :upsert_to_fts5_table
scope :matching, ->(query, account_id) { joins(:search_records_fts).where("search_records_fts MATCH ?", query) }
end
class_methods do
def search_fields(query)
opening_mark = connection.quote(Search::Highlighter::OPENING_MARK)
closing_mark = connection.quote(Search::Highlighter::CLOSING_MARK)
ellipsis = connection.quote(Search::Highlighter::ELIPSIS)
[ "highlight(search_records_fts, 0, #{opening_mark}, #{closing_mark}) AS result_title",
"snippet(search_records_fts, 1, #{opening_mark}, #{closing_mark}, #{ellipsis}, 20) AS result_content",
"#{connection.quote(query.terms)} AS query" ]
end
def for(account_id)
self
end
end
def card_title
escape_fts_highlight(result_title || card.title)
end
def card_description
escape_fts_highlight(result_content) unless comment
end
def comment_body
escape_fts_highlight(result_content) if comment
end
private
def escape_fts_highlight(html)
return nil unless html.present?
CGI.escapeHTML(html)
.gsub(CGI.escapeHTML(Search::Highlighter::OPENING_MARK), Search::Highlighter::OPENING_MARK)
.gsub(CGI.escapeHTML(Search::Highlighter::CLOSING_MARK), Search::Highlighter::CLOSING_MARK)
.html_safe
end
def upsert_to_fts5_table
Fts.upsert(id, title, content)
end
end