]> git.cworth.org Git - sup/blobdiff - lib/sup/index.rb
updated imap internaldate notes in comments
[sup] / lib / sup / index.rb
index 538cddacdfaacbeb347125d2c5d9539e34b01da3..fd46495e8706866419559d10e6d6a3a87464e521 100644 (file)
@@ -6,7 +6,7 @@ begin
   require 'chronic'
   $have_chronic = true
 rescue LoadError => e
-  Redwood::log "'chronic' library not found. run 'gem install chronic' to install."
+  Redwood::log "optional 'chronic' library not found (run 'gem install chronic' to install)"
   $have_chronic = false
 end
 
@@ -53,7 +53,7 @@ class Index
   end
 
   def start_lock_update_thread
-    @lock_update_thread = Redwood::reporting_thread do
+    @lock_update_thread = Redwood::reporting_thread("lock update") do
       while true
         sleep 30
         @lock.touch_yourself
@@ -119,8 +119,8 @@ EOS
   def add_source source
     raise "duplicate source!" if @sources.include? source
     @sources_dirty = true
-    source.id ||= @sources.size
-    ##TODO: why was this necessary?
+    max = @sources.max_of { |id, s| s.is_a?(DraftLoader) || s.is_a?(SentLoader) ? 0 : id }
+    source.id ||= (max || 0) + 1
     ##source.id += 1 while @sources.member? source.id
     @sources[source.id] = source
   end
@@ -171,14 +171,21 @@ EOS
       end
 
     to = (m.to + m.cc + m.bcc).map { |x| x.email }.join(" ")
+    snippet = 
+      if m.snippet_contains_encrypted_content? && $config[:discard_snippets_from_encrypted_messages]
+        ""
+      else
+        m.snippet
+      end
+
     d = {
       :message_id => m.id,
       :source_id => source_id,
       :source_info => m.source_info,
       :date => m.date.to_indexable_s,
       :body => m.content,
-      :snippet => m.snippet,
-      :label => m.labels.join(" "),
+      :snippet => snippet,
+      :label => m.labels.uniq.join(" "),
       :from => m.from ? m.from.email : "",
       :to => (m.to + m.cc + m.bcc).map { |x| x.email }.join(" "),
       :subject => wrap_subj(Message.normalize_subj(m.subj)),
@@ -236,6 +243,7 @@ EOS
   ## true, stops loading any thread if a message with a :killed flag
   ## is found.
   SAME_SUBJECT_DATE_LIMIT = 7
+  MAX_CLAUSES = 1000
   def each_message_in_thread_for m, opts={}
     #Redwood::log "Building thread for #{m.id}: #{m.subj}"
     messages = {}
@@ -263,12 +271,17 @@ EOS
     end
 
     until pending.empty? || (opts[:limit] && messages.size >= opts[:limit])
-      id = pending.pop
-      next if searched.member? id
-      searched[id] = true
       q = Ferret::Search::BooleanQuery.new true
-      q.add_query Ferret::Search::TermQuery.new(:message_id, id), :should
-      q.add_query Ferret::Search::TermQuery.new(:refs, id), :should
+      # this disappeared in newer ferrets... wtf.
+      # q.max_clause_count = 2048
+
+      lim = [MAX_CLAUSES / 2, pending.length].min
+      pending[0 ... lim].each do |id|
+        searched[id] = true
+        q.add_query Ferret::Search::TermQuery.new(:message_id, id), :should
+        q.add_query Ferret::Search::TermQuery.new(:refs, id), :should
+      end
+      pending = pending[lim .. -1]
 
       q = build_query :qobj => q
 
@@ -285,10 +298,11 @@ EOS
           #Redwood::log "got #{mid} as a child of #{id}"
           messages[mid] ||= lambda { build_message docid }
           refs = @index[docid][:refs].split(" ")
-          pending += refs
+          pending += refs.select { |id| !searched[id] }
         end
       end
     end
+
     if killed
       Redwood::log "thread for #{m.id} is killed, ignoring"
       false
@@ -310,7 +324,7 @@ EOS
       "date" => Time.at(doc[:date].to_i),
       "subject" => unwrap_subj(doc[:subject]),
       "from" => doc[:from],
-      "to" => doc[:to],
+      "to" => doc[:to].split(/\s+/).join(", "), # reformat
       "message-id" => doc[:message_id],
       "references" => doc[:refs].split(/\s+/).map { |x| "<#{x}>" }.join(" "),
     }
@@ -384,6 +398,8 @@ protected
       field, name = $1, $2
       if(p = ContactManager.contact_for(name))
         [field, p.email]
+      elsif name == "me"
+        [field, "(" + AccountManager.user_emails.join("||") + ")"]
       else
         [field, name]
       end.join(":")
@@ -391,16 +407,21 @@ protected
     
     if $have_chronic
       chronic_failure = false
-      result = result.gsub(/\b(before|after):(\((.+?)\)\B|(\S+)\b)/) do
+      result = result.gsub(/\b(before|on|in|after):(\((.+?)\)\B|(\S+)\b)/) do
         break if chronic_failure
         field, datestr = $1, ($3 || $4)
-        realdate = Chronic.parse datestr
+        realdate = Chronic.parse(datestr, :guess => false, :context => :none)
         if realdate
-          Redwood::log "chronic: translated #{field}:#{datestr} to #{realdate}"
-          if field == "after"
-            "date:(>= #{sprintf "%012d", realdate.to_i})"
+          case field
+          when "after"
+            Redwood::log "chronic: translated #{field}:#{datestr} to #{realdate.end}"
+            "date:(>= #{sprintf "%012d", realdate.end.to_i})"
+          when "before"
+            Redwood::log "chronic: translated #{field}:#{datestr} to #{realdate.begin}"
+            "date:(<= #{sprintf "%012d", realdate.begin.to_i})"
           else
-            "date:(<= #{sprintf "%012d", realdate.to_i})"
+            Redwood::log "chronic: translated #{field}:#{datestr} to #{realdate}"
+            "date:(<= #{sprintf "%012d", realdate.end.to_i}) date:(>= #{sprintf "%012d", realdate.begin.to_i})"
           end
         else
           BufferManager.flash "Don't understand date #{datestr.inspect}!"