tracker r1975 - in branches/indexer-split: . data/dbus src/tracker-indexer



Author: ifrade
Date: Thu Jul 31 18:51:57 2008
New Revision: 1975
URL: http://svn.gnome.org/viewvc/tracker?rev=1975&view=rev

Log:
Added new methods PropertySet and PropertyRemove in the indexer

Modified:
   branches/indexer-split/ChangeLog
   branches/indexer-split/data/dbus/tracker-indexer.xml
   branches/indexer-split/src/tracker-indexer/tracker-indexer-db.c
   branches/indexer-split/src/tracker-indexer/tracker-indexer-db.h
   branches/indexer-split/src/tracker-indexer/tracker-indexer.c
   branches/indexer-split/src/tracker-indexer/tracker-indexer.h

Modified: branches/indexer-split/data/dbus/tracker-indexer.xml
==============================================================================
--- branches/indexer-split/data/dbus/tracker-indexer.xml	(original)
+++ branches/indexer-split/data/dbus/tracker-indexer.xml	Thu Jul 31 18:51:57 2008
@@ -26,6 +26,23 @@
       <arg type="s" name="module" direction="in" />
       <arg type="as" name="files" direction="in" />
     </method>
+
+    <method name="PropertySet">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
+      <arg type="s" name="service_type" direction="in" />
+      <arg type="s" name="uri" direction="in" />
+      <arg type="s" name="property" direction="in"/>
+      <arg type="as" name="values" direction="in"/>
+    </method>      
+
+    <method name="PropertyRemove">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
+      <arg type="s" name="service_type" direction="in" />
+      <arg type="s" name="uri" direction="in" />
+      <arg type="s" name="property" direction="in"/>
+      <arg type="as" name="values" direction="in"/>
+    </method>
+
     <method name="Pause">
       <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
     </method>

Modified: branches/indexer-split/src/tracker-indexer/tracker-indexer-db.c
==============================================================================
--- branches/indexer-split/src/tracker-indexer/tracker-indexer-db.c	(original)
+++ branches/indexer-split/src/tracker-indexer/tracker-indexer-db.c	Thu Jul 31 18:51:57 2008
@@ -340,8 +340,8 @@
 }
 
 void
-tracker_db_delete_metadata (TrackerService *service,
-			    guint32         service_id)
+tracker_db_delete_all_metadata (TrackerService *service,
+				guint32         service_id)
 {
 	TrackerDBInterface *iface;
 	gchar *service_id_str;
@@ -438,6 +438,71 @@
 }
 
 void
+tracker_db_delete_metadata (TrackerService *service,
+			    guint32         id,
+			    TrackerField   *field,
+			    const gchar    *value)
+{
+	TrackerDBInterface *iface;
+	gint metadata_key;
+	gchar *id_str;
+
+	id_str = tracker_guint32_to_string (id);
+	iface = tracker_db_manager_get_db_interface_by_type (tracker_service_get_name (service),
+							     TRACKER_DB_CONTENT_TYPE_METADATA);
+
+	switch (tracker_field_get_data_type (field)) {
+	case TRACKER_FIELD_TYPE_KEYWORD:
+		if (!value) {
+			g_warning ("Trying to remove keyword field with no specific value");
+		}
+		tracker_db_interface_execute_procedure (iface, NULL,
+							"DeleteMetadataKeywordValue",
+							id_str,
+							tracker_field_get_id (field),
+							value,
+							NULL);
+		break;
+	case TRACKER_FIELD_TYPE_INDEX:
+	case TRACKER_FIELD_TYPE_STRING:
+	case TRACKER_FIELD_TYPE_DOUBLE:
+		tracker_db_interface_execute_procedure (iface, NULL,
+							"DeleteMetadata",
+							id_str,
+							tracker_field_get_id (field),
+							NULL);
+		break;
+	case TRACKER_FIELD_TYPE_INTEGER:
+	case TRACKER_FIELD_TYPE_DATE:
+		tracker_db_interface_execute_procedure (iface, NULL,
+							"DeleteMetadataNumeric",
+							id_str,
+							tracker_field_get_id (field),
+							NULL);
+		break;
+	case TRACKER_FIELD_TYPE_FULLTEXT:
+		tracker_db_delete_text (service, id);
+		break;
+	case TRACKER_FIELD_TYPE_BLOB:
+	case TRACKER_FIELD_TYPE_STRUCT:
+	case TRACKER_FIELD_TYPE_LINK:
+		/* not handled */
+	default:
+		break;
+	}
+
+	metadata_key = tracker_ontology_metadata_key_in_service (tracker_service_get_name (service),
+								 tracker_field_get_name (field));
+	if (metadata_key > 0) {
+		tracker_db_interface_execute_query (iface, NULL,
+						    "update Services set KeyMetadata%d = '%s' where id = %d",
+						    metadata_key, "", id);
+	}
+
+	g_free (id_str);
+}
+
+void
 tracker_db_set_text (TrackerService *service,
 		     guint32         id,
 		     const gchar    *text)

