[rygel] tracker: Simplified handling of nested properties



commit 3b9a7f1feef654808092127904a4753e8329e8f5
Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
Date:   Mon Dec 21 20:17:55 2009 +0200

    tracker: Simplified handling of nested properties
    
    Simplified handling of nested properties using new chainable triplets and
    recursion.

 .../tracker/rygel-tracker-search-container.vala    |   60 ++++++++++++--------
 1 files changed, 36 insertions(+), 24 deletions(-)
---
diff --git a/src/plugins/tracker/rygel-tracker-search-container.vala b/src/plugins/tracker/rygel-tracker-search-container.vala
index 2085712..c9d08f5 100644
--- a/src/plugins/tracker/rygel-tracker-search-container.vala
+++ b/src/plugins/tracker/rygel-tracker-search-container.vala
@@ -73,30 +73,17 @@ public class Rygel.TrackerSearchContainer : Rygel.MediaContainer {
 
         var optional = new TrackerQueryTriplets ();
         foreach (var chain in this.item_factory.get_metadata_key_chains ()) {
-            string next_subject = null;
+            var key = chain.last ();
+            var variable = "?" + key.replace (":", "_");
 
-            foreach (var key in chain) {
-                var variable = "?" + key.replace (":", "_");
+            variables.add (variable);
 
-                string subject;
-                if (key == chain.first ()) {
-                    subject = ITEM_VARIABLE;
-                } else {
-                    subject = next_subject;
-                }
-
-                var triplet = new TrackerQueryTriplet (subject,
-                                                       key,
-                                                       variable);
-                if (!our_mandatory.contains (triplet)) {
-                    optional.add (triplet);
-                }
+            var triplet = this.triplet_from_chain (chain,
+                                                   variable,
+                                                   ITEM_VARIABLE);
 
-                if (key == chain.last ()) {
-                    variables.add (variable);
-                }
-
-                next_subject = variable;
+            if (!our_mandatory.contains (triplet)) {
+                optional.add (triplet);
             }
         }
 
@@ -118,6 +105,31 @@ public class Rygel.TrackerSearchContainer : Rygel.MediaContainer {
         }
     }
 
+    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 TrackerQuery.clone (this.query);



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