Mercurial > hg > orthanc
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 |