Modified: branches/indexer-split/src/tracker-indexer/tracker-indexer-db.h
==============================================================================
--- branches/indexer-split/src/tracker-indexer/tracker-indexer-db.h	(original)
+++ branches/indexer-split/src/tracker-indexer/tracker-indexer-db.h	Thu Jul 31 18:51:57 2008
@@ -58,9 +58,12 @@
 					   guint32             id);
 gchar   *tracker_db_get_unparsed_metadata (TrackerService     *service,
 					   guint32             id);
-void     tracker_db_delete_metadata       (TrackerService     *service,
+void     tracker_db_delete_all_metadata   (TrackerService     *service,
 					   guint32             id);
-
+void     tracker_db_delete_metadata       (TrackerService *service,
+					   guint32         id,
+					   TrackerField   *field,
+					   const gchar    *value);
 
 /* Contents */
 void     tracker_db_set_text              (TrackerService     *service,

Modified: branches/indexer-split/src/tracker-indexer/tracker-indexer.c
==============================================================================
--- branches/indexer-split/src/tracker-indexer/tracker-indexer.c	(original)
+++ branches/indexer-split/src/tracker-indexer/tracker-indexer.c	Thu Jul 31 18:51:57 2008
@@ -86,6 +86,7 @@
 
 typedef struct PathInfo PathInfo;
 typedef struct MetadataForeachData MetadataForeachData;
+typedef struct MetadataRequest MetadataRequest;
 
 struct TrackerIndexerPrivate {
 	GQueue *dir_queue;
@@ -194,6 +195,7 @@
 	g_slice_free (PathInfo, info);
 }
 
+
 static void 
 start_transaction (TrackerIndexer *indexer)
 {
@@ -793,21 +795,29 @@
 		    gint service_id,
 		    gint service_type,
 		    const gchar *text,
+		    gboolean full_parsing,
 		    gint weight_factor)
 {
 	GHashTable *parsed = NULL;
 	GList      *words = NULL, *iter;
 	gint        weight;
 
-	parsed = tracker_parser_text (parsed,
-				      text,
-				      1,
-				      indexer->private->language,
-				      tracker_config_get_max_words_to_index (indexer->private->config),
-				      tracker_config_get_max_word_length (indexer->private->config),
-				      tracker_config_get_min_word_length (indexer->private->config),
-				      tracker_config_get_enable_stemmer (indexer->private->config),
-				      FALSE); 
+	if (full_parsing) {
+		parsed = tracker_parser_text (parsed,
+					      text,
+					      weight_factor,
+					      indexer->private->language,
+					      tracker_config_get_max_words_to_index (indexer->private->config),
+					      tracker_config_get_max_word_length (indexer->private->config),
+					      tracker_config_get_min_word_length (indexer->private->config),
+					      tracker_config_get_enable_stemmer (indexer->private->config),
+					      FALSE); 
+	} else {
+		parsed = tracker_parser_text_fast (parsed,
+						   text,
+						   weight_factor); /* We dont know the exact property weight. Big value works */
+	
+	}
 	
 	words = g_hash_table_get_keys (parsed);
 	
@@ -818,7 +828,7 @@
 					(gchar *)iter->data,
 					service_id,
 					service_type,
-					weight*weight_factor); 
+					weight); 
 	}
 
 	tracker_parser_text_free (parsed);
@@ -827,46 +837,27 @@
 
 
 static void
-index_text_with_parsing (TrackerIndexer *indexer, gint service_id, gint service_type_id, const gchar *content) 
+index_text_with_parsing (TrackerIndexer *indexer, gint service_id, gint service_type_id, const gchar *content, gint weight_factor) 
 {
-	send_text_to_index (indexer, service_id, service_type_id, content, 1);
+	send_text_to_index (indexer, service_id, service_type_id, content, TRUE, weight_factor);
 }
 
 static void
 unindex_text_with_parsing (TrackerIndexer *indexer, gint service_id, gint service_type_id, const gchar *content, gint weight_factor) 
 {
-	send_text_to_index (indexer, service_id, service_type_id, content, weight_factor);
+	send_text_to_index (indexer, service_id, service_type_id, content, TRUE, -1*weight_factor);
 }
 
 static void
