Skip to content
Draft
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
c56828a
wip
Jul 7, 2025
08ec15c
remove a bunch of fields
Jul 7, 2025
3900e79
removed some more fields
Jul 7, 2025
5cbefbe
removed some more fields
Jul 7, 2025
ae2832c
removed some more fields
Jul 7, 2025
b571d0d
removed some more fields
Jul 7, 2025
a8133c3
removed some more fields
Jul 7, 2025
48805d6
removed some more fields
Jul 7, 2025
2805e35
removed some more fields
Jul 7, 2025
c9f0a09
removed some more fields
Jul 7, 2025
f7a3507
removed some more fields
Jul 7, 2025
2c979dd
removed some more fields
Jul 7, 2025
1612c06
removed some more fields
Jul 7, 2025
bc96951
removed some more fields
Jul 7, 2025
cb6e943
removed some more fields
Jul 7, 2025
df67521
removed some more fields
Jul 7, 2025
e4bbc40
removed some more fields
Jul 7, 2025
416ed64
removed some more fields
Jul 7, 2025
e789da0
removed some more fields
Jul 7, 2025
3974e7a
removed some more fields
Jul 7, 2025
ce30f40
removed some more fields
Jul 7, 2025
3a78ece
removed some more fields
Jul 7, 2025
3b4c83b
cleanup
Jul 7, 2025
0c22c24
modification with tests passing 30602
Jul 8, 2025
0745cae
modification with tests passing 8549
Jul 8, 2025
96f4967
modification with tests passing 19016
Jul 8, 2025
bebe738
modification with tests passing 22369
Jul 8, 2025
11b8400
modification with tests passing 25732
Jul 8, 2025
5ee1348
modification with tests passing 64
Jul 8, 2025
6785739
modification with tests passing 7033
Jul 8, 2025
7bfa238
modification with tests passing 11891
Jul 8, 2025
988efe2
modification with tests passing 21702
Jul 8, 2025
7efbb5d
modification with tests passing 6506
Jul 8, 2025
8fe7804
modification with tests passing 19748
Jul 8, 2025
0385e2e
whitespace
Jul 8, 2025
b6e43ef
lint
Jul 8, 2025
014b3e5
modification with tests passing 11085
Jul 8, 2025
26c682f
modification with tests passing 31654
Jul 8, 2025
a1e54ad
one less join?
Jul 8, 2025
08b47f9
revert irrelevant change
Jul 9, 2025
cc1387f
remove logging
Jul 9, 2025
c4d3ef9
cleanup
Jul 9, 2025
d555279
Merge branch 'master' into less-fetching
alxndrsn Jul 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
145 changes: 140 additions & 5 deletions lib/model/query/submissions.js
Original file line number Diff line number Diff line change
Expand Up @@ -192,9 +192,91 @@ const getByIds = (projectId, xmlFormId, instanceId, draft, options = QueryOption
_get(maybeOne, options.withCondition({ 'submissions.instanceId': instanceId }), projectId, xmlFormId, draft)
.then(x => x.map(assignCurrentVersionSubmitter));

const getAllForFormByIds = (projectId, xmlFormId, draft, options = QueryOptions.none) => ({ all }) =>
_get(all, options, projectId, xmlFormId, draft)
.then(map(assignCurrentVersionSubmitter));
const getAllForFormByIds = (projectId, xmlFormId, draft, options) => async ({ all }) => {
let newRes;
if (options.extended) {
const maybeExtendedUnjoiner = unjoiner(Submission, Submission.Def.into('currentVersion'), Actor.into('submitter'), Actor.alias('current_version_actors', 'currentVersionSubmitter'));

newRes = await all(sql`
SELECT "submissions"."instanceId" AS "submissions!instanceId"
, "submissions"."submitterId" AS "submissions!submitterId"
, "submissions"."deviceId" AS "submissions!deviceId"
, "submissions"."createdAt" AS "submissions!createdAt"
, "submissions"."updatedAt" AS "submissions!updatedAt"
, "submissions"."reviewState" AS "submissions!reviewState"
, "submissions"."userAgent" AS "submissions!userAgent"
, "submissions"."draft" AS "submissions!draft"
, NULL AS "submissions!deletedAt"
, "submission_defs"."formDefId" AS "submission_defs!formDefId"
, "submission_defs"."submitterId" AS "submission_defs!submitterId"
, "submission_defs"."createdAt" AS "submission_defs!createdAt"
, "submission_defs"."instanceName" AS "submission_defs!instanceName"
, "submission_defs"."instanceId" AS "submission_defs!instanceId"
, TRUE AS "submission_defs!current"
, "submission_defs"."deviceId" AS "submission_defs!deviceId"
, "submission_defs"."userAgent" AS "submission_defs!userAgent"
, "actors"."id" AS "actors!id"
, "actors"."type" AS "actors!type"
, "actors"."displayName" AS "actors!displayName"
, "actors"."createdAt" AS "actors!createdAt"
, "actors"."updatedAt" AS "actors!updatedAt"
, "current_version_actors"."id" AS "current_version_actors!id"
, "current_version_actors"."type" AS "current_version_actors!type"
, "current_version_actors"."displayName" AS "current_version_actors!displayName"
, "current_version_actors"."createdAt" AS "current_version_actors!createdAt"
, "current_version_actors"."updatedAt" AS "current_version_actors!updatedAt"
FROM (
SELECT submissions.*, submission_defs."userAgent"
FROM submissions
JOIN submission_defs ON submissions.id = submission_defs."submissionId" AND root
) AS submissions
JOIN submission_defs ON submissions.id = submission_defs."submissionId" AND submission_defs.current
JOIN forms ON forms."projectId"=${projectId} AND forms."xmlFormId"=${xmlFormId} AND forms.id=submissions."formId"
LEFT OUTER JOIN actors on actors.id=submissions."submitterId"
LEFT OUTER JOIN actors current_version_actors on current_version_actors.id=submission_defs."submitterId"
WHERE draft=${draft}
AND submissions."deletedAt" IS NULL
ORDER BY submissions."createdAt" DESC
, submissions.id DESC
`)
.then(map(maybeExtendedUnjoiner))
.then(map(assignCurrentVersionSubmitter));
} else {
const maybeExtendedUnjoiner = unjoiner(Submission, Submission.Def.into('currentVersion'));

newRes = await all(sql`
SELECT "submissions"."instanceId" AS "submissions!instanceId"
, "submissions"."submitterId" AS "submissions!submitterId"
, "submissions"."deviceId" AS "submissions!deviceId"
, "submissions"."createdAt" AS "submissions!createdAt"
, "submissions"."updatedAt" AS "submissions!updatedAt"
, "submissions"."reviewState" AS "submissions!reviewState"
, "submissions"."userAgent" AS "submissions!userAgent"
, NULL AS "submissions!deletedAt"
, "submission_defs"."submitterId" AS "submission_defs!submitterId"
, "submission_defs"."createdAt" AS "submission_defs!createdAt"
, "submission_defs"."instanceName" AS "submission_defs!instanceName"
, "submission_defs"."instanceId" AS "submission_defs!instanceId"
, TRUE AS "submission_defs!current"
, "submission_defs"."deviceId" AS "submission_defs!deviceId"
, "submission_defs"."userAgent" AS "submission_defs!userAgent"
FROM (
SELECT submissions.*, submission_defs."userAgent"
FROM submissions
JOIN submission_defs ON submissions.id = submission_defs."submissionId" AND root
) AS submissions
JOIN submission_defs ON submissions.id = submission_defs."submissionId" AND submission_defs.current
JOIN forms ON forms."projectId"=${projectId} AND forms."xmlFormId"=${xmlFormId} AND forms.id=submissions."formId"
WHERE draft=${draft}
AND submissions."deletedAt" IS NULL
ORDER BY submissions."createdAt" DESC
, submissions.id DESC
`)
.then(map(maybeExtendedUnjoiner));
}

return newRes;
};

const getById = (submissionId) => ({ maybeOne }) =>
maybeOne(sql`select * from submissions where id=${submissionId} and "deletedAt" is null`)
Expand Down Expand Up @@ -408,8 +490,61 @@ const streamForExport = (formId, draft, keyIds, options = QueryOptions.none) =>
.then(dbStream => streamEncBlobs(s3, dbStream))
.then(stream.map(_exportUnjoiner));

const getForExport = (formId, instanceId, draft, options = QueryOptions.none) => ({ maybeOne }) =>
maybeOne(_export(formId, draft, [], options.withCondition({ 'submissions.instanceId': instanceId })))
const getForExport = (formId, instanceId, draft) => ({ maybeOne }) =>
maybeOne(
sql`
SELECT "submissions"."id" AS "submissions!id"
, "submissions"."instanceId" AS "submissions!instanceId"
, "submissions"."deviceId" AS "submissions!deviceId"
, "submissions"."createdAt" AS "submissions!createdAt"
, "submissions"."updatedAt" AS "submissions!updatedAt"
, "submissions"."reviewState" AS "submissions!reviewState"
, "submissions"."deletedAt" AS "submissions!deletedAt"
, "submission_defs"."localKey" AS "submission_defs!localKey"
, "submission_defs"."xml" AS "submission_defs!xml"
, "actors"."id" AS "actors!id"
, "actors"."displayName" AS "actors!displayName"
, "attachments"."present" > 0 AS "encHasData"
, "attachments"."present" AS "attachments!present"
, "attachments"."expected" AS "attachments!expected"
, "edits"."count" AS "edits!count"
, "fds"."formVersion" AS "formVersion"
FROM submission_defs
INNER JOIN (
SELECT *
FROM submissions
WHERE draft=${draft}
) AS submissions ON submissions.id=submission_defs."submissionId"
LEFT OUTER JOIN actors ON submissions."submitterId"=actors.id
LEFT OUTER JOIN (
SELECT "submissionDefId"
, COUNT("blobId") AS present
, COUNT(*) AS expected
FROM submission_attachments
GROUP BY "submissionDefId"
) AS attachments ON attachments."submissionDefId"=submission_defs.id
INNER JOIN (
SELECT "formDefId"
, "submissionId"
FROM submission_defs
WHERE root IS TRUE
) AS roots ON roots."submissionId"=submission_defs."submissionId"
INNER JOIN (
SELECT id, version AS "formVersion"
FROM form_defs
) AS fds ON fds.id=roots."formDefId"
INNER JOIN (
SELECT "submissionId", (COUNT(id) - 1) AS COUNT
FROM submission_defs
GROUP BY "submissionId"
) AS edits ON edits."submissionId"=submission_defs."submissionId"
WHERE submissions."instanceId" = ${instanceId}
AND submission_defs.current IS TRUE
AND submissions."formId" = ${formId}
AND submissions."deletedAt" IS NULL
`
)
//maybeOne(_export(formId, draft, [], options.withCondition({ 'submissions.instanceId': instanceId })))
.then(map(_exportUnjoiner));

////////////////////////////////////////////////////////////////////////////////
Expand Down