[rygel] tracker: Use Property functions rather than optionals



commit 227dc963edb1e89cd8890b559f4b9bebf348e3bf
Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
Date:   Tue Jul 6 16:58:38 2010 +0300

    tracker: Use Property functions rather than optionals
    
    Make use of property functions to avoid use of optional tripplets as they
    are very slow.

 .../tracker/rygel-tracker-insertion-query.vala     |   25 +++----
 .../tracker/rygel-tracker-metadata-values.vala     |   29 +++----
 .../tracker/rygel-tracker-query-triplet.vala       |   20 +-----
 src/plugins/tracker/rygel-tracker-query.vala       |   18 +----
 .../tracker/rygel-tracker-search-container.vala    |   78 +++++--------------
 .../tracker/rygel-tracker-selection-query.vala     |    8 +-
 6 files changed, 53 insertions(+), 125 deletions(-)
---
diff --git a/src/plugins/tracker/rygel-tracker-insertion-query.vala b/src/plugins/tracker/rygel-tracker-insertion-query.vala
index f6d05b5..cafd506 100644
--- a/src/plugins/tracker/rygel-tracker-insertion-query.vala
+++ b/src/plugins/tracker/rygel-tracker-insertion-query.vala
@@ -35,32 +35,27 @@ public class Rygel.TrackerInsertionQuery : Rygel.TrackerQuery {
         var triplets = new TrackerQueryTriplets ();
         triplets.add (new TrackerQueryTriplet (QUERY_ID,
                                                "a",
-                                               category,
-                                               false));
+                                               category));
         triplets.add (new TrackerQueryTriplet (QUERY_ID,
                                                "a",
-                                               "nie:DataObject",
-                                               false));
+                                               "nie:DataObject"));
         triplets.add (new TrackerQueryTriplet (QUERY_ID,
                                                "a",
-                                               "nfo:FileDataObject",
-                                               false));
+                                               "nfo:FileDataObject"));
         triplets.add (new TrackerQueryTriplet (QUERY_ID,
                                                "nie:mimeType",
-                                               "\"" + item.mime_type + "\"",
-                                               false));
+                                               "\"" + item.mime_type + "\""));
         triplets.add (new TrackerQueryTriplet (QUERY_ID,
                                                "nie:url",
-                                               "\"" + item.uris[0] + "\"",
-                                               false));
+                                               "\"" + item.uris[0] + "\""));
 
         var now = TimeVal ();
-        triplets.add (new TrackerQueryTriplet (QUERY_ID,
-                                               "nfo:fileLastModified",
-                                               "\"" + now.to_iso8601 () + "\"",
-                                               false));
+        triplets.add (new TrackerQueryTriplet (
+                                        QUERY_ID,
+                                        "nfo:fileLastModified",
+                                        "\"" + now.to_iso8601 () + "\""));
 
-        base (triplets, null);
+        base (triplets);
     }
 
     public override async void execute (TrackerResourcesIface resources)
diff --git a/src/plugins/tracker/rygel-tracker-metadata-values.vala b/src/plugins/tracker/rygel-tracker-metadata-values.vala
index f3f31d4..7b30875 100644
--- a/src/plugins/tracker/rygel-tracker-metadata-values.vala
+++ b/src/plugins/tracker/rygel-tracker-metadata-values.vala
@@ -87,7 +87,7 @@ public class Rygel.TrackerMetadataValues : Rygel.SimpleContainer {
         this.clear ();
 
         int i;
-        var mandatory = new TrackerQueryTriplets ();
+        var triplets = new TrackerQueryTriplets ();
 
         // All variables used in the query
         var num_keys = this.key_chain.length - 1;
@@ -102,17 +102,15 @@ public class Rygel.TrackerMetadataValues : Rygel.SimpleContainer {
                 subject = variables[i - 1];
             }
 
-            mandatory.add (new TrackerQueryTriplet (subject,
-                                                    this.key_chain[i],
-                                                    variables[i],
-                                                    false));
+            triplets.add (new TrackerQueryTriplet (subject,
+                                                   this.key_chain[i],
+                                                   variables[i]));
         }
 
