Hello,

The attached patch adds "GetUniqueValues" which should be what are looking for.

Mikael


________________________________________
From: [EMAIL PROTECTED] [EMAIL PROTECTED] On Behalf Of Iago Toral Quiroga 
[EMAIL PROTECTED]
Sent: Wednesday, April 23, 2008 11:15 AM
To: [email protected]
Subject: [Tracker] Querying values of metadata keys

Hi all,

I'd like to know how I can get the list of different values available
for a given metadata key. For example, I'd like to get the list of
different music albums (Audio:Album metadata key).

Thanks in advance!

Iago

_______________________________________________
tracker-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/tracker-list
Index: src/trackerd/tracker-dbus-metadata.c
===================================================================
--- src/trackerd/tracker-dbus-metadata.c	(revision 1241)
+++ src/trackerd/tracker-dbus-metadata.c	(working copy)
@@ -596,3 +596,63 @@
 	dbus_connection_send (rec->connection, reply, NULL);
 	dbus_message_unref (reply);
 }
+
+
+void
+tracker_dbus_method_metadata_get_unique_values (DBusRec *rec)
+{
+	DBConnection *db_con;
+	DBusError    dbus_error;
+	DBusMessage  *reply;
+	gchar 	     *meta_type;
+	gchar 	     **array;
+	gint 	     limit, offset;
+	int	     row_count;
+	char	     ***res;
+
+/*
+		<!-- returns an array of all unique values of given metadata type -->
+		<method name="GetUniqueValues">
+			<arg type="s" name="meta_type" direction="in" />
+			<arg type="i" name="offset" direction="in" />
+			<arg type="i" name="max_hits" direction="in" />
+			<arg type="as" name="result" direction="out" />
+		</method>
+*/
+
+	g_return_if_fail (rec && rec->user_data);
+
+	db_con = rec->user_data;
+
+        dbus_error_init (&dbus_error);
+        if (!dbus_message_get_args (rec->message, NULL,
+                               DBUS_TYPE_STRING, &meta_type,
+                               DBUS_TYPE_INT32, &offset,
+                               DBUS_TYPE_INT32, &limit,
+                               DBUS_TYPE_INVALID)) {
+                tracker_set_error (rec, "DBusError: %s;%s", dbus_error.name, dbus_error.message);
+                dbus_error_free (&dbus_error);
+	        return;
+        }
+
+	res = tracker_db_get_unique_metadata_values (db_con, meta_type, offset, limit);
+
+        array = NULL;
+        row_count = 0;
+
+        if (res) {
+                array = tracker_get_query_result_as_array (res, &row_count);
+                tracker_db_free_result (res);
+	}
+
+        reply = dbus_message_new_method_return (rec->message);
+
+        dbus_message_append_args (reply,
+                                  DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &array, row_count,
+                                  DBUS_TYPE_INVALID);
+
+        tracker_free_array (array, row_count);
+
+        dbus_connection_send (rec->connection, reply, NULL);
+        dbus_message_unref (reply);
+}
Index: src/trackerd/tracker-dbus-metadata.h
===================================================================
--- src/trackerd/tracker-dbus-metadata.h	(revision 1241)
+++ src/trackerd/tracker-dbus-metadata.h	(working copy)
@@ -33,4 +33,6 @@
 void	tracker_dbus_method_metadata_get_writeable_types	(DBusRec *rec);
 void	tracker_dbus_method_metadata_get_registered_classes	(DBusRec *rec);
 
+void	tracker_dbus_method_metadata_get_unique_values          (DBusRec *rec);
+
 #endif
Index: src/trackerd/tracker-db-sqlite.c
===================================================================
--- src/trackerd/tracker-db-sqlite.c	(revision 1241)
+++ src/trackerd/tracker-db-sqlite.c	(working copy)
@@ -4007,6 +4007,47 @@
 
 }
 
