Class: FullSearch::Highlighter
- Inherits:
-
Object
- Object
- FullSearch::Highlighter
- Defined in:
- lib/full_search/highlighter.rb
Class Method Summary collapse
- .apply!(records, model, query) ⇒ Object
- .apply_fields!(records, model, query) ⇒ Object
- .build_field_snippets(model, query) ⇒ Object
- .build_snippets(model, query) ⇒ Object
- .connection ⇒ Object
- .highlight_rows(model, query) ⇒ Object
- .quote(value) ⇒ Object
Class Method Details
.apply!(records, model, query) ⇒ Object
5 6 7 8 9 |
# File 'lib/full_search/highlighter.rb', line 5 def self.apply!(records, model, query) snippets = build_snippets(model, query) records.each { |record| record.full_search_snippet = snippets[record.id] } records end |
.apply_fields!(records, model, query) ⇒ Object
11 12 13 14 15 |
# File 'lib/full_search/highlighter.rb', line 11 def self.apply_fields!(records, model, query) fields = build_field_snippets(model, query) records.each { |record| record.full_search_highlight_fields = fields[record.id] || {} } records end |
.build_field_snippets(model, query) ⇒ Object
29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/full_search/highlighter.rb', line 29 def self.build_field_snippets(model, query) rows = highlight_rows(model, query) dsl = model.full_search_dsl cols = dsl.fields.map(&:name) open_tag = (dsl.highlight_config || { open_tag: "<mark>" })[:open_tag] rows.to_h do |row| snippets = cols.each_with_object({}) do |col, hash| snippet = row["#{col}_snippet"].to_s.strip hash[col.to_s] = snippet if snippet.include?(open_tag) end [row["rowid"], snippets] end end |
.build_snippets(model, query) ⇒ Object
19 20 21 22 23 24 25 26 27 |
# File 'lib/full_search/highlighter.rb', line 19 def self.build_snippets(model, query) rows = highlight_rows(model, query) cols = model.full_search_dsl.fields.map(&:name) rows.to_h do |row| text = cols.map { |col| row["#{col}_snippet"] }.compact.join(" ").strip [row["rowid"], text.presence] end end |
.connection ⇒ Object
67 68 69 |
# File 'lib/full_search/highlighter.rb', line 67 def self.connection ActiveRecord::Base.connection end |
.highlight_rows(model, query) ⇒ Object
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/full_search/highlighter.rb', line 44 def self.highlight_rows(model, query) dsl = model.full_search_dsl config = dsl.highlight_config || { open_tag: "<mark>", close_tag: "</mark>" } match_expr = QueryParser.to_match_expression(QueryParser.parse(query)) return [] if match_expr.empty? table = FullSearch::Index.fts_table_name(model) cols = dsl.fields.map(&:name) return [] if cols.empty? highlight_parts = cols.each_with_index.map do |col, idx| "highlight(#{table}, #{idx}, #{quote(config[:open_tag])}, #{quote(config[:close_tag])}) AS #{col}_snippet" end.join(", ") sql = <<~SQL SELECT rowid, #{highlight_parts} FROM #{table} WHERE #{table} MATCH #{quote(match_expr)} SQL connection.execute(sql) end |
.quote(value) ⇒ Object
71 72 73 |
# File 'lib/full_search/highlighter.rb', line 71 def self.quote(value) connection.quote(value) end |