comparison Framework/Plugins/IndexBackend.cpp @ 164:6f83b74373d3 optimized-routes

/optimized-routes/studies/../instances-metadatas: include empty dico if no metadata such that all instances are listed
author Alain Mazy <alain@mazy.be>
date Tue, 14 Jul 2020 09:47:46 +0200
parents 2ccde9c7311b
children
comparison
equal deleted inserted replaced
161:2ccde9c7311b 164:6f83b74373d3
1976 void IndexBackend::GetStudyInstancesMetadata(std::map<std::string, std::map<int32_t, std::string>>& target /*out*/, 1976 void IndexBackend::GetStudyInstancesMetadata(std::map<std::string, std::map<int32_t, std::string>>& target /*out*/,
1977 std::string& publicStudyId, 1977 std::string& publicStudyId,
1978 std::list<int32_t> metadataTypes) 1978 std::list<int32_t> metadataTypes)
1979 { 1979 {
1980 { 1980 {
1981 std::string sql = "SELECT instances.publicid, metadata.type, metadata.value FROM resources instances " 1981 std::string metadataSqlFilter = "";
1982 "LEFT JOIN metadata ON metadata.id = instances.internalid "
1983 "INNER JOIN resources series ON instances.parentid = series.internalid "
1984 "INNER JOIN resources studies ON series.parentid = studies.internalid "
1985 " WHERE studies.publicId = ${id} ";
1986
1987
1988 if (metadataTypes.size() != 0) 1982 if (metadataTypes.size() != 0)
1989 { 1983 {
1990 std::list<std::string> metadataTypesStrings; 1984 std::list<std::string> metadataTypesStrings;
1991 for (std::list<int32_t>::const_iterator m = metadataTypes.begin(); m != metadataTypes.end(); m++) 1985 for (std::list<int32_t>::const_iterator m = metadataTypes.begin(); m != metadataTypes.end(); m++)
1992 { 1986 {
1993 metadataTypesStrings.push_back(boost::lexical_cast<std::string>(*m)); 1987 metadataTypesStrings.push_back(boost::lexical_cast<std::string>(*m));
1994 } 1988 }
1995 1989
1996 std::string metadataTypesFilter = boost::algorithm::join(metadataTypesStrings, ","); 1990 std::string metadataTypesFilter = boost::algorithm::join(metadataTypesStrings, ",");
1997 sql = sql + " AND metadata.type IN (" + metadataTypesFilter + ")"; 1991 metadataSqlFilter = "WHERE metadata.type IN (" + metadataTypesFilter + ")";
1998 } 1992 }
1993
1994 std::string sql = "SELECT instances.publicid, metadata.type, metadata.value "
1995 "FROM resources instances "
1996 " LEFT JOIN (select * from metadata " + metadataSqlFilter +
1997 " ) AS metadata ON metadata.id = instances.internalId "
1998 "INNER JOIN resources series ON instances.parentid = series.internalid "
1999 "INNER JOIN resources studies ON series.parentid = studies.internalid "
2000 " WHERE studies.publicId = ${id} ";
1999 2001
2000 DatabaseManager::StandaloneStatement statement(manager_, sql); 2002 DatabaseManager::StandaloneStatement statement(manager_, sql);
2001 2003
2002 statement.SetReadOnly(true); 2004 statement.SetReadOnly(true);
2003 statement.SetParameterType("id", ValueType_Utf8String); 2005 statement.SetParameterType("id", ValueType_Utf8String);
2017 } 2019 }
2018 2020
2019 while (!statement.IsDone()) 2021 while (!statement.IsDone())
2020 { 2022 {
2021 std::string instanceId = ReadString(statement, 0); 2023 std::string instanceId = ReadString(statement, 0);
2022 int32_t type = ReadInteger32(statement, 1);
2023 std::string value = ReadString(statement, 2);
2024 2024
2025 if (target.find(instanceId) == target.end()) 2025 if (target.find(instanceId) == target.end())
2026 { 2026 {
2027 target[instanceId] = std::map<std::int32_t, std::string>(); 2027 target[instanceId] = std::map<std::int32_t, std::string>();
2028 } 2028 }
2029 target[instanceId][type] = value; 2029
2030 if (statement.GetResultField(1).GetType() != ValueType_Null)
2031 {
2032 int32_t type = ReadInteger32(statement, 1);
2033 std::string value = ReadString(statement, 2);
2034
2035 target[instanceId][type] = value;
2036 }
2030 2037
2031 statement.Next(); 2038 statement.Next();
2032 } 2039 }
2033 } 2040 }
2034 } 2041 }