[tracker/tracker-0.6] Fixes NB#117593, Top most played and Never played songs not listed in



commit 2ab91f53eafeb41f4cb7c8aafbf01e6fd880cf23
Author: Mikael Ottela <mikael ottela ixonos com>
Date:   Thu Jun 11 14:47:18 2009 +0300

    Fixes NB#117593, Top most played and Never played songs not listed in
    alphabetical order.
    
    One can now add ASC or DESC to the sort fields (for example "Audio:Album ASC")
    to define the sorting order for that specific field.
---
 src/libtracker-data/tracker-data-search.c |   74 ++++++++++++++++++++---------
 src/libtracker-data/tracker-rdf-query.c   |   22 +++++++-
 2 files changed, 70 insertions(+), 26 deletions(-)

diff --git a/src/libtracker-data/tracker-data-search.c b/src/libtracker-data/tracker-data-search.c
index 8eb2605..0098708 100644
--- a/src/libtracker-data/tracker-data-search.c
+++ b/src/libtracker-data/tracker-data-search.c
@@ -822,14 +822,28 @@ tracker_data_search_get_unique_values_with_concat_count_and_sum (const gchar
 	sql_select = g_string_new ("SELECT DISTINCT ");
 	sql_from   = g_string_new ("\nFROM Services AS S ");
 	sql_where  = g_string_new ("\nWHERE ");
-	sql_order  = g_string_new ("");
+	sql_order  = g_string_new ("\nORDER BY ");
 	sql_group  = g_string_new ("\nGROUP BY ");
 
 
 	for (i = 0; i < g_strv_length (fields); i++) {
 		TrackerFieldData *fd;
+		gchar           **s;
+		gboolean          desc;
 
-		fd = tracker_metadata_add_metadata_field (iface, service_type, &field_list, fields[i], TRUE, FALSE, TRUE);
+		s = g_strsplit (fields[i], " ", 2);
+
+		fd = tracker_metadata_add_metadata_field (iface, service_type, &field_list, s[0], TRUE, FALSE, TRUE);
+
+		if (s[1]) {
+			if ((strcmp (s[1], "ASC") == 0) || (strcmp (s[1], "A")==0)) {
+				desc = FALSE;
+			} else {
+				desc = TRUE;
+			}
+		} else {
+			desc = order_desc;
+		}
 
 		if (!fd) {
 			g_string_free (sql_select, TRUE);
@@ -840,25 +854,26 @@ tracker_data_search_get_unique_values_with_concat_count_and_sum (const gchar
 
 			g_set_error (error, TRACKER_DBUS_ERROR, 0,
 				     "Invalid or non-existant metadata type '%s' specified",
-				     fields[i]);
+				     s[0]);
+			g_strfreev(s);
 			return NULL;
 		}
 
 		if (i) {
 			g_string_append_printf (sql_select, ",");
 			g_string_append_printf (sql_group, ",");
+			g_string_append_printf (sql_order, ",");
 		}
 
 		g_string_append_printf (sql_select, "%s", tracker_field_data_get_select_field (fd));
-		if (order_desc) {
-			if (i) {
-				g_string_append_printf (sql_order, ",");
-			}
-			g_string_append_printf (sql_order, "\nORDER BY %s DESC ",
-						tracker_field_data_get_order_field (fd));
-		}
+
+		g_string_append_printf (sql_order, "%s %s ",
+					tracker_field_data_get_order_field (fd),
+					desc ? "DESC" : "ASC");
+       
 		g_string_append_printf (sql_group, "%s", tracker_field_data_get_order_field (fd));
 
+		g_strfreev(s);
 	}
 
 	if (concat_field && !(tracker_is_empty_string (concat_field))) {
@@ -1108,8 +1123,6 @@ tracker_data_search_get_sum (const gchar	 *service_type,
 	g_slist_foreach (fields, (GFunc) g_object_unref, NULL);
 	g_slist_free (fields);
 
-	g_debug ("Sum query executed:\n%s", sql);
-
 	result_set =  tracker_db_interface_execute_query (iface, NULL, "%s", sql);
 
 	g_free (sql);
@@ -1276,14 +1289,28 @@ tracker_data_search_get_unique_values_with_aggregates (const gchar	      *servic
 	sql_select = g_string_new ("SELECT DISTINCT ");
 	sql_from   = g_string_new ("\nFROM Services AS S ");
 	sql_where  = g_string_new ("\nWHERE ");
-	sql_order  = g_string_new ("");
+	sql_order  = g_string_new ("\nORDER BY ");
 	sql_group  = g_string_new ("\nGROUP BY ");
 
 
 	for (i = 0; i < g_strv_length (fields); i++) {
 		TrackerFieldData *fd;
+		gchar           **s;
+		gboolean          desc;
+
+		s = g_strsplit (fields[i], " ", 2);
 
-		fd = tracker_metadata_add_metadata_field (iface, service_type, &field_list, fields[i], TRUE, FALSE, TRUE);
+		fd = tracker_metadata_add_metadata_field (iface, service_type, &field_list, s[0], TRUE, FALSE, TRUE);
+
+		if (s[1]) {
+			if ((strcmp (s[1], "ASC") == 0) || (strcmp (s[1], "A")==0)) {
+				desc = FALSE;
+			} else {
+				desc = TRUE;
+			}
+		} else {
+			desc = order_desc;
+		}
 
 		if (!fd) {
 			g_string_free (sql_select, TRUE);
@@ -1298,24 +1325,27 @@ tracker_data_search_get_unique_values_with_aggregates (const gchar	      *servic
 			g_set_error (error, TRACKER_DBUS_ERROR, 0,
 				     "Invalid or non-existant metadata type '%s' specified",
 				     fields[i]);
+
+			g_strfreev (s);
+
 			return NULL;
 		}
 
 		if (i) {
 			g_string_append_printf (sql_select, ",");
 			g_string_append_printf (sql_group, ",");
+			g_string_append_printf (sql_order, ",");
 		}
 
 		g_string_append_printf (sql_select, "%s", tracker_field_data_get_select_field (fd));
-		if (order_desc) {
-			if (i) {
-				g_string_append_printf (sql_order, ",");
-			}
-			g_string_append_printf (sql_order, "\nORDER BY %s DESC ",
-						tracker_field_data_get_order_field (fd));
-		}
+
+		g_string_append_printf (sql_order, "%s %s ",
+					tracker_field_data_get_order_field (fd),
+					desc ? "DESC" : "ASC");
+
 		g_string_append_printf (sql_group, "%s", tracker_field_data_get_order_field (fd));
 
+		g_strfreev (s);
 	}
 
 	for (i = 0; i < g_strv_length (aggregates); i++) {
@@ -1452,8 +1482,6 @@ tracker_data_search_get_unique_values_with_aggregates (const gchar	      *servic
 			g_slist_foreach (field_list, (GFunc) g_object_unref, NULL);
 			g_slist_free (field_list);
 
-			g_debug ("Got an unknown operation %s", aggregates[i]);
-			
 			g_set_error (error, TRACKER_DBUS_ERROR, 0,
 				     "Aggregate operation %s not found",
 				     aggregates[i]);
diff --git a/src/libtracker-data/tracker-rdf-query.c b/src/libtracker-data/tracker-rdf-query.c
index db61534..6f08512 100644
--- a/src/libtracker-data/tracker-rdf-query.c
+++ b/src/libtracker-data/tracker-rdf-query.c
@@ -814,7 +814,6 @@ build_sql (ParserData *data)
 						data->current_value);
 		} else {
 			/* FIXME This check is too fragile */
-			g_debug ("value:(%s)", value);
 			if ( !strlen(value) || (strcmp(value, "''") == 0) ) {
 				tracker_field_data_set_needs_null (field_data, TRUE);
 				g_string_append_printf (str, " ((%s = '') OR %s IS NULL) ",
@@ -902,6 +901,8 @@ build_sql (ParserData *data)
 
 			g_string_append_printf (str, ") ) " );
 		}
+		g_strfreev(s);
+		
 		break;
 
 	default:
@@ -1345,8 +1346,22 @@ tracker_rdf_query_to_sql (TrackerDBInterface  *iface,
 
 		for (i = 0; i < sort_field_count; i++) {
 			TrackerFieldData *field_data;
+			gchar           **s;
+			gboolean          desc;
+
+			s = g_strsplit (sort_fields[i], " ", 2);
 
-			field_data = add_metadata_field (&data, sort_fields[i], FALSE, FALSE, TRUE);
+			field_data = add_metadata_field (&data, s[0], FALSE, FALSE, TRUE);
+
+			if (s[1]) {
+				if ((strcmp (s[1], "ASC") == 0) || (strcmp (s[1], "A")==0)) {
+					desc = FALSE;
+				} else {
+					desc = TRUE;
+				}
+			} else {
+				desc = sort_desc;
+			}
 
 			if (!field_data) {
 				g_set_error (error,
@@ -1372,7 +1387,8 @@ tracker_rdf_query_to_sql (TrackerDBInterface  *iface,
 
 			g_string_append_printf (data.sql_order, "%s %s",
 						tracker_field_data_get_order_field (field_data),
-						sort_desc ? "DESC" : "ASC");
+						desc ? "DESC" : "ASC");
+			g_strfreev(s);
 		}
 	}
 



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