annotate merge.py @ 12:032e59be8fe9

refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
author drewp@bigasterisk.com
date Fri, 25 Nov 2022 20:58:08 -0800
parents
children bfd95926be6e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
1 import collections
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
2 from typing import Callable, Dict, List, Optional, Sequence, Set, Tuple, Union, NewType
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
3 from prometheus_client import Summary
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
4
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
5 from rdfdb.patch import Patch
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
6 from rdflib import Namespace, URIRef
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
7 from rdflib.term import Node
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
8 from standardservice.logsetup import enableTwistedLog, log
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
9 from patchsink import PatchSink
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
10 LOCAL_STATEMENTS_PATCH_CALLS = Summary("local_statements_patch_calls", 'calls')
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
11 MAKE_SYNC_PATCH_CALLS = Summary("make_sync_patch_calls", 'calls')
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
12 REPLACE_SOURCE_STATEMENTS_CALLS = Summary("replace_source_statements_calls", 'calls')
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
13
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
14 SourceUri = NewType('SourceUri', URIRef)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
15
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
16 Statement = Tuple[Node, Node, Node, Node]
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
17 StatementTable = Dict[Statement, Tuple[Set[SourceUri], Set[PatchSink]]]
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
18
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
19 ROOM = Namespace("http://projects.bigasterisk.com/room/")
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
20 COLLECTOR = SourceUri(URIRef('http://bigasterisk.com/sse_collector/'))
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
21
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
22
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
23 def abbrevTerm(t: Union[URIRef, Node]) -> Union[str, Node]:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
24 if isinstance(t, URIRef):
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
25 return (t.replace('http://projects.bigasterisk.com/room/', 'room:').replace('http://projects.bigasterisk.com/device/',
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
26 'dev:').replace('http://bigasterisk.com/sse_collector/', 'sc:'))
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
27 return t
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
28
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
29
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
30 def abbrevStmt(stmt: Statement) -> str:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
31 return '(%s %s %s %s)' % (abbrevTerm(stmt[0]), abbrevTerm(stmt[1]), abbrevTerm(stmt[2]), abbrevTerm(stmt[3]))
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
32
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
33
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
34 class LocalStatements(object):
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
35 """
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
36 functions that make statements originating from sse_collector itself
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
37 """
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
38
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
39 def __init__(self, applyPatch: Callable[[SourceUri, Patch], None]):
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
40 self.applyPatch = applyPatch
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
41 self._sourceState: Dict[SourceUri, Optional[URIRef]] = {} # source: state URIRef
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
42
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
43 @LOCAL_STATEMENTS_PATCH_CALLS.time()
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
44 def setSourceState(self, source: SourceUri, state: Optional[URIRef]):
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
45 """
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
46 add a patch to the COLLECTOR graph about the state of this
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
47 source. state=None to remove the source.
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
48 """
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
49 oldState = self._sourceState.get(source, None)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
50 if state == oldState:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
51 return
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
52 log.info('source state %s -> %s', source, state)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
53 if oldState is None:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
54 self._sourceState[source] = state
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
55 self.applyPatch(COLLECTOR, Patch(addQuads=[
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
56 (COLLECTOR, ROOM['source'], source, COLLECTOR),
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
57 (source, ROOM['state'], state, COLLECTOR),
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
58 ]))
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
59 elif state is None:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
60 del self._sourceState[source]
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
61 self.applyPatch(COLLECTOR, Patch(delQuads=[
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
62 (COLLECTOR, ROOM['source'], source, COLLECTOR),
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
63 (source, ROOM['state'], oldState, COLLECTOR),
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
64 ]))
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
65 else:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
66 self._sourceState[source] = state
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
67 self.applyPatch(COLLECTOR, Patch(addQuads=[
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
68 (source, ROOM['state'], state, COLLECTOR),
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
69 ], delQuads=[
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
70 (source, ROOM['state'], oldState, COLLECTOR),
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
71 ]))
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
72
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
73
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
74 class PostDeleter(object):
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
75
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
76 def __init__(self, statements: StatementTable):
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
77 self.statements = statements
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
78
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
79 def __enter__(self):
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
80 self._garbage: List[Statement] = []
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
81 return self
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
82
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
83 def add(self, stmt: Statement):
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
84 self._garbage.append(stmt)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
85
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
86 def __exit__(self, type, value, traceback):
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
87 if type is not None:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
88 raise NotImplementedError()
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
89 for stmt in self._garbage:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
90 del self.statements[stmt]
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
91
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
92
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
93 class ActiveStatements(object):
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
94
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
95 def __init__(self):
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
96 # This table holds statements asserted by any of our sources
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
97 # plus local statements that we introduce (source is
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
98 # http://bigasterisk.com/sse_collector/).
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
99 self.table: StatementTable = collections.defaultdict(lambda: (set(), set()))
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
100
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
101 def state(self) -> Dict:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
102 return {
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
103 'len': len(self.table),
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
104 }
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
105
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
106 def postDeleteStatements(self) -> PostDeleter:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
107 return PostDeleter(self.table)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
108
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
109 def pprintTable(self) -> None:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
110 for i, (stmt, (sources, handlers)) in enumerate(sorted(self.table.items())):
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
111 print("%03d. %-80s from %s to %s" % (i, abbrevStmt(stmt), [abbrevTerm(s) for s in sources], handlers))
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
112
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
113 @MAKE_SYNC_PATCH_CALLS.time()
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
114 def makeSyncPatch(self, handler: PatchSink, sources: Set[SourceUri]):
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
115 # todo: this could run all handlers at once, which is how we
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
116 # use it anyway
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
117 adds = []
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
118 dels = []
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
119
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
120 with self.postDeleteStatements() as garbage:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
121 for stmt, (stmtSources, handlers) in self.table.items():
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
122 belongsInHandler = not sources.isdisjoint(stmtSources)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
123 handlerHasIt = handler in handlers
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
124 # log.debug("%s belong=%s has=%s",
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
125 # abbrevStmt(stmt), belongsInHandler, handlerHasIt)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
126 if belongsInHandler and not handlerHasIt:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
127 adds.append(stmt)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
128 handlers.add(handler)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
129 elif not belongsInHandler and handlerHasIt:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
130 dels.append(stmt)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
131 handlers.remove(handler)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
132 if not handlers and not stmtSources:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
133 garbage.add(stmt)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
134
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
135 return Patch(addQuads=adds, delQuads=dels)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
136
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
137 def applySourcePatch(self, source: SourceUri, p: Patch):
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
138 for stmt in p.addQuads:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
139 sourceUrls, handlers = self.table[stmt]
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
140 if source in sourceUrls:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
141 raise ValueError("%s added stmt that it already had: %s" % (source, abbrevStmt(stmt)))
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
142 sourceUrls.add(source)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
143
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
144 with self.postDeleteStatements() as garbage:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
145 for stmt in p.delQuads:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
146 sourceUrls, handlers = self.table[stmt]
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
147 if source not in sourceUrls:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
148 raise ValueError("%s deleting stmt that it didn't have: %s" % (source, abbrevStmt(stmt)))
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
149 sourceUrls.remove(source)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
150 # this is rare, since some handler probably still has
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
151 # the stmt we're deleting, but it can happen e.g. when
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
152 # a handler was just deleted
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
153 if not sourceUrls and not handlers:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
154 garbage.add(stmt)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
155
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
156 @REPLACE_SOURCE_STATEMENTS_CALLS.time()
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
157 def replaceSourceStatements(self, source: SourceUri, stmts: Sequence[Statement]):
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
158 log.debug('replaceSourceStatements with %s stmts', len(stmts))
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
159 newStmts = set(stmts)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
160
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
161 with self.postDeleteStatements() as garbage:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
162 for stmt, (sources, handlers) in self.table.items():
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
163 if source in sources:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
164 if stmt not in stmts:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
165 sources.remove(source)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
166 if not sources and not handlers:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
167 garbage.add(stmt)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
168 else:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
169 if stmt in stmts:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
170 sources.add(source)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
171 newStmts.discard(stmt)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
172
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
173 self.applySourcePatch(source, Patch(addQuads=newStmts, delQuads=[]))
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
174
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
175 def discardHandler(self, handler: PatchSink):
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
176 with self.postDeleteStatements() as garbage:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
177 for stmt, (sources, handlers) in self.table.items():
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
178 handlers.discard(handler)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
179 if not sources and not handlers:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
180 garbage.add(stmt)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
181
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
182 def discardSource(self, source: SourceUri):
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
183 with self.postDeleteStatements() as garbage:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
184 for stmt, (sources, handlers) in self.table.items():
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
185 sources.discard(source)
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
186 if not sources and not handlers:
032e59be8fe9 refactor to separate the nonweb stuff a bit, in prep for cyclone->starlette
drewp@bigasterisk.com
parents:
diff changeset
187 garbage.add(stmt)