diff --git a/src/db/db/dbPropertiesRepository.cc b/src/db/db/dbPropertiesRepository.cc index bdee8ca6e..d01d068f7 100644 --- a/src/db/db/dbPropertiesRepository.cc +++ b/src/db/db/dbPropertiesRepository.cc @@ -35,7 +35,12 @@ namespace db const tl::Variant &property_name (db::property_names_id_type id) { - return *(reinterpret_cast (id)); + if (id == 0) { + static tl::Variant nil; + return nil; + } else { + return *(reinterpret_cast (id)); + } } db::property_names_id_type property_names_id (const tl::Variant &pn) @@ -45,7 +50,12 @@ db::property_names_id_type property_names_id (const tl::Variant &pn) const tl::Variant &property_value (db::property_values_id_type id) { - return *(reinterpret_cast (id)); + if (id == 0) { + static tl::Variant nil; + return nil; + } else { + return *(reinterpret_cast (id)); + } } db::property_values_id_type property_values_id (const tl::Variant &pv) @@ -55,7 +65,12 @@ db::property_values_id_type property_values_id (const tl::Variant &pv) const PropertiesSet &properties (db::properties_id_type id) { - return *(reinterpret_cast (id)); + if (id == 0) { + static db::PropertiesSet empty; + return empty; + } else { + return *(reinterpret_cast (id)); + } } db::properties_id_type properties_id (const PropertiesSet &ps) @@ -128,7 +143,7 @@ PropertiesSet::value (const tl::Variant &name) const { db::property_names_id_type nid = db::property_names_id (name); auto i = m_map.find (nid); - if (i == m_map.end () || i->second != nid) { + if (i == m_map.end () || i->first != nid) { static tl::Variant nil; return nil; } else { @@ -140,7 +155,7 @@ const tl::Variant & PropertiesSet::value (db::property_names_id_type nid) const { auto i = m_map.find (nid); - if (i == m_map.end () || i->second != nid) { + if (i == m_map.end () || i->first != nid) { static tl::Variant nil; return nil; } else { @@ -159,20 +174,26 @@ PropertiesSet::erase (const tl::Variant &name) { db::property_names_id_type nid = db::property_names_id (name); auto i = m_map.find (nid); - while (i != m_map.end () && i->second == nid) { - m_map.erase (nid); + auto ii = i; + while (i != m_map.end () && i->first == nid) { ++i; } + if (i != ii) { + m_map.erase (ii, i); + } } void PropertiesSet::erase (db::property_names_id_type nid) { auto i = m_map.find (nid); - while (i != m_map.end () && i->second == nid) { - m_map.erase (nid); + auto ii = i; + while (i != m_map.end () && i->first == nid) { ++i; } + if (i != ii) { + m_map.erase (ii, i); + } } void @@ -224,10 +245,11 @@ tl::Variant PropertiesSet::to_list_var () const { tl::Variant var = tl::Variant::empty_list (); - for (auto i = m_map.begin (); i != m_map.end (); ++i) { + auto map = to_map (); + for (auto i = map.begin (); i != map.end (); ++i) { tl::Variant el = tl::Variant::empty_list (); - el.push (db::property_name (i->first)); - el.push (db::property_value (i->second)); + el.push (i->first); + el.push (i->second); var.push (el); } return var; @@ -344,7 +366,7 @@ PropertiesRepository::properties_id (const PropertiesSet &props) changed = true; } else { - pid = db::properties_id (**pi); + pid = db::properties_id_type (*pi); } } diff --git a/src/db/db/dbPropertiesRepository.h b/src/db/db/dbPropertiesRepository.h index a83fdc369..8c0deb0e6 100644 --- a/src/db/db/dbPropertiesRepository.h +++ b/src/db/db/dbPropertiesRepository.h @@ -360,14 +360,6 @@ public: */ properties_id_type properties_id (const PropertiesSet &props); - /** - * @brief Associate a properties set with a properties Id - * - * This method will return the properties set associated with the given Id. - * Id 0 always delivers an empty property set. - */ - const PropertiesSet &properties (properties_id_type id) const; - /** * @brief Determine if the given ID is a valid properties ID * diff --git a/src/db/unit_tests/dbPropertiesRepositoryTests.cc b/src/db/unit_tests/dbPropertiesRepositoryTests.cc index c5e266f6d..aec66a526 100644 --- a/src/db/unit_tests/dbPropertiesRepositoryTests.cc +++ b/src/db/unit_tests/dbPropertiesRepositoryTests.cc @@ -118,8 +118,8 @@ TEST(BasicPropertySetsInRepository) EXPECT_EQ (id1, id1_copy); EXPECT_EQ (id2, id2_copy); - EXPECT_EQ (rep.properties (id1) == set1, true); - EXPECT_EQ (rep.properties (id2) == set2, true); + EXPECT_EQ (db::properties (id1) == set1, true); + EXPECT_EQ (db::properties (id2) == set2, true); } TEST(PropertySets) @@ -151,14 +151,14 @@ TEST(PropertySets) EXPECT_EQ (ps1 [tl::Variant ("x")].is_nil (), true); EXPECT_EQ (ps1 == ps2, false); EXPECT_EQ (ps1 != ps2, true); - EXPECT_EQ (ps1 < ps2, true); - EXPECT_EQ (ps2 < ps1, false); + EXPECT_EQ (ps1 < ps2, false); + EXPECT_EQ (ps2 < ps1, true); ps2.swap (ps1); EXPECT_EQ (ps1.value (tl::Variant (17)).is_nil (), true); EXPECT_EQ (ps2.value (tl::Variant (17)).to_string (), "value"); - ps2 = ps1; + ps1 = ps2; EXPECT_EQ (ps1.value (tl::Variant (17)).to_string (), "value"); EXPECT_EQ (ps1.value (tl::Variant ("x")).is_nil (), true); EXPECT_EQ (ps1 == ps2, true); @@ -187,7 +187,7 @@ TEST(PropertySetsMerge) ps1.merge (ps2); - EXPECT_EQ (ps1.to_dict_var ().to_string (), "..."); + EXPECT_EQ (ps1.to_dict_var ().to_string (), "17=>value,x=>42"); } TEST(PropertySetsConversions) @@ -198,8 +198,8 @@ TEST(PropertySetsConversions) ps1.insert (tl::Variant (17), tl::Variant ("value")); ps1.insert (tl::Variant ("x"), tl::Variant (42)); - EXPECT_EQ (ps1.to_dict_var ().to_string (), "..."); - EXPECT_EQ (ps1.to_list_var ().to_string (), "..."); + EXPECT_EQ (ps1.to_dict_var ().to_string (), "17=>value,x=>42"); + EXPECT_EQ (ps1.to_list_var ().to_string (), "17,value,x,42"); auto ps1_map = ps1.to_map (); EXPECT_EQ (ps1_map.size (), size_t (2)); @@ -229,36 +229,36 @@ TEST(PropertiesTranslator) ps.insert (key1, 100); ps.insert (key2, 101); db::properties_id_type prop1a = rp.properties_id (ps); - EXPECT_EQ (db::prop2string (prop1a), "1=100\n2=101"); + EXPECT_EQ (db::prop2string (prop1a), "1=>100,2=>101"); ps.clear (); ps.insert (key1, 0); ps.insert (key2, 101); db::properties_id_type prop1b = rp.properties_id (ps); - EXPECT_EQ (db::prop2string (prop1b), "1=0\n2=101"); + EXPECT_EQ (db::prop2string (prop1b), "1=>0,2=>101"); ps.clear (); ps.insert (key1, 100); ps.insert (key3, 102); db::properties_id_type prop2 = rp.properties_id (ps); - EXPECT_EQ (db::prop2string (prop2), "1=100\n3=102"); + EXPECT_EQ (db::prop2string (prop2), "1=>100,3=>102"); ps.clear (); ps.insert (key1, 100); db::properties_id_type prop3 = rp.properties_id (ps); - EXPECT_EQ (db::prop2string (prop3), "1=100"); + EXPECT_EQ (db::prop2string (prop3), "1=>100"); db::PropertiesTranslator t; - EXPECT_EQ (db::prop2string (t (prop1a)), "1=100\n2=101"); - EXPECT_EQ (db::prop2string (t (prop1b)), "1=0\n2=101"); - EXPECT_EQ (db::prop2string (t (prop2)), "1=100\n3=102"); - EXPECT_EQ (db::prop2string (t (prop3)), "1=100"); + EXPECT_EQ (db::prop2string (t (prop1a)), "1=>100,2=>101"); + EXPECT_EQ (db::prop2string (t (prop1b)), "1=>0,2=>101"); + EXPECT_EQ (db::prop2string (t (prop2)), "1=>100,3=>102"); + EXPECT_EQ (db::prop2string (t (prop3)), "1=>100"); t = db::PropertiesTranslator::make_pass_all (); - EXPECT_EQ (db::prop2string (t (prop1a)), "1=100\n2=101"); - EXPECT_EQ (db::prop2string (t (prop1b)), "1=0\n2=101"); - EXPECT_EQ (db::prop2string (t (prop2)), "1=100\n3=102"); - EXPECT_EQ (db::prop2string (t (prop3)), "1=100"); + EXPECT_EQ (db::prop2string (t (prop1a)), "1=>100,2=>101"); + EXPECT_EQ (db::prop2string (t (prop1b)), "1=>0,2=>101"); + EXPECT_EQ (db::prop2string (t (prop2)), "1=>100,3=>102"); + EXPECT_EQ (db::prop2string (t (prop3)), "1=>100"); t = db::PropertiesTranslator::make_remove_all (); EXPECT_EQ (db::prop2string (t (prop1a)), ""); @@ -269,36 +269,36 @@ TEST(PropertiesTranslator) std::set kf; kf.insert (1); t = db::PropertiesTranslator::make_filter (kf, rp); - EXPECT_EQ (db::prop2string (t (prop1a)), "1=100"); - EXPECT_EQ (db::prop2string (t (prop1b)), "1=0"); - EXPECT_EQ (db::prop2string (t (prop2)), "1=100"); - EXPECT_EQ (db::prop2string (t (prop3)), "1=100"); + EXPECT_EQ (db::prop2string (t (prop1a)), "1=>100"); + EXPECT_EQ (db::prop2string (t (prop1b)), "1=>0"); + EXPECT_EQ (db::prop2string (t (prop2)), "1=>100"); + EXPECT_EQ (db::prop2string (t (prop3)), "1=>100"); kf.insert (3); t = db::PropertiesTranslator::make_filter (kf, rp); - EXPECT_EQ (db::prop2string (t (prop1a)), "1=100"); - EXPECT_EQ (db::prop2string (t (prop1b)), "1=0"); - EXPECT_EQ (db::prop2string (t (prop2)), "1=100\n3=102"); - EXPECT_EQ (db::prop2string (t (prop3)), "1=100"); + EXPECT_EQ (db::prop2string (t (prop1a)), "1=>100"); + EXPECT_EQ (db::prop2string (t (prop1b)), "1=>0"); + EXPECT_EQ (db::prop2string (t (prop2)), "1=>100,3=>102"); + EXPECT_EQ (db::prop2string (t (prop3)), "1=>100"); std::map km; km[1] = 4; km[3] = 1; t = db::PropertiesTranslator::make_key_mapper (km, rp); - EXPECT_EQ (db::prop2string (t (prop1a)), "4=100"); - EXPECT_EQ (db::prop2string (t (prop1b)), "4=0"); - EXPECT_EQ (db::prop2string (t (prop2)), "1=102\n4=100"); - EXPECT_EQ (db::prop2string (t (prop3)), "4=100"); + EXPECT_EQ (db::prop2string (t (prop1a)), "4=>100"); + EXPECT_EQ (db::prop2string (t (prop1b)), "4=>0"); + EXPECT_EQ (db::prop2string (t (prop2)), "1=>102,4=>100"); + EXPECT_EQ (db::prop2string (t (prop3)), "4=>100"); kf.clear (); kf.insert (4); t = db::PropertiesTranslator::make_filter (kf, rp) * db::PropertiesTranslator::make_key_mapper (km, rp); EXPECT_EQ (t.is_empty (), false); - EXPECT_EQ (db::prop2string (t (prop1a)), "4=100"); - EXPECT_EQ (db::prop2string (t (prop1b)), "4=0"); - EXPECT_EQ (db::prop2string (t (prop2)), "4=100"); - EXPECT_EQ (db::prop2string (t (prop3)), "4=100"); + EXPECT_EQ (db::prop2string (t (prop1a)), "4=>100"); + EXPECT_EQ (db::prop2string (t (prop1b)), "4=>0"); + EXPECT_EQ (db::prop2string (t (prop2)), "4=>100"); + EXPECT_EQ (db::prop2string (t (prop3)), "4=>100"); kf.clear (); kf.insert (3); @@ -314,7 +314,7 @@ TEST(PropertiesTranslator) EXPECT_EQ (t.is_empty (), false); EXPECT_EQ (db::prop2string (t (prop1a)), ""); EXPECT_EQ (db::prop2string (t (prop1b)), ""); - EXPECT_EQ (db::prop2string (t (prop2)), "1=102"); + EXPECT_EQ (db::prop2string (t (prop2)), "1=>102"); EXPECT_EQ (db::prop2string (t (prop3)), ""); t = db::PropertiesTranslator::make_key_mapper (km, rp); @@ -330,6 +330,6 @@ TEST(PropertiesTranslator) EXPECT_EQ (t.is_empty (), false); EXPECT_EQ (db::prop2string (t (prop1a)), ""); EXPECT_EQ (db::prop2string (t (prop1b)), ""); - EXPECT_EQ (db::prop2string (t (prop2)), "1=102"); + EXPECT_EQ (db::prop2string (t (prop2)), "1=>102"); EXPECT_EQ (db::prop2string (t (prop3)), ""); }