Fix distinct query on postgres

This commit is contained in:
Ajay
2023-07-26 16:02:21 -04:00
parent d23e9b9940
commit f0b0217c78
3 changed files with 30 additions and 9 deletions

View File

@@ -124,9 +124,9 @@ CREATE INDEX IF NOT EXISTS "titles_timeSubmitted"
("timeSubmitted" ASC NULLS LAST) ("timeSubmitted" ASC NULLS LAST)
TABLESPACE pg_default; TABLESPACE pg_default;
CREATE INDEX IF NOT EXISTS "titles_votes_timeSubmitted" CREATE INDEX IF NOT EXISTS "titles_userID_timeSubmitted"
ON public."titles" USING btree ON public."titles" USING btree
("videoID" COLLATE pg_catalog."default" ASC NULLS LAST, "service" COLLATE pg_catalog."default" ASC NULLS LAST, "votes" DESC NULLS LAST, "timeSubmitted" DESC NULLS LAST) ("videoID" COLLATE pg_catalog."default" ASC NULLS LAST, "service" COLLATE pg_catalog."default" ASC NULLS LAST, "userID" COLLATE pg_catalog."default" DESC NULLS LAST, "timeSubmitted" DESC NULLS LAST)
TABLESPACE pg_default; TABLESPACE pg_default;
CREATE INDEX IF NOT EXISTS "titles_videoID" CREATE INDEX IF NOT EXISTS "titles_videoID"
@@ -139,6 +139,13 @@ CREATE INDEX IF NOT EXISTS "titles_hashedVideoID"
("hashedVideoID" COLLATE pg_catalog."default" ASC NULLS LAST, "service" COLLATE pg_catalog."default" ASC NULLS LAST) ("hashedVideoID" COLLATE pg_catalog."default" ASC NULLS LAST, "service" COLLATE pg_catalog."default" ASC NULLS LAST)
TABLESPACE pg_default; TABLESPACE pg_default;
-- titleVotes
CREATE INDEX IF NOT EXISTS "titleVotes_votes"
ON public."titleVotes" USING btree
("UUID" COLLATE pg_catalog."default" ASC NULLS LAST, "votes" DESC NULLS LAST)
TABLESPACE pg_default;
-- thumbnails -- thumbnails
CREATE INDEX IF NOT EXISTS "thumbnails_timeSubmitted" CREATE INDEX IF NOT EXISTS "thumbnails_timeSubmitted"
@@ -148,7 +155,7 @@ CREATE INDEX IF NOT EXISTS "thumbnails_timeSubmitted"
CREATE INDEX IF NOT EXISTS "thumbnails_votes_timeSubmitted" CREATE INDEX IF NOT EXISTS "thumbnails_votes_timeSubmitted"
ON public."thumbnails" USING btree ON public."thumbnails" USING btree
("videoID" COLLATE pg_catalog."default" ASC NULLS LAST, "service" COLLATE pg_catalog."default" ASC NULLS LAST, "votes" DESC NULLS LAST, "timeSubmitted" DESC NULLS LAST) ("videoID" COLLATE pg_catalog."default" ASC NULLS LAST, "service" COLLATE pg_catalog."default" ASC NULLS LAST, "userID" COLLATE pg_catalog."default" DESC NULLS LAST, "timeSubmitted" DESC NULLS LAST)
TABLESPACE pg_default; TABLESPACE pg_default;
CREATE INDEX IF NOT EXISTS "thumbnails_videoID" CREATE INDEX IF NOT EXISTS "thumbnails_videoID"
@@ -159,4 +166,11 @@ CREATE INDEX IF NOT EXISTS "thumbnails_videoID"
CREATE INDEX IF NOT EXISTS "thumbnails_hashedVideoID" CREATE INDEX IF NOT EXISTS "thumbnails_hashedVideoID"
ON public."thumbnails" USING btree ON public."thumbnails" USING btree
("hashedVideoID" COLLATE pg_catalog."default" ASC NULLS LAST, "service" COLLATE pg_catalog."default" ASC NULLS LAST) ("hashedVideoID" COLLATE pg_catalog."default" ASC NULLS LAST, "service" COLLATE pg_catalog."default" ASC NULLS LAST)
TABLESPACE pg_default;
-- thumbnailVotes
CREATE INDEX IF NOT EXISTS "thumbnailVotes_votes"
ON public."thumbnailVotes" USING btree
("UUID" COLLATE pg_catalog."default" ASC NULLS LAST, "votes" DESC NULLS LAST)
TABLESPACE pg_default; TABLESPACE pg_default;

View File

