Skip to content

Commit 0946569

Browse files
author
Misha Savelyev
committed
Optimize subproject queries a bit and fix bugs
1 parent 97d6c6e commit 0946569

File tree

1 file changed

+33
-24
lines changed

1 file changed

+33
-24
lines changed

backend/src/database/repositories/segmentRepository.ts

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -327,22 +327,24 @@ class SegmentRepository extends RepositoryBase<
327327
const transaction = this.transaction
328328

329329
const records = await this.options.database.sequelize.query(
330-
`SELECT
331-
s.*,
332-
json_agg(sac."activityChannels") AS "activityChannels"
330+
`
331+
SELECT
332+
s.*,
333+
jsonb_merge_agg(sac."activityChannels") AS "activityChannels"
333334
FROM segments s
334335
LEFT JOIN (
335336
SELECT
336337
"tenantId",
337-
json_build_object(concat(platform), json_agg(sac.channel)) AS "activityChannels"
338+
"segmentId",
339+
jsonb_build_object(platform, json_agg(DISTINCT sac.channel)) AS "activityChannels"
338340
FROM "segmentActivityChannels" sac
339341
WHERE "tenantId" = :tenantId
340-
GROUP BY "tenantId", "platform"
341-
) sac
342-
ON sac."tenantId" = s."tenantId"
342+
GROUP BY "tenantId", "segmentId", "platform"
343+
) sac ON sac."tenantId" = s."tenantId" AND sac."segmentId" = s.id
343344
WHERE id in (:ids)
344345
AND s."tenantId" = :tenantId
345-
GROUP BY s.id;`,
346+
GROUP BY s.id;
347+
`,
346348
{
347349
replacements: {
348350
ids,
@@ -354,7 +356,10 @@ class SegmentRepository extends RepositoryBase<
354356
)
355357

356358
records.forEach((row) => {
357-
row.activityChannels = Object.assign({}, ...row.activityChannels)
359+
if (!row.activityChannels) {
360+
row.activityChannels = {}
361+
}
362+
row.activityChannels = { ...row.activityChannels }
358363
})
359364

360365
return records.map((sr) => SegmentRepository.populateRelations(sr))
@@ -377,22 +382,24 @@ class SegmentRepository extends RepositoryBase<
377382
const transaction = this.transaction
378383

379384
const records = await this.options.database.sequelize.query(
380-
`SELECT
381-
s.*,
382-
json_agg(sac."activityChannels") AS "activityChannels"
385+
`
386+
SELECT
387+
s.*,
388+
jsonb_merge_agg(sac."activityChannels") AS "activityChannels"
383389
FROM segments s
384390
LEFT JOIN (
385391
SELECT
386392
"tenantId",
387-
json_build_object(concat(platform), json_agg(sac.channel)) AS "activityChannels"
393+
"segmentId",
394+
jsonb_build_object(platform, json_agg(DISTINCT sac.channel)) AS "activityChannels"
388395
FROM "segmentActivityChannels" sac
389396
WHERE "tenantId" = :tenantId
390-
GROUP BY "tenantId", "platform"
391-
) sac
392-
ON sac."tenantId" = s."tenantId"
397+
GROUP BY "tenantId", "segmentId", "platform"
398+
) sac ON sac."tenantId" = s."tenantId" AND sac."segmentId" = s.id
393399
WHERE s.id = :id
394400
AND s."tenantId" = :tenantId
395-
GROUP BY s.id;`,
401+
GROUP BY s.id;
402+
`,
396403
{
397404
replacements: {
398405
id,
@@ -408,7 +415,10 @@ class SegmentRepository extends RepositoryBase<
408415
}
409416

410417
const record = records[0]
411-
record.activityChannels = Object.assign({}, ...record.activityChannels)
418+
if (!record.activityChannels) {
419+
record.activityChannels = {}
420+
}
421+
record.activityChannels = { ...record.activityChannels }
412422

413423
if (SegmentRepository.isProjectGroup(record)) {
414424
// find projects
@@ -628,17 +638,17 @@ class SegmentRepository extends RepositoryBase<
628638
SELECT
629639
COUNT(DISTINCT s.id) AS count,
630640
s.*,
631-
json_agg(sac."activityChannels") AS "activityChannels"
641+
jsonb_merge_agg(sac."activityChannels") AS "activityChannels"
632642
FROM segments s
633643
LEFT JOIN (
634644
SELECT
635645
"tenantId",
636-
json_build_object(concat(platform), json_agg(sac.channel)) AS "activityChannels"
646+
"segmentId",
647+
jsonb_build_object(platform, json_agg(sac.channel)) AS "activityChannels"
637648
FROM "segmentActivityChannels" sac
638649
WHERE "tenantId" = :tenantId
639-
GROUP BY "tenantId", "platform"
640-
) sac
641-
ON sac."tenantId" = s."tenantId"
650+
GROUP BY "tenantId", "segmentId", "platform"
651+
) sac ON sac."tenantId" = s."tenantId" AND sac."segmentId" = s.id
642652
WHERE s."grandparentSlug" IS NOT NULL
643653
AND s."parentSlug" IS NOT NULL
644654
AND s."tenantId" = :tenantId
@@ -662,7 +672,6 @@ class SegmentRepository extends RepositoryBase<
662672

663673
const rows = subprojects
664674
rows.forEach((row, i) => {
665-
rows[i].activityChannels = rows[i].activityChannels[0]
666675
if (rows[i].activityChannels === null) {
667676
rows[i].activityChannels = {}
668677
}

0 commit comments

Comments
 (0)