Skip to content

Commit d0d8ba0

Browse files
committed
Remove sequelize pagination in full db tasks cause uh... it has a lot of problems that make no sense to me.
1 parent e7bfcdc commit d0d8ba0

File tree

4 files changed

+78
-69
lines changed

4 files changed

+78
-69
lines changed

lib/dboptimize.js

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,22 +34,38 @@ export async function optimizeDatabaseKws() {
3434
let dbLength = await File.count();
3535
let optimizeTasks = [];
3636
let resolvedTasks = [];
37+
let promiseIndex = 0;
38+
let currentIndex = 0;
39+
let result = await File.findAll({
40+
order: ["id", "filename"],
41+
attributes: [
42+
"id",
43+
"filename",
44+
"filenamekws",
45+
"category",
46+
"categorykws",
47+
"subcategories",
48+
"subcategorieskws",
49+
"region",
50+
"regionkws",
51+
"type",
52+
"nongame"
53+
],
54+
});
3755
for (let i = 0; i < dbLength; ) {
56+
let loopIndexStart = i;
3857
singleLineStatus(
3958
`Optimizing Keywords: ${i} / ${dbLength} ${((i / dbLength) * 100).toFixed(
4059
2
4160
)}% (${proctime.elapsed()})`
4261
);
43-
let result = await File.findAndCountAll({
44-
limit: BATCH_SIZE,
45-
offset: i,
46-
order: ["id", "filename"],
47-
});
48-
for (let x = 0; x < result.rows.length; x++) {
49-
debugPrint(`Submitting job for: ${result.rows[x]["filename"]}`);
62+
63+
for (let x = i; x < currentIndex + BATCH_SIZE; x++) {
64+
if(x >= dbLength) break; //Abort abandon ship, otherwise we sink
65+
debugPrint(`Submitting job for: ${result[x].filename}`);
5066
let data = [];
5167
for (let column in keywords) {
52-
data[column] = result.rows[x][column];
68+
data[column] = result[x][column];
5369
}
5470
optimizeTasks.push(
5571
piscina
@@ -66,23 +82,28 @@ export async function optimizeDatabaseKws() {
6682
);
6783
i++;
6884
}
85+
currentIndex = i;
6986
let settledTasks = await Promise.all(optimizeTasks);
7087
resolvedTasks.push(...settledTasks);
7188
debugPrint(`Resolving ${resolvedTasks.length} optimization tasks.`);
7289
for (let y = 0; y < resolvedTasks.length; y++) {
7390
let changed = false;
7491
for (let column in keywords) {
75-
if (result.rows[y][column + "kws"] == resolvedTasks[y][column + "kws"])
92+
if (
93+
result[promiseIndex][column + "kws"] ==
94+
resolvedTasks[y][column + "kws"]
95+
)
7696
continue;
77-
result.rows[y][column + "kws"] = resolvedTasks[y][column + "kws"];
97+
result[promiseIndex][column + "kws"] = resolvedTasks[y][column + "kws"];
7898
changed = true;
7999
}
80100
if (changed) {
81-
result.rows[y].save();
101+
result[promiseIndex].save();
82102
changes++;
83103
}
104+
promiseIndex++;
84105
}
85-
await bulkIndexFiles(result.rows);
106+
await bulkIndexFiles(result.slice(loopIndexStart, currentIndex));
86107
optimizeTasks = [];
87108
resolvedTasks = [];
88109
}

lib/metadatasearch.js

Lines changed: 40 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -115,82 +115,70 @@ export default class MetadataSearch {
115115
}
116116

117117
async matchAllMetadata(fuzzy = false) {
118-
let games = await File.findAndCountAll({
118+
let games = await File.findAll({
119119
where: {
120120
nongame: false,
121-
//detailsId: null,
121+
detailsId: null,
122122
},
123-
limit: 1000,
123+
attributes: ["id", "filename"],
124124
order: ["id", "filename"],
125+
include: { model: Metadata, as: "details" },
125126
});
126-
let count = games.count;
127-
let pages = Math.ceil(games.count / 1000);
127+
let count = games.length;
128128
let timer = new Timer();
129129
let found = 0;
130130
console.log(`Matching ${count} games to metadata.`);
131-
for (let x = 0; x < pages; x++) {
132-
games = await File.findAndCountAll({
133-
where: {
134-
nongame: false,
135-
//detailsId: null,
136-
},
137-
limit: 1000,
138-
offset: x * 1000 - found,
139-
order: ["id", "filename"],
140-
include: { model: Metadata, as: "details" },
141-
});
142-
for (let y = 0; y < games.rows.length; y++) {
143-
singleLineStatus(
144-
`Matching metadata: ${x * 1000 + y} / ${count} ${(
145-
((x * 1000 + y) / count) *
146-
100
147-
).toFixed(2)}% (${timer.elapsed()}) Total Matches: ${found}`
131+
for (let x = 0; x < count; x++) {
132+
singleLineStatus(
133+
`Matching metadata: ${x} / ${count} ${(
134+
((x) / count) *
135+
100
136+
).toFixed(2)}% (${timer.elapsed()}) Total Matches: ${found}`
137+
);
138+
let game = games[x];
139+
let metadata = await Metadata.searchByText(
140+
"title",
141+
this.normalizeName(game.filename),
142+
game.category
143+
);
144+
if (metadata?.length == 0) {
145+
// repeat the search under one of the alternate titles
146+
metadata = await Metadata.searchByText(
147+
"alternatetitles",
148+
this.normalizeName(game.filename),
149+
game.category
148150
);
149-
let game = games.rows[y];
150-
let metadata = await Metadata.searchByText(
151+
}
152+
if (metadata?.length >= 1) {
153+
let md = await Metadata.findByPk(metadata[0].id);
154+
await game.setDetails(md);
155+
await md.addFile(game);
156+
await game.save();
157+
await md.save();
158+
found++;
159+
} else if (fuzzy) {
160+
//this is much slower and should only be used if the faster full text search can't find it.
161+
let metadata = await Metadata.fuzzySearchByText(
151162
"title",
152163
this.normalizeName(game.filename),
164+
0.8,
153165
game.category
154166
);
155-
if (!metadata.length) {
156-
// repeat the search under one of the alternate titles
157-
metadata = await Metadata.searchByText(
167+
if (!metadata?.length == 0) {
168+
metadata = await Metadata.fuzzySearchByText(
158169
"alternatetitles",
159170
this.normalizeName(game.filename),
171+
0.8,
160172
game.category
161173
);
162174
}
163-
if (metadata.length) {
175+
if (metadata?.length >= 1) {
164176
let md = await Metadata.findByPk(metadata[0].id);
165177
await game.setDetails(md);
166178
await md.addFile(game);
167179
await game.save();
168180
await md.save();
169181
found++;
170-
} else if (fuzzy) {
171-
//this is much slower and should only be used if the faster full text search can't find it.
172-
let metadata = await Metadata.fuzzySearchByText(
173-
"title",
174-
this.normalizeName(game.filename),
175-
0.8,
176-
game.category
177-
);
178-
if (!metadata.length) {
179-
metadata = await Metadata.fuzzySearchByText(
180-
"alternatetitles",
181-
this.normalizeName(game.filename),
182-
0.8,
183-
game.category
184-
);
185-
}
186-
if (metadata.length) {
187-
let md = await Metadata.findByPk(metadata[0].id);
188-
await game.setDetails(md);
189-
await md.addFile(game);
190-
await game.save();
191-
await md.save();
192-
found++;
193-
}
194182
}
195183
}
196184
}

lib/models/metadata.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,14 +105,14 @@ export default function (sequelize) {
105105
if (platform && platform != "Others") {
106106
platformClause = `AND '${platform}' = ANY(platforms)`;
107107
}
108+
let fieldName = field + 'Vector'
108109
const query = `
109110
SELECT id FROM "Metadata"
110-
WHERE $1 @@ plainto_tsquery('english', $2) ${platformClause}
111+
WHERE "${fieldName}" @@ plainto_tsquery('english', $1) ${platformClause}
111112
ORDER BY length(title) ${limitClause}
112113
`;
113114
return await sequelize.query(query, {
114-
model: Metadata,
115-
bind: [(field + 'Vector'), searchQuery],
115+
bind: [searchQuery],
116116
type: sequelize.QueryTypes.SELECT,
117117
});
118118
};

server.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ let indexPage = "pages/index";
4040
let flags = new Flag();
4141
let consoleIcons = new ConsoleIcons(emulatorsData);
4242

43+
4344
// Initialize databases
4445
await initDB();
4546
await initElasticsearch();
@@ -579,5 +580,4 @@ if (
579580

580581
cron.schedule("0 30 2 * * *", getFilesJob);
581582

582-
await metadataSearch.syncAllMetadata()
583-
await metadataSearch.matchAllMetadata()
583+
await optimizeDatabaseKws()

0 commit comments

Comments
 (0)