+char ***
+tracker_db_get_unique_metadata_values (DBConnection *db_con, const char *meta_type, int offset, int limit)
+{
+        FieldDef *def;
+        char	 *str_offset, *str_limit;
+        char     ***res;
+
+        g_return_val_if_fail ((meta_type), NULL);
+
+        def = tracker_db_get_field_def (db_con, meta_type);
+
+        if (!def) {
+                tracker_error ("ERROR: metadata not found for type %s", meta_type);
+                return NULL;
+        }
+
+	str_offset = tracker_int_to_str (offset);
+	str_limit = tracker_int_to_str (limit);
+
+        switch (def->type) {
+
+                case DATA_INDEX:
+                case DATA_STRING:
+                case DATA_DOUBLE:
+		        res = tracker_exec_proc (db_con, "GetMetadataValues", 3, def->id, str_offset, str_limit); break;
+
+                case DATA_INTEGER:
+                case DATA_DATE:
+		        res = tracker_exec_proc (db_con, "GetMetadataNumericValues", 3, def->id, str_offset, str_limit); break;
+
+                case DATA_KEYWORD:
+		        res = tracker_exec_proc (db_con, "GetMetadataKeywordValues", 3, def->id, str_offset, str_limit); break;
+
+                default: tracker_error ("ERROR: metadata could not be retrieved as type %d is not supported", def->type); res = NULL;
+	}
+
+	return res;
+
+}
+
+
 static char *
 remove_value (const char *str, const char *del_str) 
 {
Index: src/trackerd/tracker-process-requests.c
===================================================================
--- src/trackerd/tracker-process-requests.c	(revision 1241)
+++ src/trackerd/tracker-process-requests.c	(working copy)
@@ -206,7 +206,11 @@
                 case DBUS_ACTION_METADATA_GET_REGISTERED_CLASSES:
                         tracker_dbus_method_metadata_get_registered_classes (rec);
                         break;
-                        
+
+                case DBUS_ACTION_METADATA_GET_UNIQUE_VALUES:
+                        tracker_dbus_method_metadata_get_unique_values (rec);
+                        break;
+
                 case DBUS_ACTION_KEYWORDS_GET_LIST:
                         tracker->request_waiting = TRUE;
                         tracker->grace_period = 2;
Index: src/trackerd/tracker-db-sqlite.h
===================================================================
--- src/trackerd/tracker-db-sqlite.h	(revision 1241)
+++ src/trackerd/tracker-db-sqlite.h	(working copy)
@@ -145,6 +145,8 @@
 char *		tracker_db_set_metadata		  (DBConnection *db_con, const char *service, const char *id, const char *key, char **values, int length, gboolean do_backup);
 void		tracker_db_set_single_metadata 	  (DBConnection *db_con, const char *service, const char *id, const char *key, const char *value, gboolean do_backup);
 
+char ***        tracker_db_get_unique_metadata_values (DBConnection *db_con, const char *meta_type, int offset, int limit);
+
 void		tracker_db_insert_embedded_metadata		(DBConnection *db_con, const char *service, const char *id, const char *key, char **values, int length, GHashTable *table);
 void		tracker_db_insert_single_embedded_metadata 	(DBConnection *db_con, const char *service, const char *id, const char *key, const char *value, GHashTable *table);
 
Index: src/trackerd/tracker-dbus.c
===================================================================
--- src/trackerd/tracker-dbus.c	(revision 1241)
+++ src/trackerd/tracker-dbus.c	(working copy)
@@ -431,6 +431,13 @@
 
 
 
+	} else if (dbus_message_is_method_call (message, TRACKER_INTERFACE_METADATA, TRACKER_METHOD_METADATA_GET_UNIQUE_VALUES)) {
+
+		dbus_message_ref (message);
+		rec->action = DBUS_ACTION_METADATA_GET_UNIQUE_VALUES;
+
+
+
 	} else if (dbus_message_is_method_call (message, TRACKER_INTERFACE_KEYWORDS, TRACKER_METHOD_KEYWORDS_GET_LIST)) {
 
 		dbus_message_ref (message);
Index: src/trackerd/tracker-dbus.h
===================================================================
--- src/trackerd/tracker-dbus.h	(revision 1241)
+++ src/trackerd/tracker-dbus.h	(working copy)
@@ -59,6 +59,7 @@
 #define TRACKER_METHOD_METADATA_GET_REGISTERED_TYPES   	"GetRegisteredTypes"
 #define TRACKER_METHOD_METADATA_GET_WRITEABLE_TYPES   	"GetWriteableTypes"
 #define TRACKER_METHOD_METADATA_GET_REGISTERED_CLASSES 	"GetRegisteredClasses"
+#define TRACKER_METHOD_METADATA_GET_UNIQUE_VALUES       "GetUniqueValues"
 
 /* keywords interface */
 #define TRACKER_METHOD_KEYWORDS_GET_LIST		"GetList"
@@ -130,6 +131,7 @@
 	DBUS_ACTION_METADATA_GET_REGISTERED_TYPES,
 	DBUS_ACTION_METADATA_GET_WRITEABLE_TYPES,
 	DBUS_ACTION_METADATA_GET_REGISTERED_CLASSES,
+	DBUS_ACTION_METADATA_GET_UNIQUE_VALUES,
 
 	DBUS_ACTION_KEYWORDS_GET_LIST,
 	DBUS_ACTION_KEYWORDS_GET,
Index: src/libtracker/tracker.h
===================================================================
--- src/libtracker/tracker.h	(revision 1241)
+++ src/libtracker/tracker.h	(working copy)
@@ -125,8 +125,8 @@
 char **			tracker_metadata_get_registered_types		(TrackerClient *client, const char *classname, GError **error);
 char **			tracker_metadata_get_writeable_types		(TrackerClient *client, const char *classname, GError **error);
 char **			tracker_metadata_get_registered_classes		(TrackerClient *client, GError **error);
+char **		        tracker_metadata_get_unique_values              (TrackerClient *client, const char *meta_type, int offset, int max_hits, GError **error);
 
-
 GPtrArray *	tracker_keywords_get_list			(TrackerClient *client, ServiceType service, GError **error);
 char **		tracker_keywords_get				(TrackerClient *client, ServiceType service, const char *id, GError **error);
 void		tracker_keywords_add				(TrackerClient *client, ServiceType service, const char *id, char **values, GError **error);
@@ -184,8 +184,8 @@
 void		tracker_metadata_get_registered_types_async 		(TrackerClient *client, const char *classname, TrackerArrayReply callback, gpointer user_data);
 void		tracker_metadata_get_writeable_types_async 		(TrackerClient *client, const char *classname, TrackerArrayReply callback, gpointer user_data);
 void		tracker_metadata_get_registered_classes_async 		(TrackerClient *client, TrackerArrayReply callback, gpointer user_data);
+void		tracker_metadata_get_unique_values_async                (TrackerClient *client, const char *meta_type, int offset, int max_hits, TrackerArrayReply callback, gpointer user_data);
 
-
 void		tracker_keywords_get_list_async 			(TrackerClient *client, ServiceType service, TrackerGPtrArrayReply callback, gpointer user_data);
 void		tracker_keywords_get_async 				(TrackerClient *client, ServiceType service, const char *id, TrackerArrayReply callback, gpointer user_data);
 void		tracker_keywords_add_async 				(TrackerClient *client, ServiceType service, const char *id, char **values, TrackerVoidReply callback, gpointer user_data);
Index: src/libtracker/tracker.c
===================================================================
--- src/libtracker/tracker.c	(revision 1241)
+++ src/libtracker/tracker.c	(working copy)
@@ -511,9 +511,19 @@
 
 
 
+char **		
+tracker_metadata_get_unique_values (TrackerClient *client, const char *meta_type, int offset, int max_hits, GError **error)
+{
+	char **array = NULL;
 
+	if (!org_freedesktop_Tracker_Metadata_get_unique_values (client->proxy_metadata, meta_type, offset, max_hits, &array, &*error)) {
+		return NULL;
+	}
 
+	return array;
+}
 
+
 GPtrArray *	
 tracker_keywords_get_list (TrackerClient *client, ServiceType service, GError **error)
 {
@@ -1099,9 +1109,23 @@
 
 
 
+void
+tracker_metadata_get_unique_values_async (TrackerClient *client, const char *meta_type, int offset, int max_hits, TrackerArrayReply callback, gpointer user_data)
+{
+	
+        ArrayCallBackStruct *callback_struct;
 
+        callback_struct = g_new (ArrayCallBackStruct, 1);
+        callback_struct->callback = callback;
+        callback_struct->data = user_data;
 
+        org_freedesktop_Tracker_Metadata_get_unique_values_async (client->proxy_search, meta_type, offset, max_hits, tracker_array_reply, callback_struct);
+	
+}
 
+
+
+
 void
 tracker_keywords_get_list_async (TrackerClient *client, ServiceType service, TrackerGPtrArrayReply callback, gpointer user_data)
 {
Index: data/sqlite-stored-procs.sql
===================================================================
--- data/sqlite-stored-procs.sql	(revision 1241)
+++ data/sqlite-stored-procs.sql	(working copy)
@@ -83,6 +83,10 @@
 GetMetadata SELECT MetaDataDisplay FROM ServiceMetaData WHERE ServiceID = ? AND MetaDataID = ?;
 GetMetadataNumeric SELECT MetaDataValue FROM ServiceNumericMetaData WHERE ServiceID = ? AND MetaDataID = ?;
 
+GetMetadataKeywordValues SELECT DISTINCT MetaDataValue FROM ServiceKeywordMetaData WHERE MetaDataID = ? LIMIT ?,?;
+GetMetadataValues SELECT DISTINCT MetaDataDisplay FROM ServiceMetaData WHERE MetaDataID = ? LIMIT ?,?;
+GetMetadataNumericValues SELECT DISTINCT MetaDataValue FROM ServiceNumericMetaData WHERE MetaDataID = ? LIMIT ?,?;
+
 SetMetadataKeyword INSERT INTO ServiceKeywordMetaData (ServiceID, MetaDataID, MetaDataValue) VALUES (?,?,?);
 SetMetadata INSERT INTO ServiceMetaData (ServiceID, MetaDataID, MetaDataValue, MetaDataDisplay) VALUES (?,?,?,?);
 SetMetadataNumeric INSERT INTO ServiceNumericMetaData (ServiceID, MetaDataID, MetaDataValue) VALUES (?,?,?);
Index: data/tracker-introspect.xml
===================================================================
--- data/tracker-introspect.xml	(revision 1241)
+++ data/tracker-introspect.xml	(working copy)
@@ -220,6 +220,14 @@
 			<arg type="as" name="result" direction="out" />
 		</method>
 
+		<!-- returns an array of all unique values of given metadata type -->
+		<method name="GetUniqueValues">
+			<arg type="s" name="meta_type" direction="in" />
+			<arg type="i" name="offset" direction="in" />
+			<arg type="i" name="max_hits" direction="in" />
+			<arg type="as" name="result" direction="out" />
+		</method>
+
 		<!-- signal emitted whenever metadata for a service entity is changed. The keys are the metadata names that have changed -->
 		<signal name="Changed">
 			<arg type="s" name="service"/>
_______________________________________________
tracker-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/tracker-list

Reply via email to