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
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:
{{{
PARTITION BY bugtask.id datecreated, message.id) AS index,
CREATE VIEW indexedmessage AS
SELECT message.*,
-1 + row_number() OVER (
ORDER BY message.
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):
{{{ launchpad. database. message import Message launchpad. interfaces. message import IIndexedMessage
from canonical.
from canonical.
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.
IndexedMessage , IndexedMessage. inside == bugtask)
print [
(im.id, im.index, im.insideID)
for im in store.find(
]
# Slicing.
IndexedMessage , IndexedMessage. inside == bugtask)[3:5]
print [
(im.id, im.index, im.insideID)
for im in store.find(
]
tracer.debug(False)
}}}