## do any specialized parsing
## returns nil and flashes error message if parsing failed
def parse_user_query_string str
+ extraopts = {}
result = str.gsub(/\b(to|from):(\S+)\b/) do
field, name = $1, $2
if(p = ContactManager.contact_for(name))
end.join(":")
end
+ # gmail style "is" operator
+ result = result.gsub(/\b(is):(\S+)\b/) do
+ field, label = $1, $2
+ case label
+ when "read"
+ "-label:unread"
+ when "spam"
+ extraopts[:load_spam] = true
+ "label:spam"
+ when "deleted"
+ extraopts[:load_deleted] = true
+ "label:deleted"
+ else
+ "label:#{$2}"
+ end
+ end
+
if $have_chronic
chronic_failure = false
- result = result.gsub(/\b(before|on|in|after):(\((.+?)\)\B|(\S+)\b)/) do
+ result = result.gsub(/\b(before|on|in|during|after):(\((.+?)\)\B|(\S+)\b)/) do
break if chronic_failure
field, datestr = $1, ($3 || $4)
realdate = Chronic.parse(datestr, :guess => false, :context => :none)
end
Redwood::log "translated #{str.inspect} to #{result}" unless result == str
- @qparser.parse result if result
+ if result
+ [@qparser.parse(result), extraopts]
+ else
+ [nil,nil]
+ end
end
def build_query opts
module Redwood
class SearchResultsMode < ThreadIndexMode
- def initialize qobj
+ def initialize qobj, qopts = nil
@qobj = qobj
- super [], { :qobj => @qobj }
+ @qopts = qopts
+
+ super [], { :qobj => @qobj }.merge(@qopts)
end
register_keymap do |k|
def refine_search
query = BufferManager.ask :search, "query: ", (@qobj.to_s + " ")
return unless query && query !~ /^\s*$/
- SearchResultsMode.spawn_from_query query
+ SearchResultsMode.spawn_from_query query, @qopts
end
## a proper is_relevant? method requires some way of asking ferret
def self.spawn_from_query text
begin
- qobj = Index.parse_user_query_string(text) or return
+ qobj, extraopts = Index.parse_user_query_string(text)
+ return unless qobj
short_text = text.length < 20 ? text : text[0 ... 20] + "..."
- mode = SearchResultsMode.new qobj
+ mode = SearchResultsMode.new qobj, extraopts
BufferManager.spawn "search: \"#{short_text}\"", mode
mode.load_threads :num => mode.buffer.content_height
rescue Ferret::QueryParser::QueryParseException => e