[gxml] GomHashThreeMap: reimplemented using Gee.HashMap



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]