Skip to content

Commit 900f011

Browse files
committed
recommend でユーザ情報を JOIN する
1 parent e198c47 commit 900f011

File tree

2 files changed

+56
-24
lines changed

2 files changed

+56
-24
lines changed

server/prisma/sql/recommend.sql

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,33 @@
11
-- $1 = senderId
22
SELECT
3-
*,
3+
recv.id,
4+
recv.name,
5+
recv.gender,
6+
recv.grade,
7+
recv.faculty,
8+
recv.department,
9+
recv.intro,
10+
recv."guid",
11+
recv."pictureUrl",
12+
json_agg(DISTINCT jsonb_build_object(
13+
'id', c.id,
14+
'name', c.name,
15+
'teacher', c.teacher,
16+
'slots', (
17+
SELECT json_agg(
18+
jsonb_build_object(
19+
'courseId', "Slot"."courseId",
20+
'day', "Slot"."day",
21+
'period', "Slot"."period"
22+
)
23+
) FROM "Slot" WHERE "Slot"."courseId" = c.id)
24+
)
25+
) FILTER (WHERE c.id IS NOT NULL) AS "courses",
26+
json_agg(DISTINCT jsonb_build_object(
27+
'id', s.id,
28+
'name', s.name,
29+
'group', s.group
30+
)) FILTER (WHERE s.id IS NOT NULL) AS "interestSubjects",
431
-- course overlap
532
(SELECT COUNT(1) FROM "Course" course
633
WHERE EXISTS (SELECT 1 FROM "Enrollment" e WHERE e."courseId" = course.id AND e."userId" = recv.id)
@@ -12,6 +39,13 @@ SELECT
1239
AND EXISTS (SELECT 1 FROM "Interest" i WHERE i."subjectId" = subj.id AND i."userId" = $1)
1340
) AS overlap
1441
FROM "User" recv
42+
43+
LEFT JOIN "Enrollment" ON "Enrollment"."userId" = recv.id
44+
LEFT JOIN "Course" c on c.id = "Enrollment"."courseId"
45+
LEFT JOIN "Slot" ON "Slot"."courseId" = c.id
46+
LEFT JOIN "Interest" ON "Interest"."userId" = recv.id
47+
LEFT JOIN "InterestSubject" s ON s.id = "Interest"."subjectId"
48+
1549
WHERE recv.id <> $1
1650

1751
AND NOT EXISTS (
@@ -39,5 +73,7 @@ AND (
3973
)
4074
)
4175

76+
GROUP BY recv.id
77+
4278
ORDER BY overlap DESC
4379
LIMIT $2 OFFSET $3;
Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { recommend } from "@prisma/client/sql";
2-
import type { UserID, UserWithCoursesAndSubjects } from "common/types";
2+
import type {
3+
Course,
4+
InterestSubject,
5+
UserID,
6+
UserWithCoursesAndSubjects,
7+
} from "common/types";
38
import { prisma } from "../../database/client";
4-
import { getCoursesByUserId } from "../../database/courses";
5-
import * as interest from "../../database/interest";
6-
import { getUserByID } from "../../database/users";
79

810
export async function recommendedTo(
911
user: UserID,
@@ -15,23 +17,17 @@ export async function recommendedTo(
1517
count: number;
1618
}>
1719
> {
18-
const result = await prisma.$queryRawTyped(recommend(user, limit, offset));
19-
return Promise.all(
20-
result.map(async (res) => {
21-
const { overlap: count, ...u } = res;
22-
if (count === null) throw new Error("count is null: something is wrong");
23-
// TODO: user の情報はここで再度 DB に問い合わせるのではなく、 recommend の sql で取得
24-
const user = await getUserByID(u.id);
25-
const courses = getCoursesByUserId(u.id);
26-
const subjects = interest.of(u.id);
27-
return {
28-
count: Number(count),
29-
u: {
30-
...user,
31-
courses: await courses,
32-
interestSubjects: await subjects,
33-
},
34-
};
35-
}),
36-
);
20+
const users = await prisma.$queryRawTyped(recommend(user, limit, offset));
21+
console.log("🚀", users);
22+
return users.map((user) => {
23+
const { overlap: count, ...u } = user;
24+
return {
25+
count: Number(count),
26+
u: {
27+
...u,
28+
interestSubjects: (u.interestSubjects ?? []) as InterestSubject[], // TODO: type
29+
courses: (u.courses ?? []) as Course[], // TODO: type
30+
},
31+
};
32+
});
3733
}

0 commit comments

Comments
 (0)