From 4a8e63023248f71e3dba13de7b39182c826387a8 Mon Sep 17 00:00:00 2001 From: multiple creatures Date: Tue, 1 Oct 2019 00:22:01 -0500 Subject: prefixing a search with `@@` interprets it as an advanced query (in postgresql `tsquery` format) --- app/models/status.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/status.rb b/app/models/status.rb index afd25c808..01ef7c7ea 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -347,11 +347,18 @@ class Status < ApplicationRecord .or(Status.where(account_id: mutual_account_ids, visibility: [:private, :local, :unlisted])) .or(Status.where(id: account.mentions.select(:status_id))) end + sql = 'tsv @@ plainto_tsquery(?)' + if term.start_with?('@@') + sql = 'tsv @@ to_tsquery(?)' + term = term[2..-1].lstrip + end return none if term.blank? pattern = sanitize_sql_like(term) pattern = "#{pattern}" - query = query.without_reblogs.where("tsv @@ plainto_tsquery('english', ?)", pattern).offset(offset).limit(limit) + query = query.without_reblogs.where(sql, pattern).offset(offset).limit(limit) apply_timeline_filters(query, account, true) + rescue ActiveRecord::StatementInvalid + raise Mastodon::ValidationError, 'Your advanced search query has invalid syntax.' end def selectable_visibilities -- cgit