Skip to content

Commit

Permalink
refactor(backend): simplify UploadDatabaseService (#1367)
Browse files Browse the repository at this point in the history
  • Loading branch information
chaoran-chen committed Mar 18, 2024
1 parent a8f5f94 commit cf67283
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 65 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import org.loculus.backend.api.Status
import org.loculus.backend.api.SubmissionIdMapping
import org.loculus.backend.model.SubmissionId
import org.loculus.backend.model.SubmissionParams
import org.loculus.backend.model.UploadType
import org.loculus.backend.service.GenerateAccessionFromNumberService
import org.loculus.backend.service.datauseterms.DataUseTermsDatabaseService
import org.loculus.backend.service.submission.MetadataUploadAuxTable.accessionColumn
Expand Down Expand Up @@ -123,8 +122,47 @@ class UploadDatabaseService(
"mapping and copying sequences with UploadId $uploadId and uploadType: $submissionParams.uploadType"
}

val mapAndCopySql = """
INSERT INTO sequence_entries (
accession,
version,
organism,
submission_id,
submitter,
group_name,
submitted_at,
original_data,
status
)
SELECT
m.accession,
m.version,
m.organism,
m.submission_id,
m.submitter,
m.group_name,
m.uploaded_at,
jsonb_build_object(
'metadata', m.metadata,
'unalignedNucleotideSequences', jsonb_object_agg(s.segment_name, s.compressed_sequence_data)
),
'${Status.RECEIVED.name}'
FROM
metadata_upload_aux_table m
JOIN
sequence_upload_aux_table s ON m.upload_id = s.upload_id AND m.submission_id = s.submission_id
WHERE m.upload_id = ?
GROUP BY
m.upload_id,
m.organism,
m.submission_id,
m.submitter,
m.group_name,
m.uploaded_at
RETURNING accession, version, submission_id;
""".trimIndent()
val insertionResult = exec(
generateMapAndCopyStatement(submissionParams.uploadType),
mapAndCopySql,
listOf(
Pair(VarCharColumnType(), uploadId),
),
Expand Down Expand Up @@ -221,72 +259,11 @@ class UploadDatabaseService(
},
) {
it[accessionColumn] = accession
it[versionColumn] = 1
}
}
}

private fun generateMapAndCopyStatement(uploadType: UploadType): String {
val commonColumns = StringBuilder().apply {
append("accession,")
if (uploadType == UploadType.REVISION) {
append("version,")
}
append(
"""
organism,
submission_id,
submitter,
group_name,
submitted_at,
original_data,
status
""",
)
}.toString()

val specificColumns = if (uploadType == UploadType.ORIGINAL) {
"""
m.accession,
""".trimIndent()
} else {
"""
m.accession,
m.version,
""".trimIndent()
}

return """
INSERT INTO sequence_entries (
$commonColumns
)
SELECT
$specificColumns
m.organism,
m.submission_id,
m.submitter,
m.group_name,
m.uploaded_at,
jsonb_build_object(
'metadata', m.metadata,
'unalignedNucleotideSequences', jsonb_object_agg(s.segment_name, s.compressed_sequence_data)
),
'${Status.RECEIVED.name}'
FROM
metadata_upload_aux_table m
JOIN
sequence_upload_aux_table s ON m.upload_id = s.upload_id AND m.submission_id = s.submission_id
WHERE m.upload_id = ?
GROUP BY
m.upload_id,
m.organism,
m.submission_id,
m.submitter,
m.group_name,
m.uploaded_at
RETURNING accession, version, submission_id;
""".trimIndent()
}

fun getNextSequenceNumbers(numberOfNewEntries: Int) = transaction {
val nextValues = exec(
"SELECT nextval('accession_sequence') FROM generate_series(1, ?)",
Expand Down
2 changes: 1 addition & 1 deletion backend/src/main/resources/db/migration/V1__init.sql
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ create table groups_table (

create table sequence_entries (
accession text not null,
version bigint not null default 1,
version bigint not null,
organism text not null,
submission_id text not null,
submitter text not null,
Expand Down

0 comments on commit cf67283

Please sign in to comment.