Mercurial > hg > orthanc
comparison OrthancServer/Sources/Database/StatelessDatabaseOperations.cpp @ 5039:28db9663fc2d
DicomSequencesMap + fix unit tests
author | Alain Mazy <am@osimis.io> |
---|---|
date | Mon, 27 Jun 2022 10:48:46 +0200 |
parents | 877bc3b96476 |
children | 120945ce48b6 |
comparison
equal
deleted
inserted
replaced
5038:f8bea9c1c0fc | 5039:28db9663fc2d |
---|---|
43 #include <stack> | 43 #include <stack> |
44 | 44 |
45 | 45 |
46 namespace Orthanc | 46 namespace Orthanc |
47 { | 47 { |
48 // copy all tags from Json | 48 // copy all tags from Json (used to read from metadata) |
49 void DicomSequencesMap::FromJson(const Json::Value& value) | 49 void DicomSequencesMap::Deserialize(const Json::Value& serialized) |
50 { | 50 { |
51 Json::Value::Members members = value.getMemberNames(); | 51 Json::Value::Members members = serialized.getMemberNames(); |
52 for (size_t i = 0; i < members.size(); i++) | 52 for (size_t i = 0; i < members.size(); i++) |
53 { | 53 { |
54 DicomTag tag = FromDcmtkBridge::ParseTag(members[i].c_str()); | 54 DicomTag tag = FromDcmtkBridge::ParseTag(members[i].c_str()); |
55 sequences_[tag] = value[members[i]]; | 55 sequences_[tag] = serialized[members[i]]; |
56 } | |
57 } | |
58 | |
59 // serialize a subet of tags (used to store in the metadata) | |
60 void DicomSequencesMap::Serialize(Json::Value& target, const std::set<DicomTag>& tags) const | |
61 { | |
62 // add the sequences to "target" | |
63 for (std::map<DicomTag, Json::Value>::const_iterator it = sequences_.begin(); | |
64 it != sequences_.end(); ++it) | |
65 { | |
66 if (tags.find(it->first) != tags.end()) | |
67 { | |
68 target[it->first.Format()] = it->second; | |
69 } | |
56 } | 70 } |
57 } | 71 } |
58 | 72 |
59 // copy a subset of tags from Json | 73 // copy a subset of tags from Json |
60 void DicomSequencesMap::FromDicomAsJson(const Json::Value& dicomAsJson, const std::set<DicomTag>& tags) | 74 void DicomSequencesMap::FromDicomAsJson(const Json::Value& dicomAsJson, const std::set<DicomTag>& tags) |
924 { | 938 { |
925 Json::Value jsonMetadata; | 939 Json::Value jsonMetadata; |
926 Toolbox::ReadJson(jsonMetadata, serializedSequences); | 940 Toolbox::ReadJson(jsonMetadata, serializedSequences); |
927 | 941 |
928 assert(jsonMetadata["Version"].asInt() == 1); | 942 assert(jsonMetadata["Version"].asInt() == 1); |
929 target.sequences_.FromJson(jsonMetadata["Sequences"]); | 943 target.sequences_.Deserialize(jsonMetadata["Sequences"]); |
930 } | 944 } |
931 | 945 |
932 // check if we have access to all requestedTags or if we must get tags from parents | 946 // check if we have access to all requestedTags or if we must get tags from parents |
933 const std::set<DicomTag>& requestedTags = tuple.get<4>(); | 947 const std::set<DicomTag>& requestedTags = tuple.get<4>(); |
934 | 948 |
2895 } | 2909 } |
2896 | 2910 |
2897 | 2911 |
2898 StoreStatus StatelessDatabaseOperations::Store(std::map<MetadataType, std::string>& instanceMetadata, | 2912 StoreStatus StatelessDatabaseOperations::Store(std::map<MetadataType, std::string>& instanceMetadata, |
2899 const DicomMap& dicomSummary, | 2913 const DicomMap& dicomSummary, |
2900 const std::map<DicomTag, Json::Value>& sequencesToStore, | 2914 const DicomSequencesMap& sequencesToStore, |
2901 const Attachments& attachments, | 2915 const Attachments& attachments, |
2902 const MetadataMap& metadata, | 2916 const MetadataMap& metadata, |
2903 const DicomInstanceOrigin& origin, | 2917 const DicomInstanceOrigin& origin, |
2904 bool overwrite, | 2918 bool overwrite, |
2905 bool hasTransferSyntax, | 2919 bool hasTransferSyntax, |
2914 { | 2928 { |
2915 private: | 2929 private: |
2916 StoreStatus storeStatus_; | 2930 StoreStatus storeStatus_; |
2917 std::map<MetadataType, std::string>& instanceMetadata_; | 2931 std::map<MetadataType, std::string>& instanceMetadata_; |
2918 const DicomMap& dicomSummary_; | 2932 const DicomMap& dicomSummary_; |
2919 const std::map<DicomTag, Json::Value>& sequencesToStore_; | 2933 const DicomSequencesMap& sequencesToStore_; |
2920 const Attachments& attachments_; | 2934 const Attachments& attachments_; |
2921 const MetadataMap& metadata_; | 2935 const MetadataMap& metadata_; |
2922 const DicomInstanceOrigin& origin_; | 2936 const DicomInstanceOrigin& origin_; |
2923 bool overwrite_; | 2937 bool overwrite_; |
2924 bool hasTransferSyntax_; | 2938 bool hasTransferSyntax_; |
2948 instanceMetadata[metadata] = value; | 2962 instanceMetadata[metadata] = value; |
2949 } | 2963 } |
2950 | 2964 |
2951 static void SetMainDicomSequenceMetadata(ResourcesContent& content, | 2965 static void SetMainDicomSequenceMetadata(ResourcesContent& content, |
2952 int64_t resource, | 2966 int64_t resource, |
2953 const std::map<DicomTag, Json::Value>& sequencesToStore, // all sequences for all levels ! | 2967 const DicomSequencesMap& sequencesToStore, // all sequences for all levels ! |
2954 ResourceType level) | 2968 ResourceType level) |
2955 { | 2969 { |
2956 if (sequencesToStore.size() > 0) | 2970 if (sequencesToStore.GetSize() > 0) |
2957 { | 2971 { |
2958 const std::set<DicomTag>& levelTags = DicomMap::GetMainDicomTags(level); | 2972 const std::set<DicomTag>& levelTags = DicomMap::GetMainDicomTags(level); |
2959 std::set<DicomTag> levelSequences; | 2973 std::set<DicomTag> levelSequences; |
2960 DicomMap::ExtractSequences(levelSequences, levelTags); | 2974 DicomMap::ExtractSequences(levelSequences, levelTags); |
2961 | 2975 |
2964 return; | 2978 return; |
2965 } | 2979 } |
2966 | 2980 |
2967 Json::Value jsonMetadata; | 2981 Json::Value jsonMetadata; |
2968 jsonMetadata["Version"] = 1; | 2982 jsonMetadata["Version"] = 1; |
2969 Json::Value jsonSequences = Json::objectValue; | 2983 jsonMetadata["Sequences"] = Json::objectValue; |
2970 | 2984 sequencesToStore.Serialize(jsonMetadata["Sequences"], levelSequences); |
2971 for (std::set<DicomTag>::const_iterator it = levelSequences.begin(); | 2985 |
2972 it != levelSequences.end(); ++it) | |
2973 { | |
2974 std::map<DicomTag, Json::Value>::const_iterator foundSeq = sequencesToStore.find(*it); | |
2975 if (foundSeq != sequencesToStore.end()) | |
2976 { | |
2977 jsonSequences[it->Format()] = foundSeq->second; | |
2978 } | |
2979 } | |
2980 jsonMetadata["Sequences"] = jsonSequences; | |
2981 | |
2982 std::string serialized; | 2986 std::string serialized; |
2983 Toolbox::WriteFastJson(serialized, jsonMetadata); | 2987 Toolbox::WriteFastJson(serialized, jsonMetadata); |
2984 | 2988 |
2985 content.AddMetadata(resource, MetadataType_MainDicomSequences, serialized); | 2989 content.AddMetadata(resource, MetadataType_MainDicomSequences, serialized); |
2986 } | 2990 } |
3042 } | 3046 } |
3043 | 3047 |
3044 public: | 3048 public: |
3045 Operations(std::map<MetadataType, std::string>& instanceMetadata, | 3049 Operations(std::map<MetadataType, std::string>& instanceMetadata, |
3046 const DicomMap& dicomSummary, | 3050 const DicomMap& dicomSummary, |
3047 const std::map<DicomTag, Json::Value>& sequencesToStore, | 3051 const DicomSequencesMap& sequencesToStore, |
3048 const Attachments& attachments, | 3052 const Attachments& attachments, |
3049 const MetadataMap& metadata, | 3053 const MetadataMap& metadata, |
3050 const DicomInstanceOrigin& origin, | 3054 const DicomInstanceOrigin& origin, |
3051 bool overwrite, | 3055 bool overwrite, |
3052 bool hasTransferSyntax, | 3056 bool hasTransferSyntax, |