[tracker/tracker-0.6] Fixes NB#117593, Top most played and Never played songs not listed in
- From: Mikael Ottela <mottela src gnome org>
- To: svn-commits-list gnome org
- Subject: [tracker/tracker-0.6] Fixes NB#117593, Top most played and Never played songs not listed in
- Date: Thu, 11 Jun 2009 07:53:59 -0400 (EDT)
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]