From f8baf37765580eaa497f675f102ef713a67083fe Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Tue, 19 Apr 2011 22:27:27 +0100 Subject: [PATCH] Change UrlDetails.urls to be a Set Helps: bgo#640092 --- NEWS | 1 + backends/libsocialweb/lib/swf-persona.vala | 18 ++--- backends/tracker/lib/trf-persona-store.vala | 115 +++++----------------------- backends/tracker/lib/trf-persona.vala | 22 ++---- folks/individual.vala | 31 ++++---- folks/url-details.vala | 5 +- tests/tracker/add-persona.vala | 11 ++- tests/tracker/set-urls.vala | 12 +-- tests/tracker/website-updates.vala | 4 +- tools/inspect/utils.vala | 23 +----- 10 files changed, 68 insertions(+), 174 deletions(-) diff --git a/NEWS b/NEWS index 718c3a8..56aef5e 100644 --- a/NEWS +++ b/NEWS @@ -24,6 +24,7 @@ API changes: * PostalAddressDetails.postal_addresses is now of type Set * EmailDetails.email_addresses is now of type Set * PhoneDetails.phone_numbers is now of type Set +* UrlDetails.urls is now of type Set Overview of changes from libfolks 0.4.0 to libfolks 0.5.0 ========================================================= diff --git a/backends/libsocialweb/lib/swf-persona.vala b/backends/libsocialweb/lib/swf-persona.vala index bf25d11..c913331 100644 --- a/backends/libsocialweb/lib/swf-persona.vala +++ b/backends/libsocialweb/lib/swf-persona.vala @@ -79,19 +79,19 @@ public class Swf.Persona : Folks.Persona, */ public Gender gender { get; private set; } - private GLib.List _urls; + private HashSet _urls; + /** * {@inheritDoc} */ - public GLib.List urls + public Set urls { get { return this._urls; } private set { - this._urls = new GLib.List (); - foreach (unowned FieldDetails ps in value) - this._urls.prepend (ps); - this._urls.reverse (); + this._urls = new HashSet (); + foreach (var ps in value) + this._urls.add (ps); } } @@ -251,16 +251,16 @@ public class Swf.Persona : Folks.Persona, if (this.full_name != full_name) this.full_name = full_name; - var urls = new GLib.List (); + var urls = new HashSet (); var website = contact.get_value ("url"); if (website != null) - urls.prepend (new FieldDetails (website)); + urls.add (new FieldDetails (website)); /* https://bugzilla.gnome.org/show_bug.cgi?id=645139 string[] websites = contact.get_value_all ("url"); foreach (string website in websites) - urls.prepend (new FieldDetails (website)); + urls.add (new FieldDetails (website)); */ if (this.urls != urls) this.urls = urls; diff --git a/backends/tracker/lib/trf-persona-store.vala b/backends/tracker/lib/trf-persona-store.vala index 86f9f10..7cff6c2 100644 --- a/backends/tracker/lib/trf-persona-store.vala +++ b/backends/tracker/lib/trf-persona-store.vala @@ -612,8 +612,7 @@ public class Trf.PersonaStore : Folks.PersonaStore } else if (k == Folks.PersonaStore.detail_key (PersonaDetail.URLS)) { - unowned GLib.List urls = - (GLib.List) v.get_pointer (); + Set urls = (Set) v.get_object (); int url_cnt = 0; foreach (var u in urls) @@ -1970,9 +1969,9 @@ public class Trf.PersonaStore : Folks.PersonaStore } internal async void _set_urls (Folks.Persona persona, - owned GLib.List urls) + Set urls) { - yield this._set_attrib (persona, (owned) urls, + yield this._set_attrib_set (persona, urls, Trf.Attrib.URLS); } @@ -2257,97 +2256,6 @@ public class Trf.PersonaStore : Folks.PersonaStore * - first we nuke old attribs * - we create new affls with the new attribs */ - private async void _set_attrib (Folks.Persona persona, - owned GLib.List attribs, Trf.Attrib what) - { - var p_id = ((Trf.Persona) persona).tracker_id (); - - unowned string? related_attrib = null; - unowned string? related_prop = null; - unowned string? related_prop_2 = null; - unowned string? related_connection = null; - - switch (what) - { - case Trf.Attrib.URLS: - related_attrib = Trf.OntologyDefs.NCO_URL; - related_connection = Trf.OntologyDefs.NCO_URL; - break; - case Trf.Attrib.IM_ADDRESSES: - assert_not_reached (); - case Trf.Attrib.POSTAL_ADDRESSES: - assert_not_reached (); - } - - var builder = new Tracker.Sparql.Builder.update (); - builder.insert_open (null); - int i = 0; - foreach (var p in attribs) - { - FieldDetails fd = null; - - string affl = "_:a%d".printf (i); - string attr; - - if (what == Trf.Attrib.URLS) - { - fd = (FieldDetails) p; - var type_p = fd.get_parameter_values ("type"); - if (type_p.contains ("blog")) - { - related_connection = Trf.OntologyDefs.NCO_BLOG; - } - else if (type_p.contains ("website")) - { - related_connection = Trf.OntologyDefs.NCO_WEBSITE; - } - attr = "'%s'".printf (fd.value); - } - else - { - fd = (FieldDetails) p; - attr = "_:p%d".printf (i); - builder.subject (attr); - builder.predicate ("a"); - builder.object (related_attrib); - builder.predicate (related_prop); - builder.object_string (fd.value); - - if (what == Trf.Attrib.IM_ADDRESSES) - { - builder.predicate (related_prop_2); - var im_params = fd.get_parameter_values ("proto").to_array (); - builder.object_string (im_params[0]); - } - } - - builder.subject (affl); - builder.predicate ("a"); - builder.object (Trf.OntologyDefs.NCO_AFFILIATION); - builder.predicate (related_connection); - builder.object (attr); - builder.subject ("?contact"); - builder.predicate (Trf.OntologyDefs.NCO_HAS_AFFILIATION); - builder.object (affl); - - i++; - } - builder.insert_close (); - builder.where_open (); - builder.subject ("?contact"); - builder.predicate ("a"); - builder.object (Trf.OntologyDefs.NCO_PERSON); - string filter = " FILTER(tracker:id(?contact) = %s) ".printf (p_id); - builder.append (filter); - builder.where_close (); - - yield this._tracker_update (builder.result, "set_attrib"); - } - - /* NOTE: - * - first we nuke old attribs - * - we create new affls with the new attribs - */ private async void _set_attrib_set (Folks.Persona persona, Set attribs, Trf.Attrib what) { @@ -2375,7 +2283,9 @@ public class Trf.PersonaStore : Folks.PersonaStore _REMOVE_POSTALS); break; case Trf.Attrib.URLS: - assert_not_reached (); + related_attrib = Trf.OntologyDefs.NCO_URL; + related_connection = Trf.OntologyDefs.NCO_URL; + break; } var builder = new Tracker.Sparql.Builder.update (); @@ -2413,7 +2323,18 @@ public class Trf.PersonaStore : Folks.PersonaStore builder.object_string (pa.region); break; case Trf.Attrib.URLS: - assert_not_reached (); + fd = (FieldDetails) p; + var type_p = fd.get_parameter_values ("type"); + if (type_p.contains ("blog")) + { + related_connection = Trf.OntologyDefs.NCO_BLOG; + } + else if (type_p.contains ("website")) + { + related_connection = Trf.OntologyDefs.NCO_WEBSITE; + } + attr = "'%s'".printf (fd.value); + break; case Trf.Attrib.IM_ADDRESSES: default: fd = (FieldDetails) p; diff --git a/backends/tracker/lib/trf-persona.vala b/backends/tracker/lib/trf-persona.vala index 6675552..8a818be 100644 --- a/backends/tracker/lib/trf-persona.vala +++ b/backends/tracker/lib/trf-persona.vala @@ -214,22 +214,17 @@ public class Trf.Persona : Folks.Persona, } } - private GLib.List _urls; + private HashSet _urls = new HashSet (); + /** * {@inheritDoc} */ - public GLib.List urls + public Set urls { get { return this._urls; } public set { - var _temp = new GLib.List (); - foreach (unowned FieldDetails e in value) - _temp.prepend (e); - _temp.reverse (); - - ((Trf.PersonaStore) this.store)._set_urls (this, - (owned) _temp); + ((Trf.PersonaStore) this.store)._set_urls (this, value); } } @@ -1050,7 +1045,7 @@ public class Trf.Persona : Folks.Persona, private void _update_urls () { - var urls = new GLib.List (); + var urls = new HashSet (); var _urls_field = this._cursor.get_string (Trf.Fields.URLS).dup (); if (_urls_field == null) @@ -1085,12 +1080,11 @@ public class Trf.Persona : Folks.Persona, var fd = new FieldDetails (u[i]); fd.set_parameter ("tracker_id", tracker_id); fd.set_parameter ("type", type); - urls.prepend ((owned) fd); + urls.add (fd); } } - urls.reverse (); - this._urls = (owned) urls; + this._urls = urls; } internal bool _add_url (string url, string tracker_id, string type = "") @@ -1111,7 +1105,7 @@ public class Trf.Persona : Folks.Persona, var fd = new FieldDetails (url); fd.set_parameter ("tracker_id", tracker_id); fd.set_parameter ("type", type); - this._urls.prepend ((owned) fd); + this._urls.add (fd); this.notify_property ("urls"); } diff --git a/folks/individual.vala b/folks/individual.vala index 94bad5d..4994f59 100644 --- a/folks/individual.vala +++ b/folks/individual.vala @@ -256,19 +256,18 @@ public class Folks.Individual : Object, } } - private GLib.List _urls; + private HashSet _urls; /** * {@inheritDoc} */ - public GLib.List urls + public Set urls { get { return this._urls; } private set { - this._urls = new GLib.List (); - foreach (unowned FieldDetails ps in value) - this._urls.prepend (ps); - this._urls.reverse (); + this._urls = new HashSet (); + foreach (var ps in value) + this._urls.add (ps); } } @@ -1135,37 +1134,35 @@ public class Folks.Individual : Object, private void _update_urls () { /* Populate the URLs as the union of our Personas' URLs. - * If the same URL exist multiple times we merge the parameters. */ - var urls_set = new HashTable ( - str_hash, str_equal); - var urls = new GLib.List (); + * If the same URL exists multiple times we merge the parameters. */ + var urls_set = new HashMap (); + var urls = new HashSet (); foreach (var persona in this._persona_list) { var url_details = persona as UrlDetails; if (url_details != null) { - foreach (unowned FieldDetails ps in url_details.urls) + foreach (var ps in url_details.urls) { if (ps.value == null) continue; - var existing = urls_set.lookup (ps.value); + var existing = urls_set.get (ps.value); if (existing != null) existing.extend_parameters (ps.parameters); else { var new_ps = new FieldDetails (ps.value); new_ps.extend_parameters (ps.parameters); - urls_set.insert (ps.value, new_ps); - urls.prepend ((owned) new_ps); + urls_set.set (ps.value, new_ps); + urls.add (new_ps); } } } } - /* Set the private member directly to avoid iterating this list again */ - urls.reverse (); - this._urls = (owned) urls; + /* Set the private member directly to avoid iterating this set again */ + this._urls = urls; this.notify_property ("urls"); } diff --git a/folks/url-details.vala b/folks/url-details.vala index 80ac343..e8b47ed 100644 --- a/folks/url-details.vala +++ b/folks/url-details.vala @@ -20,6 +20,7 @@ */ using GLib; +using Gee; /** * Associates a list of URLs with a contact. @@ -33,7 +34,7 @@ public interface Folks.UrlDetails : Object * * A list or websites associated to the contact. * - * @since 0.3.5 + * @since UNRELEASED */ - public abstract List urls { get; set; } + public abstract Set urls { get; set; } } diff --git a/tests/tracker/add-persona.vala b/tests/tracker/add-persona.vala index c73eb7a..e1c2cc0 100644 --- a/tests/tracker/add-persona.vala +++ b/tests/tracker/add-persona.vala @@ -280,14 +280,13 @@ public class AddPersonaTests : Folks.TestCase Folks.PersonaStore.detail_key (PersonaDetail.POSTAL_ADDRESSES), (owned) v13); - Value? v14 = Value (typeof (GLib.List)); - GLib.List urls = - new GLib.List (); + Value? v14 = Value (typeof (Set)); + var urls = new HashSet (); var url_1 = new FieldDetails (this._url_1); - urls.prepend ((owned) url_1); + urls.add (url_1); var url_2 = new FieldDetails (this._url_2); - urls.prepend ((owned) url_2); - v14.set_pointer (urls); + urls.add (url_2); + v14.set_object (urls); details.insert (Folks.PersonaStore.detail_key (PersonaDetail.URLS), (owned) v14); diff --git a/tests/tracker/set-urls.vala b/tests/tracker/set-urls.vala index ed3744d..eb1e02f 100644 --- a/tests/tracker/set-urls.vala +++ b/tests/tracker/set-urls.vala @@ -108,19 +108,19 @@ public class SetURLsTests : Folks.TestCase { i.notify["urls"].connect (this._notify_urls_cb); - GLib.List urls = new GLib.List (); + var urls = new HashSet (); var p1 = new FieldDetails (this._urls.get ("blog")); p1.set_parameter ("type", "blog"); - urls.prepend ((owned) p1); + urls.add (p1); var p2 = new FieldDetails (this._urls.get ("website")); p2.set_parameter ("type", "website"); - urls.prepend ((owned) p2); + urls.add (p2); var p3 = new FieldDetails (this._urls.get ("url")); p3.set_parameter ("type", "url"); - urls.prepend ((owned) p3); + urls.add (p3); Trf.Persona p = (Trf.Persona)i.personas.nth_data (0); - p.urls = (owned) urls; + p.urls = urls; } } @@ -132,7 +132,7 @@ public class SetURLsTests : Folks.TestCase Folks.Individual i = (Folks.Individual) individual_obj; if (i.full_name == this._persona_fullname) { - foreach (unowned FieldDetails p in i.urls) + foreach (var p in i.urls) { var type_p = p.get_parameter_values ("type"); diff --git a/tests/tracker/website-updates.vala b/tests/tracker/website-updates.vala index d7689d8..ea0f0d1 100644 --- a/tests/tracker/website-updates.vala +++ b/tests/tracker/website-updates.vala @@ -125,7 +125,7 @@ public class WebsiteUpdatesTests : Folks.TestCase this._individual_id = i.id; - foreach (unowned FieldDetails fd in i.urls) + foreach (var fd in i.urls) { var website = fd.value; if (website == this._initial_website) @@ -150,7 +150,7 @@ public class WebsiteUpdatesTests : Folks.TestCase { Folks.Individual i = (Folks.Individual) individual_obj; - foreach (unowned FieldDetails fd in i.urls) + foreach (var fd in i.urls) { var website = fd.value; if (website == this._updated_website) diff --git a/tools/inspect/utils.vala b/tools/inspect/utils.vala index c25ab23..b1639a2 100644 --- a/tools/inspect/utils.vala +++ b/tools/inspect/utils.vala @@ -321,7 +321,8 @@ private class Folks.Inspect.Utils return output_string; } else if (prop_name == "email-addresses" || - prop_name == "phone-numbers") + prop_name == "phone-numbers" || + prop_name == "urls") { output_string = "{ "; bool first = true; @@ -341,26 +342,6 @@ private class Folks.Inspect.Utils return output_string; } - else if (prop_name == "urls") - { - output_string = "{ "; - bool first = true; - unowned GLib.List prop_list = - (GLib.List) prop_value.get_pointer (); - - foreach (var p in prop_list) - { - if (!first) - { - output_string += ", "; - } - output_string += p.value; - first = false; - } - output_string += " }"; - - return output_string; - } else if (prop_name == "birthday") { unowned DateTime dobj = (DateTime) prop_value.get_boxed (); -- 2.7.4