comparison OrthancServer/Resources/Graveyard/FindRefactoringForSQLite.cpp @ 5723:b1c86368af2b find-refactoring

moved experimental code to graveyard
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 19 Jul 2024 10:19:57 +0200
parents
children
comparison
equal deleted inserted replaced
5720:89d559e67b03 5723:b1c86368af2b
1 #if 0
2 // TODO-FIND: Remove this implementation, as it should be done by
3 // the compatibility mode implemented by "GenericFind"
4
5 virtual void ExecuteFind(FindResponse& response,
6 const FindRequest& request,
7 const std::vector<DatabaseConstraint>& normalized) ORTHANC_OVERRIDE
8 {
9 #if 0
10 Compatibility::GenericFind find(*this);
11 find.Execute(response, request);
12 #else
13 {
14 SQLite::Statement s(db_, SQLITE_FROM_HERE, "DROP TABLE IF EXISTS FilteredResourcesIds");
15 s.Run();
16 }
17
18 {
19
20 LookupFormatter formatter;
21
22 std::string sqlLookup;
23 LookupFormatter::Apply(sqlLookup,
24 formatter,
25 normalized,
26 request.GetLevel(),
27 request.GetLabels(),
28 request.GetLabelsConstraint(),
29 (request.HasLimits() ? request.GetLimitsCount() : 0)); // TODO: handles since and count
30
31 {
32 // first create a temporary table that with the filtered and ordered results
33 sqlLookup = "CREATE TEMPORARY TABLE FilteredResourcesIds AS " + sqlLookup;
34
35 SQLite::Statement statement(db_, SQLITE_FROM_HERE_DYNAMIC(sqlLookup), sqlLookup);
36 formatter.Bind(statement);
37 statement.Run();
38 }
39
40 {
41 // create the response item with the public ids only
42 SQLite::Statement statement(db_, SQLITE_FROM_HERE, "SELECT publicId FROM FilteredResourcesIds");
43 formatter.Bind(statement);
44
45 while (statement.Step())
46 {
47 const std::string resourceId = statement.ColumnString(0);
48 response.Add(new FindResponse::Resource(request.GetLevel(), resourceId));
49 }
50 }
51
52 // request Each response content through INNER JOIN with the temporary table
53 if (request.IsRetrieveMainDicomTags())
54 {
55 // TODO-FIND: handle the case where we request tags from multiple levels
56 SQLite::Statement statement(db_, SQLITE_FROM_HERE,
57 "SELECT publicId, tagGroup, tagElement, value FROM MainDicomTags AS tags "
58 " INNER JOIN FilteredResourcesIds ON tags.id = FilteredResourcesIds.internalId");
59 formatter.Bind(statement);
60
61 while (statement.Step())
62 {
63 const std::string& resourceId = statement.ColumnString(0);
64 assert(response.HasResource(resourceId));
65 response.GetResource(resourceId).AddStringDicomTag(statement.ColumnInt(1),
66 statement.ColumnInt(2),
67 statement.ColumnString(3));
68 }
69 }
70
71 if (request.IsRetrieveChildrenIdentifiers())
72 {
73 SQLite::Statement statement(db_, SQLITE_FROM_HERE,
74 "SELECT filtered.publicId, childLevel.publicId AS childPublicId "
75 "FROM Resources as currentLevel "
76 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = currentLevel.internalId "
77 " INNER JOIN Resources childLevel ON childLevel.parentId = currentLevel.internalId");
78 formatter.Bind(statement);
79
80 while (statement.Step())
81 {
82 const std::string& resourceId = statement.ColumnString(0);
83 assert(response.HasResource(resourceId));
84 response.GetResource(resourceId).AddChildIdentifier(GetChildResourceType(request.GetLevel()), statement.ColumnString(1));
85 }
86 }
87
88 if (request.IsRetrieveParentIdentifier())
89 {
90 SQLite::Statement statement(db_, SQLITE_FROM_HERE,
91 "SELECT filtered.publicId, parentLevel.publicId AS parentPublicId "
92 "FROM Resources as currentLevel "
93 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = currentLevel.internalId "
94 " INNER JOIN Resources parentLevel ON currentLevel.parentId = parentLevel.internalId");
95
96 while (statement.Step())
97 {
98 const std::string& resourceId = statement.ColumnString(0);
99 const std::string& parentId = statement.ColumnString(1);
100 assert(response.HasResource(resourceId));
101 response.GetResource(resourceId).SetParentIdentifier(parentId);
102 }
103 }
104
105 if (request.IsRetrieveMetadata())
106 {
107 SQLite::Statement statement(db_, SQLITE_FROM_HERE,
108 "SELECT filtered.publicId, metadata.type, metadata.value "
109 "FROM Metadata "
110 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = Metadata.id");
111
112 while (statement.Step())
113 {
114 const std::string& resourceId = statement.ColumnString(0);
115 assert(response.HasResource(resourceId));
116 response.GetResource(resourceId).AddMetadata(static_cast<MetadataType>(statement.ColumnInt(1)),
117 statement.ColumnString(2));
118 }
119 }
120
121 if (request.IsRetrieveLabels())
122 {
123 SQLite::Statement statement(db_, SQLITE_FROM_HERE,
124 "SELECT filtered.publicId, label "
125 "FROM Labels "
126 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = Labels.id");
127
128 while (statement.Step())
129 {
130 const std::string& resourceId = statement.ColumnString(0);
131 assert(response.HasResource(resourceId));
132 response.GetResource(resourceId).AddLabel(statement.ColumnString(1));
133 }
134 }
135
136 if (request.IsRetrieveAttachments())
137 {
138 SQLite::Statement statement(db_, SQLITE_FROM_HERE,
139 "SELECT filtered.publicId, uuid, fileType, uncompressedSize, compressionType, compressedSize, "
140 " uncompressedMD5, compressedMD5 "
141 "FROM AttachedFiles "
142 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = AttachedFiles.id");
143
144 while (statement.Step())
145 {
146 const std::string& resourceId = statement.ColumnString(0);
147 FileInfo attachment = FileInfo(statement.ColumnString(1),
148 static_cast<FileContentType>(statement.ColumnInt(2)),
149 statement.ColumnInt64(3),
150 statement.ColumnString(6),
151 static_cast<CompressionType>(statement.ColumnInt(4)),
152 statement.ColumnInt64(5),
153 statement.ColumnString(7));
154
155 assert(response.HasResource(resourceId));
156 response.GetResource(resourceId).AddAttachment(attachment);
157 };
158 }
159
160 // TODO-FIND: implement other responseContent: ResponseContent_ChildInstanceId, ResponseContent_ChildrenMetadata (later: ResponseContent_IsStable)
161
162 }
163
164 #endif
165 }
166 #endif
167