Dear Wiki user,

You have subscribed to a wiki page or wiki category on "James Wiki" for change 
notification.

The "GSoC2011HBaseMailbox" page has been changed by EricCharles:
http://wiki.apache.org/james/GSoC2011HBaseMailbox?action=diff&rev1=1&rev2=2

- The page contains the documentation related to the design of the mailbox 
hbase module as Ioan Eugen Stan's GSoC2011 project. Everyone is welcome to 
update/inject with his ideas.
+ The page contains information related to the design of the mailbox hbase 
module as Ioan Eugen Stan's GSoC2011 project.
  
- DataModel
+ Everyone is welcome to update/inject with his ideas
  
- UID Generation
+ = Data Model =
+ Hereafter some information gathered from JIRA:
  
- Queries
+ {{{
+ * one row for the mailbox meta data (mailboxId, uidvalidity, namespace, 
username ...).
+ * one row for the message metadata ( mailboxId, uid, size, headers, flags, 
messagecontentId...).
+ * one row per message content where I splitted the messagecontent in 1mb 
parts and put each "raw" byte[] in a new column. This makes sure we don't get 
to big column (not sure if this is also needed for hbase, in cassandra big 
columns are a problem)
+ }}}
+ {{{
+ - If you look at the classes, we could have Mailbox, Subscription and Message 
tables.
+ - A row per mailbox, subscription and message
+ - The unanswered question are: 1. The structure of the rowkey? - 2. Header 
and Property as separate table or as additional column to the message row.
+ }}}
+ {{{
+ messagesMetaData(CF): {
+   mailboxId/uid: {
+     uid: 1,
+     mailboxId: 184e-ske1-igk2-gj71
+     flags.recent: true,
+     flags.deleted: true,
+     flags.seen: true,
+     flags.deleted: false,
+     flags.seen: false,
+     flags.flagged: true,
+     bodyOctets: 19484
+     fullContentOctets: 10304
+     properties: namespace::localname::value;;namespace2::localname2::value2
+     headers: byte[],
+     mediaType: text,
+     subType: plain,
+    textualLineCount: 24
+   }
+ }
  
+ messagesContent(CF): {
+   mailboxId/uid: {
+     1: byte[],
+     2: byte[],
+     3: byte[]
+   }
+ }
+ }}}
+ = UID Generation =
+ How are we going to generate the UID? Probably with the HBase Increment class.
+ 
+ = Indexes =
+ None for the time being
+ 
+ = Queries =
+ List here all needed queries and the Scanner implementation that will support 
them.
+ 
+ Hereafter, a dump of the JPA queries that can help review the datamodel is 
correct
+ 
+ From AbstractJPAMessage:
+ @NamedQueries({
+     @NamedQuery(name="findRecentMessagesInMailbox",
+             query="SELECT message FROM Message message WHERE 
message.mailbox.mailboxId = :idParam AND message.recent = TRUE"),
+     @NamedQuery(name="findUnseenMessagesInMailboxOrderByUid",
+             query="SELECT message FROM Message message WHERE 
message.mailbox.mailboxId = :idParam AND message.seen = FALSE ORDER BY 
message.uid ASC"),
+     @NamedQuery(name="findMessagesInMailbox",
+             query="SELECT message FROM Message message WHERE 
message.mailbox.mailboxId = :idParam"),
+     @NamedQuery(name="findMessagesInMailboxBetweenUIDs",
+             query="SELECT message FROM Message message WHERE 
message.mailbox.mailboxId = :idParam AND message.uid BETWEEN :fromParam AND 
:toParam"),
+     @NamedQuery(name="findMessagesInMailboxWithUID",
+             query="SELECT message FROM Message message WHERE 
message.mailbox.mailboxId = :idParam AND message.uid=:uidParam"),
+     @NamedQuery(name="findMessagesInMailboxAfterUID",
+             query="SELECT message FROM Message message WHERE 
message.mailbox.mailboxId = :idParam AND message.uid>=:uidParam"),
+     @NamedQuery(name="findDeletedMessagesInMailbox",
+             query="SELECT message.uid FROM Message message WHERE 
message.mailbox.mailboxId = :idParam AND message.deleted=TRUE"),
+     @NamedQuery(name="findDeletedMessagesInMailboxBetweenUIDs",
+             query="SELECT message.uid FROM Message message WHERE 
message.mailbox.mailboxId = :idParam AND message.uid BETWEEN :fromParam AND 
:toParam AND message.deleted=TRUE"),
+     @NamedQuery(name="findDeletedMessagesInMailboxWithUID",
+             query="SELECT message.uid FROM Message message WHERE 
message.mailbox.mailboxId = :idParam AND message.uid=:uidParam AND 
message.deleted=TRUE"),
+     @NamedQuery(name="findDeletedMessagesInMailboxAfterUID",
+             query="SELECT message.uid FROM Message message WHERE 
message.mailbox.mailboxId = :idParam AND message.uid>=:uidParam AND 
message.deleted=TRUE"),
+ 
+     @NamedQuery(name="deleteDeletedMessagesInMailbox",
+             query="DELETE FROM Message message WHERE 
message.mailbox.mailboxId = :idParam AND message.deleted=TRUE"),
+     @NamedQuery(name="deleteDeletedMessagesInMailboxBetweenUIDs",
+             query="DELETE FROM Message message WHERE 
message.mailbox.mailboxId = :idParam AND message.uid BETWEEN :fromParam AND 
:toParam AND message.deleted=TRUE"),
+     @NamedQuery(name="deleteDeletedMessagesInMailboxWithUID",
+             query="DELETE FROM Message message WHERE 
message.mailbox.mailboxId = :idParam AND message.uid=:uidParam AND 
message.deleted=TRUE"),
+     @NamedQuery(name="deleteDeletedMessagesInMailboxAfterUID",
+             query="DELETE FROM Message message WHERE 
message.mailbox.mailboxId = :idParam AND message.uid>=:uidParam AND 
message.deleted=TRUE"),
+ 
+     @NamedQuery(name="countUnseenMessagesInMailbox",
+             query="SELECT COUNT(message) FROM Message message WHERE 
message.mailbox.mailboxId = :idParam AND message.seen=FALSE"),
+     @NamedQuery(name="countMessagesInMailbox",
+             query="SELECT COUNT(message) FROM Message message WHERE 
message.mailbox.mailboxId = :idParam"),
+     @NamedQuery(name="deleteMessages",
+             query="DELETE FROM Message message WHERE 
message.mailbox.mailboxId = :idParam"),
+     @NamedQuery(name="findLastUidInMailbox",
+             query="SELECT message.uid FROM Message message WHERE 
message.mailbox.mailboxId = :idParam ORDER BY message.uid DESC"),
+     @NamedQuery(name="deleteAllMemberships",
+             query="DELETE FROM Message message")
+ From JPAMailbox
+     @NamedQuery(name="findMailboxById",
+         query="SELECT mailbox FROM Mailbox mailbox WHERE 
mailbox.mailbox.mailboxId = :idParam"),
+     @NamedQuery(name="findMailboxByName",
+         query="SELECT mailbox FROM Mailbox mailbox WHERE mailbox.name = 
:nameParam and mailbox.user is NULL and mailbox.namespace= :namespaceParam"),
+     @NamedQuery(name="findMailboxByNameWithUser",
+         query="SELECT mailbox FROM Mailbox mailbox WHERE mailbox.name = 
:nameParam and mailbox.user= :userParam and mailbox.namespace= 
:namespaceParam"),
+     @NamedQuery(name="deleteAllMailboxes",
+         query="DELETE FROM Mailbox mailbox"),
+     @NamedQuery(name="findMailboxWithNameLikeWithUser",
+         query="SELECT mailbox FROM Mailbox mailbox WHERE mailbox.name LIKE 
:nameParam and mailbox.user= :userParam and mailbox.namespace= 
:namespaceParam"),
+     @NamedQuery(name="findMailboxWithNameLike",
+         query="SELECT mailbox FROM Mailbox mailbox WHERE mailbox.name LIKE 
:nameParam and mailbox.user is NULL and mailbox.namespace= :namespaceParam"),
+     @NamedQuery(name="countMailboxesWithNameLikeWithUser",
+         query="SELECT COUNT(mailbox) FROM Mailbox mailbox WHERE mailbox.name 
LIKE :nameParam and mailbox.user= :userParam and mailbox.namespace= 
:namespaceParam"),
+     @NamedQuery(name="countMailboxesWithNameLike",
+         query="SELECT COUNT(mailbox) FROM Mailbox mailbox WHERE mailbox.name 
LIKE :nameParam and mailbox.user is NULL and mailbox.namespace= 
:namespaceParam"),
+     @NamedQuery(name="listMailboxes",
+         query="SELECT mailbox FROM Mailbox mailbox")
+ From JPASubscription
+ @NamedQueries({
+     @NamedQuery(name = "findFindMailboxSubscriptionForUser",
+         query = "SELECT subscription FROM Subscription subscription WHERE 
subscription.username = :userParam AND subscription.mailbox = :mailboxParam"),
+     @NamedQuery(name = "findSubscriptionsForUser",
+         query = "SELECT subscription FROM Subscription subscription WHERE 
subscription.username = :userParam")
+ })
+ 

Reply via email to