tracker r2089 - in branches/indexer-split: . data/dbus src/libtracker src/trackerd



Author: mottela
Date: Mon Aug 18 13:11:33 2008
New Revision: 2089
URL: http://svn.gnome.org/viewvc/tracker?rev=2089&view=rev

Log:
Added sorting fields to rdf-queries. Fixed problems with error reporting and limit/offset in unique values

Modified:
   branches/indexer-split/ChangeLog
   branches/indexer-split/data/dbus/tracker-search.xml
   branches/indexer-split/src/libtracker/tracker.c
   branches/indexer-split/src/libtracker/tracker.h
   branches/indexer-split/src/trackerd/tracker-metadata.c
   branches/indexer-split/src/trackerd/tracker-rdf-query.c
   branches/indexer-split/src/trackerd/tracker-rdf-query.h
   branches/indexer-split/src/trackerd/tracker-search.c
   branches/indexer-split/src/trackerd/tracker-search.h

Modified: branches/indexer-split/data/dbus/tracker-search.xml
==============================================================================
--- branches/indexer-split/data/dbus/tracker-search.xml	(original)
+++ branches/indexer-split/data/dbus/tracker-search.xml	Mon Aug 18 13:11:33 2008
@@ -105,6 +105,8 @@
       <arg type="s" name="keyword" 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" />
+      <arg type="b" name="sort_descending" direction="in" />
       <arg type="i" name="offset" direction="in" />
       <arg type="i" name="max_hits" direction="in" />
       <arg type="aas" name="result" direction="out" />

Modified: branches/indexer-split/src/libtracker/tracker.c
==============================================================================
--- branches/indexer-split/src/libtracker/tracker.c	(original)
+++ branches/indexer-split/src/libtracker/tracker.c	Mon Aug 18 13:11:33 2008
@@ -718,12 +718,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, GError **error)
+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 *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, offset, max_hits , &table, &*error)) {
+	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)) {
 		return NULL;
 	}
 
@@ -1377,7 +1377,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, TrackerGPtrArrayReply callback, gpointer user_data)
+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)
 {
 	GPtrArrayCallBackStruct *callback_struct;
 
@@ -1387,7 +1387,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, 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, keywords, query, sort_by_service, (const char **)sort_fields, sort_descending, offset, max_hits,  tracker_GPtrArray_reply, callback_struct);
 	
 }
 

Modified: branches/indexer-split/src/libtracker/tracker.h
==============================================================================
--- branches/indexer-split/src/libtracker/tracker.h	(original)
+++ branches/indexer-split/src/libtracker/tracker.h	Mon Aug 18 13:11:33 2008
@@ -145,7 +145,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, 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);
 gchar * 	tracker_search_suggest				(TrackerClient *client, const char *search_text, int maxdist, GError **error);
 
 
@@ -205,7 +205,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, TrackerGPtrArrayReply 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_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: branches/indexer-split/src/trackerd/tracker-metadata.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-metadata.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-metadata.c	Mon Aug 18 13:11:33 2008
@@ -41,6 +41,8 @@
 
 #include "tracker-rdf-query.h"
 
+#define DEFAULT_METADATA_MAX_HITS 1024
+
 G_DEFINE_TYPE(TrackerMetadata, tracker_metadata, G_TYPE_OBJECT)
 
 static void
@@ -63,6 +65,16 @@
  * Functions
  */
 
