Comment 7 for bug 497386

Revision history for this message
Gavin Panella (allenap) wrote :

Actually, it's not entirely pointless; it made me think of something
else. Have a look at the following (needs PostgreSQL 8.4 again):

A view of indexed messages:

{{{
CREATE VIEW indexedmessage AS
  SELECT message.*,
         -1 + row_number() OVER (
            PARTITION BY bugtask.id
            ORDER BY message.datecreated, message.id) AS index,
         bugtask.id AS inside
    FROM message, bugmessage, bugtask
   WHERE bugmessage.message = message.id
     AND bugmessage.bug = bugtask.bug;

GRANT SELECT ON indexedmessage TO PUBLIC;
}}}

The Storm model class (well, with some SQLObject shim stuff still
around because Message hasn't changed yet):

{{{
from canonical.launchpad.database.message import Message
from canonical.launchpad.interfaces.message import IIndexedMessage

class IndexedMessage(Message):

    implements(IIndexedMessage)

    _table = "IndexedMessage"
    _defaultOrder = 'index'

    index = Int()

    insideID = Int("inside", allow_none=False)
    inside = Reference(insideID, "BugTask.id")
}}}

In use:

{{{
bug = BugSet().get(15)
bugtask = bug.default_bugtask

from storm import tracer
tracer.debug(True)

# All messages.
print [
    (im.id, im.index, im.insideID)
    for im in store.find(
        IndexedMessage, IndexedMessage.inside == bugtask)
    ]

# Slicing.
print [
    (im.id, im.index, im.insideID)
    for im in store.find(
        IndexedMessage, IndexedMessage.inside == bugtask)[3:5]
    ]

tracer.debug(False)
}}}