annotate NOTES @ 520:e1d3da372805 OrthancMySQL-5.2

mainline -> MySQL 5.2
author Alain Mazy <am@orthanc.team>
date Thu, 06 Jun 2024 15:12:01 +0200
parents bf4b9c7cf338
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
431
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
1 Resources:
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
2 *********
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
3 - PG transaction modes explained: https://www.postgresql.org/files/developer/concurrency.pdf
433
5964ce6385a5 use temporary tables for DeletedFiles, RemainingAncestor and DeletedResources
Alain Mazy <am@osimis.io>
parents: 432
diff changeset
4 - Isolation level explained (PG + MySQL): https://amirsoleimani.medium.com/understanding-database-isolation-level-via-examples-mysql-and-postgres-a86b5502d404
5964ce6385a5 use temporary tables for DeletedFiles, RemainingAncestor and DeletedResources
Alain Mazy <am@osimis.io>
parents: 432
diff changeset
5 - Message queuing in PG: https://www.crunchydata.com/blog/message-queuing-using-native-postgresql
5964ce6385a5 use temporary tables for DeletedFiles, RemainingAncestor and DeletedResources
Alain Mazy <am@osimis.io>
parents: 432
diff changeset
6
431
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
7
432
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
8 Create and delete instances Internals:
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
9 *************************************
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
10
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
11 isNewInstance = CreateInstance(...)
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
12
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
13 if (!isNewInstance && overwriteInstances)
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
14 DeleteResource(instance)
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
15 -> ClearDeletedFiles(manager);
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
16 DELETE FROM DeletedFiles ------> this is not a temporary table in postgres but it is supposed to be empty before and after each transaction -> it is empty when taking a snapshot of the DB in READ COMMITTED mode!!!
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
17 ClearDeletedResources(manager);
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
18 DELETE FROM DeletedResources ------> this is not a temporary table in postgres but it is supposed to be empty before and after each transaction !!!
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
19
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
20 DELETE FROM RemainingAncestor ------> this is not a temporary table in postgres but it is supposed to be empty before and after each transaction !!!
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
21 DELETE FROM Resources WHERE internalId=..
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
22 -> cascades delete the MainDicomTags, the Metadata and the AttachedFiles
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
23 -> this triggers AttachedFileDeletedFunc
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
24 INSERT INTO DeletedFiles VALUES
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
25 (old.uuid, old.filetype, old.compressedSize,
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
26 old.uncompressedSize, old.compressionType,
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
27 old.uncompressedHash, old.compressedHash);
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
28 RETURN NULL;
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
29 -> this triggers a SQL trigger: ResourceDeletedFunc
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
30 INSERT INTO DeletedResources VALUES (old.resourceType, old.publicId);
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
31 IF EXISTS (SELECT 1 FROM Resources WHERE parentId = old.parentId) THEN
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
32 -- Signal that the deleted resource has a remaining parent
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
33 -- (a parent that must not be deleted but whose LastUpdate must be updated)
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
34 INSERT INTO RemainingAncestor
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
35 SELECT resourceType, publicId FROM Resources WHERE internalId = old.parentId;
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
36 ELSE
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
37 -- Delete a parent resource when its unique child is deleted
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
38 DELETE FROM Resources WHERE internalId = old.parentId;
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
39 END IF;
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
40
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
41 SELECT * FROM RemainingAncestor
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
42 -> SignalRemainingAncestor() // There is at most 1 remaining ancestor
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
43 -> ServerIndex::TransactionContext::SignalRemainingAncestor()
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
44 -> stores remainingType and remainingPublicId (this is used in StatelessDatabaseOperations::DeleteResource to build the Rest Response of /delete
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
45 and to update the LastUpdate of all parent (only when deleted from /delete))
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
46
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
47 SignalDeletedFiles(output, manager);
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
48 SELECT * FROM DeletedFiles
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
49 -> SignalDeletedAttachment()
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
50 -> ServerIndex::TransactionContext::SignalAttachmentDeleted()
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
51 -> pendingFilesToRemove_.push_back(FileToRemove(info)) (files are deleted in CommitFilesToRemove in the ServerIndex::TransactionContext::Commit)
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
52
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
53 SignalDeletedResources(output, manager);
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
54 SELECT resourceType, publicId FROM DeletedResources
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
55 -> SignalDeletedResource()
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
56 -> Emit DeletedResource event (lua)
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
57
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
58
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
59 if (!CreateInstance(...))
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
60 Error: "No new instance while overwriting; this should not happen"
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
61
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
62 if isNewInstance -> LogChange
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
63 if isNewSeries -> LogChange
8b7c1c423367 new 'TransactionMode' config + rewrote ResourceDeletedFunc to avoid IF/THEN/ELSE pattern
Alain Mazy <am@osimis.io>
parents: 431
diff changeset
64 ....
431
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
65
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
66 Sample SQL code that you can execute in DBeaver to test new functions/procedures:
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
67
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
68 CreateInstance
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
69 ************************************************************************
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
70
444
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
71 CREATE OR REPLACE FUNCTION CreateInstance(
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
72 IN patient_public_id TEXT,
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
73 IN study_public_id TEXT,
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
74 IN series_public_id TEXT,
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
75 IN instance_public_id TEXT,
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
76 OUT is_new_patient BIGINT,
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
77 OUT is_new_study BIGINT,
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
78 OUT is_new_series BIGINT,
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
79 OUT is_new_instance BIGINT,
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
80 OUT patient_internal_id BIGINT,
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
81 OUT study_internal_id BIGINT,
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
82 OUT series_internal_id BIGINT,
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
83 OUT instance_internal_id BIGINT) AS $body$
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
84
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
85 BEGIN
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
86 is_new_patient := 1;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
87 is_new_study := 1;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
88 is_new_series := 1;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
89 is_new_instance := 1;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
90
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
91
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
92 BEGIN
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
93 INSERT INTO "resources" VALUES (DEFAULT, 0, patient_public_id, NULL);
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
94 EXCEPTION
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
95 WHEN unique_violation THEN
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
96 is_new_patient := 0;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
97 END;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
98 SELECT internalid INTO patient_internal_id FROM "resources" WHERE publicId = patient_public_id AND resourcetype = 0 FOR UPDATE; -- also locks the resource and its parent to prevent from deletion while we complete this transaction
431
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
99
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
100 BEGIN
444
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
101 INSERT INTO "resources" VALUES (DEFAULT, 1, study_public_id, patient_internal_id);
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
102 EXCEPTION
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
103 WHEN unique_violation THEN
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
104 is_new_study := 0;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
105 END;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
106 SELECT internalid INTO study_internal_id FROM "resources" WHERE publicId = study_public_id AND resourcetype = 1 FOR UPDATE; -- also locks the resource and its parent to prevent from deletion while we complete this transaction
431
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
107
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
108 BEGIN
444
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
109 INSERT INTO "resources" VALUES (DEFAULT, 2, series_public_id, study_internal_id);
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
110 EXCEPTION
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
111 WHEN unique_violation THEN
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
112 is_new_series := 0;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
113 END;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
114 SELECT internalid INTO series_internal_id FROM "resources" WHERE publicId = series_public_id AND resourcetype = 2 FOR UPDATE; -- also locks the resource and its parent to prevent from deletion while we complete this transaction
431
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
115
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
116 BEGIN
444
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
117 INSERT INTO "resources" VALUES (DEFAULT, 3, instance_public_id, series_internal_id);
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
118 EXCEPTION
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
119 WHEN unique_violation THEN
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
120 is_new_instance := 0;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
121 END;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
122 SELECT internalid INTO instance_internal_id FROM "resources" WHERE publicId = instance_public_id AND resourcetype = 3 FOR UPDATE; -- also locks the resource and its parent to prevent from deletion while we complete this transaction
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
123
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
124 IF is_new_instance > 0 THEN
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
125 -- Move the patient to the end of the recycling order.
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
126 PERFORM PatientAddedOrUpdated(patient_internal_id, 1);
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
127 END IF;
431
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
128 END;
444
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
129
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
130 $body$ LANGUAGE plpgsql;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
131
431
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
132
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
133 DO $$
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
134 DECLARE
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
135 result record;
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
136 begin
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
137 delete from "resources";
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
138
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
139 SELECT * INTO result from CreateInstance('patient1', 'study1', 'series1', 'instance1');
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
140
444
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
141 RAISE NOTICE 'Value patientInternalId: %, is_new: %', result.patient_internal_id, result.is_new_patient;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
142 RAISE NOTICE 'Value studyInternalId: %, is_new: %', result.study_internal_id, result.is_new_study;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
143 RAISE NOTICE 'Value seriesInternalId: %, is_new: %', result.series_internal_id, result.is_new_series;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
144 RAISE NOTICE 'Value instanceInternalId: %, is_new: %', result.instance_internal_id, result.is_new_instance;
431
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
145 RAISE NOTICE '--------------';
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
146
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
147 SELECT * INTO result from CreateInstance('patient1', 'study1', 'series1', 'instance2');
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
148
444
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
149 RAISE NOTICE 'Value patientInternalId: %, is_new: %', result.patient_internal_id, result.is_new_patient;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
150 RAISE NOTICE 'Value studyInternalId: %, is_new: %', result.study_internal_id, result.is_new_study;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
151 RAISE NOTICE 'Value seriesInternalId: %, is_new: %', result.series_internal_id, result.is_new_series;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
152 RAISE NOTICE 'Value instanceInternalId: %, is_new: %', result.instance_internal_id, result.is_new_instance;
431
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
153 RAISE NOTICE '--------------';
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
154
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
155 SELECT * INTO result from CreateInstance('patient1', 'study1', 'series1', 'instance2');
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
156
444
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
157 RAISE NOTICE 'Value patientInternalId: %, is_new: %', result.patient_internal_id, result.is_new_patient;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
158 RAISE NOTICE 'Value studyInternalId: %, is_new: %', result.study_internal_id, result.is_new_study;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
159 RAISE NOTICE 'Value seriesInternalId: %, is_new: %', result.series_internal_id, result.is_new_series;
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
160 RAISE NOTICE 'Value instanceInternalId: %, is_new: %', result.instance_internal_id, result.is_new_instance;
431
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
161 RAISE NOTICE '--------------';
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
162
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
163 END $$;
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
164
444
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
165
431
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
166 -- \set patient_key 'patient_key'
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
167 -- SELECT CreateInstance('patient', 'study', 'series', 'instance', patient_key) ;
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
168
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
169 -- drop function CreateInstance
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
170 -- select * from "resources";
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
171 -- delete from "resources";
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
172 -- INSERT INTO "resources" VALUES (DEFAULT, 0, 'patient', NULL)
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
173
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
174
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
175
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
176 ************************************************************************
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
177
443
2a48f8fcec6e cleanup
Alain Mazy <am@osimis.io>
parents: 437
diff changeset
178 In debug, no verbose logs, 10 connections
433
5964ce6385a5 use temporary tables for DeletedFiles, RemainingAncestor and DeletedResources
Alain Mazy <am@osimis.io>
parents: 432
diff changeset
179 Orthanc 1.12.1 + PG 5.1 (serializable mode) : test_concurrent_anonymize_same_study with 4 workers and 10x repeat: 43.957 s
436
f16faa1fdc46 InsertOrUpdateMetadata function + UpdateAndGetStatistics
Alain Mazy <am@osimis.io>
parents: 435
diff changeset
180 Orthanc mainline + PG mainline (read-committed mode) : test_concurrent_anonymize_same_study with 4 workers and 10x repeat: 15.744 s
f16faa1fdc46 InsertOrUpdateMetadata function + UpdateAndGetStatistics
Alain Mazy <am@osimis.io>
parents: 435
diff changeset
181 test_concurrent_anonymize_same_study deletion took: 18.8 s
435
326f8304daa1 new creating temporary tables inside functions
Alain Mazy <am@osimis.io>
parents: 434
diff changeset
182
433
5964ce6385a5 use temporary tables for DeletedFiles, RemainingAncestor and DeletedResources
Alain Mazy <am@osimis.io>
parents: 432
diff changeset
183 Orthanc 1.12.1 + PG 5.1 (serializable mode) : test_concurrent_uploads_same_study with 20 workers and 1x repeat: 21.214 s
446
Alain Mazy <am@osimis.io>
parents: 444
diff changeset
184 Orthanc mainline + PG mainline (read-committed mode) : test_concurrent_uploads_same_study with 20 workers and 1x repeat: 9.514 s
433
5964ce6385a5 use temporary tables for DeletedFiles, RemainingAncestor and DeletedResources
Alain Mazy <am@osimis.io>
parents: 432
diff changeset
185
443
2a48f8fcec6e cleanup
Alain Mazy <am@osimis.io>
parents: 437
diff changeset
186 Orthanc 1.12.1 + PG 5.1 (serializable mode) : test_upload_delete_same_study_from_multiple_threads with 5 workers and 3x repeat (10x): 23.016 s
2a48f8fcec6e cleanup
Alain Mazy <am@osimis.io>
parents: 437
diff changeset
187 Orthanc mainline + PG mainline (read-committed mode) : test_upload_delete_same_study_from_multiple_threads with 5 workers and 3x repeat (10x): 7.129 s
436
f16faa1fdc46 InsertOrUpdateMetadata function + UpdateAndGetStatistics
Alain Mazy <am@osimis.io>
parents: 435
diff changeset
188
444
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
189 Orthanc mainline + PG mainline (read-committed mode) : test_upload_multiple_studies_from_multiple_threads with 10 workers and 25 files and repeat 3x: 6.454 s
2ca939d02d39 cleanup
Alain Mazy <am@osimis.io>
parents: 443
diff changeset
190
436
f16faa1fdc46 InsertOrUpdateMetadata function + UpdateAndGetStatistics
Alain Mazy <am@osimis.io>
parents: 435
diff changeset
191 With Docker with 10 connections SQL:
446
Alain Mazy <am@osimis.io>
parents: 444
diff changeset
192 osimis/orthanc:24.1.2 : test_concurrent_anonymize_same_study with 4 workers and 10x repeat: 18.956 s FAIL !!!
Alain Mazy <am@osimis.io>
parents: 444
diff changeset
193 test_concurrent_anonymize_same_study deletion took: NA
Alain Mazy <am@osimis.io>
parents: 444
diff changeset
194 osimis/orthanc:current: test_concurrent_anonymize_same_study with 4 workers and 10x repeat: 6.867 s
Alain Mazy <am@osimis.io>
parents: 444
diff changeset
195 test_concurrent_anonymize_same_study deletion took: 9.095 s
436
f16faa1fdc46 InsertOrUpdateMetadata function + UpdateAndGetStatistics
Alain Mazy <am@osimis.io>
parents: 435
diff changeset
196
446
Alain Mazy <am@osimis.io>
parents: 444
diff changeset
197 osimis/orthanc:24.1.2 : test_concurrent_uploads_same_study with 20 workers and 1x repeat: 9.822 s
Alain Mazy <am@osimis.io>
parents: 444
diff changeset
198 osimis/orthanc:current: test_concurrent_uploads_same_study with 20 workers and 1x repeat: 16.027 s up to 38s ! (slower but the test is not representative of a real life scenario !!!!!)
436
f16faa1fdc46 InsertOrUpdateMetadata function + UpdateAndGetStatistics
Alain Mazy <am@osimis.io>
parents: 435
diff changeset
199
446
Alain Mazy <am@osimis.io>
parents: 444
diff changeset
200 osimis/orthanc:24.1.2 : test_upload_delete_same_study_from_multiple_threads with 5 workers and 3x repeat (10x): 12.966 s
Alain Mazy <am@osimis.io>
parents: 444
diff changeset
201 osimis/orthanc:current: test_upload_delete_same_study_from_multiple_threads with 5 workers and 3x repeat (10x): 4.196 s
Alain Mazy <am@osimis.io>
parents: 444
diff changeset
202
Alain Mazy <am@osimis.io>
parents: 444
diff changeset
203 osimis/orthanc:24.1.2 : test_upload_multiple_studies_from_multiple_threads with 10 workers and 25 files and repeat 3x: 8.957 s
Alain Mazy <am@osimis.io>
parents: 444
diff changeset
204 osimis/orthanc:current: test_upload_multiple_studies_from_multiple_threads with 10 workers and 25 files and repeat 3x: 2.671 s
436
f16faa1fdc46 InsertOrUpdateMetadata function + UpdateAndGetStatistics
Alain Mazy <am@osimis.io>
parents: 435
diff changeset
205
443
2a48f8fcec6e cleanup
Alain Mazy <am@osimis.io>
parents: 437
diff changeset
206 Testing the connecions (note: Orthanc and PG server running on the same server)
2a48f8fcec6e cleanup
Alain Mazy <am@osimis.io>
parents: 437
diff changeset
207 10 connections : test_concurrent_anonymize_same_study with 4 workers and 10x repeat: 15.744 s
2a48f8fcec6e cleanup
Alain Mazy <am@osimis.io>
parents: 437
diff changeset
208 1 connection : test_concurrent_anonymize_same_study with 4 workers and 10x repeat: 21.341 s
2a48f8fcec6e cleanup
Alain Mazy <am@osimis.io>
parents: 437
diff changeset
209 10 connections : test_concurrent_uploads_same_study with 20 workers and 1x repeat: 6.57 s
2a48f8fcec6e cleanup
Alain Mazy <am@osimis.io>
parents: 437
diff changeset
210 1 connection : test_concurrent_uploads_same_study with 20 workers and 1x repeat: 10.223 s
2a48f8fcec6e cleanup
Alain Mazy <am@osimis.io>
parents: 437
diff changeset
211 10 connections : test_upload_delete_same_study_from_multiple_threads with 5 workers and 3x repeat (10x): 7.129 s
2a48f8fcec6e cleanup
Alain Mazy <am@osimis.io>
parents: 437
diff changeset
212 1 connection : test_upload_delete_same_study_from_multiple_threads with 5 workers and 3x repeat (10x): 11.172 s
2a48f8fcec6e cleanup
Alain Mazy <am@osimis.io>
parents: 437
diff changeset
213
431
7c1fe5d6c12c PG: IncrementGlobalProperty
Alain Mazy <am@osimis.io>
parents:
diff changeset
214
502
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
215 LARGE QUERIES
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
216 -------------
453
Alain Mazy <am@osimis.io>
parents: 446
diff changeset
217
502
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
218 new extended-api-v1/tools/find requirements (note: extended-api-v1 is a code name:-) ):
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
219 - be able to list child-resources like in /studies/.../instances?expand
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
220 => we need a "ParentStudy" in the query. Note: a single "Parent" field is not enough since we sometimes want to specify a "Parent"
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
221 that is 2 or 3 levels higher (e.g /patients/../instances)
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
222 e.g: {
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
223 "Level": "Instance",
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
224 "Query": {
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
225 "ParentStudy": "orthanc-study-id",
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
226 },
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
227 }
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
228 - be able to search on labels like in the current tools/find implementation
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
229 => we need a "ParentStudy" in the query. Note: a single "Parent" field is not enough since we sometimes want to specify a "Parent"
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
230 that is 2 or 3 levels higher (e.g /patients/../instances)
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
231 e.g: {
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
232 "Level": "Study",
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
233 "Query": {
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
234 "Labels": ["hello"],
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
235 "LabelsConstraint" : "All",
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
236 },
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
237 }
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
238 - be able to select what are the expected fields in the response
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
239 => we need a "ExpandContent" field in the query.
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
240 If there are no "ExpandContent", we simply return a list of IDs
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
241 e.g: {
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
242 "Level": "Series",
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
243 "Query": {
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
244 "ParentStudy": "orthanc-study-id",
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
245 },
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
246 "ExpandContent": [
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
247 "Children", // the list of orthanc-ids of the child of the resources (equivalent to e.g /series/../instances)
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
248 "Parent", // the resource parent id (e.g. "ParentStudy" for a series)
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
249 "Labels", // the resources labels (equivalent to e.g /series/../labels)
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
250 "Metadata", // the resources metadata (equivalent to e.g. /series/../metadata?expand)
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
251 "MainDicomTags", // the resources MainDicomTags
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
252 "FileInfo", // "FileSize" + "FileUuid", applicable only to instances
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
253 // TODO: what about "IsStable", "Status", "LastUpdate", "IndexInSeries", "ExpectedNumberOfInstances" ???
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
254 // TODO: right now, we have a "RequestedTags" option that can list the DICOM TAGS and tools/find can fetch the tags from disk if they are not in the ExtraMainDicomTags
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
255 ]
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
256 }
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
257 - be able to filter on DICOM Tags (and compose with a Parent orthanc id)
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
258 e.g: get all US series from this study
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
259 {
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
260 "Level": "Series",
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
261 "Query": {
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
262 "ParentStudy": "orthanc-study-id",
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
263 "DicomTags": {
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
264 "Modality": "US"
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
265 }
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
266 }
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
267 }
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
268 - be able to filter on a metadata (and compose with a Parent orthanc id)
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
269 e.g: to get all PDF instances of a study
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
270 {
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
271 "Level": "Instance",
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
272 "Query": {
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
273 "ParentStudy": "orthanc-study-id",
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
274 "Metadata": {
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
275 "SopClassUid": "1.2.840.10008.5.1.4.1.1.104.1"
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
276 }
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
277 }
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
278 }
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
279 - be able to order results on one or more DicomTags or Metadata + limit results + offset (for pagination)
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
280 e.g: to get page 5 of all studies from this month
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
281 {
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
282 "Level": "Study",
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
283 "Query": {
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
284 "DicomTags": {
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
285 "StudyDate": "20240101-20240131"
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
286 },
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
287 "OrderBy": [
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
288 {
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
289 "DicomTag": "StudyDate",
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
290 "Order": "Desc"
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
291 },
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
292 {
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
293 "Metadata": "LastUpdate",
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
294 "Order": "Desc"
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
295 }
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
296 ],
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
297 "Limit": 1000,
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
298 "Since": 5000
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
299 }
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
300 }
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
301
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
302
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
303 current queries - single level:
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
304 ------------------------------
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
305
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
306 Search:
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
307 sql = ("SELECT publicId, internalId "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
308 "FROM Resources "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
309 "WHERE resourceType = " + formatter.FormatResourceType(queryLevel)
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
310 + " ");
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
311
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
312 if (dicomIdentifiersComparisons.size() > 0)
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
313 sql += (" AND internalId IN (SELECT id FROM DicomIdentifiers WHERE " + *it + ") ");
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
314
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
315 if (mainDicomTagsComparisons.size() > 0)
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
316 sql += (" AND internalId IN (SELECT id FROM MainDicomTags WHERE " + *it + ") ");
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
317
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
318 if (!labels.empty())
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
319 sql += (" AND internalId " + inOrNotIn + " (SELECT id"
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
320 " FROM (SELECT id, COUNT(1) AS labelsCount "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
321 "FROM Labels "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
322 "WHERE label IN (" + Join(formattedLabels, "", ", ") + ") GROUP BY id"
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
323 ") AS temp "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
324 " WHERE labelsCount " + condition + ")");
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
325 if (limit != 0)
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
326 sql += " LIMIT " + boost::lexical_cast<std::string>(limit);
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
327
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
328
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
329 Patients:
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
330 "SELECT patients_studies.patients_public_id, MIN(instances.publicId) AS instances_public_id "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
331 "FROM (SELECT patients.publicId AS patients_public_id, MIN(studies.internalId) AS studies_internal_id "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
332 "FROM (" + sql +
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
333 ") AS patients "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
334 "INNER JOIN Resources studies ON studies.parentId = patients.internalId "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
335 "GROUP BY patients.publicId "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
336 ") AS patients_studies "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
337 "INNER JOIN Resources series ON series.parentId = patients_studies.studies_internal_id "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
338 "INNER JOIN Resources instances ON instances.parentId = series.internalId "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
339 "GROUP BY patients_studies.patients_public_id"
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
340
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
341 Studies:
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
342 "SELECT studies_series.studies_public_id, MIN(instances.publicId) AS instances_public_id "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
343 "FROM (SELECT studies.publicId AS studies_public_id, MIN(series.internalId) AS series_internal_id "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
344 "FROM (" + sql +
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
345 ") AS studies "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
346 "INNER JOIN Resources series ON series.parentId = studies.internalId "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
347 "GROUP BY studies.publicId "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
348 ") AS studies_series "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
349 "INNER JOIN Resources instances ON instances.parentId = studies_series.series_internal_id "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
350 "GROUP BY studies_series.studies_public_id"
443
2a48f8fcec6e cleanup
Alain Mazy <am@osimis.io>
parents: 437
diff changeset
351
502
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
352 Series:
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
353 "SELECT series.publicId AS series_public_id, MIN(instances.publicId) AS instances_public_id "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
354 "FROM (" + sql +
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
355 ") AS series "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
356 "INNER JOIN Resources instances ON instances.parentId = series.internalId "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
357 "GROUP BY series.publicId "
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
358
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
359 Instances:
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
360 "SELECT instances.publicId, instances.publicId FROM (" + sql + ") instances"
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
361
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
362
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
363 current queries - multi level:
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
364 ------------------------------
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
365 Search: ISqlLookupFormatter::Apply
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
366
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
367
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
368
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
369 New queries:
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
370 -----------
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
371
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
372 - Get all series ids where PatientID (16, 32)="ID-DYL-WAL-00000008"
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
373 StudyDescription (8, 4144) %LIKE% "000000"
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
374 order by StudyDate(8, 32) DESC
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
375
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
376 Current: curl http://localhost:8044/tools/find -d '{"Level": "Series", "Query": {"StudyDescription": "*000000*", "PatientID": "ID-DYL-WAL-00000008"}}'
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
377 SELECT series.publicId, MIN(instances.publicId)
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
378 FROM (SELECT series.publicId, series.internalId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
379 FROM Resources AS series
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
380 INNER JOIN Resources studies ON studies.internalId=series.parentId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
381 INNER JOIN DicomIdentifiers t0 ON t0.id = studies.internalId AND t0.tagGroup = 16 AND t0.tagElement = 32 -- Patient tags are copied at study level !
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
382 INNER JOIN DicomIdentifiers t1 ON t1.id = studies.internalId AND t1.tagGroup = 8 AND t1.tagElement = 4144
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
383 WHERE series.resourceType = 2 AND t0.value = 'ID-DYL-WAL-00000008' AND t1.value like '%000000%' ESCAPE '\' LIMIT 101) series
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
384 INNER JOIN Resources instances ON instances.parentId = series.internalId GROUP BY series.publicId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
385
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
386
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
387 With order by, we must not retrieve the instance anymore:
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
388 SELECT series.publicId, series.internalId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
389 FROM Resources AS series
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
390 INNER JOIN Resources studies ON studies.internalId=series.parentId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
391 INNER JOIN DicomIdentifiers t0 ON t0.id = studies.internalId AND t0.tagGroup = 16 AND t0.tagElement = 32 -- Patient tags are copied at study level !
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
392 INNER JOIN DicomIdentifiers t1 ON t1.id = studies.internalId AND t1.tagGroup = 8 AND t1.tagElement = 4144
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
393 INNER JOIN DicomIdentifiers t2 ON t2.id = studies.internalId AND t2.tagGroup = 8 AND t2.tagElement = 32
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
394 WHERE series.resourceType = 2 AND t0.value = 'ID-DYL-WAL-00000008' AND t1.value like '%000000%' ESCAPE '\'
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
395 ORDER BY t2 DESC
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
396 LIMIT 101
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
397
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
398 Combine multiple search criteria:
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
399 Search studies with a label constraints + a Metadata filter + a DICOM Tag filter + a ParentPatient filter
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
400
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
401 SELECT studies.publicId, studies.internalId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
402 FROM Resources AS studies
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
403 INNER JOIN
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
404
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
405 WHERE resourceType = 1 AND internalId IN (SELECT id FROM DicomIdentifiers WHERE tagGroup = 16 AND tagElement = 32 AND value = $1) AND internalId IN (SELECT id FROM DicomIdentifiers WHERE tagGroup = 8 AND tagElement = 32 AND value >= $2) AND internalId IN (SELECT id FROM DicomIdentifiers WHERE tagGroup = 8 AND tagElement = 4144 AND value LIKE $3 ESCAPE '\') LIMIT 101) AS studies INNER JOIN Resources series ON series.parentId = studies.internalId GROUP BY studies.publicId ) AS studies_series INNER JOIN Resources instances ON instances.parentId = studies_series.series_internal_id GROUP BY studies_series.studies_public_id
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
406
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
407
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
408 -- current search at study level (single level -> we use IN instead of INNER JOIN)
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
409 SELECT publicId, internalId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
410 FROM Resources
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
411 WHERE resourceType = 1
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
412 AND internalId IN (SELECT id
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
413 FROM DicomIdentifiers WHERE tagGroup = 16 AND tagElement = 32 AND value = 'ID-DYL-WAL-00000008')
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
414 AND internalId IN (SELECT id
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
415 FROM DicomIdentifiers WHERE tagGroup = 8 AND tagElement = 32 AND value >= '19700101')
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
416 AND internalId IN (SELECT id
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
417 FROM DicomIdentifiers WHERE tagGroup = 8 AND tagElement = 4144 AND value LIKE '%000000%' ESCAPE '\')
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
418 AND internalId IN (SELECT id
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
419 FROM (SELECT id, COUNT(1) AS labelsCount FROM Labels WHERE label IN ('Label2', 'Label3') GROUP BY id) AS temp
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
420 WHERE labelsCount >= 1)
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
421 AND internalId IN (SELECT id
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
422 FROM Metadata WHERE type=7 AND value >= '20240415T120000')
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
423 LIMIT 101
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
424
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
425
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
426 -- same query with INNER JOIN to compare performance
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
427 SELECT studies.publicId, studies.internalId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
428 FROM Resources AS studies
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
429 INNER JOIN DicomIdentifiers t0 ON t0.id = studies.internalId AND t0.tagGroup = 16 AND t0.tagElement = 32 AND t0.value = 'ID-DYL-WAL-00000008' -- Patient tags are copied at study level !
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
430 INNER JOIN DicomIdentifiers t1 ON t1.id = studies.internalId AND t1.tagGroup = 8 AND t1.tagElement = 4144 AND t1.value like '%000000%' ESCAPE '\'
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
431 INNER JOIN DicomIdentifiers t2 ON t2.id = studies.internalId AND t2.tagGroup = 8 AND t2.tagElement = 32 AND t2.value >= '19700101'
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
432 INNER JOIN Metadata m ON m.id = studies.internalId AND m.type = 7 AND m.value >= '20240415T120000'
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
433 WHERE studies.resourceType = 1
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
434 -- AND studies.internalId IN (SELECT id FROM (SELECT id, COUNT(1) AS labelsCount FROM labels WHERE label IN ('Label2', 'Label6') GROUP BY id) AS temp WHERE labelsCount = 2) -- All labels
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
435 -- AND studies.internalId IN (SELECT id FROM (SELECT id, COUNT(1) AS labelsCount FROM labels WHERE label IN ('Label2', 'Label6') GROUP BY id) AS temp WHERE labelsCount >= 1) -- Any labels
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
436 AND studies.internalId NOT IN (SELECT id FROM (SELECT id, COUNT(1) AS labelsCount FROM labels WHERE label IN ('Label2', 'Label6') GROUP BY id) AS temp WHERE labelsCount >= 1) -- None of labels
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
437 ORDER BY t2.value DESC, m.value ASC
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
438 LIMIT 100 OFFSET 0
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
439
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
440
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
441 We may store this in a temporary table that we can reuse e.g to retrieve, the labels, the metadata, the MainDicomTags ...
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
442 CREATE TEMPORARY TABLE FilteredResourcesIds AS
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
443 SELECT series.publicId, series.internalId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
444 FROM Resources AS series
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
445 INNER JOIN Resources studies ON studies.internalId=series.parentId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
446 INNER JOIN DicomIdentifiers t0 ON t0.id = studies.internalId AND t0.tagGroup = 16 AND t0.tagElement = 32 -- Patient tags are copied at study level !
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
447 INNER JOIN DicomIdentifiers t1 ON t1.id = studies.internalId AND t1.tagGroup = 8 AND t1.tagElement = 4144
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
448 INNER JOIN DicomIdentifiers t2 ON t2.id = studies.internalId AND t2.tagGroup = 8 AND t2.tagElement = 32
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
449 WHERE series.resourceType = 2 AND t0.value = 'ID-DYL-WAL-00000008' AND t1.value like '%000000%' ESCAPE '\'
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
450 ORDER BY t2 DESC
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
451 LIMIT 101;
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
452
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
453 Note: we can probably only retrieve the internalId as the key -> since it is an integer, it is more efficient than a uuid to populate the responses
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
454 Retrieve all MainDicomTags at the series level
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
455 SELECT internalId, publicId, tagGroup, tagElement, value FROM MainDicomTags AS tags
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
456 INNER JOIN FilteredResourcesIds ON tags.id = FilteredResourcesIds.internalId;
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
457
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
458 Retrieve all MainDicomTags at the study level too but attach them to the series ids
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
459 SELECT series.internalId, series.publicId, tagGroup, tagElement, value
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
460 FROM Resources as series
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
461 INNER JOIN Resources studies ON studies.internalId=series.parentId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
462 INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = series.internalId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
463 INNER JOIN MainDicomTags tags ON tags.id=studies.internalId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
464
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
465 Retrieve all Metadata from all the series
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
466 SELECT metadata.id, series.publicId, metadata.type, metadata.value, metadata.revision
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
467 FROM Metadata
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
468 INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = Metadata.id
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
469
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
470 Retrieve all Labels from all the series (not tested yet)
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
471 SELECT labels.id, series.publicId, label
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
472 FROM Labels
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
473 INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = Labels.id
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
474
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
475 Retrieve all parents from all the series
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
476 SELECT filtered.internalId, filtered.publicId, parentLevel.internalId as parentInternalId, parentLevel.publicId as parentPublicId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
477 FROM Resources as currentLevel
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
478 INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = currentLevel.internalId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
479 INNER JOIN Resources parentLevel ON currentLevel.parentId = parentLevel.internalId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
480
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
481 Retrieve all children from all the series
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
482 SELECT filtered.internalId, filtered.publicId, childLevel.internalId as childInternalId, childLevel.publicId as childPublicId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
483 FROM Resources as currentLevel
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
484 INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = currentLevel.internalId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
485 INNER JOIN Resources childLevel ON childLevel.parentId = currentLevel.internalId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
486
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
487 Retrieve one instanceId by series
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
488 SELECT filtered.internalId, filtered.publicId, MIN(c0.publicId) as instancePublicId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
489 FROM Resources as currentLevel
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
490 INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = currentLevel.internalId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
491 INNER JOIN Resources c0 ON c0.parentId = currentLevel.internalId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
492 GROUP BY filtered.internalId, filtered.publicId
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
493
bf4b9c7cf338 todo & notes
Alain Mazy <am@orthanc.team>
parents: 453
diff changeset
494 TODO Retrieve all attachments from all the series