@@ -59,8 +59,9 @@ internal object IndexerOrderUtils {
5959
6060 /* *
6161 * Groups indexers by block number proximity. Indexers within [threshold] blocks of each other
62- * are placed in the same group. Dependencies are forced into the same group even if far apart.
63- * Each group is topologically ordered internally.
62+ * are placed in the same group. When a dependency spans groups, only the dependent indexer is
63+ * moved to its dependency's group (not the entire group). Each group is topologically ordered
64+ * internally.
6465 *
6566 * @param indexers The list of indexers to group
6667 * @param threshold Maximum block gap allowed within a group
@@ -77,7 +78,7 @@ internal object IndexerOrderUtils {
7778 var currentGroup = mutableListOf (sorted[0 ])
7879 groups.add(currentGroup)
7980
80- for (i in 1 until sorted.size) {
81+ for (i in 1 .. < sorted.size) {
8182 val gap = sorted[i].getCurrentBlockNumber() - sorted[i - 1 ].getCurrentBlockNumber()
8283 if (gap > threshold) {
8384 currentGroup = mutableListOf ()
@@ -86,26 +87,23 @@ internal object IndexerOrderUtils {
8687 currentGroup.add(sorted[i])
8788 }
8889
89- // Force dependent indexers into the same group
90+ // Move dependent indexers to their dependency's group
9091 val indexerToGroup = mutableMapOf<Indexer , Int >()
9192 groups.forEachIndexed { idx, group -> group.forEach { indexerToGroup[it] = idx } }
9293
93- // Merge groups when a dependency relationship spans groups
94- var merged = true
95- while (merged) {
96- merged = false
94+ var moved = true
95+ while (moved) {
96+ moved = false
9797 for (indexer in indexers) {
9898 val dep = indexer.dependsOn ? : continue
9999 val indexerGroupIdx = indexerToGroup[indexer] ? : continue
100100 val depGroupIdx = indexerToGroup[dep] ? : continue
101101 if (indexerGroupIdx != depGroupIdx) {
102- // Merge into the lower-numbered group (earlier blocks)
103- val targetIdx = minOf(indexerGroupIdx, depGroupIdx)
104- val sourceIdx = maxOf(indexerGroupIdx, depGroupIdx)
105- groups[targetIdx].addAll(groups[sourceIdx])
106- groups[sourceIdx].forEach { indexerToGroup[it] = targetIdx }
107- groups[sourceIdx].clear()
108- merged = true
102+ // Move only the dependent indexer to its dependency's group
103+ groups[indexerGroupIdx].remove(indexer)
104+ groups[depGroupIdx].add(indexer)
105+ indexerToGroup[indexer] = depGroupIdx
106+ moved = true
109107 }
110108 }
111109 }
0 commit comments