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,