+static gint
+metadata_sanity_check_max_hits (gint max_hits)
+{
+        if (max_hits < 1) {
+                return DEFAULT_METADATA_MAX_HITS;
+        }
+
+        return max_hits;
+}
+
 static TrackerFieldData *
 tracker_metadata_add_metadata_field (TrackerDBInterface *iface,
 		    const gchar        *service,
@@ -466,6 +478,7 @@
 
 	GPtrArray          *values = NULL;
 	GSList             *field_list = NULL;
+	gchar	           *str_offset, *str_limit;
 
 	GString            *sql_select;
 	GString            *sql_from;
@@ -477,7 +490,7 @@
 	char               *rdf_from;
 	GError             *actual_error = NULL;
 
-	guint         i;
+	guint               i;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
@@ -565,8 +578,16 @@
 	g_free (rdf_from);
 	g_free (rdf_where);
 
+	str_offset = tracker_int_to_string (offset);
+	str_limit = tracker_int_to_string (metadata_sanity_check_max_hits (max_hits));
+
+	g_string_append_printf (sql_order, " LIMIT %s,%s", str_offset, str_limit);
+
 	sql = g_strconcat (sql_select->str, " ", sql_from->str, " ", sql_where->str, " ", sql_order->str, NULL);
 
+	g_free (str_offset);
+	g_free (str_limit);
+
 	g_string_free (sql_select, TRUE);
 	g_string_free (sql_from, TRUE);
 	g_string_free (sql_where, TRUE);

Modified: branches/indexer-split/src/trackerd/tracker-rdf-query.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-rdf-query.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-rdf-query.c	Mon Aug 18 13:11:33 2008
@@ -1146,9 +1146,12 @@
                           const gchar         *search_text,
                           const gchar         *keyword,
                           gboolean             sort_by_service,
+			  gchar              **sort_fields,
+			  gint                 sort_field_count,
+			  gboolean             sort_desc,
                           gint                 offset,
                           gint                 limit,
-                          GError              *error)
+                          GError             **error)
 {
 	static gboolean  inited = FALSE;
 	ParserData       data;
@@ -1183,8 +1186,12 @@
 			field_data = add_metadata_field (&data, fields[i], TRUE, FALSE);
 
 			if (!field_data) {
-				g_critical ("RDF Query failed, field:'%s' not found", 
-                                            fields[i]);
+			        g_set_error (error,
+					     error_quark, 
+					     PARSE_ERROR,
+					     "RDF Query failed, field:'%s' not found", 
+					     sort_fields[i]);
+
 				g_slist_foreach (data.fields, 
                                                  (GFunc) g_object_unref, 
                                                  NULL);
@@ -1244,21 +1251,64 @@
 		limit = 1024;
 	}
 
+	data.sql_order = g_string_new ("");
+
 	if (sort_by_service) {
 		if (do_search) {
-			data.sql_order = g_string_new ("\n ORDER BY M.Score desc, S.ServiceTypeID, uri LIMIT ");
+		        g_string_append_printf (data.sql_order,"M.Score desc, S.ServiceTypeID, uri ");
 		} else {
-			data.sql_order = g_string_new ("\n ORDER BY S.ServiceTypeID, uri LIMIT ");
+			g_string_append_printf (data.sql_order,"S.ServiceTypeID, uri ");
 		}
 	} else {
 		if (do_search) {
-			data.sql_order = g_string_new ("\n ORDER BY M.Score desc LIMIT ");
+			g_string_append_printf (data.sql_order,"M.Score desc ");
 		} else {
-			data.sql_order = g_string_new ("\n  LIMIT ");
+			/* Nothing */
 		}
 
 	}
 
+	if (sort_field_count>0) {
+	        gint i;
+
+		for (i = 0; i < sort_field_count; i++) {
+			TrackerFieldData *field_data;
+
+			field_data = add_metadata_field (&data, sort_fields[i], FALSE, FALSE);
+
+			if (!field_data) {
+			        g_set_error (error,
+					     error_quark, 
+					     PARSE_ERROR,
+					     "RDF Query failed, sort field:'%s' not found", 
+					     sort_fields[i]);
+				g_slist_foreach (data.fields, 
+                                                 (GFunc) g_object_unref, 
+                                                 NULL);
+				g_slist_free (data.fields);
+				g_string_free (data.sql_select, TRUE);
+				g_string_free (data.sql_where, TRUE);
+				g_string_free (data.sql_order, TRUE);
+
+				return NULL;
+			}
+
+			if (i) {
+				g_string_append_printf (data.sql_order, ", ");
+			}
+
+			g_string_append_printf (data.sql_order, "%s %s", 
+						tracker_field_data_get_select_field (field_data),
+						sort_desc ? "DESC" : "ASC");
+		}
+ 	}
+ 
+	if (!tracker_is_empty_string (data.sql_order->str)) {
+		g_string_prepend (data.sql_order, "\n ORDER BY ");
+	}
+
+	g_string_append_printf (data.sql_order, " LIMIT ");	
+
 	g_string_append_printf (data.sql_order, "%d,%d ", offset, limit);
 
 	data.parser = g_new0 (GMarkupParser, 1);
@@ -1277,7 +1327,7 @@
 
 	result = NULL;
 
-	if (!g_markup_parse_context_parse (data.context, query, -1, &error)) {
+	if (!g_markup_parse_context_parse (data.context, query, -1, error)) {
 		g_string_free (data.sql_select, TRUE);
 		g_string_free (data.sql_from, TRUE);
 		g_string_free (data.sql_where, TRUE);

Modified: branches/indexer-split/src/trackerd/tracker-rdf-query.h
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-rdf-query.h	(original)
+++ branches/indexer-split/src/trackerd/tracker-rdf-query.h	Mon Aug 18 13:11:33 2008
@@ -35,9 +35,12 @@
 				 const gchar         *search_text,
 				 const gchar         *keyword,
 				 gboolean             sort_by_service,
+				 gchar              **sort_fields,
+				 gint                 sort_field_count,
+				 gboolean             sort_desc,
 				 gint                 offset,
 				 gint                 limit,
-				 GError              *error);
+				 GError             **error);
 
 void tracker_rdf_filter_to_sql  (TrackerDBInterface  *iface,
 				 const gchar         *query,

Modified: branches/indexer-split/src/trackerd/tracker-search.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-search.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-search.c	Mon Aug 18 13:11:33 2008
@@ -1091,6 +1091,8 @@
 		      const gchar            *keyword,
 		      const gchar            *query_condition,
 		      gboolean                sort_by_service,
+		      gchar                 **sort_fields,
+		      gboolean                sort_desc,
 		      gint                    offset,
 		      gint                    max_hits,
 		      DBusGMethodInvocation  *context,
@@ -1114,7 +1116,7 @@
 				  "DBus request to search query, "
 				  "query id:%d, service:'%s', search text '%s', "
 				  "keyword:'%s', query condition:'%s', offset:%d, "
-				  "max hits:%d, sort by service:'%s'",
+				  "max hits:%d, sort by service:'%s', sort descending'%s'",
 				  live_query_id,
 				  service,
 				  search_text,
@@ -1122,14 +1124,15 @@
 				  query_condition,
 				  offset,
 				  max_hits, 
-				  sort_by_service ? "yes" : "no");
+				  sort_by_service ? "yes" : "no",
+				  sort_desc ? "yes" : "no");
 
 	if (!tracker_ontology_is_valid_service_type (service)) {
-		g_set_error (&actual_error,
-			     TRACKER_DBUS_ERROR,
-			     0,
-			     "Service '%s' is invalid or has not been implemented yet",
-			     service);
+		tracker_dbus_request_failed (request_id,
+					     &actual_error,
+					     0,
+					     "Service '%s' is invalid or has not been implemented yet",
+					     service);
 		dbus_g_method_return_error (context, actual_error);
 		g_error_free (actual_error);
 		return;
@@ -1157,25 +1160,26 @@
 							     g_strv_length (fields), 
 							     search_text, 
 							     keyword, 
-							     sort_by_service, 
+							     sort_by_service,
+							     sort_fields,
+							     g_strv_length (sort_fields),
+							     sort_desc,
 							     offset, 
 							     search_sanity_check_max_hits (max_hits), 
-							     query_error);
+							     &query_error);
 
 		if (query_error) {
-			g_set_error (&actual_error,
-				     TRACKER_DBUS_ERROR,
-				     0,
-				     query_error->message);
-			dbus_g_method_return_error (context, actual_error);
-			g_error_free (actual_error);
+			tracker_dbus_request_failed (request_id,
+						     &query_error, 
+						     NULL);
+			dbus_g_method_return_error (context, query_error);
 			g_error_free (query_error);
 			return;
 		} else if (!query_translated) {
-			g_set_error (&actual_error,
-				     TRACKER_DBUS_ERROR,
-				     0,
-				     "Invalid rdf query, no error given");
+			tracker_dbus_request_failed (request_id,
+						     &actual_error,
+						     0,
+						     "Invalid rdf query, no error given");
 			dbus_g_method_return_error (context, actual_error);
 			g_error_free (actual_error);
 			return;

Modified: branches/indexer-split/src/trackerd/tracker-search.h
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-search.h	(original)
+++ branches/indexer-split/src/trackerd/tracker-search.h	Mon Aug 18 13:11:33 2008
@@ -117,6 +117,8 @@
 						 const gchar            *keyword,
 						 const gchar            *query_condition,
 						 gboolean                sort_by_service,
+						 gchar                 **sort_fields,
+						 gint                    sort_field_count,
 						 gint                    offset,
 						 gint                    max_hits,
 						 DBusGMethodInvocation  *context,



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