-        mandatory.insert (0, new TrackerQueryTriplet (
+        triplets.insert (0, new TrackerQueryTriplet (
                                         ITEM_VARIABLE,
                                         "a",
-                                        this.item_factory.category,
-                                        false));
+                                        this.item_factory.category));
 
         // Variables to select from query
         var selected = new ArrayList<string> ();
@@ -121,8 +119,7 @@ public class Rygel.TrackerMetadataValues : Rygel.SimpleContainer {
         selected.add ("DISTINCT " + last_variable);
 
         var query = new TrackerSelectionQuery (selected,
-                                               mandatory,
-                                               null,
+                                               triplets,
                                                null,
                                                last_variable);
 
@@ -151,20 +148,20 @@ public class Rygel.TrackerMetadataValues : Rygel.SimpleContainer {
 
             var title = this.title_func (value);
 
-            // The child container can use the same mandatory triplets we used
-            // in our query.
-            var child_mandatory = new TrackerQueryTriplets.clone (mandatory);
+            // The child container can use the same triplets we used in our
+            // query.
+            var child_triplets = new TrackerQueryTriplets.clone (triplets);
 
-            // However we constrain the object of our last mandatory triplet.
+            // However we constrain the object of our last triplet.
             var filters = new ArrayList<string> ();
-            var filter = this.filter_func (child_mandatory.last ().obj, value);
+            var filter = this.filter_func (child_triplets.last ().obj, value);
             filters.add (filter);
 
             var container = new TrackerSearchContainer (id,
                                                         this,
                                                         title,
                                                         this.item_factory,
-                                                        child_mandatory,
+                                                        child_triplets,
                                                         filters);
 
             this.add_child (container);
diff --git a/src/plugins/tracker/rygel-tracker-query-triplet.vala b/src/plugins/tracker/rygel-tracker-query-triplet.vala
index eef4871..5186478 100644
--- a/src/plugins/tracker/rygel-tracker-query-triplet.vala
+++ b/src/plugins/tracker/rygel-tracker-query-triplet.vala
@@ -30,34 +30,27 @@ public class Rygel.TrackerQueryTriplet {
     public string predicate;
     public string obj;
 
-    public bool optional;
-
     public TrackerQueryTriplet next;
 
     public TrackerQueryTriplet (string? subject,
                                 string  predicate,
-                                string  obj,
-                                bool    optional = true) {
+                                string  obj) {
         this.subject = subject;
         this.predicate = predicate;
         this.obj = obj;
-        this.optional = optional;
     }
 
     public TrackerQueryTriplet.chain (string?             subject,
                                       string              predicate,
-                                      TrackerQueryTriplet next,
-                                      bool                optional = true) {
+                                      TrackerQueryTriplet next) {
         this.subject = subject;
         this.predicate = predicate;
         this.next = next;
-        this.optional = optional;
     }
 
     public TrackerQueryTriplet.clone (TrackerQueryTriplet triplet) {
         this.subject = triplet.subject;
         this.predicate = triplet.predicate;
-        this.optional = triplet.optional;
 
         if (triplet.next != null) {
             this.next = triplet.next;
@@ -79,17 +72,12 @@ public class Rygel.TrackerQueryTriplet {
         return a.subject == b.subject &&
                a.obj == b.obj &&
                a.predicate == b.predicate &&
-               a.optional == b.optional &&
                chain_equal;
     }
 
     public string to_string () {
         string str = "";
 
-        if (this.optional) {
-            str += "OPTIONAL {";
-        }
-
         if (this.subject != null) {
             str += " " + subject;
         }
@@ -102,10 +90,6 @@ public class Rygel.TrackerQueryTriplet {
             str += " " + this.obj;
         }
 
-        if (this.optional) {
-            str += " }";
-        }
-
         return str;
     }
 }
diff --git a/src/plugins/tracker/rygel-tracker-query.vala b/src/plugins/tracker/rygel-tracker-query.vala
index b230139..1b3edfd 100644
--- a/src/plugins/tracker/rygel-tracker-query.vala
+++ b/src/plugins/tracker/rygel-tracker-query.vala
@@ -26,18 +26,10 @@ using Gee;
  * Represents Tracker SPARQL query
  */
 public abstract class Rygel.TrackerQuery {
-    public TrackerQueryTriplets mandatory;
-    public TrackerQueryTriplets optional;
+    public TrackerQueryTriplets triplets;
 
-    public TrackerQuery (TrackerQueryTriplets  mandatory,
-                         TrackerQueryTriplets? optional) {
-        this.mandatory = mandatory;
-
-        if (optional != null) {
-            this.optional = optional;
-        } else {
-            this.optional = new TrackerQueryTriplets ();
-        }
+    public TrackerQuery (TrackerQueryTriplets triplets) {
+        this.triplets = triplets;
     }
 
     public abstract async void execute (TrackerResourcesIface resources)
@@ -46,9 +38,7 @@ public abstract class Rygel.TrackerQuery {
     // Deriving classes should override this method and complete it by
     // adding the first part of the query
     public virtual string to_string () {
-        return this.serialize_triplets (this.mandatory) +
-               " . " +
-               this.serialize_triplets (this.optional);
+        return this.serialize_triplets (this.triplets);
     }
 
     private string serialize_triplets (TrackerQueryTriplets triplets) {
diff --git a/src/plugins/tracker/rygel-tracker-search-container.vala b/src/plugins/tracker/rygel-tracker-search-container.vala
index 48bc2c9..e296ce1 100644
--- a/src/plugins/tracker/rygel-tracker-search-container.vala
+++ b/src/plugins/tracker/rygel-tracker-search-container.vala
@@ -48,7 +48,7 @@ public class Rygel.TrackerSearchContainer : Rygel.MediaContainer {
                                    MediaContainer        parent,
                                    string                title,
                                    TrackerItemFactory    item_factory,
-                                   TrackerQueryTriplets? mandatory = null,
+                                   TrackerQueryTriplets? triplets = null,
                                    ArrayList<string>?    filters = null) {
         base (id, parent, title, 0);
 
@@ -58,45 +58,35 @@ public class Rygel.TrackerSearchContainer : Rygel.MediaContainer {
         variables.add (ITEM_VARIABLE);
         variables.add (URL_VARIABLE);
 
-        TrackerQueryTriplets our_mandatory;
-        if (mandatory != null) {
-            our_mandatory = mandatory;
+        TrackerQueryTriplets our_triplets;
+        if (triplets != null) {
+            our_triplets = triplets;
         } else {
-            our_mandatory = new TrackerQueryTriplets ();
+            our_triplets = new TrackerQueryTriplets ();
         }
 
-        our_mandatory.add (new TrackerQueryTriplet (ITEM_VARIABLE,
-                                                    "a",
-                                                    item_factory.category,
-                                                    false));
-        our_mandatory.add (new TrackerQueryTriplet (ITEM_VARIABLE,
-                                                    MODIFIED_PREDICATE,
-                                                    MODIFIED_VARIABLE,
-                                                    false));
-        our_mandatory.add (new TrackerQueryTriplet (ITEM_VARIABLE,
-                                                    URL_PREDICATE,
-                                                    URL_VARIABLE,
-                                                    false));
-
-        var optional = new TrackerQueryTriplets ();
-        foreach (var chain in this.item_factory.key_chains) {
-            var key = chain.last ();
-            var variable = "?" + key.replace (":", "_");
-
-            variables.add (variable);
+        our_triplets.add (new TrackerQueryTriplet (ITEM_VARIABLE,
+                                                   "a",
+                                                   item_factory.category));
+        our_triplets.add (new TrackerQueryTriplet (ITEM_VARIABLE,
+                                                   MODIFIED_PREDICATE,
+                                                   MODIFIED_VARIABLE));
+        our_triplets.add (new TrackerQueryTriplet (ITEM_VARIABLE,
+                                                   URL_PREDICATE,
+                                                   URL_VARIABLE));
 
-            var triplet = this.triplet_from_chain (chain,
-                                                   variable,
-                                                   ITEM_VARIABLE);
+        foreach (var chain in this.item_factory.key_chains) {
+            var variable = ITEM_VARIABLE;
 
-            if (!our_mandatory.contains (triplet)) {
-                optional.add (triplet);
+            foreach (var key in chain) {
+                variable = key + "(" + variable + ")";
             }
+
+            variables.add (variable);
         }
 
         this.query = new TrackerSelectionQuery (variables,
-                                                our_mandatory,
-                                                optional,
+                                                our_triplets,
                                                 filters,
                                                 MODIFIED_VARIABLE);
 
@@ -168,38 +158,12 @@ public class Rygel.TrackerSearchContainer : Rygel.MediaContainer {
         return this.id + ":" + urn;
     }
 
-    private TrackerQueryTriplet triplet_from_chain (
-                                        Gee.List<string> chain,
-                                        string?          variable = null,
-                                        string?          subject = null) {
-        var key = chain.first ();
-
-        TrackerQueryTriplet triplet;
-
-        if (chain.size == 1) {
-            triplet = new TrackerQueryTriplet (subject,
-                                               key,
-                                               variable,
-                                               subject != null);
-        } else {
-            var child_chain = chain.slice (chain.index_of (key) + 1,
-                                           chain.size);
-
-            var child = this.triplet_from_chain (child_chain, variable);
-
-            triplet = new TrackerQueryTriplet.chain (subject, key, child);
-        }
-
-        return triplet;
-    }
-
     private async void get_children_count () {
         try {
             var query = new TrackerSelectionQuery.clone (this.query);
 
             query.variables = new ArrayList<string> ();
             query.variables.add ("COUNT(" + ITEM_VARIABLE + ") AS x");
-            query.optional = new TrackerQueryTriplets ();
 
             yield query.execute (this.resources);
 
diff --git a/src/plugins/tracker/rygel-tracker-selection-query.vala b/src/plugins/tracker/rygel-tracker-selection-query.vala
index beb0563..5dfb7c8 100644
--- a/src/plugins/tracker/rygel-tracker-selection-query.vala
+++ b/src/plugins/tracker/rygel-tracker-selection-query.vala
@@ -36,13 +36,12 @@ public class Rygel.TrackerSelectionQuery : Rygel.TrackerQuery {
     public string[,] result;
 
     public TrackerSelectionQuery (ArrayList<string>     variables,
-                                  TrackerQueryTriplets  mandatory,
-                                  TrackerQueryTriplets? optional,
+                                  TrackerQueryTriplets  triplets,
                                   ArrayList<string>?    filters,
                                   string?               order_by = null,
                                   int                   offset = 0,
                                   int                   max_count = -1) {
-        base (mandatory, optional);
+        base (triplets);
 
         if (filters != null) {
             this.filters = filters;
@@ -58,8 +57,7 @@ public class Rygel.TrackerSelectionQuery : Rygel.TrackerQuery {
 
     public TrackerSelectionQuery.clone (TrackerSelectionQuery query) {
         this (copy_str_list (query.variables),
-              new TrackerQueryTriplets.clone (query.mandatory),
-              new TrackerQueryTriplets.clone (query.optional),
+              new TrackerQueryTriplets.clone (query.triplets),
               copy_str_list (query.filters),
               query.order_by,
               query.offset,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]