tracker r2683 - in trunk: . data/dbus data/services src/libtracker src/libtracker-data src/tracker-extract src/tracker-utils src/trackerd



Author: mottela
Date: Tue Dec  9 15:15:02 2008
New Revision: 2683
URL: http://svn.gnome.org/viewvc/tracker?rev=2683&view=rev

Log:
The keyword field of queries now supports multiple values

Modified:
   trunk/ChangeLog
   trunk/data/dbus/tracker-search.xml
   trunk/data/services/image.metadata
   trunk/src/libtracker-data/tracker-rdf-query.c
   trunk/src/libtracker-data/tracker-rdf-query.h
   trunk/src/libtracker/tracker.c
   trunk/src/libtracker/tracker.h
   trunk/src/tracker-extract/tracker-xmp.c
   trunk/src/tracker-utils/tracker-query.c
   trunk/src/trackerd/tracker-search.c
   trunk/src/trackerd/tracker-search.h

Modified: trunk/data/dbus/tracker-search.xml
==============================================================================
--- trunk/data/dbus/tracker-search.xml	(original)
+++ trunk/data/dbus/tracker-search.xml	Tue Dec  9 15:15:02 2008
@@ -102,7 +102,7 @@
       <arg type="s" name="service" direction="in" />
       <arg type="as" name="fields" direction="in" />
       <arg type="s" name="search_text" direction="in" />
-      <arg type="s" name="keyword" direction="in" />
+      <arg type="as" name="keywords" direction="in" />
       <arg type="s" name="query_condition" direction="in" />
       <arg type="b" name="sort_by_service" direction="in" />
       <arg type="as" name="sort_fields" direction="in" />

Modified: trunk/data/services/image.metadata
==============================================================================
--- trunk/data/services/image.metadata	(original)
+++ trunk/data/services/image.metadata	Tue Dec  9 15:15:02 2008
@@ -14,6 +14,7 @@
 Weight=20
 Filtered=false
 Delimited=true
+MultipleValues=true
 
 [Image:Height]
 DisplayName=Height

Modified: trunk/src/libtracker-data/tracker-rdf-query.c
==============================================================================
--- trunk/src/libtracker-data/tracker-rdf-query.c	(original)
+++ trunk/src/libtracker-data/tracker-rdf-query.c	Tue Dec  9 15:15:02 2008
@@ -1,3 +1,4 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /* Tracker - indexer and metadata database engine
  * Copyright (C) 2006, Mr Jamie McCracken (jamiemcc gnome org)
  *
@@ -18,6 +19,7 @@
  */
 
 #include <string.h>
+#include <glib/ghash.h>
 
 #include <libtracker-common/tracker-field-data.h>
 #include <libtracker-common/tracker-log.h>
@@ -1137,7 +1139,8 @@
 			  const gchar        **fields,
 			  gint		       field_count,
 			  const gchar	      *search_text,
-			  const gchar	      *keyword,
+			  const gchar	     **keywords,
+			  gint                 keyword_count,
 			  gboolean	       sort_by_service,
 			  const gchar	     **sort_fields,
 			  gint		       sort_field_count,
@@ -1156,7 +1159,7 @@
 	g_return_val_if_fail (service != NULL, NULL);
 	g_return_val_if_fail (fields != NULL, NULL);
 	g_return_val_if_fail (search_text != NULL, NULL);
-	g_return_val_if_fail (keyword != NULL, NULL);
+	g_return_val_if_fail (keywords != NULL, NULL);
 
 	memset (&data, 0, sizeof (data));
 	data.iface = iface;
@@ -1205,16 +1208,67 @@
 					table_name);
 	}
 
