[gnome-photos] base-manager: Add a get_filter method



commit 376acd5eb99ff5359c4935f723471732cd4f733c
Author: Debarshi Ray <debarshir gnome org>
Date:   Sat May 5 21:42:42 2012 +0200

    base-manager: Add a get_filter method

 src/photos-base-manager.c  |   65 ++++++++++++++++++++++++++++++++++++++++++++
 src/photos-base-manager.h  |    2 +
 src/photos-query-builder.c |   31 +++++++++++++++++++++
 3 files changed, 98 insertions(+), 0 deletions(-)
---
diff --git a/src/photos-base-manager.c b/src/photos-base-manager.c
index cc52b7a..8397917 100644
--- a/src/photos-base-manager.c
+++ b/src/photos-base-manager.c
@@ -24,6 +24,7 @@
 #include <glib.h>
 
 #include "photos-base-manager.h"
+#include "photos-filterable.h"
 
 
 struct _PhotosBaseManagerPrivate
@@ -66,6 +67,46 @@ photos_base_manager_default_set_active_object (PhotosBaseManager *self, GObject
 }
 
 
+static gchar *
+photos_base_manager_get_all_filter (PhotosBaseManager *self)
+{
+  GList *l;
+  GList *values;
+  gchar *filter;
+  gchar **strv;
+  gchar *tmp;
+  guint i;
+  guint length;
+
+  values = g_hash_table_get_values (self->priv->objects);
+  length = g_list_length (values);
+  strv = (gchar **) g_malloc0_n (length + 1, sizeof (gchar *));
+
+  for (i = 0, l = values; l != NULL; l = l->next)
+    {
+      gchar *id;
+
+      g_object_get (l->data, "id", &id, NULL);
+      if (g_strcmp0 (id, "all") != 0)
+        {
+          strv[i] = photos_filterable_get_filter (PHOTOS_FILTERABLE (l->data));
+          i++;
+        }
+      g_free (id);
+    }
+
+  filter = g_strjoinv (" || ", strv);
+  g_strfreev (strv);
+
+  tmp = filter;
+  filter = g_strconcat ("(", filter, ")", NULL);
+  g_free (tmp);
+
+  g_list_free (values);
+  return filter;
+}
+
+
 static void
 photos_base_manager_dispose (GObject *object)
 {
@@ -174,6 +215,30 @@ photos_base_manager_get_active_object (PhotosBaseManager *self)
 }
 
 
+gchar *
+photos_base_manager_get_filter (PhotosBaseManager *self)
+{
+  PhotosBaseManagerPrivate *priv = self->priv;
+  const gchar *blank = "(true)";
+  gchar *filter;
+  gchar *id;
+
+  if (priv->active_object == NULL)
+    return g_strdup (blank);
+
+  g_return_val_if_fail (PHOTOS_IS_FILTERABLE (priv->active_object), g_strdup (blank));
+
+  g_object_get (self, "id", &id, NULL);
+  if (g_strcmp0 (id, "all") == 0)
+    filter = photos_base_manager_get_all_filter (self);
+  else
+    filter = photos_filterable_get_filter (PHOTOS_FILTERABLE (priv->active_object));
+
+  g_free (id);
+  return filter;
+}
+
+
 GObject *
 photos_base_manager_get_object_by_id (PhotosBaseManager *self, const gchar *id)
 {
diff --git a/src/photos-base-manager.h b/src/photos-base-manager.h
index 4348f13..7bda012 100644
--- a/src/photos-base-manager.h
+++ b/src/photos-base-manager.h
@@ -78,6 +78,8 @@ void                photos_base_manager_clear                    (PhotosBaseMana
 
 GObject            *photos_base_manager_get_active_object        (PhotosBaseManager *self);
 
+gchar              *photos_base_manager_get_filter               (PhotosBaseManager *self);
+
 GObject            *photos_base_manager_get_object_by_id         (PhotosBaseManager *self, const gchar *id);
 
 GHashTable         *photos_base_manager_get_objects              (PhotosBaseManager *self);
diff --git a/src/photos-query-builder.c b/src/photos-query-builder.c
index 9562584..24bb4a7 100644
--- a/src/photos-query-builder.c
+++ b/src/photos-query-builder.c
@@ -25,6 +25,7 @@
 
 #include "photos-offset-controller.h"
 #include "photos-query-builder.h"
+#include "photos-source-manager.h"
 
 
 static gchar *
@@ -45,6 +46,25 @@ photos_query_builder_convert_path_to_uri (const gchar *path)
 
 
 static gchar *
+photos_query_builder_filter (void)
+{
+  PhotosBaseManager *src_mngr;
+  gchar *sparql;
+  gchar *src_mngr_filter;
+
+  src_mngr = photos_source_manager_new ();
+  src_mngr_filter = photos_base_manager_get_filter (src_mngr);
+
+  sparql = g_strdup_printf ("FILTER (%s)", src_mngr_filter);
+
+  g_free (src_mngr_filter);
+  g_object_unref (src_mngr);
+
+  return sparql;
+}
+
+
+static gchar *
 photos_query_builder_optional (void)
 {
   return g_strdup ("OPTIONAL { ?urn nco:creator ?creater . } "
@@ -55,6 +75,7 @@ photos_query_builder_optional (void)
 static gchar *
 photos_query_builder_query (gboolean global, gint flags)
 {
+  gchar *filter;
   gchar *global_sparql;
   gchar *optional;
   gchar *sparql;
@@ -71,6 +92,11 @@ photos_query_builder_query (gboolean global, gint flags)
 
       if (!(flags & PHOTOS_QUERY_FLAGS_UNFILTERED))
         {
+          filter = photos_query_builder_filter ();
+          tmp = global_sparql;
+          global_sparql = g_strconcat (global_sparql, filter, NULL);
+          g_free (tmp);
+          g_free (filter);
         }
 
       offset_cntrlr = photos_offset_controller_new ();
@@ -89,6 +115,11 @@ photos_query_builder_query (gboolean global, gint flags)
     {
       if (!(flags & PHOTOS_QUERY_FLAGS_UNFILTERED))
         {
+          filter = photos_query_builder_filter ();
+          tmp = global_sparql;
+          global_sparql = g_strconcat (global_sparql, filter, NULL);
+          g_free (tmp);
+          g_free (filter);
         }
 
       tmp = global_sparql;



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