thread.rb

Path: lib/sup/thread.rb
Last Update: Wed Feb 09 11:36:45 +0000 2011

Herein lies all the code responsible for threading messages. It‘s basically an online version of the JWZ threading algorithm: www.jwz.org/doc/threading.html

I didn‘t implement it for efficiency, but thanks to our search engine backend, it‘s typically not applied to very many messages at once.

At the top level, we have a ThreadSet, which represents a set of threads, e.g. a message folder or an inbox. Each ThreadSet contains zero or more Threads. A Thread represents all the message related to a particular subject. Each Thread has one or more Containers. A Container is a recursive structure that holds the message tree as determined by the references: and in-reply-to: headers. Each Container holds zero or one messages. In the case of zero messages, it means we‘ve seen a reference to the message but haven‘t (yet) seen the message itself.

A Thread can have multiple top-level Containers if we decide to group them together independent of tree structure, typically if (e.g. due to someone using a primitive MUA) the messages have the same subject but we don‘t have evidence from in-reply-to: or references: headers. In this case Thread#each can optionally yield a faked root object tying them all together into one tree structure.

Required files

set  

[Validate]