[tracker/offsets_return] Return the URI of the property instead of an internal ID for fts:offsets()



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]