Pre-parse StanzaPath paths to speed up matching.

The parsing and namespace cleaning isn't terribly expensive, but it does
add up. It was adding an extra 5sec when processing 100,000 basic
message stanzas.
This commit is contained in:
Lance Stout
2012-01-17 22:28:44 -08:00
parent 4274f49ada
commit 2923f56561
2 changed files with 57 additions and 42 deletions
+10 -1
View File
@@ -10,6 +10,7 @@
"""
from sleekxmpp.xmlstream.matcher.base import MatcherBase
from sleekxmpp.xmlstream.stanzabase import fix_ns
class StanzaPath(MatcherBase):
@@ -18,8 +19,16 @@ class StanzaPath(MatcherBase):
The StanzaPath matcher selects stanzas that match a given "stanza path",
which is similar to a normal XPath except that it uses the interfaces and
plugins of the stanza instead of the actual, underlying XML.
:param criteria: Object to compare some aspect of a stanza against.
"""
def __init__(self, criteria):
self._criteria = fix_ns(criteria, split=True,
propagate_ns=False,
default_ns='jabber:client')
self._raw_criteria = criteria
def match(self, stanza):
"""
Compare a stanza against a "stanza path". A stanza path is similar to
@@ -31,4 +40,4 @@ class StanzaPath(MatcherBase):
:param stanza: The :class:`~sleekxmpp.xmlstream.stanzabase.ElementBase`
stanza to compare against.
"""
return stanza.match(self._criteria)
return stanza.match(self._criteria) or stanza.match(self._raw_criteria)