-unindex_text_no_parsing (TrackerIndexer *indexer,
-			 gint service_id,
-			 gint service_type_id,
-			 const gchar *text)
+index_text_no_parsing (TrackerIndexer *indexer, gint service_id, gint service_type_id, const gchar *content, gchar weight_factor)
 {
-	GHashTable *parsed = NULL;
-	GList      *words = NULL, *iter;
-	gint        weight;
-
-	parsed = tracker_parser_text_fast (parsed,
-					   text,
-					   50); /* We dont know the exact property weight. Big value works */
-	
-	words = g_hash_table_get_keys (parsed);
-	
-	for (iter = words; iter != NULL; iter = iter->next) {
-		
-		weight = GPOINTER_TO_INT (g_hash_table_lookup (parsed, (gchar *)iter->data));
-
-
-		tracker_index_add_word (indexer->private->index, 
-					(gchar *)iter->data,
-					service_id,
-					service_type_id,
-					weight * -1); 
-	}
+	send_text_to_index (indexer, service_id, service_type_id, content, FALSE, weight_factor);
+}
 
-	tracker_parser_text_free (parsed);
+static void
+unindex_text_no_parsing (TrackerIndexer *indexer, gint service_id, gint service_type_id, const gchar *content, gint weight_factor)
+{
+	send_text_to_index (indexer, service_id, service_type_id, content, FALSE, -1*weight_factor);
 }
 
 
@@ -925,8 +916,9 @@
 					index_text_with_parsing (indexer, 
 								 id, 
 								 tracker_service_get_id (service_def), 
-								 text);
-
+								 text,
+								 1);
+					
 					/* Save in the DB */
 					tracker_db_set_text (service_def, id, text);
 					g_free (text);
@@ -983,7 +975,7 @@
 	/* Get content, unindex the words and delete the contents */
 	content = tracker_db_get_text (service_def, service_id);
 	if (content) {
-		unindex_text_with_parsing (indexer, service_id, service_type_id, content, -1);
+		unindex_text_with_parsing (indexer, service_id, service_type_id, content, 1);
 		g_free (content);
 		tracker_db_delete_text (service_def, service_id);
 	}
@@ -991,19 +983,19 @@
 
 	/* Get metadata from DB to remove it from the index */
 	metadata = tracker_db_get_parsed_metadata (service_def, service_id);
-	unindex_text_no_parsing (indexer, service_id, service_type_id, metadata);
+	unindex_text_no_parsing (indexer, service_id, service_type_id, metadata, 1000);
 	g_free (metadata);
 
 
 	/* the weight depends on metadata, but a number high enough force deletion  */
 	metadata = tracker_db_get_unparsed_metadata (service_def, service_id);
-	unindex_text_with_parsing (indexer, service_id, service_type_id, metadata, -1000);
+	unindex_text_with_parsing (indexer, service_id, service_type_id, metadata, 1000);
 	g_free (metadata);
 
 	
 	/* delete service */
         tracker_db_delete_service (service_def, service_id);
-	tracker_db_delete_metadata (service_def, service_id);
+	tracker_db_delete_all_metadata (service_def, service_id);
 
 	tracker_db_decrement_stats (indexer->private->common, service_def);
 	
@@ -1013,6 +1005,100 @@
 }
 
 static gboolean
