Skip to content

Commit c57902d

Browse files
authored
Merge pull request #484 from hack-a-chain-software/issue-405
refactor: transactions count improvement; transfers query improvement
2 parents 245f8be + 2be9fe8 commit c57902d

File tree

13 files changed

+391
-168
lines changed

13 files changed

+391
-168
lines changed

indexer/migrations/20250902193850-modify-transfer-indexes-with-includes.js

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,40 +3,21 @@
33
/** @type {import('sequelize-cli').Migration} */
44
module.exports = {
55
async up(queryInterface) {
6-
// Remove old indexes
76
await queryInterface.removeIndex('Transfers', 'to_acct_idx');
87
await queryInterface.removeIndex('Transfers', 'from_acct_idx');
98

10-
// Drop and recreate existing indexes with INCLUDE columns
119
await queryInterface.removeIndex('Transfers', 'transfers_from_acct_creationtime_id_idx');
1210
await queryInterface.removeIndex('Transfers', 'transfers_to_acct_creationtime_id_idx');
13-
14-
// Create new indexes with INCLUDE columns using raw SQL
15-
await queryInterface.sequelize.query(`
16-
CREATE INDEX transfers_from_acct_creationtime_id_idx ON "Transfers" USING btree (from_acct, creationtime, id)
17-
INCLUDE (amount, "chainId", "transactionId", to_acct, modulename, modulehash, requestkey, "orderIndex", "tokenId")
18-
`);
19-
20-
await queryInterface.sequelize.query(`
21-
CREATE INDEX transfers_to_acct_creationtime_id_idx ON "Transfers" USING btree (to_acct, creationtime, id)
22-
INCLUDE (amount, "chainId", "transactionId", from_acct, modulename, modulehash, requestkey, "orderIndex", "tokenId")
23-
`);
2411
},
2512

2613
async down(queryInterface) {
27-
// Drop the new indexes
28-
await queryInterface.removeIndex('Transfers', 'transfers_from_acct_creationtime_id_idx');
29-
await queryInterface.removeIndex('Transfers', 'transfers_to_acct_creationtime_id_idx');
30-
31-
// Recreate the original indexes without INCLUDE
3214
await queryInterface.addIndex('Transfers', ['from_acct', 'creationtime', 'id'], {
3315
name: 'transfers_from_acct_creationtime_id_idx',
3416
});
3517
await queryInterface.addIndex('Transfers', ['to_acct', 'creationtime', 'id'], {
3618
name: 'transfers_to_acct_creationtime_id_idx',
3719
});
3820

39-
// Recreate the old simple indexes
4021
await queryInterface.addIndex('Transfers', ['to_acct'], {
4122
name: 'to_acct_idx',
4223
});
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
'use strict';
2+
3+
/** @type {import('sequelize-cli').Migration} */
4+
module.exports = {
5+
async up(queryInterface) {
6+
await queryInterface.removeIndex('Transfers', 'transfers_creationtime_id_idx');
7+
await queryInterface.removeIndex('Transfers', 'transfers_type_idx');
8+
await queryInterface.removeIndex('Transfers', 'transfers_from_acct_modulename_idx');
9+
await queryInterface.removeIndex('Transfers', 'transfers_chainid_from_acct_modulename_idx');
10+
await queryInterface.removeIndex('Transfers', 'transfers_chainid_to_acct_modulename_idx');
11+
},
12+
13+
async down(queryInterface) {
14+
await queryInterface.addIndex('Transfers', ['creationtime', 'id'], {
15+
name: 'transfers_creationtime_id_idx',
16+
});
17+
await queryInterface.addIndex('Transfers', ['type'], {
18+
name: 'transfers_type_idx',
19+
});
20+
await queryInterface.addIndex('Transfers', ['from_acct', 'modulename'], {
21+
name: 'transfers_from_acct_modulename_idx',
22+
});
23+
await queryInterface.addIndex('Transfers', ['chainId', 'from_acct', 'modulename'], {
24+
name: 'transfers_chainid_from_acct_modulename_idx',
25+
});
26+
await queryInterface.addIndex('Transfers', ['chainId', 'to_acct', 'modulename'], {
27+
name: 'transfers_chainid_to_acct_modulename_idx',
28+
});
29+
},
30+
};
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
'use strict';
2+
3+
/** @type {import('sequelize-cli').Migration} */
4+
module.exports = {
5+
async up(queryInterface, Sequelize) {
6+
// For use case 1: where hasTokenId = ...
7+
await queryInterface.sequelize.query(
8+
'ALTER INDEX "transfers_hasTokenId_idx" RENAME TO "transfers_hasTokenId_count_idx";',
9+
);
10+
await queryInterface.addIndex('Transfers', ['hasTokenId', 'creationtime', 'id'], {
11+
name: 'transfers_hasTokenId_creationtime_id_idx',
12+
});
13+
14+
// For use case 2: where modulename = ...
15+
await queryInterface.sequelize.query(
16+
'ALTER INDEX transfers_modulename_idx RENAME TO transfers_modulename_count_idx;',
17+
);
18+
await queryInterface.addIndex('Transfers', ['modulename', 'creationtime', 'id'], {
19+
name: 'transfers_modulename_creationtime_id_idx',
20+
});
21+
22+
// For use case 3: where (from_acct = ... OR to_acct = ...) and hasTokenId = ...
23+
await queryInterface.addIndex('Transfers', ['from_acct', 'hasTokenId'], {
24+
name: 'transfers_from_acct_hasTokenId_count_idx',
25+
});
26+
await queryInterface.addIndex('Transfers', ['to_acct', 'hasTokenId'], {
27+
name: 'transfers_to_acct_hasTokenId_count_idx',
28+
});
29+
await queryInterface.addIndex('Transfers', ['from_acct', 'hasTokenId', 'creationtime', 'id'], {
30+
name: 'transfers_from_acct_hasTokenId_creationtime_id_idx',
31+
});
32+
await queryInterface.addIndex('Transfers', ['to_acct', 'hasTokenId', 'creationtime', 'id'], {
33+
name: 'transfers_to_acct_hasTokenId_creationtime_id_idx',
34+
});
35+
36+
// -- For use case 4: where chainId = ... and hasTokenId = ...
37+
await queryInterface.addIndex('Transfers', ['chainId', 'hasTokenId'], {
38+
name: 'transfers_chainId_hasTokenId_idx',
39+
});
40+
await queryInterface.addIndex('Transfers', ['chainId', 'hasTokenId', 'creationtime', 'id'], {
41+
name: 'transfers_chainId_hasTokenId_creationtime_id_idx',
42+
});
43+
44+
// -- For use case 5: where (from_acct = ... OR to_acct = ...) and hasTokenId = ... and chainId = ...
45+
await queryInterface.addIndex('Transfers', ['from_acct', 'hasTokenId', 'chainId'], {
46+
name: 'transfers_from_acct_hasTokenId_chainId_count_idx',
47+
});
48+
await queryInterface.addIndex('Transfers', ['to_acct', 'hasTokenId', 'chainId'], {
49+
name: 'transfers_to_acct_hasTokenId_chainId_count_idx',
50+
});
51+
await queryInterface.addIndex(
52+
'Transfers',
53+
['from_acct', 'hasTokenId', 'chainId', 'creationtime', 'id'],
54+
{
55+
name: 'transfers_from_acct_hasTokenId_chainId_creationtime_id_idx',
56+
},
57+
);
58+
await queryInterface.addIndex(
59+
'Transfers',
60+
['to_acct', 'hasTokenId', 'chainId', 'creationtime', 'id'],
61+
{
62+
name: 'transfers_to_acct_hasTokenId_chainId_creationtime_id_idx',
63+
},
64+
);
65+
66+
// -- For use case 6: where (from_acct = ... OR to_acct = ...) ... and modulename = ...
67+
await queryInterface.addIndex('Transfers', ['from_acct', 'modulename'], {
68+
name: 'transfers_from_acct_modulename_count_idx',
69+
});
70+
await queryInterface.addIndex('Transfers', ['to_acct', 'modulename'], {
71+
name: 'transfers_to_acct_modulename_count_idx',
72+
});
73+
await queryInterface.addIndex('Transfers', ['from_acct', 'modulename', 'creationtime', 'id'], {
74+
name: 'transfers_from_acct_modulename_creationtime_id_idx',
75+
});
76+
await queryInterface.addIndex('Transfers', ['to_acct', 'modulename', 'creationtime', 'id'], {
77+
name: 'transfers_to_acct_modulename_creationtime_id_idx',
78+
});
79+
80+
// -- For use case 7: where (from_acct = ... OR to_acct = ...) ... and chainId = ... and modulename = ...
81+
await queryInterface.addIndex('Transfers', ['from_acct', 'chainId', 'modulename'], {
82+
name: 'transfers_from_acct_chainId_modulename_count_idx',
83+
});
84+
await queryInterface.addIndex('Transfers', ['to_acct', 'chainId', 'modulename'], {
85+
name: 'transfers_to_acct_chainId_modulename_count_idx',
86+
});
87+
await queryInterface.addIndex(
88+
'Transfers',
89+
['from_acct', 'chainId', 'modulename', 'creationtime', 'id'],
90+
{
91+
name: 'transfers_from_acct_chainId_modulename_creationtime_id_idx',
92+
},
93+
);
94+
await queryInterface.addIndex(
95+
'Transfers',
96+
['to_acct', 'chainId', 'modulename', 'creationtime', 'id'],
97+
{
98+
name: 'transfers_to_acct_chainId_modulename_creationtime_id_idx',
99+
},
100+
);
101+
},
102+
103+
async down(queryInterface) {
104+
// For use case 1: where hasTokenId = ...
105+
await queryInterface.sequelize.query(
106+
'ALTER INDEX transfers_hasTokenId_count_idx RENAME TO transfers_hasTokenId_idx;',
107+
);
108+
await queryInterface.removeIndex('Transfers', 'transfers_hasTokenId_creationtime_id_idx');
109+
110+
// For use case 2: where modulename = ...
111+
await queryInterface.sequelize.query(
112+
'ALTER INDEX transfers_modulename_count_idx RENAME TO transfers_modulename_idx;',
113+
);
114+
await queryInterface.removeIndex('Transfers', 'transfers_modulename_creationtime_id_idx');
115+
116+
// For use case 3: where (from_acct = ... OR to_acct = ...) and hasTokenId = ...
117+
await queryInterface.removeIndex('Transfers', 'transfers_from_acct_hasTokenId_count_idx');
118+
await queryInterface.removeIndex('Transfers', 'transfers_to_acct_hasTokenId_count_idx');
119+
await queryInterface.removeIndex(
120+
'Transfers',
121+
'transfers_from_acct_hasTokenId_creationtime_id_idx',
122+
);
123+
await queryInterface.removeIndex(
124+
'Transfers',
125+
'transfers_to_acct_hasTokenId_creationtime_id_idx',
126+
);
127+
128+
// For use case 4: where chainId = ... and hasTokenId = ...
129+
await queryInterface.removeIndex('Transfers', 'transfers_chainId_hasTokenId_idx');
130+
await queryInterface.removeIndex(
131+
'Transfers',
132+
'transfers_chainId_hasTokenId_creationtime_id_idx',
133+
);
134+
135+
// For use case 5: where (from_acct = ... OR to_acct = ...) and hasTokenId = ... and chainId = ...
136+
await queryInterface.removeIndex(
137+
'Transfers',
138+
'transfers_from_acct_hasTokenId_chainId_count_idx',
139+
);
140+
await queryInterface.removeIndex('Transfers', 'transfers_to_acct_hasTokenId_chainId_count_idx');
141+
await queryInterface.removeIndex(
142+
'Transfers',
143+
'transfers_from_acct_hasTokenId_chainId_creationtime_id_idx',
144+
);
145+
await queryInterface.removeIndex(
146+
'Transfers',
147+
'transfers_to_acct_hasTokenId_chainId_creationtime_id_idx',
148+
);
149+
150+
// For use case 6: where (from_acct = ... OR to_acct = ...) and modulename = ...
151+
await queryInterface.removeIndex('Transfers', 'transfers_from_acct_modulename_count_idx');
152+
await queryInterface.removeIndex('Transfers', 'transfers_to_acct_modulename_count_idx');
153+
await queryInterface.removeIndex(
154+
'Transfers',
155+
'transfers_from_acct_modulename_creationtime_id_idx',
156+
);
157+
await queryInterface.removeIndex(
158+
'Transfers',
159+
'transfers_to_acct_modulename_creationtime_id_idx',
160+
);
161+
162+
// For use case 7: where (from_acct = ... OR to_acct = ...) and chainId = ... and modulename = ...
163+
await queryInterface.removeIndex(
164+
'Transfers',
165+
'transfers_from_acct_chainId_modulename_count_idx',
166+
);
167+
await queryInterface.removeIndex('Transfers', 'transfers_to_acct_chainId_modulename_count_idx');
168+
await queryInterface.removeIndex(
169+
'Transfers',
170+
'transfers_from_acct_chainId_modulename_creationtime_id_idx',
171+
);
172+
await queryInterface.removeIndex(
173+
'Transfers',
174+
'transfers_to_acct_chainId_modulename_creationtime_id_idx',
175+
);
176+
},
177+
};

indexer/src/kadena-server/config/schema.graphql

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -353,15 +353,17 @@ type Query {
353353
Retrieve transfers. Default page size is 20.
354354
"""
355355
transfers(
356-
accountName: String
357356
after: String
358357
before: String
359-
blockHash: String
360-
chainId: String
361358
first: Int
362-
fungibleName: String
363359
last: Int
360+
361+
blockHash: String
364362
requestKey: String
363+
364+
accountName: String
365+
chainId: String
366+
fungibleName: String
365367
isNFT: Boolean
366368
): QueryTransfersConnection! @complexity(value: 1, multipliers: ["first", "last"])
367369

0 commit comments

Comments
 (0)