tracker r2089 - in branches/indexer-split: . data/dbus src/libtracker src/trackerd
- From: mottela svn gnome org
- To: svn-commits-list gnome org
- Subject: tracker r2089 - in branches/indexer-split: . data/dbus src/libtracker src/trackerd
- Date: Mon, 18 Aug 2008 13:11:33 +0000 (UTC)
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]