+handle_metadata_add (TrackerIndexer *indexer, 
+		     const gchar    *service_type,
+		     const gchar    *uri,
+		     const gchar    *property,
+		     GStrv           values)
+{
+	TrackerService *service_def;
+	TrackerField   *field_def;
+	guint           service_id, i;
+	gchar          *joined;
+
+	service_def = tracker_ontology_get_service_type_by_name (service_type);
+	if (!service_def) {
+		return FALSE;
+	}
+
+	field_def = tracker_ontology_get_field_def (property);
+	if (!field_def) {
+		return FALSE;
+	}
+
+	service_id = tracker_db_check_service (service_def, uri, NULL);
+	if (service_id < 1) {
+		g_message ("Cannot delete file: it doesnt exist in DB");
+		return FALSE;
+	}
+
+	for (i = 0; values[i] != NULL; i++) {
+		tracker_db_set_metadata (service_def,
+					 service_id,
+					 field_def,
+					 values[i],
+					 NULL);
+	}
+	
+	joined = g_strjoinv (" ", values);
+	index_text_no_parsing (indexer,
+			       service_id,
+			       tracker_service_get_id (service_def),
+			       joined,
+			       tracker_field_get_weight (field_def));
+	g_free (joined);
+
+	return TRUE;
+}
+
+
+static gboolean
+handle_metadata_remove (TrackerIndexer *indexer, 
+		     const gchar    *service_type,
+		     const gchar    *uri,
+		     const gchar    *property,
+		     GStrv           values)
+{
+	TrackerService *service_def;
+	TrackerField   *field_def;
+	guint           service_id, i;
+	gchar          *joined;
+
+	service_def = tracker_ontology_get_service_type_by_name (service_type);
+	if (!service_def) {
+		return FALSE;
+	}
+
+	field_def = tracker_ontology_get_field_def (property);
+	if (!field_def) {
+		return FALSE;
+	}
+
+	service_id = tracker_db_check_service (service_def, uri, NULL);
+	if (service_id < 1) {
+		g_message ("Cannot delete file: it doesnt exist in DB");
+		return FALSE;
+	}
+
+	for (i = 0; values[i] != NULL; i++) {
+		tracker_db_delete_metadata (service_def,
+					    service_id,
+					    field_def,
+					    values[i]);
+	}
+	
+	joined = g_strjoinv (" ", values);
+	unindex_text_no_parsing (indexer,
+				 service_id,
+				 tracker_service_get_id (service_def),
+				 joined,
+				 tracker_field_get_weight (field_def));
+	g_free (joined);
+	
+	return TRUE;
+}
+
+static gboolean
 process_file (TrackerIndexer *indexer,
 	      PathInfo       *info)
 {
@@ -1482,3 +1568,56 @@
 		g_error_free (actual_error);
 	}
 }
+
+void            
+tracker_indexer_property_set (TrackerIndexer         *indexer,
+			      const gchar            *service_type,
+			      const gchar            *uri,
+			      const gchar            *property,
+			      GStrv                   values,
+			      DBusGMethodInvocation  *context,
+			      GError                **error) {
+
+	guint request_id;
+
+	request_id = tracker_dbus_get_next_request_id ();
+
+	tracker_dbus_async_return_if_fail (TRACKER_IS_INDEXER (indexer), FALSE);
+	tracker_dbus_async_return_if_fail (service_type != NULL, FALSE);
+	tracker_dbus_async_return_if_fail (uri != NULL, FALSE);
+	tracker_dbus_async_return_if_fail (property != NULL, FALSE);
+	tracker_dbus_async_return_if_fail (values != NULL, FALSE);
+	tracker_dbus_async_return_if_fail (g_strv_length (values) > 0, FALSE);
+
+	handle_metadata_add (indexer, service_type, uri, property, values);
+
+	dbus_g_method_return (context);
+	tracker_dbus_request_success (request_id);
+	
+}
+
+void            
+tracker_indexer_property_remove (TrackerIndexer         *indexer,
+				 const gchar            *service_type,
+				 const gchar            *uri,
+				 const gchar            *property,
+				 GStrv                   values,
+				 DBusGMethodInvocation  *context,
+				 GError                **error) {
+
+	guint request_id;
+
+	request_id = tracker_dbus_get_next_request_id ();
+
+	tracker_dbus_async_return_if_fail (TRACKER_IS_INDEXER (indexer), FALSE);
+	tracker_dbus_async_return_if_fail (service_type != NULL, FALSE);
+	tracker_dbus_async_return_if_fail (uri != NULL, FALSE);
+	tracker_dbus_async_return_if_fail (property != NULL, FALSE);
+	/* Values can be NULL */
+
+	handle_metadata_remove (indexer, service_type, uri, property, values);
+
+	dbus_g_method_return (context);
+	tracker_dbus_request_success (request_id);
+	
+}

Modified: branches/indexer-split/src/tracker-indexer/tracker-indexer.h
==============================================================================
--- branches/indexer-split/src/tracker-indexer/tracker-indexer.h	(original)
+++ branches/indexer-split/src/tracker-indexer/tracker-indexer.h	Thu Jul 31 18:51:57 2008
@@ -99,6 +99,20 @@
 						    GStrv                   files,
 						    DBusGMethodInvocation  *context,
 						    GError                **error);
+void            tracker_indexer_property_set       (TrackerIndexer         *indexer,
+						    const gchar            *service_type,
+						    const gchar            *uri,
+						    const gchar            *property,
+						    GStrv                   values,
+						    DBusGMethodInvocation  *context,
+						    GError                **error);
+void            tracker_indexer_property_remove    (TrackerIndexer         *indexer,
+						    const gchar            *service_type,
+						    const gchar            *uri,
+						    const gchar            *property,
+						    GStrv                   values,
+						    DBusGMethodInvocation  *context,
+						    GError                **error);
 
 G_END_DECLS
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]