Mercurial > libervia-pubsub
diff sat_pubsub/pgsql_storage.py @ 337:57a3051ee435
storage (pgsql): added getLastItems method, to get last items from a series of nodes and entities (needed for PEP compliance).
author | Goffi <goffi@goffi.org> |
---|---|
date | Sat, 12 Aug 2017 18:11:36 +0200 |
parents | 31cbd8b9fa7f |
children | b49f75a26156 |
line wrap: on
line diff
--- a/sat_pubsub/pgsql_storage.py Sat Aug 12 18:10:14 2017 +0200 +++ b/sat_pubsub/pgsql_storage.py Sat Aug 12 18:11:36 2017 +0200 @@ -338,6 +338,38 @@ return self.defaultConfig[nodeType] + def formatLastItems(self, result): + last_items = [] + for pep_jid_s, node, data, item_access_model in result: + pep_jid = jid.JID(pep_jid_s) + item = generic.stripNamespace(parseXml(data)) + last_items.append((pep_jid, node, item, item_access_model)) + return last_items + + + def getLastItems(self, entities, nodes, node_accesses, item_accesses, pep): + """get last item for several nodes and entities in a single request""" + if not entities or not nodes or not node_accesses or not item_accesses: + raise ValueError("entities, nodes and accesses must not be empty") + if node_accesses != ('open',) or item_accesses != ('open',): + raise NotImplementedError('only "open" access model is handled for now') + if not pep: + raise NotImplementedError(u"getLastItems is only implemented for PEP at the moment") + d = self.dbpool.runQuery("""SELECT DISTINCT ON (node_id) pep, node, data, items.access_model + FROM items + NATURAL JOIN nodes + WHERE nodes.pep IN %s + AND node IN %s + AND nodes.access_model in %s + AND items.access_model in %s + ORDER BY node_id DESC, item_id DESC""", + (tuple([e.userhost() for e in entities]), + nodes, + node_accesses, + item_accesses)) + d.addCallback(self.formatLastItems) + return d + class Node: