[gxml] GomHashThreeMap: reimplemented using Gee.HashMap
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gxml] GomHashThreeMap: reimplemented using Gee.HashMap
- Date: Fri, 9 Jun 2017 20:51:14 +0000 (UTC)
commit c5e9e7fa736c2e99a15412ee54aaa8765599c8ba
Author: Daniel Espinosa <esodan gmail com>
Date: Fri Jun 9 15:49:24 2017 -0500
GomHashThreeMap: reimplemented using Gee.HashMap
There are an issue to get keys from a GLib.HashTable
inside a GLib.HashTable, so it is replaced using Gee.HashTable
gxml/GomCollections.vala | 28 ++++++++----
test/GomSerializationTest.vala | 90 +++++++++++++++++++++++++++++++++++++++-
2 files changed, 108 insertions(+), 10 deletions(-)
---
diff --git a/gxml/GomCollections.vala b/gxml/GomCollections.vala
index e8ef380..0294910 100644
--- a/gxml/GomCollections.vala
+++ b/gxml/GomCollections.vala
@@ -705,7 +705,7 @@ public class GXml.GomHashThreeMap : GXml.BaseCollection, GXml.GomCollection {
/**
* A hashtable with all keys as string to node's index refered. Don't modify it manually.
*/
- protected HashTable<string,HashTable<string,HashTable<string,int>>> _hashtable = new
HashTable<string,HashTable<string,HashTable<string,int>>> (str_hash,str_equal);
+ protected HashMap<string,HashMap<string,HashMap<string,int>>> _hashtable = new
HashMap<string,HashMap<string,HashMap<string,int>>> ();
/**
* Element's attribute name used to refer of container's element as primery key.
* You should define it at construction time
@@ -827,7 +827,11 @@ public class GXml.GomHashThreeMap : GXml.BaseCollection, GXml.GomCollection {
* Returns list of primary keys used in collection.
*/
public GLib.List<string> get_primary_keys () {
- return _hashtable.get_keys ();
+ var l = new GLib.List<string> ();
+ foreach (string k in _hashtable.keys) {
+ l.append (k);
+ }
+ return l;
}
/**
* Returns list of secondary keys used in collection with pkey as primary key.
@@ -837,7 +841,10 @@ public class GXml.GomHashThreeMap : GXml.BaseCollection, GXml.GomCollection {
if (!_hashtable.contains (pkey)) return l;
var ht = _hashtable.get (pkey);
if (ht == null) return l;
- return ht.get_keys ();
+ foreach (string k in ht.keys) {
+ l.append (k);
+ }
+ return l;
}
/**
* Returns list of third keys used in collection with pkey as primary key
@@ -850,7 +857,10 @@ public class GXml.GomHashThreeMap : GXml.BaseCollection, GXml.GomCollection {
if (ht == null) return l;
var hte = ht.get (skey);
if (hte == null) return l;
- return hte.get_keys ();
+ foreach (string k in hte.keys) {
+ l.append (k);
+ }
+ return l;
}
/**
* Validates if given element has a {@link attribute_primary_key},
@@ -891,12 +901,12 @@ public class GXml.GomHashThreeMap : GXml.BaseCollection, GXml.GomCollection {
}
if (pkey == null || skey == null || tkey == null) return false;
var ht = _hashtable.get (pkey);
- if (ht == null) ht = new HashTable<string,HashTable<string,int>> (str_hash, str_equal);
+ if (ht == null) ht = new HashMap<string,HashMap<string,int>> ();
var hte = ht.get (skey);
- if (hte == null) hte = new HashTable<string,int> (str_hash, str_equal);
- if (!_hashtable.contains (pkey)) _hashtable.insert (pkey, ht);
- if (!ht.contains (skey)) ht.insert (skey, hte);
- hte.insert (tkey, index);
+ if (hte == null) hte = new HashMap<string,int> ();
+ if (!_hashtable.contains (pkey)) _hashtable.set (pkey, ht);
+ if (!ht.contains (skey)) ht.set (skey, hte);
+ hte.set (tkey, index);
return true;
}
}
diff --git a/test/GomSerializationTest.vala b/test/GomSerializationTest.vala
index f9b90fc..3496f23 100644
--- a/test/GomSerializationTest.vala
+++ b/test/GomSerializationTest.vala
@@ -23,6 +23,41 @@
using GXml;
// GOM Collection Definitions
+class ThreeKeys : GomElement {
+ private ThreeKey.Map _map;
+ public ThreeKey.Map map {
+ get {
+ if (_map == null)
+ set_instance_property ("map");
+ return _map;
+ }
+ set {
+ if (_map != null)
+ try { clean_property_elements ("map"); }
+ catch (GLib.Error e) { warning ("Error: "+e.message); }
+ _map = value;
+ }
+ }
+ construct { try { initialize ("ThreeKeys"); } catch { assert_not_reached (); } }
+}
+class ThreeKey : GomElement, MappeableElementThreeKey {
+ [Description (nick="::ID")]
+ public string id { get; set; }
+ [Description (nick="::Code")]
+ public string code { get; set; }
+ [Description (nick="::name")]
+ public string name { get; set; }
+ construct { try { initialize ("ThreeKey"); } catch { assert_not_reached (); } }
+ public string get_map_pkey () { return id; }
+ public string get_map_skey () { return code; }
+ public string get_map_tkey () { return name; }
+ public class Map : GomHashThreeMap {
+ construct {
+ try { initialize (typeof (ThreeKey)); }
+ catch (GLib.Error e) { message ("Error: "+e.message); }
+ }
+ }
+}
class Operations : GomElement {
private Operation.Map _map;
public Operation.Map map {
@@ -279,6 +314,7 @@ class GomSerializationTest : GXmlTest {
string s = "";
try {
s = parser.write_string ();
+ assert (s != "");
} catch (GLib.Error e) {
GLib.message ("Error: "+e.message);
assert_not_reached ();
@@ -1163,7 +1199,7 @@ class GomSerializationTest : GXmlTest {
assert_not_reached ();
}
});
- Test.add_func ("/gxml/gom-serialization/collections/hashpairedmap",
+ Test.add_func ("/gxml/gom-serialization/collections/hashpairedmap/keys",
() => {
try {
var ops = new Operations ();
@@ -1210,5 +1246,57 @@ class GomSerializationTest : GXmlTest {
assert_not_reached ();
}
});
+ Test.add_func ("/gxml/gom-serialization/collections/hashthreemap/keys",
+ () => {
+ try {
+ var ks = new ThreeKeys ();
+ assert (ks.map != null);
+ assert (ks.map.length == 0);
+ var k1 = ks.map.create_item () as ThreeKey;
+ assert (k1 is ThreeKey);
+ k1.id = "a1";
+ k1.code = "b1";
+ k1.name = "name1";
+ ks.map.append (k1);
+ assert (ks.map.length == 1);
+ var tk1 = ks.map.get ("a1", "b1", "name1") as ThreeKey;
+ assert (tk1 is ThreeKey);
+ assert (tk1.id == "a1");
+ assert (tk1.code == "b1");
+ assert (tk1.name == "name1");
+ var pkeys1 = ks.map.get_primary_keys ();
+ assert (pkeys1.length () == 1);
+ var k2 = ks.map.create_item () as ThreeKey;
+ assert (k2 is ThreeKey);
+ k2.id = "a1";
+ k2.code = "b2";
+ k2.name = "name2";
+ ks.map.append (k2);
+ var k3 = ks.map.create_item () as ThreeKey;
+ assert (k3 is ThreeKey);
+ k3.id = "a2";
+ k3.code = "b1";
+ k3.name = "name3";
+ ks.map.append (k3);
+ assert (ks.map.length == 3);
+ var k4 = ks.map.create_item () as ThreeKey;
+ assert (k4 is ThreeKey);
+ k4.id = "a2";
+ k4.code = "b2";
+ k4.name = "name3";
+ ks.map.append (k4);
+ assert (ks.map.length == 4);
+ message (ks.write_string ());
+ var pkeys2 = ks.map.get_primary_keys ();
+ assert (pkeys2.length () == 2);
+ foreach (string pk in pkeys2) { message (pk); }
+ var skeys1 = ks.map.get_secondary_keys ("a1");
+ foreach (string pk in skeys1) { message (pk); }
+ assert (skeys1.length () == 2);
+ } catch (GLib.Error e) {
+ GLib.message ("ERROR: "+e.message);
+ assert_not_reached ();
+ }
+ });
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]