[tracker/offsets_return] Return the URI of the property instead of an internal ID for fts:offsets()
- From: Philip Van Hoof <pvanhoof src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker/offsets_return] Return the URI of the property instead of an internal ID for fts:offsets()
- Date: Mon, 9 Nov 2009 17:07:01 +0000 (UTC)
commit a2cec2ec8847e570496fdab68fab894b990c25ea
Author: Philip Van Hoof <philip codeminded be>
Date: Mon Nov 9 17:58:56 2009 +0100
Return the URI of the property instead of an internal ID for fts:offsets()
src/libtracker-common/tracker-ontology.c | 26 ++++++++
src/libtracker-common/tracker-ontology.h | 3 +
src/libtracker-data/tracker-data-manager.c | 89 ++++++++++++++++++++--------
src/libtracker-fts/tracker-fts.c | 15 +++--
4 files changed, 101 insertions(+), 32 deletions(-)
---
diff --git a/src/libtracker-common/tracker-ontology.c b/src/libtracker-common/tracker-ontology.c
index 0b8d647..9effb46 100644
--- a/src/libtracker-common/tracker-ontology.c
+++ b/src/libtracker-common/tracker-ontology.c
@@ -56,6 +56,9 @@ static GHashTable *property_uris;
/* FieldType enum class */
static gpointer property_type_enum_class;
+/* Hash (int id, const gchar *uri) */
+static GHashTable *id_uri_pairs;
+
void
tracker_ontology_init (void)
{
@@ -77,6 +80,10 @@ tracker_ontology_init (void)
g_free,
g_object_unref);
+ id_uri_pairs = g_hash_table_new_full (g_direct_hash, g_direct_equal,
+ NULL,
+ g_free);
+
properties = g_array_new (TRUE, TRUE, sizeof (TrackerProperty *));
property_uris = g_hash_table_new_full (g_str_hash,
@@ -118,6 +125,9 @@ tracker_ontology_shutdown (void)
g_hash_table_unref (class_uris);
class_uris = NULL;
+ g_hash_table_unref (id_uri_pairs);
+ id_uri_pairs = NULL;
+
for (i = 0; i < properties->len; i++) {
g_object_unref (g_array_index (properties, TrackerProperty *, i));
}
@@ -132,6 +142,14 @@ tracker_ontology_shutdown (void)
initialized = FALSE;
}
+const gchar*
+tracker_ontology_get_uri_by_id (gint id)
+{
+ g_return_val_if_fail (id != -1, NULL);
+
+ return g_hash_table_lookup (id_uri_pairs, GINT_TO_POINTER (id));
+}
+
void
tracker_ontology_add_class (TrackerClass *service)
{
@@ -197,6 +215,14 @@ tracker_ontology_add_property (TrackerProperty *field)
g_object_ref (field));
}
+void
+tracker_ontology_add_id_uri_pair (gint id, const gchar *uri)
+{
+ g_hash_table_insert (id_uri_pairs,
+ GINT_TO_POINTER (id),
+ g_strdup (uri));
+}
+
TrackerProperty *
tracker_ontology_get_property_by_uri (const gchar *uri)
{
diff --git a/src/libtracker-common/tracker-ontology.h b/src/libtracker-common/tracker-ontology.h
index 7f51e53..d435e37 100644
--- a/src/libtracker-common/tracker-ontology.h
+++ b/src/libtracker-common/tracker-ontology.h
@@ -74,6 +74,9 @@ void tracker_ontology_add_property (TrackerProperty *fiel
TrackerProperty * tracker_ontology_get_property_by_uri (const gchar *uri);
void tracker_ontology_add_namespace (TrackerNamespace *namespace_);
TrackerNamespace * tracker_ontology_get_namespace_by_uri (const gchar *namespace_uri);
+const gchar* tracker_ontology_get_uri_by_id (gint id);
+void tracker_ontology_add_id_uri_pair (gint id,
+ const gchar *uri);
G_END_DECLS
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index 69f5042..57c4de5 100644
--- a/src/libtracker-data/tracker-data-manager.c
+++ b/src/libtracker-data/tracker-data-manager.c
@@ -386,7 +386,7 @@ db_get_static_data (TrackerDBInterface *iface)
}
stmt = tracker_db_interface_create_statement (iface,
- "SELECT (SELECT Uri FROM \"rdfs:Resource\" WHERE ID = \"rdfs:Class\".ID) "
+ "SELECT \"rdfs:Class\".ID, (SELECT Uri FROM \"rdfs:Resource\" WHERE ID = \"rdfs:Class\".ID) "
"FROM \"rdfs:Class\" ORDER BY ID");
cursor = tracker_db_statement_start_cursor (stmt, NULL);
g_object_unref (stmt);
@@ -395,15 +395,19 @@ db_get_static_data (TrackerDBInterface *iface)
while (tracker_db_cursor_iter_next (cursor)) {
TrackerClass *class;
const gchar *uri;
+ gint id;
gint count;
class = tracker_class_new ();
- uri = tracker_db_cursor_get_string (cursor, 0);
+ id = tracker_db_cursor_get_int (cursor, 0);
+ uri = tracker_db_cursor_get_string (cursor, 1);
tracker_class_set_uri (class, uri);
class_add_super_classes_from_db (iface, class);
+
tracker_ontology_add_class (class);
+ tracker_ontology_add_id_uri_pair (id, uri);
/* xsd classes do not derive from rdfs:Resource and do not use separate tables */
if (!g_str_has_prefix (tracker_class_get_name (class), "xsd:")) {
@@ -423,7 +427,7 @@ db_get_static_data (TrackerDBInterface *iface)
}
stmt = tracker_db_interface_create_statement (iface,
- "SELECT (SELECT Uri FROM \"rdfs:Resource\" WHERE ID = \"rdf:Property\".ID), "
+ "SELECT \"rdf:Property\".ID, (SELECT Uri FROM \"rdfs:Resource\" WHERE ID = \"rdf:Property\".ID), "
"(SELECT Uri FROM \"rdfs:Resource\" WHERE ID = \"rdfs:domain\"), "
"(SELECT Uri FROM \"rdfs:Resource\" WHERE ID = \"rdfs:range\"), "
"\"nrl:maxCardinality\", "
@@ -443,14 +447,16 @@ db_get_static_data (TrackerDBInterface *iface)
const gchar *uri, *domain_uri, *range_uri;
gboolean multi_valued, indexed, fulltext_indexed;
gboolean transient, annotation;
+ gint id;
property = tracker_property_new ();
- uri = tracker_db_cursor_get_string (cursor, 0);
- domain_uri = tracker_db_cursor_get_string (cursor, 1);
- range_uri = tracker_db_cursor_get_string (cursor, 2);
+ id = tracker_db_cursor_get_int (cursor, 0);
+ uri = tracker_db_cursor_get_string (cursor, 1);
+ domain_uri = tracker_db_cursor_get_string (cursor, 2);
+ range_uri = tracker_db_cursor_get_string (cursor, 3);
- tracker_db_cursor_get_value (cursor, 3, &value);
+ tracker_db_cursor_get_value (cursor, 4, &value);
if (G_VALUE_TYPE (&value) != 0) {
multi_valued = (g_value_get_int (&value) > 1);
@@ -461,7 +467,7 @@ db_get_static_data (TrackerDBInterface *iface)
multi_valued = TRUE;
}
- tracker_db_cursor_get_value (cursor, 4, &value);
+ tracker_db_cursor_get_value (cursor, 5, &value);
if (G_VALUE_TYPE (&value) != 0) {
indexed = (g_value_get_int (&value) == 1);
@@ -471,7 +477,7 @@ db_get_static_data (TrackerDBInterface *iface)
indexed = FALSE;
}
- tracker_db_cursor_get_value (cursor, 5, &value);
+ tracker_db_cursor_get_value (cursor, 6, &value);
if (G_VALUE_TYPE (&value) != 0) {
fulltext_indexed = (g_value_get_int (&value) == 1);
@@ -481,7 +487,7 @@ db_get_static_data (TrackerDBInterface *iface)
fulltext_indexed = FALSE;
}
- tracker_db_cursor_get_value (cursor, 6, &value);
+ tracker_db_cursor_get_value (cursor, 7, &value);
if (G_VALUE_TYPE (&value) != 0) {
transient = (g_value_get_int (&value) == 1);
@@ -491,7 +497,7 @@ db_get_static_data (TrackerDBInterface *iface)
transient = FALSE;
}
- tracker_db_cursor_get_value (cursor, 7, &value);
+ tracker_db_cursor_get_value (cursor, 8, &value);
if (G_VALUE_TYPE (&value) != 0) {
annotation = (g_value_get_int (&value) == 1);
@@ -510,7 +516,9 @@ db_get_static_data (TrackerDBInterface *iface)
tracker_property_set_fulltext_indexed (property, fulltext_indexed);
tracker_property_set_embedded (property, !annotation);
property_add_super_properties_from_db (iface, property);
+
tracker_ontology_add_property (property);
+ tracker_ontology_add_id_uri_pair (id, uri);
g_object_unref (property);
@@ -520,11 +528,41 @@ db_get_static_data (TrackerDBInterface *iface)
}
}
+
+static void
+insert_uri_in_resource_table (TrackerDBInterface *iface, const gchar *uri, gint *max_id)
+{
+ TrackerDBStatement *stmt;
+ gint id = ++(*max_id);
+ GError *error = NULL;
+
+ stmt = tracker_db_interface_create_statement (iface,
+ "INSERT "
+ "INTO \"rdfs:Resource\" "
+ "(ID, Uri, \"tracker:added\", "
+ "\"tracker:modified\", Available) "
+ "VALUES (?, ?, ?, 0, 1)");
+ tracker_db_statement_bind_int (stmt, 0, id);
+ tracker_db_statement_bind_text (stmt, 1, uri);
+ tracker_db_statement_bind_int64 (stmt, 2, (gint64) time (NULL));
+ tracker_db_statement_execute (stmt, &error);
+
+ if (error) {
+ g_critical ("%s\n", error->message);
+ g_clear_error (&error);
+ }
+
+ tracker_ontology_add_id_uri_pair (id, uri);
+ g_object_unref (stmt);
+
+}
+
static void
create_decomposed_metadata_property_table (TrackerDBInterface *iface,
TrackerProperty **property,
const gchar *service_name,
- const gchar **sql_type_for_single_value)
+ const gchar **sql_type_for_single_value,
+ gint *max_id)
{
const char *field_name;
const char *sql_type;
@@ -599,6 +637,11 @@ create_decomposed_metadata_property_table (TrackerDBInterface *iface,
*sql_type_for_single_value = sql_type;
}
+ /* insert property uri in rdfs:Resource table */
+ if (max_id && tracker_property_get_uri (*property) != NULL) {
+ insert_uri_in_resource_table (iface, tracker_property_get_uri (*property),
+ max_id);
+ }
}
static void
@@ -634,7 +677,8 @@ create_decomposed_metadata_tables (TrackerDBInterface *iface,
create_decomposed_metadata_property_table (iface, property,
service_name,
- &sql_type_for_single_value);
+ &sql_type_for_single_value,
+ main_class ? NULL : max_id);
if (sql_type_for_single_value) {
/* single value */
@@ -675,20 +719,14 @@ create_decomposed_metadata_tables (TrackerDBInterface *iface,
}
}
- g_slist_free (class_properties);
-
/* insert class uri in rdfs:Resource table */
if (tracker_class_get_uri (service) != NULL) {
- TrackerDBStatement *stmt;
-
- stmt = tracker_db_interface_create_statement (iface,
- "INSERT OR IGNORE INTO \"rdfs:Resource\" (ID, Uri, \"tracker:added\", \"tracker:modified\") VALUES (?, ?, ?, 0)");
- tracker_db_statement_bind_int (stmt, 0, ++(*max_id));
- tracker_db_statement_bind_text (stmt, 1, tracker_class_get_uri (service));
- tracker_db_statement_bind_int64 (stmt, 2, (gint64) time (NULL));
- tracker_db_statement_execute (stmt, NULL);
- g_object_unref (stmt);
+ insert_uri_in_resource_table (iface, tracker_class_get_uri (service),
+ max_id);
}
+
+ g_slist_free (class_properties);
+
}
static void
@@ -714,8 +752,7 @@ create_decomposed_transient_metadata_tables (TrackerDBInterface *iface)
/* create the TEMPORARY table */
create_decomposed_metadata_property_table (iface, property,
service_name,
- NULL);
-
+ NULL, NULL);
}
}
}
diff --git a/src/libtracker-fts/tracker-fts.c b/src/libtracker-fts/tracker-fts.c
index 9cf2622..9dc32f0 100644
--- a/src/libtracker-fts/tracker-fts.c
+++ b/src/libtracker-fts/tracker-fts.c
@@ -4151,16 +4151,19 @@ static int fulltextNext(sqlite3_vtab_cursor *pCursor){
for ( ; !plrAtEnd(&plReader); plrStep(&plReader) ){
-
+ const gchar *uri;
int col = plrColumn (&plReader);
-
+
+ uri = tracker_ontology_get_uri_by_id (col);
c->rank += get_metadata_weight (col);
-
- if (first_pos) {
- g_string_append_printf (c->offsets, "%d,%d", col, plrPosition (&plReader));
+
+ if (uri && first_pos) {
+ g_string_append_printf (c->offsets, "%s,%d", uri, plrPosition (&plReader));
first_pos = FALSE;
+ } else if (uri) {
+ g_string_append_printf (c->offsets, ",%s,%d", uri, plrPosition (&plReader));
} else {
- g_string_append_printf (c->offsets, ",%d,%d", col, plrPosition (&plReader));
+ g_warning ("Type '%d' for FTS offset doesn't exist in ontology", col);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]