* FieldDetails.get_parameter_values() now returns type Collection<string>
* FieldDetails.extend_parameters() now takes type MultiMap<string, string>
* PostalAddressDetails.postal_addresses is now of type Set<PostalAddress>
+* EmailDetails.email_addresses is now of type Set<FieldDetails>
Overview of changes from libfolks 0.4.0 to libfolks 0.5.0
=========================================================
else if (k == Folks.PersonaStore.detail_key (
PersonaDetail.EMAIL_ADDRESSES))
{
- unowned GLib.List<FieldDetails> email_addresses =
- (GLib.List<FieldDetails>) v.get_pointer ();
- var email_addresses_l = email_addresses.copy ();
- foreach (var email_fd_obj in email_addresses_l)
- {
- email_fd_obj.ref ();
- }
- yield this._build_update_query (builder,
- (owned) email_addresses_l,
+ Set<FieldDetails> email_addresses =
+ (Set<FieldDetails>) v.get_object ();
+ yield this._build_update_query_set (builder, email_addresses,
"_:p", Trf.Attrib.EMAILS);
}
else if (k == Folks.PersonaStore.detail_key (
obj_var = "_:phone%d";
break;
case Trf.Attrib.EMAILS:
+ assert_not_reached ();
+ }
+
+ int cnt = 0;
+ foreach (var p in properties)
+ {
+ var affl = affl_var.printf (cnt);
+ var obj = yield this._urn_from_property (
+ related_attrib, related_prop, p.value);
+
+ if (obj == "")
+ {
+ obj = obj_var.printf (cnt);
+ builder.subject (obj);
+ builder.predicate ("a");
+ builder.object (related_attrib);
+ builder.predicate (related_prop);
+ builder.object_string (p.value);
+ }
+
+ builder.subject (affl);
+ builder.predicate ("a");
+ builder.object (Trf.OntologyDefs.NCO_AFFILIATION);
+ builder.predicate (related_connection);
+ builder.object (obj);
+
+ builder.subject (contact_var);
+ builder.predicate (Trf.OntologyDefs.NCO_HAS_AFFILIATION);
+ builder.object (affl);
+
+ cnt++;
+ }
+ }
+
+ private async void _build_update_query_set (
+ Tracker.Sparql.Builder builder,
+ Set<FieldDetails> properties,
+ string contact_var,
+ Trf.Attrib attrib)
+ {
+ string? affl_var = null;
+ string? obj_var = null;
+ unowned string? related_attrib = null;
+ unowned string? related_prop = null;
+ unowned string? related_connection = null;
+
+ switch (attrib)
+ {
+ case Trf.Attrib.PHONES:
+ assert_not_reached ();
+ case Trf.Attrib.EMAILS:
related_attrib = Trf.OntologyDefs.NCO_EMAIL;
related_prop = Trf.OntologyDefs.NCO_EMAIL_PROP;
related_connection = Trf.OntologyDefs.NCO_HAS_EMAIL;
}
internal async void _set_emails (Folks.Persona persona,
- owned GLib.List<FieldDetails> emails)
+ Set<FieldDetails> emails)
{
- yield this._set_unique_attrib (persona, (owned) emails,
+ yield this._set_unique_attrib_set (persona, emails,
Trf.Attrib.EMAILS);
}
"?contact", Trf.Attrib.PHONES);
break;
case Trf.Attrib.EMAILS:
+ assert_not_reached ();
+ }
+ 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, query_name);
+ }
+
+ internal async void _set_unique_attrib_set (Folks.Persona persona,
+ Set<FieldDetails> properties, Trf.Attrib attrib)
+ {
+ string? query_name = null;
+ var p_id = ((Trf.Persona) persona).tracker_id ();
+ var builder = new Tracker.Sparql.Builder.update ();
+ builder.insert_open (null);
+
+ switch (attrib)
+ {
+ case Trf.Attrib.PHONES:
+ assert_not_reached ();
+ case Trf.Attrib.EMAILS:
query_name = "_set_emailss";
yield this._remove_attributes_from_persona (persona,
_REMOVE_EMAILS);
- yield this._build_update_query (builder, (owned) properties,
+ yield this._build_update_query_set (builder, properties,
"?contact", Trf.Attrib.EMAILS);
break;
}
private const string[] _linkable_properties =
{"im-addresses", "local-ids", "web-service-addresses"};
private GLib.List<FieldDetails> _phone_numbers;
- private GLib.List<FieldDetails> _email_addresses;
+ private HashSet<FieldDetails> _email_addresses = new HashSet<FieldDetails> ();
private weak Sparql.Cursor _cursor;
private string _tracker_id;
/**
* {@inheritDoc}
*/
- public GLib.List<FieldDetails> email_addresses
+ public Set<FieldDetails> email_addresses
{
get { return this._email_addresses; }
public set
{
- var _temp = new GLib.List<FieldDetails> ();
- foreach (unowned FieldDetails e in value)
- {
- _temp.prepend (e);
- }
- _temp.reverse ();
-
- ((Trf.PersonaStore) this.store)._set_emails (this,
- (owned) _temp);
+ ((Trf.PersonaStore) this.store)._set_emails (this, value);
}
}
{
var fd = new FieldDetails (addr);
fd.set_parameter ("tracker_id", tracker_id);
- this._email_addresses.prepend ((owned) fd);
+ this._email_addresses.add (fd);
this.notify_property ("email-addresses");
}
return;
}
- var email_addresses = new GLib.List<FieldDetails> ();
+ var email_addresses = new HashSet<FieldDetails> ();
string[] emails_a = emails_field.split (",");
foreach (var e in emails_a)
var fd = new FieldDetails (id_addr[Trf.EmailFields.EMAIL]);
fd.set_parameter ("tracker_id",
id_addr[Trf.EmailFields.TRACKER_ID]);
- email_addresses.prepend ((owned) fd);
+ email_addresses.add (fd);
}
}
- email_addresses.reverse ();
- this._email_addresses = (owned) email_addresses;
+ this._email_addresses = email_addresses;
}
private void _update_urls ()
*/
using GLib;
+using Gee;
/**
* Interface for classes that have email addresses, such as {@link Persona}
/**
* The email addresses of the contact.
*
- * @since 0.3.5
+ * @since UNRELEASED
*/
- public abstract List<FieldDetails> email_addresses { get; set; }
+ public abstract Set<FieldDetails> email_addresses { get; set; }
}
}
}
- private GLib.List<FieldDetails> _email_addresses;
+ private HashSet<FieldDetails> _email_addresses;
/**
* {@inheritDoc}
*/
- public GLib.List<FieldDetails> email_addresses
+ public Set<FieldDetails> email_addresses
{
get { return this._email_addresses; }
private set
{
- this._email_addresses = new GLib.List<FieldDetails> ();
- foreach (unowned FieldDetails fd in value)
- this._email_addresses.prepend (fd);
- this._email_addresses.reverse ();
+ this._email_addresses = new HashSet<FieldDetails> ();
+ foreach (var fd in value)
+ this._email_addresses.add (fd);
}
}
private void _update_email_addresses ()
{
/* Populate the email addresses as the union of our Personas' addresses.
- * If the same URL exist multiple times we merge the parameters. */
- var emails_set = new HashTable<unowned string, unowned FieldDetails> (
- str_hash, str_equal);
- var emails = new GLib.List<FieldDetails> ();
+ * If the same address exists multiple times we merge the parameters. */
+ var emails_set = new HashMap<unowned string, unowned FieldDetails> ();
+ var emails = new HashSet<FieldDetails> ();
foreach (var persona in this._persona_list)
{
var email_details = persona as EmailDetails;
if (email_details != null)
{
- foreach (unowned FieldDetails fd in email_details.email_addresses)
+ foreach (var fd in email_details.email_addresses)
{
if (fd.value == null)
continue;
- var existing = emails_set.lookup (fd.value);
+ var existing = emails_set.get (fd.value);
if (existing != null)
existing.extend_parameters (fd.parameters);
else
{
var new_fd = new FieldDetails (fd.value);
new_fd.extend_parameters (fd.parameters);
- emails_set.insert (fd.value, new_fd);
- emails.prepend ((owned) new_fd);
+ emails_set.set (fd.value, new_fd);
+ emails.add (new_fd);
}
}
}
}
- /* Set the private member directly to avoid iterating this list again */
- emails.reverse ();
- this._email_addresses = (owned) emails;
+
+ /* Set the private member directly to avoid iterating this set again */
+ this._email_addresses = emails;
this.notify_property ("email-addresses");
}
*/
private void _inspect_emails ()
{
- unowned GLib.List<FieldDetails> list_a =
- this._individual_a.email_addresses;
- unowned GLib.List<FieldDetails> list_b =
- this._individual_b.email_addresses;
+ var set_a = this._individual_a.email_addresses;
+ var set_b = this._individual_b.email_addresses;
- foreach (var fd_a in list_a)
+ foreach (var fd_a in set_a)
{
- foreach (var fd_b in list_b)
+ foreach (var fd_b in set_b)
{
string[] email_split_a = fd_a.value.split ("@");
string[] email_split_b = fd_b.value.split ("@");
details.insert (Folks.PersonaStore.detail_key (PersonaDetail.GENDER),
(owned) v7);
- Value? v8 = Value (typeof (GLib.List<FieldDetails>));
- GLib.List<FieldDetails> emails =
- new GLib.List<FieldDetails> ();
+ Value? v8 = Value (typeof (Set<FieldDetails>));
+ var emails = new HashSet<FieldDetails> ();
var email_1 = new FieldDetails (this._email_1);
- emails.prepend ((owned) email_1);
+ emails.add (email_1);
var email_2 = new FieldDetails (this._email_2);
- emails.prepend ((owned) email_2);
- v8.set_pointer (emails);
+ emails.add (email_2);
+ v8.set_object (emails);
details.insert (
Folks.PersonaStore.detail_key (PersonaDetail.EMAIL_ADDRESSES),
(owned) v8);
if (i.gender == Gender.MALE)
this._properties_found.replace ("gender", true);
- foreach (unowned FieldDetails e in i.email_addresses)
+ foreach (var e in i.email_addresses)
{
if (e.value == this._email_1)
{
details1.insert (Folks.PersonaStore.detail_key (PersonaDetail.FULL_NAME),
(owned) val);
- val = Value (typeof (GLib.List<FieldDetails>));
- var emails1 = new GLib.List<FieldDetails> ();
+ val = Value (typeof (Set<FieldDetails>));
+ var emails1 = new HashSet<FieldDetails> ();
var email_1 = new FieldDetails (this._email_1);
- emails1.prepend ((owned) email_1);
- val.set_pointer (emails1);
+ emails1.add (email_1);
+ val.set_object (emails1);
details1.insert (
Folks.PersonaStore.detail_key (PersonaDetail.EMAIL_ADDRESSES),
(owned) val);
details2.insert (Folks.PersonaStore.detail_key (PersonaDetail.FULL_NAME),
(owned) val);
- val = Value (typeof (GLib.List<FieldDetails>));
- var emails2 = new GLib.List<FieldDetails> ();
+ val = Value (typeof (Set<FieldDetails>));
+ var emails2 = new HashSet<FieldDetails> ();
var email_2 = new FieldDetails (this._email_1);
- emails2.prepend ((owned) email_2);
- val.set_pointer (emails2);
+ emails2.add (email_2);
+ val.set_object (emails2);
details2.insert (
Folks.PersonaStore.detail_key (PersonaDetail.EMAIL_ADDRESSES),
(owned) val);
var i = this._aggregator.individuals.lookup (this._individual_id);
if (i != null)
{
- foreach (unowned FieldDetails fd in i.email_addresses)
+ foreach (var fd in i.email_addresses)
{
var email = fd.value;
if (email == this._email_1)
this._individual_id = i.id;
i.notify["email-addresses"].connect (this._notify_email_cb);
- foreach (unowned FieldDetails fd in i.email_addresses)
+ foreach (var fd in i.email_addresses)
{
var email = fd.value;
if (email == this._email_1)
if (this._individual_id != individual.id)
return;
- foreach (unowned FieldDetails fd in individual.email_addresses)
+ foreach (var fd in individual.email_addresses)
{
var email = fd.value;
if (email == this._email_2)
details1.insert (Folks.PersonaStore.detail_key (PersonaDetail.FULL_NAME),
(owned) val);
- val = Value (typeof (GLib.List<FieldDetails>));
- var emails1 = new GLib.List<FieldDetails> ();
+ val = Value (typeof (Set<FieldDetails>));
+ var emails1 = new HashSet<FieldDetails> ();
var email_1 = new FieldDetails (this._email_1);
- emails1.prepend ((owned) email_1);
- val.set_pointer (emails1);
+ emails1.add (email_1);
+ val.set_object (emails1);
details1.insert (
Folks.PersonaStore.detail_key (PersonaDetail.EMAIL_ADDRESSES),
(owned) val);
details2.insert (Folks.PersonaStore.detail_key (PersonaDetail.FULL_NAME),
(owned) val);
- val = Value (typeof (GLib.List<FieldDetails>));
- var emails2 = new GLib.List<FieldDetails> ();
+ val = Value (typeof (Set<FieldDetails>));
+ var emails2 = new HashSet<FieldDetails> ();
var email_2 = new FieldDetails (this._email_1);
- emails2.prepend ((owned) email_2);
- val.set_pointer (emails2);
+ emails2.add (email_2);
+ val.set_object (emails2);
details2.insert (
Folks.PersonaStore.detail_key (PersonaDetail.EMAIL_ADDRESSES),
(owned) val);
details1.insert (Folks.PersonaStore.detail_key (PersonaDetail.FULL_NAME),
(owned) val);
- val = Value (typeof (GLib.List<FieldDetails>));
- var emails1 = new GLib.List<FieldDetails> ();
+ val = Value (typeof (Set<FieldDetails>));
+ var emails1 = new HashSet<FieldDetails> ();
var email_1 = new FieldDetails (this._email_1);
- emails1.prepend ((owned) email_1);
- val.set_pointer (emails1);
+ emails1.add (email_1);
+ val.set_object (emails1);
details1.insert (
Folks.PersonaStore.detail_key (PersonaDetail.EMAIL_ADDRESSES),
(owned) val);
details2.insert (Folks.PersonaStore.detail_key (PersonaDetail.FULL_NAME),
(owned) val);
- val = Value (typeof (GLib.List<FieldDetails>));
- var emails2 = new GLib.List<FieldDetails> ();
+ val = Value (typeof (Set<FieldDetails>));
+ var emails2 = new HashSet<FieldDetails> ();
var email_2 = new FieldDetails (this._email_1);
- emails2.prepend ((owned) email_2);
- val.set_pointer (emails2);
+ emails2.add (email_2);
+ val.set_object (emails2);
details2.insert (
Folks.PersonaStore.detail_key (PersonaDetail.EMAIL_ADDRESSES),
(owned) val);
details.insert (Folks.PersonaStore.detail_key (PersonaDetail.FULL_NAME),
(owned) v1);
- Value? v2 = Value (typeof (GLib.List<FieldDetails>));
- GLib.List<FieldDetails> emails =
- new GLib.List<FieldDetails> ();
+ Value? v2 = Value (typeof (Set<FieldDetails>));
+ var emails = new HashSet<FieldDetails> ();
var email_1 = new FieldDetails ("test-1@example.org");
- emails.prepend ((owned) email_1);
+ emails.add (email_1);
var email_2 = new FieldDetails ("test-2@example.org");
- emails.prepend ((owned) email_2);
- v2.set_pointer (emails);
+ emails.add (email_2);
+ v2.set_object (emails);
details.insert (
Folks.PersonaStore.detail_key (PersonaDetail.EMAIL_ADDRESSES),
(owned) v2);
Trf.Persona p = (Trf.Persona) i.personas.nth_data (0);
if (this._has_email (p, this._email_1))
{
- var emails1 = new GLib.List<FieldDetails> ();
+ var emails1 = new HashSet<FieldDetails> ();
var email_1 = new FieldDetails (this._email_1);
- emails1.prepend ((owned) email_1);
- p.email_addresses = (emails1);
+ emails1.add (email_1);
+ p.email_addresses = emails1;
p.notify["email-addresses"].connect (this._email_addresses_cb);
}
}
details1.insert (Folks.PersonaStore.detail_key (PersonaDetail.FULL_NAME),
(owned) val);
- val = Value (typeof (GLib.List<FieldDetails>));
- var emails1 = new GLib.List<FieldDetails> ();
+ val = Value (typeof (Set<FieldDetails>));
+ var emails1 = new HashSet<FieldDetails> ();
var email_1 = new FieldDetails (this._email_1);
- emails1.prepend ((owned) email_1);
- val.set_pointer (emails1);
+ emails1.add (email_1);
+ val.set_object (emails1);
details1.insert (
Folks.PersonaStore.detail_key (PersonaDetail.EMAIL_ADDRESSES),
(owned) val);
{
i.notify["email-addresses"].connect (this._notify_emails_cb);
- GLib.List<FieldDetails> emails = new GLib.List<FieldDetails> ();
+ var emails = new HashSet<FieldDetails> ();
var p1 = new FieldDetails (this._email_1);
- emails.prepend ((owned) p1);
+ emails.add (p1);
var p2 = new FieldDetails (this._email_2);
- emails.prepend ((owned) p2);
+ emails.add (p2);
Trf.Persona p = (Trf.Persona)i.personas.nth_data (0);
- p.email_addresses = (owned) emails;
+ p.email_addresses = emails;
}
}
Folks.Individual i = (Folks.Individual) individual_obj;
if (i.full_name == this._persona_fullname)
{
- foreach (unowned FieldDetails p in i.email_addresses)
+ foreach (var p in i.email_addresses)
{
if (p.value == this._email_1)
this._email_1_found = true;
output_string += " }";
return output_string;
}
- else if (prop_name == "email-addresses" ||
- prop_name == "urls" ||
+ else if (prop_name == "email-addresses")
+ {
+ output_string = "{ ";
+ bool first = true;
+ Set<FieldDetails> prop_list =
+ (Set<FieldDetails>) prop_value.get_object ();
+
+ 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 == "urls" ||
prop_name == "phone-numbers")
{
output_string = "{ ";