tracker r1766 - in branches/xesam-support: . data src/libtracker-db src/trackerd
- From: mottela svn gnome org
- To: svn-commits-list gnome org
- Subject: tracker r1766 - in branches/xesam-support: . data src/libtracker-db src/trackerd
- Date: Wed, 25 Jun 2008 13:40:15 +0000 (UTC)
Author: mottela
Date: Wed Jun 25 13:40:15 2008
New Revision: 1766
URL: http://svn.gnome.org/viewvc/tracker?rev=1766&view=rev
Log:
Added fullText to xesam queries and removed common-db dependency from xesam.db creation
Modified:
branches/xesam-support/ChangeLog
branches/xesam-support/data/sqlite-stored-procs.sql
branches/xesam-support/data/sqlite-xesam.sql
branches/xesam-support/src/libtracker-db/tracker-db-manager.c
branches/xesam-support/src/trackerd/tracker-db.c
branches/xesam-support/src/trackerd/tracker-db.h
branches/xesam-support/src/trackerd/tracker-xesam-query.c
Modified: branches/xesam-support/data/sqlite-stored-procs.sql
==============================================================================
--- branches/xesam-support/data/sqlite-stored-procs.sql (original)
+++ branches/xesam-support/data/sqlite-stored-procs.sql Wed Jun 25 13:40:15 2008
@@ -209,6 +209,13 @@
GetXesamMetaDataChildren SELECT Child FROM XesamMetaDataChildren WHERE Parent = ?;
GetXesamMetaDataMappings SELECT MetaName FROM XesamMetaDataMapping WHERE XesamMetaName = ?;
GetXesamMetaDataLookups SELECT DISTINCT MetaName FROM XesamMetaDataLookup WHERE XesamMetaName = ?;
+GetXesamMetaDataTextLookups SELECT DISTINCT L.MetaName FROM XesamMetaDataLookup L INNER JOIN XesamMetaDataTypes T ON (T.MetaName = L.XesamMetaName) WHERE T.DataTypeID = 3;
GetXesamMetaDataTypes SELECT ID, MetaName, DataTypeID, FieldName, Weight, Embedded, MultipleValues, Delimited, Filtered, Abstract FROM XesamMetaDataTypes;
GetXesamServiceTypes SELECT TypeID, TypeName, Parents, Enabled, Embedded, HasMetadata, HasFullText, HasThumbs, ContentMetadata, Database, ShowServiceFiles, ShowServiceDirectories, KeyMetadata1, KeyMetadata2, KeyMetadata3, KeyMetadata4, KeyMetadata5, KeyMetadata6, KeyMetadata7, KeyMetadata8, KeyMetadata9, KeyMetadata10, KeyMetadata11 FROM XesamServiceTypes;
+
+InsertXesamMimes replace into XesamFileMimes (Mime) Values (?);
+InsertXesamMimePrefixes replace into XesamFileMimePrefixes (MimePrefix) Values (?);
+
+GetXesamMimeForServiceId select Mime from XesamFileMimes where ServiceTypeId = ?;
+GetXesamMimePrefixForServiceId select MimePrefix from XesamFileMimePrefixes where ServiceTypeId = ?;
\ No newline at end of file
Modified: branches/xesam-support/data/sqlite-xesam.sql
==============================================================================
--- branches/xesam-support/data/sqlite-xesam.sql (original)
+++ branches/xesam-support/data/sqlite-xesam.sql Wed Jun 25 13:40:15 2008
@@ -143,4 +143,24 @@
MetaName Text,
unique (XesamMetaName, MetaName)
+);
+
+CREATE TABLE XesamFileMimes
+(
+ Mime Text primary key not null,
+ ServiceTypeID Integer default 0,
+ ThumbExec Text default ' ',
+ MetadataExec Text default ' ',
+ FullTextExec Text default ' '
+
+);
+
+CREATE TABLE XesamFileMimePrefixes
+(
+ MimePrefix Text primary key not null,
+ ServiceTypeID Integer default 0,
+ ThumbExec Text default ' ',
+ MetadataExec Text default ' ',
+ FullTextExec Text default ' '
+
);
\ No newline at end of file
Modified: branches/xesam-support/src/libtracker-db/tracker-db-manager.c
==============================================================================
--- branches/xesam-support/src/libtracker-db/tracker-db-manager.c (original)
+++ branches/xesam-support/src/libtracker-db/tracker-db-manager.c Wed Jun 25 13:40:15 2008
@@ -608,14 +608,13 @@
GError *error = NULL;
const gchar * const *language_names;
gchar **groups;
- gchar **group;
gchar *service_file;
gchar *sql;
gboolean is_metadata;
gboolean is_service;
gboolean is_metadata_mapping;
gboolean is_service_mapping;
- gint id;
+ gint i, j, id;
const gchar *data_types[] = {
"string",
@@ -670,35 +669,34 @@
groups = g_key_file_get_groups (key_file, NULL);
- for (group = groups; *group; group++) {
+ for (i = 0; groups[i]; i++) {
gchar *str_id;
gchar **keys;
- gchar **key;
if (is_metadata) {
db_exec_proc (iface,
"InsertXesamMetadataType",
- *group,
+ groups[i],
NULL);
id = tracker_db_interface_sqlite_get_last_insert_id (TRACKER_DB_INTERFACE_SQLITE (iface));
} else if (is_service) {
db_exec_proc (iface,
"InsertXesamServiceType",
- *group,
+ groups[i],
NULL);
id = tracker_db_interface_sqlite_get_last_insert_id (TRACKER_DB_INTERFACE_SQLITE (iface));
}
/* Get inserted ID */
str_id = tracker_uint_to_string (id);
- keys = g_key_file_get_keys (key_file, *group, NULL, NULL);
+ keys = g_key_file_get_keys (key_file, groups[i], NULL, NULL);
- for (key = keys; *key; key++) {
+ for (j = 0; keys[j]; j++) {
gchar *value;
value = g_key_file_get_locale_string (key_file,
- *group,
- *key,
+ groups[i],
+ keys[j],
language_names[0],
NULL);
@@ -715,12 +713,12 @@
}
if (is_metadata) {
- if (strcasecmp (*key, "Parents") == 0) {
+ if (strcasecmp (keys[j], "Parents") == 0) {
load_service_file_xesam_insert (iface,
"INSERT INTO XesamMetadataChildren (Parent, Child) VALUES ('%s', '%s')",
value,
- *group);
- } else if (strcasecmp (*key, "ValueType") == 0) {
+ groups[i]);
+ } else if (strcasecmp (keys[j], "ValueType") == 0) {
gint data_id;
data_id = tracker_string_in_string_list (value, (gchar **) data_types);
@@ -772,20 +770,67 @@
} else {
load_service_file_xesam_update (iface,
"update XesamMetadataTypes set %s = '%s' where ID = %s",
- *key,
+ keys[j],
value,
str_id);
}
} else if (is_service) {
- if (strcasecmp (*key, "Parents") == 0) {
+ if (strcasecmp (keys[j], "Parents") == 0) {
load_service_file_xesam_insert (iface,
"INSERT INTO XesamServiceChildren (Parent, Child) VALUES ('%s', '%s')",
value,
- *group);
+ groups[i]);
+ } else if (strcasecmp (keys[j], "Mimes") == 0) {
+ gchar **tab_array;
+ gint k;
+
+ tab_array = g_key_file_get_string_list (key_file,
+ groups[i],
+ keys[j],
+ NULL,
+ NULL);
+
+ for (k = 0; tab_array[k]; k++) {
+ tracker_db_interface_execute_procedure (iface, NULL,
+ "InsertXesamMimes",
+ tab_array[k],
+ NULL);
+ tracker_db_interface_execute_query (iface,
+ NULL,
+ "update XesamFileMimes set ServiceTypeID = %s where Mime = '%s'",
+ str_id,
+ tab_array[k]);
+ }
+
+ g_strfreev (tab_array);
+ } else if (strcasecmp (keys[j], "MimePrefixes") == 0) {
+ gchar **tab_array;
+ gint k;
+
+ tab_array = g_key_file_get_string_list (key_file,
+ groups[i],
+ keys[j],
+ NULL,
+ NULL);
+
+ for (k = 0; tab_array[k]; k++) {
+ tracker_db_interface_execute_procedure (iface,
+ NULL,
+ "InsertXesamMimePrefixes",
+ tab_array[k],
+ NULL);
+ tracker_db_interface_execute_query (iface,
+ NULL,
+ "update XesamFileMimePrefixes set ServiceTypeID = %s where MimePrefix = '%s'",
+ str_id,
+ tab_array[k]);
+ }
+
+ g_strfreev (tab_array);
} else {
load_service_file_xesam_update (iface,
"update XesamServiceTypes set %s = '%s' where typeID = %s",
- *key,
+ keys[j],
value,
str_id);
}
@@ -793,12 +838,12 @@
load_service_file_xesam_map (iface,
"InsertXesamMetaDataMapping",
value,
- *group);
+ groups[i]);
} else {
load_service_file_xesam_map (iface,
"InsertXesamServiceMapping",
value,
- *group);
+ groups[i]);
}
g_free (value);
@@ -1062,6 +1107,20 @@
return db_mime_query (iface, "GetMimePrefixForServiceId", service_id);
}
+static GSList *
+db_get_xesam_mimes_for_service_id (TrackerDBInterface *iface,
+ gint service_id)
+{
+ return db_mime_query (iface, "GetXesamMimeForServiceId", service_id);
+}
+
+static GSList *
+db_get_xesam_mime_prefixes_for_service_id (TrackerDBInterface *iface,
+ gint service_id)
+{
+ return db_mime_query (iface, "GetXesamMimePrefixForServiceId", service_id);
+}
+
/* Sqlite utf-8 user defined collation sequence */
static gint
utf8_collation_func (gchar *str1,
@@ -1625,8 +1684,8 @@
id = tracker_service_get_id (service);
name = tracker_service_get_name (service);
- mimes = db_get_mimes_for_service_id (iface, id);
- mime_prefixes = db_get_mime_prefixes_for_service_id (iface, id);
+ mimes = db_get_xesam_mimes_for_service_id (iface, id);
+ mime_prefixes = db_get_xesam_mime_prefixes_for_service_id (iface, id);
g_message ("Adding xesam service:'%s' with id:%d and mimes:%d",
name,
@@ -2102,7 +2161,7 @@
/* Load static xesam data */
- db_get_static_xesam_data (attach_iface);
+ db_get_static_xesam_data (iface);
return iface;
}
Modified: branches/xesam-support/src/trackerd/tracker-db.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-db.c (original)
+++ branches/xesam-support/src/trackerd/tracker-db.c Wed Jun 25 13:40:15 2008
@@ -1389,6 +1389,20 @@
}
TrackerDBResultSet *
+tracker_db_xesam_get_all_text_metadata_names (TrackerDBInterface *iface)
+{
+ TrackerDBResultSet *result_set;
+
+ g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+
+ result_set = tracker_db_exec_proc (iface,
+ "GetXesamMetaDataTextLookups",
+ NULL);
+
+ return result_set;
+}
+
+TrackerDBResultSet *
tracker_db_xesam_get_service_names (TrackerDBInterface *iface,
const gchar *name)
{
@@ -2542,9 +2556,9 @@
* It is used by xesam_live_search parsing. */
static GList *
-add_metadata_field (TrackerDBInterface *iface,
- GSList **fields,
- const char *xesam_name)
+add_live_search_metadata_field (TrackerDBInterface *iface,
+ GSList **fields,
+ const char *xesam_name)
{
TrackerDBResultSet *result_set;
TrackerFieldData *field_data;
@@ -2636,9 +2650,9 @@
while (field_names[i]) {
GList *field_data_list = NULL;
- field_data_list = add_metadata_field (iface,
- &fields,
- field_names[i]);
+ field_data_list = add_live_search_metadata_field (iface,
+ &fields,
+ field_names[i]);
if (!field_data_list) {
g_warning ("Asking for a non-mapped xesam field: %s", field_names[i]);
Modified: branches/xesam-support/src/trackerd/tracker-db.h
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-db.h (original)
+++ branches/xesam-support/src/trackerd/tracker-db.h Wed Jun 25 13:40:15 2008
@@ -231,12 +231,12 @@
const gchar *search_id);
/* XESAM API */
-void tracker_db_xesam_delete_handled_events (TrackerDBInterface *iface);
-TrackerDBResultSet *tracker_db_xesam_get_metadata_names (TrackerDBInterface *iface,
- const char *name);
-TrackerDBResultSet *tracker_db_xesam_get_service_names (TrackerDBInterface *iface,
- const char *name);
-
+void tracker_db_xesam_delete_handled_events (TrackerDBInterface *iface);
+TrackerDBResultSet *tracker_db_xesam_get_metadata_names (TrackerDBInterface *iface,
+ const char *name);
+TrackerDBResultSet *tracker_db_xesam_get_all_text_metadata_names (TrackerDBInterface *iface);
+TrackerDBResultSet *tracker_db_xesam_get_service_names (TrackerDBInterface *iface,
+ const char *name);
G_END_DECLS
#endif /* __TRACKERD_DB_H__ */
Modified: branches/xesam-support/src/trackerd/tracker-xesam-query.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-xesam-query.c (original)
+++ branches/xesam-support/src/trackerd/tracker-xesam-query.c Wed Jun 25 13:40:15 2008
@@ -21,6 +21,25 @@
* Boston, MA 02110-1301, USA.
*/
+/*
+ * TODO
+ * - Boost attribute support is missing completely
+ * - userQuery is missing completely
+ * - works only with the default db at the moment.
+ * - Missing checks for several field elements in one selector
+ *
+ *
+ *
+ *
+ * FIXME
+ * - The mappings
+ * - Multifield-elements work in a hackish way with a magic current_field name. An additional field is pushed to stack for fullText.
+ */
+
+
+#define FIELD_NAME_FULL_TEXT_FIELDS "fullTextFields"
+
+
#include <string.h>
#include <libtracker-common/tracker-log.h>
@@ -50,6 +69,7 @@
#define ELEMENT_XESAM_QUERY "query"
#define ELEMENT_XESAM_USER_QUERY "userQuery"
#define ELEMENT_XESAM_FIELD "field"
+#define ELEMENT_XESAM_FULL_TEXT_FIELDS "fullTextFields"
#define ELEMENT_XESAM_REQUEST "request"
/* Operators */
@@ -68,6 +88,7 @@
#define ELEMENT_XESAM_REGEX "regex"
#define ELEMENT_XESAM_STARTS_WITH "startsWith"
#define ELEMENT_XESAM_IN_SET "inSet"
+#define ELEMENT_XESAM_FULL_TEXT "fullText"
/* Types */
#define ELEMENT_XESAM_INTEGER "integer"
@@ -112,6 +133,8 @@
STATE_END_STARTS_WITH,
STATE_IN_SET,
STATE_END_IN_SET,
+ STATE_FULL_TEXT,
+ STATE_END_FULL_TEXT,
STATE_INTEGER,
STATE_END_INTEGER,
STATE_STRING,
@@ -135,6 +158,7 @@
OP_CONTAINS,
OP_REGEX,
OP_SET,
+ OP_FULL_TEXT,
OP_STARTS
} Operators;
@@ -194,6 +218,7 @@
state == STATE_LESS_THAN ||
state == STATE_CONTAINS ||
state == STATE_IN_SET ||
+ state == STATE_FULL_TEXT ||
state == STATE_LESS_OR_EQUAL ||
state == STATE_GREATER_OR_EQUAL ||
state == STATE_STARTS_WITH ||
@@ -209,7 +234,8 @@
state == STATE_END_GREATER_THAN ||
state == STATE_END_LESS_THAN ||
state == STATE_END_CONTAINS ||
- state == STATE_END_IN_SET ||
+ state == STATE_END_IN_SET ||
+ state == STATE_END_FULL_TEXT ||
state == STATE_END_LESS_OR_EQUAL ||
state == STATE_END_GREATER_OR_EQUAL ||
state == STATE_END_STARTS_WITH ||
@@ -369,8 +395,12 @@
valid = TRUE;
/* Do the xesam mapping */
-
- result_set = tracker_db_xesam_get_metadata_names (data->iface, xesam_name);
+ if (!strcmp(xesam_name,FIELD_NAME_FULL_TEXT_FIELDS)) {
+ result_set = tracker_db_xesam_get_all_text_metadata_names (data->iface);
+ } else {
+ result_set = tracker_db_xesam_get_metadata_names (data->iface, xesam_name);
+ }
+
if (!result_set) {
return NULL;
}
@@ -390,16 +420,15 @@
continue;
}
- if (strcasecmp (this_field_name, field_name) != 0) {
- continue;
+ if (strcasecmp (this_field_name, field_name) == 0) {
+ field_data = l->data;
+ field_exists = TRUE;
+
+ tracker_field_data_set_is_condition (l->data, is_condition);
+ tracker_field_data_set_is_select (l->data, is_select);
+
+ break;
}
-
- field_exists = TRUE;
-
- tracker_field_data_set_is_condition (l->data, is_condition);
- tracker_field_data_set_is_select (l->data, is_select);
-
- break;
}
if (!field_exists) {
@@ -414,7 +443,10 @@
}
}
- reply = g_list_append (reply, field_data);
+ if (field_data) {
+ reply = g_list_append (reply, field_data);
+ }
+
valid = tracker_db_result_set_iter_next (result_set);
g_free (field_name);
}
@@ -516,6 +548,26 @@
data->current_field = g_strdup (name);
push_stack (data, STATE_FIELD);
}
+ } else if (ELEMENT_IS (ELEMENT_XESAM_FULL_TEXT_FIELDS)) {
+
+ if (set_error_on_fail (is_operator (state),
+ context,
+ "Field element (fullTextFields) not expected here",
+ error)) {
+ return;
+ }
+
+ if (data->current_operator == OP_NONE) {
+ set_error (error,
+ context,
+ PARSE_ERROR,
+ "no operator found for fullTextFields");
+ return;
+ }
+
+ data->current_field = g_strdup (FIELD_NAME_FULL_TEXT_FIELDS);
+ push_stack (data, STATE_FIELD); /* We don't need to differentiate */
+
} else if (ELEMENT_IS (ELEMENT_XESAM_AND)) {
const gchar *negate;
@@ -800,8 +852,33 @@
data->current_operator = OP_SET;
push_stack (data, STATE_IN_SET);
+ } else if (ELEMENT_IS (ELEMENT_XESAM_FULL_TEXT)) {
+ const gchar *negate;
+
+ if (set_error_on_fail (state == STATE_QUERY ||
+ is_logic (state) ||
+ ((data->current_logic_operator == LOP_AND ||
+ data->current_logic_operator == LOP_OR) &&
+ is_end_operator (state)),
+ context,
+ "fullText element not expected here",
+ error)) {
+ return;
+ }
+
+ negate = get_attribute_value ("negate",
+ attribute_names,
+ attribute_values);
+
+ if (negate && !strcmp(negate,"true")) {
+ data->sql_where = g_string_append (data->sql_where, " NOT ");
+ }
+
+ data->current_operator = OP_FULL_TEXT;
+ data->current_field = g_strdup (FIELD_NAME_FULL_TEXT_FIELDS);
+ push_stack (data, STATE_FULL_TEXT);
} else if (ELEMENT_IS (ELEMENT_XESAM_INTEGER)) {
- if (set_error_on_fail (state == STATE_FIELD,
+ if (set_error_on_fail (state == STATE_FIELD || state == STATE_FULL_TEXT,
context,
"INTEGER element not expected here",
error)) {
@@ -810,7 +887,7 @@
push_stack (data, STATE_INTEGER);
} else if (ELEMENT_IS (ELEMENT_XESAM_DATE)) {
- if (set_error_on_fail (state == STATE_FIELD,
+ if (set_error_on_fail (state == STATE_FIELD || state == STATE_FULL_TEXT,
context,
"DATE element not expected here",
error)) {
@@ -819,7 +896,7 @@
push_stack (data, STATE_DATE);
} else if (ELEMENT_IS (ELEMENT_XESAM_STRING)) {
- if (set_error_on_fail (state == STATE_FIELD,
+ if (set_error_on_fail (state == STATE_FIELD || state == STATE_FULL_TEXT,
context,
"STRING element not expected here",
error)) {
@@ -828,7 +905,7 @@
push_stack (data, STATE_STRING);
} else if (ELEMENT_IS (ELEMENT_XESAM_FLOAT)) {
- if (set_error_on_fail (state == STATE_FIELD,
+ if (set_error_on_fail (state == STATE_FIELD || state == STATE_FULL_TEXT,
context,
"FLOAT element not expected here",
error)) {
@@ -837,7 +914,7 @@
push_stack (data, STATE_FLOAT);
} else if (ELEMENT_IS (ELEMENT_XESAM_BOOLEAN)) {
- if (set_error_on_fail (state == STATE_FIELD,
+ if (set_error_on_fail (state == STATE_FIELD || state == STATE_FULL_TEXT,
context,
"BOOLEAN element not expected here",
error)) {
@@ -1061,6 +1138,21 @@
}
break;
+ case OP_FULL_TEXT:
+
+ sub = strchr (data->current_value, '*');
+
+ if (sub) {
+ g_string_append_printf (str, " (%s like '%%%s%%') ",
+ where_field,
+ data->current_value);
+ } else {
+ g_string_append_printf (str, " (%s like '%%%s%%') ",
+ where_field,
+ data->current_value);
+ }
+ break;
+
default:
break;
}
@@ -1209,6 +1301,14 @@
push_stack (data, STATE_END_IN_SET);
+ } else if (ELEMENT_IS (ELEMENT_XESAM_FULL_TEXT)) {
+
+ if (!build_sql (data)) {
+ set_error (error, context, 1, "parse error");
+ return;
+ }
+
+ push_stack (data, STATE_END_FULL_TEXT);
} else if (ELEMENT_IS (ELEMENT_XESAM_INTEGER)) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]