-	if (!tracker_is_empty_string (keyword)) {
-		gchar *keyword_metadata;
+	if (keyword_count > 0) {
+		guint keyword;
+		GHashTable *table = NULL;
+		GHashTableIter iter;
+		GList *list = NULL;
+		guint count = 0;
+		gchar *key;
+
+		table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+
+		for (keyword=0; keyword<keyword_count; keyword++) {
+			gchar *full;
+			gchar *sep;
+			gchar *value;
+
+			full = g_strdup (keywords[keyword]);
+
+			sep = strchr (full, '=');
+			if (sep) {
+				sep[0]= '\0';
+				key   = full;
+				value = sep+1;
 
-		keyword_metadata = tracker_data_schema_metadata_field_get_related_names (iface,
-                                                                                         "DC:Keywords");
-		g_string_append_printf (data.sql_from,
-					"\n INNER JOIN ServiceKeywordMetaData K ON S.ID = K.ServiceID and K.MetaDataID in (%s) and K.MetaDataValue = '%s' ",
-					keyword_metadata,
-					keyword);
-		g_free (keyword_metadata);
+			} else {
+				key   = g_strdup ("DC:Keywords");
+				value = g_strdup (keywords[keyword]);
+			}
+
+			g_debug ("Adding key: %s Value:%s", key, value);
+
+			list = g_hash_table_lookup (table, key);
+			list = g_list_prepend (list, g_strdup (value));
+			g_hash_table_insert (table, g_strdup (key), list);
+
+			g_free (full);
+		}
+		
+		g_hash_table_iter_init (&iter, table);
+		while (g_hash_table_iter_next (&iter, (gpointer) &key, (gpointer) &list)) {
+		
+			GList *l = NULL;
+			gchar *keyword_metadata;
+
+			count++;
+			keyword_metadata = tracker_data_schema_metadata_field_get_related_names (iface, key);
+			g_string_append_printf (data.sql_from,
+						"\n INNER JOIN ServiceKeywordMetaData K%d ON K%d.MetaDataID in (%s)",
+						count, count, keyword_metadata);
+
+			for (l = list; l; l = l->next) {
+				g_string_append_printf (data.sql_from,
+							" AND S.ID IN (SELECT ServiceID FROM ServiceKeywordMetaData WHERE MetadataValue = '%s')",
+							l->data);
+			}
+
+			g_list_foreach(list, (GFunc)g_free, NULL);
+			g_list_free (list);
+			g_free (keyword_metadata);
+			
+		}
+		g_hash_table_destroy (table);
 	}
 
 	data.sql_where = g_string_new ("");

Modified: trunk/src/libtracker-data/tracker-rdf-query.h
==============================================================================
--- trunk/src/libtracker-data/tracker-rdf-query.h	(original)
+++ trunk/src/libtracker-data/tracker-rdf-query.h	Tue Dec  9 15:15:02 2008
@@ -38,7 +38,8 @@
 					  const gchar        **fields,
 					  gint                 field_count,
 					  const gchar         *search_text,
-					  const gchar         *keyword,
+					  const gchar        **keywords,
+					  gint                 keyword_count,
 					  gboolean             sort_by_service,
 					  const gchar        **sort_fields,
 					  gint                 sort_field_count,

Modified: trunk/src/libtracker/tracker.c
==============================================================================
--- trunk/src/libtracker/tracker.c	(original)
+++ trunk/src/libtracker/tracker.c	Tue Dec  9 15:15:02 2008
@@ -758,12 +758,12 @@
 
 
 GPtrArray *
-tracker_search_query (TrackerClient *client, int live_query_id, ServiceType service, char **fields, const char *search_text, const char *keywords, const char *query, int offset, int max_hits, gboolean sort_by_service, char **sort_fields, gboolean sort_descending, GError **error)
+tracker_search_query (TrackerClient *client, int live_query_id, ServiceType service, char **fields, const char *search_text, char **keywords, const char *query, int offset, int max_hits, gboolean sort_by_service, char **sort_fields, gboolean sort_descending, GError **error)
 {
 	GPtrArray *table;
 	char *service_str = tracker_service_types[service];
 
-	if (!org_freedesktop_Tracker_Search_query (client->proxy_search, live_query_id, service_str, (const char **)fields, search_text, keywords, query, sort_by_service, (const char **)sort_fields, sort_descending, offset, max_hits , &table, &*error)) {
+	if (!org_freedesktop_Tracker_Search_query (client->proxy_search, live_query_id, service_str, (const char **)fields, search_text, (const char **)keywords, query, sort_by_service, (const char **)sort_fields, sort_descending, offset, max_hits , &table, &*error)) {
 		return NULL;
 	}
 
@@ -1447,7 +1447,7 @@
 }
 
 void
-tracker_search_query_async (TrackerClient *client, int live_query_id, ServiceType service, char **fields, const char *search_text,  const char *keywords, const char *query, int offset, int max_hits, gboolean sort_by_service, char **sort_fields, gboolean sort_descending, TrackerGPtrArrayReply callback, gpointer user_data)
+tracker_search_query_async (TrackerClient *client, int live_query_id, ServiceType service, char **fields, const char *search_text,  char **keywords, const char *query, int offset, int max_hits, gboolean sort_by_service, char **sort_fields, gboolean sort_descending, TrackerGPtrArrayReply callback, gpointer user_data)
 {
 	GPtrArrayCallBackStruct *callback_struct;
 
@@ -1457,7 +1457,7 @@
 
 	char *service_str = tracker_service_types[service];
 
-	client->last_pending_call = org_freedesktop_Tracker_Search_query_async (client->proxy_search, live_query_id, service_str, (const char **)fields, search_text, keywords, query, sort_by_service, (const char **)sort_fields, sort_descending, offset, max_hits,	tracker_GPtrArray_reply, callback_struct);
+	client->last_pending_call = org_freedesktop_Tracker_Search_query_async (client->proxy_search, live_query_id, service_str, (const char **)fields, search_text, (const char **)keywords, query, sort_by_service, (const char **)sort_fields, sort_descending, offset, max_hits,	tracker_GPtrArray_reply, callback_struct);
 
 }
 

Modified: trunk/src/libtracker/tracker.h
==============================================================================
--- trunk/src/libtracker/tracker.h	(original)
+++ trunk/src/libtracker/tracker.h	Tue Dec  9 15:15:02 2008
@@ -147,7 +147,7 @@
 GPtrArray *	tracker_search_text_detailed			(TrackerClient *client, int live_query_id, ServiceType service, const char *search_text, int offset, int max_hits, GError **error);
 char *		tracker_search_get_snippet			(TrackerClient *client, ServiceType service, const char *uri, const char *search_text, GError **error);
 char **		tracker_search_metadata				(TrackerClient *client, ServiceType service, const char *field, const char* search_text, int offset, int max_hits, GError **error);
-GPtrArray *	tracker_search_query				(TrackerClient *client, int live_query_id, ServiceType service, char **fields, const char *search_text, const char *keywords, const char *query, int offset, int max_hits, gboolean sort_by_service, char **sort_fields, gboolean sort_descending, GError **error);
+GPtrArray *	tracker_search_query				(TrackerClient *client, int live_query_id, ServiceType service, char **fields, const char *search_text, char **keywords, const char *query, int offset, int max_hits, gboolean sort_by_service, char **sort_fields, gboolean sort_descending, GError **error);
 gchar *		tracker_search_suggest				(TrackerClient *client, const char *search_text, int maxdist, GError **error);
 
 
@@ -209,7 +209,7 @@
 void		tracker_search_text_detailed_async			(TrackerClient *client, int live_query_id, ServiceType service, const char *search_text, int offset, int max_hits, TrackerGPtrArrayReply callback, gpointer user_data);
 void		tracker_search_get_snippet_async			(TrackerClient *client, ServiceType service, const char *uri, const char *search_text, TrackerStringReply callback, gpointer user_data);
 void		tracker_search_metadata_async				(TrackerClient *client, ServiceType service, const char *field, const char* search_text, int offset, int max_hits, TrackerArrayReply callback, gpointer user_data);
-void		tracker_search_query_async				(TrackerClient *client, int live_query_id, ServiceType service, char **fields, const char *search_text, const char *keywords, const char *query, int offset, int max_hits, gboolean sort_by_service, char **sort_fields, gboolean sort_descending, TrackerGPtrArrayReply callback, gpointer user_data);
+void		tracker_search_query_async				(TrackerClient *client, int live_query_id, ServiceType service, char **fields, const char *search_text, char **keywords, const char *query, int offset, int max_hits, gboolean sort_by_service, char **sort_fields, gboolean sort_descending, TrackerGPtrArrayReply callback, gpointer user_data);
 void		tracker_search_suggest_async				(TrackerClient *client, const char *search_text, int maxdist, TrackerStringReply callback, gpointer user_data);
 
 void		tracker_files_create_async				(TrackerClient *client,  const char *uri, gboolean is_directory, const char *mime, int size, int mtime, TrackerVoidReply callback, gpointer user_data);

Modified: trunk/src/tracker-extract/tracker-xmp.c
==============================================================================
--- trunk/src/tracker-extract/tracker-xmp.c	(original)
+++ trunk/src/tracker-extract/tracker-xmp.c	Tue Dec  9 15:15:02 2008
@@ -162,6 +162,9 @@
 		}
 		else if (strcmp (name, "subject") == 0) {
 			tracker_append_string_to_hash_table (metadata, "DC:Subject", value, append);
+
+			/* The subject field may contain keywords as well */
+			tracker_append_string_to_hash_table (metadata, "Image:Keywords", value, TRUE);
 		}
 		else if (strcmp (name, "publisher") == 0) {
 			tracker_append_string_to_hash_table (metadata, "DC:Publisher", value, append);
@@ -253,15 +256,24 @@
 	else if (strcmp (schema,  NS_IPTC4XMP) == 0) {
 	        if (strcmp (name, "Location") == 0) {
 		        tracker_append_string_to_hash_table (metadata, "Image:Location", value, append);
+
+			/* Added to the valid keywords */
+		        tracker_append_string_to_hash_table (metadata, "Image:Keywords", value, TRUE);
 		}
 	}
 	/* Photoshop scheme */
 	else if (strcmp (schema,  NS_PHOTOSHOP) == 0) {
 	        if (strcmp (name, "City") == 0) {
 		        tracker_append_string_to_hash_table (metadata, "Image:City", value, append);
+
+			/* Added to the valid keywords */
+		        tracker_append_string_to_hash_table (metadata, "Image:Keywords", value, TRUE);
 		}
 		else if (strcmp (name, "Country") == 0) {
 			tracker_append_string_to_hash_table (metadata, "Image:Country", value, append);
+
+			/* Added to the valid keywords */
+		        tracker_append_string_to_hash_table (metadata, "Image:Keywords", value, TRUE);
 		}
 	}
 

Modified: trunk/src/tracker-utils/tracker-query.c
==============================================================================
--- trunk/src/tracker-utils/tracker-query.c	(original)
+++ trunk/src/tracker-utils/tracker-query.c	Tue Dec  9 15:15:02 2008
@@ -40,7 +40,7 @@
 static gchar	     *search;
 static gchar	    **fields;
 static gchar	     *service;
-static gchar	     *keyword;
+static gchar	    **keywords;
 static gint	      limit = 512;
 static gint	      offset;
 
@@ -65,7 +65,7 @@
 	  N_("Adds a fulltext search filter"),
 	  NULL,
 	},
-	{ "keyword", 'k', 0, G_OPTION_ARG_STRING, &keyword,
+	{ "keyword", 'k', 0, G_OPTION_ARG_STRING_ARRAY, &keywords,
 	  N_("Adds a keyword filter"),
 	  NULL
 	},
@@ -217,7 +217,7 @@
 				      type,
 				      fields,
 				      search,
-				      keyword,
+				      keywords,
 				      buffer,
 				      offset,
 				      limit,

Modified: trunk/src/trackerd/tracker-search.c
==============================================================================
--- trunk/src/trackerd/tracker-search.c	(original)
+++ trunk/src/trackerd/tracker-search.c	Tue Dec  9 15:15:02 2008
@@ -427,7 +427,7 @@
 			  const gchar  *service,
 			  const gchar **fields,
 			  const gchar  *search_text,
-			  const gchar  *keyword,
+			  const gchar **keywords,
 			  const gchar  *query_condition,
 			  gboolean      sort_by_service,
 			  const gchar **sort_fields,
@@ -449,10 +449,9 @@
 
 		tracker_dbus_request_comment (request_id,
 					      "Executing RDF query:'%s' with search "
-					      "term:'%s' and keyword:'%s'",
+					      "term:'%s'",
 					      query_condition,
-					      search_text,
-					      keyword);
+					      search_text);
 
 		query_translated = tracker_rdf_query_to_sql (iface,
 							     query_condition,
@@ -460,7 +459,8 @@
 							     fields,
 							     g_strv_length ((GStrv) fields),
 							     search_text,
-							     keyword,
+							     keywords,
+							     keywords ? g_strv_length ((GStrv) keywords) : 0,
 							     sort_by_service,
 							     sort_fields,
 							     sort_fields ? g_strv_length ((GStrv) sort_fields) : 0,
@@ -1152,7 +1152,7 @@
 		      const gchar	     *service,
 		      const gchar	    **fields,
 		      const gchar	     *search_text,
-		      const gchar	     *keyword,
+		      const gchar	    **keywords,
 		      const gchar	     *query_condition,
 		      gboolean		      sort_by_service,
 		      const gchar           **sort_fields,
@@ -1172,18 +1172,17 @@
 	tracker_dbus_async_return_if_fail (service != NULL, context);
 	tracker_dbus_async_return_if_fail (fields != NULL, context);
 	tracker_dbus_async_return_if_fail (search_text != NULL, context);
-	tracker_dbus_async_return_if_fail (keyword != NULL, context);
+	tracker_dbus_async_return_if_fail (keywords != NULL, context);
 	tracker_dbus_async_return_if_fail (query_condition != NULL, context);
 
 	tracker_dbus_request_new (request_id,
 				  "DBus request to search query, "
 				  "query id:%d, service:'%s', search text '%s', "
-				  "keyword:'%s', query condition:'%s', offset:%d, "
+				  "query condition:'%s', offset:%d, "
 				  "max hits:%d, sort by service:'%s', sort descending'%s'",
 				  live_query_id,
 				  service,
 				  search_text,
-				  keyword,
 				  query_condition,
 				  offset,
 				  max_hits,
@@ -1205,7 +1204,7 @@
 					       service, 
 					       fields, 
 					       search_text, 
-					       keyword, 
+					       keywords, 
 					       query_condition,
 					       sort_by_service,
 					       sort_fields, 

Modified: trunk/src/trackerd/tracker-search.h
==============================================================================
--- trunk/src/trackerd/tracker-search.h	(original)
+++ trunk/src/trackerd/tracker-search.h	Tue Dec  9 15:15:02 2008
@@ -115,7 +115,7 @@
 						 const gchar		*service,
 						 const gchar	       **fields,
 						 const gchar		*search_text,
-						 const gchar		*keyword,
+						 const gchar	       **keywords,
 						 const gchar		*query_condition,
 						 gboolean		 sort_by_service,
 						 const gchar	       **sort_fields,



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