Add from: query operator to search syntax (#16526)
				
					
				
			* Add 'by:userhandle' parameter to search api * Use search syntax for "by" prefix * Codeclimate * Use 'from' instead of 'by'
This commit is contained in:
		@@ -2,19 +2,21 @@
 | 
			
		||||
 | 
			
		||||
class SearchQueryTransformer < Parslet::Transform
 | 
			
		||||
  class Query
 | 
			
		||||
    attr_reader :should_clauses, :must_not_clauses, :must_clauses
 | 
			
		||||
    attr_reader :should_clauses, :must_not_clauses, :must_clauses, :filter_clauses
 | 
			
		||||
 | 
			
		||||
    def initialize(clauses)
 | 
			
		||||
      grouped = clauses.chunk(&:operator).to_h
 | 
			
		||||
      @should_clauses = grouped.fetch(:should, [])
 | 
			
		||||
      @must_not_clauses = grouped.fetch(:must_not, [])
 | 
			
		||||
      @must_clauses = grouped.fetch(:must, [])
 | 
			
		||||
      @filter_clauses = grouped.fetch(:filter, [])
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def apply(search)
 | 
			
		||||
      should_clauses.each { |clause| search = search.query.should(clause_to_query(clause)) }
 | 
			
		||||
      must_clauses.each { |clause| search = search.query.must(clause_to_query(clause)) }
 | 
			
		||||
      must_not_clauses.each { |clause| search = search.query.must_not(clause_to_query(clause)) }
 | 
			
		||||
      filter_clauses.each { |clause| search = search.filter(**clause_to_filter(clause)) }
 | 
			
		||||
      search.query.minimum_should_match(1)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
@@ -30,6 +32,15 @@ class SearchQueryTransformer < Parslet::Transform
 | 
			
		||||
        raise "Unexpected clause type: #{clause}"
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def clause_to_filter(clause)
 | 
			
		||||
      case clause
 | 
			
		||||
      when PrefixClause
 | 
			
		||||
        { term: { clause.filter => clause.term } }
 | 
			
		||||
      else
 | 
			
		||||
        raise "Unexpected clause type: #{clause}"
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  class Operator
 | 
			
		||||
@@ -69,11 +80,33 @@ class SearchQueryTransformer < Parslet::Transform
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  class PrefixClause
 | 
			
		||||
    attr_reader :filter, :operator, :term
 | 
			
		||||
 | 
			
		||||
    def initialize(prefix, term)
 | 
			
		||||
      @operator = :filter
 | 
			
		||||
      case prefix
 | 
			
		||||
      when 'from'
 | 
			
		||||
        @filter = :account_id
 | 
			
		||||
        username, domain = term.split('@')
 | 
			
		||||
        account = Account.find_remote(username, domain)
 | 
			
		||||
 | 
			
		||||
        raise "Account not found: #{term}" unless account
 | 
			
		||||
 | 
			
		||||
        @term = account.id
 | 
			
		||||
      else
 | 
			
		||||
        raise "Unknown prefix: #{prefix}"
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  rule(clause: subtree(:clause)) do
 | 
			
		||||
    prefix   = clause[:prefix][:term].to_s if clause[:prefix]
 | 
			
		||||
    operator = clause[:operator]&.to_s
 | 
			
		||||
 | 
			
		||||
    if clause[:term]
 | 
			
		||||
    if clause[:prefix]
 | 
			
		||||
      PrefixClause.new(prefix, clause[:term].to_s)
 | 
			
		||||
    elsif clause[:term]
 | 
			
		||||
      TermClause.new(prefix, operator, clause[:term].to_s)
 | 
			
		||||
    elsif clause[:shortcode]
 | 
			
		||||
      TermClause.new(prefix, operator, ":#{clause[:term]}:")
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user