| 140 | self._index = collections.deque([], max_size) |
| 141 | |
| 142 | def append(self, item): |
| 143 | by_id = self.hashmap.setdefault(item['symbol'], {}) |
| 144 | if item['id'] in by_id: |
| 145 | reference = by_id[item['id']] |
| 146 | if reference != item: |
| 147 | reference.update(item) |
| 148 | item = reference |
| 149 | index = self._index.index(item['id']) |
| 150 | del self._deque[index] |
| 151 | del self._index[index] |
| 152 | else: |
| 153 | by_id[item['id']] = item |
| 154 | if len(self._deque) == self._deque.maxlen: |
| 155 | delete_item = self._deque.popleft() |
| 156 | self._index.popleft() |
| 157 | try: |
| 158 | del self.hashmap[delete_item['symbol']][delete_item['id']] |
| 159 | except Exception as e: |
| 160 | logger.error(f"Error deleting item from hashmap: {delete_item}. Error:{e}") |
| 161 | self._deque.append(item) |
| 162 | self._index.append(item['id']) |
| 163 | if self._clear_all_updates: |
| 164 | self._clear_all_updates = False |
| 165 | self._clear_updates_by_symbol.clear() |
| 166 | self._all_new_updates = 0 |
| 167 | self._new_updates_by_symbol.clear() |
| 168 | if item['symbol'] not in self._new_updates_by_symbol: |
| 169 | self._new_updates_by_symbol[item['symbol']] = set() |
| 170 | if self._clear_updates_by_symbol.get(item['symbol']): |
| 171 | self._clear_updates_by_symbol[item['symbol']] = False |
| 172 | self._new_updates_by_symbol[item['symbol']].clear() |
| 173 | id_set = self._new_updates_by_symbol[item['symbol']] |
| 174 | before_length = len(id_set) |
| 175 | id_set.add(item['id']) |
| 176 | after_length = len(id_set) |
| 177 | self._all_new_updates = (self._all_new_updates or 0) + (after_length - before_length) |
| 178 | |
| 179 | |
| 180 | class ArrayCacheBySymbolBySide(ArrayCache): |