tracker r2683 - in trunk: . data/dbus data/services src/libtracker src/libtracker-data src/tracker-extract src/tracker-utils src/trackerd
- From: mottela svn gnome org
- To: svn-commits-list gnome org
- Subject: tracker r2683 - in trunk: . data/dbus data/services src/libtracker src/libtracker-data src/tracker-extract src/tracker-utils src/trackerd
- Date: Tue, 9 Dec 2008 15:15:02 +0000 (UTC)
Author: mottela
Date: Tue Dec 9 15:15:02 2008
New Revision: 2683
URL: http://svn.gnome.org/viewvc/tracker?rev=2683&view=rev
Log:
The keyword field of queries now supports multiple values
Modified:
trunk/ChangeLog
trunk/data/dbus/tracker-search.xml
trunk/data/services/image.metadata
trunk/src/libtracker-data/tracker-rdf-query.c
trunk/src/libtracker-data/tracker-rdf-query.h
trunk/src/libtracker/tracker.c
trunk/src/libtracker/tracker.h
trunk/src/tracker-extract/tracker-xmp.c
trunk/src/tracker-utils/tracker-query.c
trunk/src/trackerd/tracker-search.c
trunk/src/trackerd/tracker-search.h
Modified: trunk/data/dbus/tracker-search.xml
==============================================================================
--- trunk/data/dbus/tracker-search.xml (original)
+++ trunk/data/dbus/tracker-search.xml Tue Dec 9 15:15:02 2008
@@ -102,7 +102,7 @@
<arg type="s" name="service" direction="in" />
<arg type="as" name="fields" direction="in" />
<arg type="s" name="search_text" direction="in" />
- <arg type="s" name="keyword" direction="in" />
+ <arg type="as" name="keywords" 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" />
Modified: trunk/data/services/image.metadata
==============================================================================
--- trunk/data/services/image.metadata (original)
+++ trunk/data/services/image.metadata Tue Dec 9 15:15:02 2008
@@ -14,6 +14,7 @@
Weight=20
Filtered=false
Delimited=true
+MultipleValues=true
[Image:Height]
DisplayName=Height
Modified: trunk/src/libtracker-data/tracker-rdf-query.c
==============================================================================
--- trunk/src/libtracker-data/tracker-rdf-query.c (original)
+++ trunk/src/libtracker-data/tracker-rdf-query.c Tue Dec 9 15:15:02 2008
@@ -1,3 +1,4 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/* Tracker - indexer and metadata database engine
* Copyright (C) 2006, Mr Jamie McCracken (jamiemcc gnome org)
*
@@ -18,6 +19,7 @@
*/
#include <string.h>
+#include <glib/ghash.h>
#include <libtracker-common/tracker-field-data.h>
#include <libtracker-common/tracker-log.h>
@@ -1137,7 +1139,8 @@
const gchar **fields,
gint field_count,
const gchar *search_text,
- const gchar *keyword,
+ const gchar **keywords,
+ gint keyword_count,
gboolean sort_by_service,
const gchar **sort_fields,
gint sort_field_count,
@@ -1156,7 +1159,7 @@
g_return_val_if_fail (service != NULL, NULL);
g_return_val_if_fail (fields != NULL, NULL);
g_return_val_if_fail (search_text != NULL, NULL);
- g_return_val_if_fail (keyword != NULL, NULL);
+ g_return_val_if_fail (keywords != NULL, NULL);
memset (&data, 0, sizeof (data));
data.iface = iface;
@@ -1205,16 +1208,67 @@
table_name);
}
- if (!tracker_is_empty_string (keyword)) {
- gchar *keyword_metadata;
+ if (keyword_count > 0) {
+ guint keyword;
+ GHashTable *table = NULL;
+ GHashTableIter iter;
+ GList *list = NULL;
+ guint count = 0;
+ gchar *key;
+
+ table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+
+ for (keyword=0; keyword<keyword_count; keyword++) {
+ gchar *full;
+ gchar *sep;
+ gchar *value;
+
+ full = g_strdup (keywords[keyword]);
+
+ sep = strchr (full, '=');
+ if (sep) {
+ sep[0]= '\0';
+ key = full;
+ value = sep+1;
- keyword_metadata = tracker_data_schema_metadata_field_get_related_names (iface,
- "DC:Keywords");
- g_string_append_printf (data.sql_from,
- "\n INNER JOIN ServiceKeywordMetaData K ON S.ID = K.ServiceID and K.MetaDataID in (%s) and K.MetaDataValue = '%s' ",
- keyword_metadata,
- keyword);
- g_free (keyword_metadata);
+ } else {
+ key = g_strdup ("DC:Keywords");
+ value = g_strdup (keywords[keyword]);
+ }
+
+ g_debug ("Adding key: %s Value:%s", key, value);
+
+ list = g_hash_table_lookup (table, key);
+ list = g_list_prepend (list, g_strdup (value));
+ g_hash_table_insert (table, g_strdup (key), list);
+
+ g_free (full);
+ }
+
+ g_hash_table_iter_init (&iter, table);
+ while (g_hash_table_iter_next (&iter, (gpointer) &key, (gpointer) &list)) {
+
+ GList *l = NULL;
+ gchar *keyword_metadata;
+
+ count++;
+ keyword_metadata = tracker_data_schema_metadata_field_get_related_names (iface, key);
+ g_string_append_printf (data.sql_from,
+ "\n INNER JOIN ServiceKeywordMetaData K%d ON K%d.MetaDataID in (%s)",
+ count, count, keyword_metadata);
+
+ for (l = list; l; l = l->next) {
+ g_string_append_printf (data.sql_from,
+ " AND S.ID IN (SELECT ServiceID FROM ServiceKeywordMetaData WHERE MetadataValue = '%s')",
+ l->data);
+ }
+
+ g_list_foreach(list, (GFunc)g_free, NULL);
+ g_list_free (list);
+ g_free (keyword_metadata);
+
+ }
+ g_hash_table_destroy (table);
}
data.sql_where = g_string_new ("");
Modified: trunk/src/libtracker-data/tracker-rdf-query.h
==============================================================================
--- trunk/src/libtracker-data/tracker-rdf-query.h (original)
+++ trunk/src/libtracker-data/tracker-rdf-query.h Tue Dec 9 15:15:02 2008
@@ -38,7 +38,8 @@
const gchar **fields,
gint field_count,
const gchar *search_text,
- const gchar *keyword,
+ const gchar **keywords,
+ gint keyword_count,
gboolean sort_by_service,
const gchar **sort_fields,
gint sort_field_count,
Modified: trunk/src/libtracker/tracker.c
==============================================================================
--- trunk/src/libtracker/tracker.c (original)
+++ trunk/src/libtracker/tracker.c Tue Dec 9 15:15:02 2008
@@ -758,12 +758,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, char **sort_fields, gboolean sort_descending, GError **error)
+tracker_search_query (TrackerClient *client, int live_query_id, ServiceType service, char **fields, const char *search_text, 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, (const char **)sort_fields, sort_descending, offset, max_hits , &table, &*error)) {
+ if (!org_freedesktop_Tracker_Search_query (client->proxy_search, live_query_id, service_str, (const char **)fields, search_text, (const char **)keywords, query, sort_by_service, (const char **)sort_fields, sort_descending, offset, max_hits , &table, &*error)) {
return NULL;
}
@@ -1447,7 +1447,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, char **sort_fields, gboolean sort_descending, TrackerGPtrArrayReply callback, gpointer user_data)
+tracker_search_query_async (TrackerClient *client, int live_query_id, ServiceType service, char **fields, const char *search_text, 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;
@@ -1457,7 +1457,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, (const char **)sort_fields, sort_descending, 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, (const char **)keywords, query, sort_by_service, (const char **)sort_fields, sort_descending, offset, max_hits, tracker_GPtrArray_reply, callback_struct);
}
Modified: trunk/src/libtracker/tracker.h
==============================================================================
--- trunk/src/libtracker/tracker.h (original)
+++ trunk/src/libtracker/tracker.h Tue Dec 9 15:15:02 2008
@@ -147,7 +147,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, char **sort_fields, gboolean sort_descending, GError **error);
+GPtrArray * tracker_search_query (TrackerClient *client, int live_query_id, ServiceType service, char **fields, const char *search_text, 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);
@@ -209,7 +209,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, char **sort_fields, gboolean sort_descending, TrackerGPtrArrayReply callback, gpointer user_data);
+void tracker_search_query_async (TrackerClient *client, int live_query_id, ServiceType service, char **fields, const char *search_text, 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: trunk/src/tracker-extract/tracker-xmp.c
==============================================================================
--- trunk/src/tracker-extract/tracker-xmp.c (original)
+++ trunk/src/tracker-extract/tracker-xmp.c Tue Dec 9 15:15:02 2008
@@ -162,6 +162,9 @@
}
else if (strcmp (name, "subject") == 0) {
tracker_append_string_to_hash_table (metadata, "DC:Subject", value, append);
+
+ /* The subject field may contain keywords as well */
+ tracker_append_string_to_hash_table (metadata, "Image:Keywords", value, TRUE);
}
else if (strcmp (name, "publisher") == 0) {
tracker_append_string_to_hash_table (metadata, "DC:Publisher", value, append);
@@ -253,15 +256,24 @@
else if (strcmp (schema, NS_IPTC4XMP) == 0) {
if (strcmp (name, "Location") == 0) {
tracker_append_string_to_hash_table (metadata, "Image:Location", value, append);
+
+ /* Added to the valid keywords */
+ tracker_append_string_to_hash_table (metadata, "Image:Keywords", value, TRUE);
}
}
/* Photoshop scheme */
else if (strcmp (schema, NS_PHOTOSHOP) == 0) {
if (strcmp (name, "City") == 0) {
tracker_append_string_to_hash_table (metadata, "Image:City", value, append);
+
+ /* Added to the valid keywords */
+ tracker_append_string_to_hash_table (metadata, "Image:Keywords", value, TRUE);
}
else if (strcmp (name, "Country") == 0) {
tracker_append_string_to_hash_table (metadata, "Image:Country", value, append);
+
+ /* Added to the valid keywords */
+ tracker_append_string_to_hash_table (metadata, "Image:Keywords", value, TRUE);
}
}
Modified: trunk/src/tracker-utils/tracker-query.c
==============================================================================
--- trunk/src/tracker-utils/tracker-query.c (original)
+++ trunk/src/tracker-utils/tracker-query.c Tue Dec 9 15:15:02 2008
@@ -40,7 +40,7 @@
static gchar *search;
static gchar **fields;
static gchar *service;
-static gchar *keyword;
+static gchar **keywords;
static gint limit = 512;
static gint offset;
@@ -65,7 +65,7 @@
N_("Adds a fulltext search filter"),
NULL,
},
- { "keyword", 'k', 0, G_OPTION_ARG_STRING, &keyword,
+ { "keyword", 'k', 0, G_OPTION_ARG_STRING_ARRAY, &keywords,
N_("Adds a keyword filter"),
NULL
},
@@ -217,7 +217,7 @@
type,
fields,
search,
- keyword,
+ keywords,
buffer,
offset,
limit,
Modified: trunk/src/trackerd/tracker-search.c
==============================================================================
--- trunk/src/trackerd/tracker-search.c (original)
+++ trunk/src/trackerd/tracker-search.c Tue Dec 9 15:15:02 2008
@@ -427,7 +427,7 @@
const gchar *service,
const gchar **fields,
const gchar *search_text,
- const gchar *keyword,
+ const gchar **keywords,
const gchar *query_condition,
gboolean sort_by_service,
const gchar **sort_fields,
@@ -449,10 +449,9 @@
tracker_dbus_request_comment (request_id,
"Executing RDF query:'%s' with search "
- "term:'%s' and keyword:'%s'",
+ "term:'%s'",
query_condition,
- search_text,
- keyword);
+ search_text);
query_translated = tracker_rdf_query_to_sql (iface,
query_condition,
@@ -460,7 +459,8 @@
fields,
g_strv_length ((GStrv) fields),
search_text,
- keyword,
+ keywords,
+ keywords ? g_strv_length ((GStrv) keywords) : 0,
sort_by_service,
sort_fields,
sort_fields ? g_strv_length ((GStrv) sort_fields) : 0,
@@ -1152,7 +1152,7 @@
const gchar *service,
const gchar **fields,
const gchar *search_text,
- const gchar *keyword,
+ const gchar **keywords,
const gchar *query_condition,
gboolean sort_by_service,
const gchar **sort_fields,
@@ -1172,18 +1172,17 @@
tracker_dbus_async_return_if_fail (service != NULL, context);
tracker_dbus_async_return_if_fail (fields != NULL, context);
tracker_dbus_async_return_if_fail (search_text != NULL, context);
- tracker_dbus_async_return_if_fail (keyword != NULL, context);
+ tracker_dbus_async_return_if_fail (keywords != NULL, context);
tracker_dbus_async_return_if_fail (query_condition != NULL, context);
tracker_dbus_request_new (request_id,
"DBus request to search query, "
"query id:%d, service:'%s', search text '%s', "
- "keyword:'%s', query condition:'%s', offset:%d, "
+ "query condition:'%s', offset:%d, "
"max hits:%d, sort by service:'%s', sort descending'%s'",
live_query_id,
service,
search_text,
- keyword,
query_condition,
offset,
max_hits,
@@ -1205,7 +1204,7 @@
service,
fields,
search_text,
- keyword,
+ keywords,
query_condition,
sort_by_service,
sort_fields,
Modified: trunk/src/trackerd/tracker-search.h
==============================================================================
--- trunk/src/trackerd/tracker-search.h (original)
+++ trunk/src/trackerd/tracker-search.h Tue Dec 9 15:15:02 2008
@@ -115,7 +115,7 @@
const gchar *service,
const gchar **fields,
const gchar *search_text,
- const gchar *keyword,
+ const gchar **keywords,
const gchar *query_condition,
gboolean sort_by_service,
const gchar **sort_fields,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]