Skip to content

Commit 160b7d2

Browse files
Alternative algorithm for operation matcher (#707)
1 parent ecd54ce commit 160b7d2

File tree

4 files changed

+34
-7
lines changed

4 files changed

+34
-7
lines changed

docs/config/reference.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<!-- markdownlint-disable first-line-h1 no-space-in-emphasis -->
22
<dl class="py class">
33
<dt class="sig sig-object py" id="DipDupConfig">
4-
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre"></span></span><span class="sig-name descname"><span class="pre">DipDupConfig</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">spec_version</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">package</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">datasources=&lt;factory&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">database=SqliteDatabaseConfig(kind='sqlite'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">path=':memory:')</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">contracts=&lt;factory&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">indexes=&lt;factory&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">templates=&lt;factory&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">jobs=&lt;factory&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">hooks=&lt;factory&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">hasura=None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">sentry=SentryConfig(dsn=''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">environment=None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">server_name=None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">release=None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">user_id=None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">debug=False)</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prometheus=None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">advanced=AdvancedConfig(reindex={}</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">scheduler=None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">postpone_jobs=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">early_realtime=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">merge_subscriptions=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">metadata_interface=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">skip_version_check=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">rollback_depth=2</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">crash_reporting=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">decimal_precision=None)</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">custom=&lt;factory&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">logging=LoggingValues.default</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#DipDupConfig" title="Permalink to this definition">¶</a></dt>
4+
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre"></span></span><span class="sig-name descname"><span class="pre">DipDupConfig</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">spec_version</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">package</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">datasources=&lt;factory&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">database=SqliteDatabaseConfig(kind='sqlite'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">path=':memory:')</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">contracts=&lt;factory&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">indexes=&lt;factory&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">templates=&lt;factory&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">jobs=&lt;factory&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">hooks=&lt;factory&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">hasura=None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">sentry=SentryConfig(dsn=''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">environment=None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">server_name=None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">release=None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">user_id=None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">debug=False)</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prometheus=None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">advanced=AdvancedConfig(reindex={}</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">scheduler=None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">postpone_jobs=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">early_realtime=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">merge_subscriptions=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">metadata_interface=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">skip_version_check=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">rollback_depth=2</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">crash_reporting=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">decimal_precision=None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">alt_operation_matcher=False)</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">custom=&lt;factory&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">logging=LoggingValues.default</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#DipDupConfig" title="Permalink to this definition">¶</a></dt>
55
<dd><p>Main indexer config</p>
66
<dl class="field-list simple">
77
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
@@ -28,7 +28,7 @@
2828

2929
<dl class="py class">
3030
<dt class="sig sig-object py" id="AdvancedConfig">
31-
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre"></span></span><span class="sig-name descname"><span class="pre">AdvancedConfig</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">reindex=&lt;factory&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">scheduler=None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">postpone_jobs=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">early_realtime=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">merge_subscriptions=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">metadata_interface=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">skip_version_check=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">rollback_depth=2</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">crash_reporting=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">decimal_precision=None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#AdvancedConfig" title="Permalink to this definition">¶</a></dt>
31+
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre"></span></span><span class="sig-name descname"><span class="pre">AdvancedConfig</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">reindex=&lt;factory&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">scheduler=None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">postpone_jobs=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">early_realtime=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">merge_subscriptions=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">metadata_interface=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">skip_version_check=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">rollback_depth=2</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">crash_reporting=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">decimal_precision=None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">alt_operation_matcher=False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#AdvancedConfig" title="Permalink to this definition">¶</a></dt>
3232
<dd><p>Feature flags and other advanced config.</p>
3333
<dl class="field-list simple">
3434
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
@@ -43,6 +43,7 @@
4343
<li><p><strong>rollback_depth</strong> (<em>int</em>) – A number of levels to keep for rollback</p></li>
4444
<li><p><strong>crash_reporting</strong> (<em>bool</em>) – Enable crash reporting</p></li>
4545
<li><p><strong>decimal_precision</strong> (<em>int</em><em> | </em><em>None</em>) – Adjust decimal context precision.</p></li>
46+
<li><p><strong>alt_operation_matcher</strong> (<em>bool</em>) – Use different algorithm to match operations (undocumented)</p></li>
4647
</ul>
4748
</dd>
4849
</dl>

src/dipdup/config.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1474,6 +1474,7 @@ class AdvancedConfig:
14741474
:param rollback_depth: A number of levels to keep for rollback
14751475
:param crash_reporting: Enable crash reporting
14761476
:param decimal_precision: Adjust decimal context precision.
1477+
:param alt_operation_matcher: Use different algorithm to match operations (undocumented)
14771478
"""
14781479

14791480
reindex: dict[ReindexingReason, ReindexingAction] = field(default_factory=dict)
@@ -1486,6 +1487,7 @@ class AdvancedConfig:
14861487
rollback_depth: int = 2
14871488
crash_reporting: bool = False
14881489
decimal_precision: int | None = None
1490+
alt_operation_matcher: bool = False
14891491

14901492

14911493
@dataclass

src/dipdup/indexes/operation/index.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -277,13 +277,14 @@ async def _process_level_operations(
277277
for operation_subgroup in operation_subgroups:
278278
if isinstance(self._config, OperationUnfilteredIndexConfig):
279279
subgroup_handlers = match_operation_unfiltered_subgroup(
280-
self._config,
281-
operation_subgroup,
280+
index=self._config,
281+
operation_subgroup=operation_subgroup,
282282
)
283283
else:
284284
subgroup_handlers = match_operation_subgroup(
285-
self._config.handlers,
286-
operation_subgroup,
285+
handlers=self._config.handlers,
286+
operation_subgroup=operation_subgroup,
287+
alt=self._ctx.config.advanced.alt_operation_matcher,
287288
)
288289

289290
if subgroup_handlers:

src/dipdup/indexes/operation/matcher.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ def match_operation_unfiltered_subgroup(
143143
def match_operation_subgroup(
144144
handlers: Iterable[OperationHandlerConfig],
145145
operation_subgroup: OperationSubgroup,
146+
alt: bool = False,
146147
) -> deque[MatchedOperationsT]:
147148
"""Try to match operation subgroup with all index handlers."""
148149
matched_handlers: deque[MatchedOperationsT] = deque()
@@ -193,4 +194,26 @@ def match_operation_subgroup(
193194
args = prepare_operation_handler_args(handler_config, matched_operations)
194195
matched_handlers.append((operation_subgroup, handler_config, args))
195196

196-
return matched_handlers
197+
if not (alt and len(matched_handlers) in (0, 1)):
198+
return matched_handlers
199+
200+
# NOTE: Below is a secret algorithm for very special cases
201+
index_list = list(range(len(matched_handlers)))
202+
id_list = []
203+
for handler in matched_handlers:
204+
transaction = handler[2][-1]
205+
if isinstance(transaction, OperationData):
206+
id_list.append(transaction.id)
207+
elif isinstance(transaction, Transaction):
208+
id_list.append(transaction.data.id)
209+
else:
210+
raise FrameworkException('Type of the first handler argument is unknown')
211+
212+
sorted_index_list = [x for _, x in sorted(zip(id_list, index_list))]
213+
if index_list == sorted_index_list:
214+
return matched_handlers
215+
216+
sorted_matched_handlers: deque[MatchedOperationsT] = deque()
217+
for index in sorted_index_list:
218+
sorted_matched_handlers.append(matched_handlers[index])
219+
return sorted_matched_handlers

0 commit comments

Comments
 (0)