| 178 | |
| 179 | |
| 180 | class ArrayCacheBySymbolBySide(ArrayCache): |
| 181 | def __init__(self, max_size=None): |
| 182 | super(ArrayCacheBySymbolBySide, self).__init__(max_size) |
| 183 | self._nested_new_updates_by_symbol = True |
| 184 | self.hashmap = {} |
| 185 | self._index = collections.deque([], max_size) |
| 186 | |
| 187 | def append(self, item): |
| 188 | by_side = self.hashmap.setdefault(item['symbol'], {}) |
| 189 | if item['side'] in by_side: |
| 190 | reference = by_side[item['side']] |
| 191 | if reference != item: |
| 192 | reference.update(item) |
| 193 | item = reference |
| 194 | index = self._index.index(item['symbol'] + item['side']) |
| 195 | del self._deque[index] |
| 196 | del self._index[index] |
| 197 | else: |
| 198 | by_side[item['side']] = item |
| 199 | if len(self._deque) == self._deque.maxlen: |
| 200 | delete_item = self._deque.popleft() |
| 201 | self._index.popleft() |
| 202 | del self.hashmap[delete_item['symbol']][delete_item['side']] |
| 203 | self._deque.append(item) |
| 204 | self._index.append(item['symbol'] + item['side']) |
| 205 | if self._clear_all_updates: |
| 206 | self._clear_all_updates = False |
| 207 | self._clear_updates_by_symbol.clear() |
| 208 | self._all_new_updates = 0 |
| 209 | self._new_updates_by_symbol.clear() |
| 210 | if item['symbol'] not in self._new_updates_by_symbol: |
| 211 | self._new_updates_by_symbol[item['symbol']] = set() |
| 212 | if self._clear_updates_by_symbol.get(item['symbol']): |
| 213 | self._clear_updates_by_symbol[item['symbol']] = False |
| 214 | self._new_updates_by_symbol[item['symbol']].clear() |
| 215 | side_set = self._new_updates_by_symbol[item['symbol']] |
| 216 | before_length = len(side_set) |
| 217 | side_set.add(item['side']) |
| 218 | after_length = len(side_set) |
| 219 | self._all_new_updates = (self._all_new_updates or 0) + (after_length - before_length) |
no outgoing calls
searching dependent graphs…