@@ -72,6 +72,15 @@ export class Sqlite implements IDatabase {
} }
private static processQuery(query: string): string { private static processQuery(query: string): string {
if (query.includes("DISTINCT ON")) {
const column = query.match(/DISTINCT ON \((.*)\) (.*)/)[1];
query = query.replace(/DISTINCT ON \((.*)\)/g, "");
const parts = query.split("ORDER BY");
query = `${parts[0]} GROUP BY ${column} ORDER BY ${parts[1]}`;
}
return query.replace(/ ~\* /g, " REGEXP "); return query.replace(/ ~\* /g, " REGEXP ");
} }

View File

@@ -24,22 +24,20 @@ enum BrandingSubmissionType {
export async function getVideoBranding(res: Response, videoID: VideoID, service: Service, ip: IPAddress, returnUserID: boolean): Promise<BrandingResult> { export async function getVideoBranding(res: Response, videoID: VideoID, service: Service, ip: IPAddress, returnUserID: boolean): Promise<BrandingResult> {
const getTitles = () => db.prepare( const getTitles = () => db.prepare(
"all", "all",
`SELECT "titles"."title", "titles"."original", "titleVotes"."votes", "titleVotes"."locked", "titleVotes"."shadowHidden", "titles"."UUID", "titles"."videoID", "titles"."hashedVideoID", "titleVotes"."verification", "titles"."userID" `SELECT DISTINCT ON ("titles"."userID") "titles"."title", "titles"."original", "titleVotes"."votes", "titleVotes"."locked", "titleVotes"."shadowHidden", "titles"."UUID", "titles"."videoID", "titles"."hashedVideoID", "titleVotes"."verification", "titles"."userID"
FROM "titles" JOIN "titleVotes" ON "titles"."UUID" = "titleVotes"."UUID" FROM "titles" JOIN "titleVotes" ON "titles"."UUID" = "titleVotes"."UUID"
WHERE "titles"."videoID" = ? AND "titles"."service" = ? AND "titleVotes"."votes" > -2 WHERE "titles"."videoID" = ? AND "titles"."service" = ? AND "titleVotes"."votes" > -2
GROUP BY "titles"."userID" ORDER BY "titles"."userID", "titleVotes"."votes", "titles"."timeSubmitted" DESC`,
ORDER BY "titleVotes"."votes", "titles"."timeSubmitted" DESC`,
[videoID, service], [videoID, service],
{ useReplica: true } { useReplica: true }
) as Promise<TitleDBResult[]>; ) as Promise<TitleDBResult[]>;
const getThumbnails = () => db.prepare( const getThumbnails = () => db.prepare(
"all", "all",
`SELECT "thumbnailTimestamps"."timestamp", "thumbnails"."original", "thumbnailVotes"."votes", "thumbnailVotes"."locked", "thumbnailVotes"."shadowHidden", "thumbnails"."UUID", "thumbnails"."videoID", "thumbnails"."hashedVideoID", "thumbnails"."userID" `SELECT DISTINCT ON ("thumbnails"."userID") "thumbnailTimestamps"."timestamp", "thumbnails"."original", "thumbnailVotes"."votes", "thumbnailVotes"."locked", "thumbnailVotes"."shadowHidden", "thumbnails"."UUID", "thumbnails"."videoID", "thumbnails"."hashedVideoID", "thumbnails"."userID"
FROM "thumbnails" LEFT JOIN "thumbnailVotes" ON "thumbnails"."UUID" = "thumbnailVotes"."UUID" LEFT JOIN "thumbnailTimestamps" ON "thumbnails"."UUID" = "thumbnailTimestamps"."UUID" FROM "thumbnails" LEFT JOIN "thumbnailVotes" ON "thumbnails"."UUID" = "thumbnailVotes"."UUID" LEFT JOIN "thumbnailTimestamps" ON "thumbnails"."UUID" = "thumbnailTimestamps"."UUID"
WHERE "thumbnails"."videoID" = ? AND "thumbnails"."service" = ? AND "thumbnailVotes"."votes" > -2 WHERE "thumbnails"."videoID" = ? AND "thumbnails"."service" = ? AND "thumbnailVotes"."votes" > -2
GROUP BY "thumbnails"."userID" ORDER BY "thumbnails"."userID", "thumbnailVotes"."votes", "thumbnails"."timeSubmitted" DESC`,
ORDER BY "thumbnailVotes"."votes", "thumbnails"."timeSubmitted" DESC`,
[videoID, service], [videoID, service],
{ useReplica: true } { useReplica: true }
) as Promise<ThumbnailDBResult[]>; ) as Promise<ThumbnailDBResult[]>;