Cache get_templates results.
authorBenjamin Braatz <benjamin.braatz@graph-it.com>
Wed, 1 Sep 2021 10:31:43 +0000 (12:31 +0200)
committerBenjamin Braatz <benjamin.braatz@graph-it.com>
Wed, 1 Sep 2021 10:31:43 +0000 (12:31 +0200)
controlpi/messagebus.py

index 30ec4b8a7e34bf1f6170e123d135a0b829a77b84..02e45b5544beaee0ebc0895acec84304bde5002d 100644 (file)
@@ -733,6 +733,7 @@ class MessageTemplateRegistry:
         """
         self._clients: List[str] = []
         self._children: Dict[str, Dict[str, MessageTemplateRegistry]] = {}
+        self._templates: Dict[str, List[MessageTemplate]] = {}
 
     def insert(self, template: MessageTemplate, client: str) -> None:
         """Register a client for a template.
@@ -806,6 +807,8 @@ class MessageTemplateRegistry:
             if schema_string not in self._children[key]:
                 self._children[key][schema_string] = MessageTemplateRegistry()
             self._children[key][schema_string].insert(reduced_template, client)
+        if client in self._templates:
+            del self._templates[client]
 
     def delete(self, client: str) -> bool:
         """Unregister a client from all templates.
@@ -861,6 +864,8 @@ class MessageTemplateRegistry:
             if not new_children[key]:
                 del new_children[key]
         self._children = new_children
+        if client in self._templates:
+            del self._templates[client]
         if self._clients or self._children:
             return True
         return False
@@ -969,18 +974,19 @@ class MessageTemplateRegistry:
         >>> r.get_templates('Client 6')
         [{'k1': {'const': 'v1'}}, {'k2': {'const': 'v1'}}]
         """
-        result = []
-        if client in self._clients:
-            result.append(MessageTemplate())
-        for key in self._children:
-            for schema_string in self._children[key]:
-                schema = json.loads(schema_string)
-                child = self._children[key][schema_string]
-                for template in child.get_templates(client):
-                    current = MessageTemplate({key: schema})
-                    current.update(template)
-                    result.append(current)
-        return result
+        if client not in self._templates:
+            self._templates[client] = []
+            if client in self._clients:
+                self._templates[client].append(MessageTemplate())
+            for key in self._children:
+                for schema_string in self._children[key]:
+                    schema = json.loads(schema_string)
+                    child = self._children[key][schema_string]
+                    for template in child.get_templates(client):
+                        current = MessageTemplate({key: schema})
+                        current.update(template)
+                        self._templates[client].append(current)
+        return self._templates[client]
 
 
 class BusException(Exception):