tracker r1472 - in branches/indexer-split: . src/trackerd



Author: mr
Date: Fri May 23 11:06:05 2008
New Revision: 1472
URL: http://svn.gnome.org/viewvc/tracker?rev=1472&view=rev

Log:
	* src/trackerd/Makefile.am:
	* src/trackerd/tracker-db-sqlite.c:
	* src/trackerd/tracker-db-sqlite.h:
	* src/trackerd/tracker-dbus-metadata.c:
	* src/trackerd/tracker-field-data.[ch]:
	* src/trackerd/tracker-field.c:
	* src/trackerd/tracker-rdf-query.c:
	* src/trackerd/tracker-xesam-query.c: Added the
	tracker-field-data.[ch] to handle all FieldData code that used to
	exist. Also fixed up some errors in the tracker-xesam-query.c
	module where is_end_operator() and is_operator() were not proper
	logic statements.


Added:
   branches/indexer-split/src/trackerd/tracker-field-data.c
   branches/indexer-split/src/trackerd/tracker-field-data.h
Modified:
   branches/indexer-split/ChangeLog
   branches/indexer-split/src/trackerd/Makefile.am
   branches/indexer-split/src/trackerd/tracker-db-sqlite.c
   branches/indexer-split/src/trackerd/tracker-db-sqlite.h
   branches/indexer-split/src/trackerd/tracker-dbus-metadata.c
   branches/indexer-split/src/trackerd/tracker-field.c
   branches/indexer-split/src/trackerd/tracker-rdf-query.c
   branches/indexer-split/src/trackerd/tracker-xesam-query.c

Modified: branches/indexer-split/src/trackerd/Makefile.am
==============================================================================
--- branches/indexer-split/src/trackerd/Makefile.am	(original)
+++ branches/indexer-split/src/trackerd/Makefile.am	Fri May 23 11:06:05 2008
@@ -104,6 +104,8 @@
 	tracker-email-utils.h						\
 	tracker-field.c							\
 	tracker-field.h							\
+	tracker-field-data.c						\
+	tracker-field-data.h						\
 	tracker-indexer.c						\
 	tracker-indexer.h						\
 	tracker-index-stage.c						\

Modified: branches/indexer-split/src/trackerd/tracker-db-sqlite.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-db-sqlite.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-db-sqlite.c	Fri May 23 11:06:05 2008
@@ -5079,54 +5079,72 @@
 	return TRUE;
 }
 
-
-FieldData *
-tracker_db_get_metadata_field (DBConnection *db_con, const char *service, const char *field_name, int field_count, gboolean is_select, gboolean is_condition)
+TrackerFieldData *
+tracker_db_get_metadata_field (DBConnection *db_con,
+			       const gchar  *service, 
+			       const gchar  *field_name, 
+			       gint          field_count, 
+			       gboolean      is_select, 
+			       gboolean      is_condition)
 {
-	FieldData    *field_data = NULL;
-	TrackerField *def;
-
-	field_data = g_new0 (FieldData, 1);
-
-	field_data->is_select = is_select;
-	field_data->is_condition = is_condition;
-	field_data->field_name = g_strdup (field_name);
+	TrackerFieldData *field_data = NULL;
+	TrackerField     *def;
 
 	def = tracker_ontology_get_field_def (field_name);
 
 	if (def) {
-	
-		field_data->table_name = tracker_get_metadata_table (tracker_field_get_data_type (def));
-		field_data->alias = g_strdup_printf ("M%d", field_count);
-		field_data->data_type = tracker_field_get_data_type (def);
-		field_data->id_field = g_strdup (tracker_field_get_id (def));
-		field_data->multiple_values = tracker_field_get_multiple_values (def);
+		gchar *alias;
+		gchar *table_name;
+		gchar *this_field_name;
+		gchar *where_field;
+
+		field_data = g_object_new (TRACKER_TYPE_FIELD_DATA, 
+					   "is-select", is_select,
+					   "is-condition", is_condition,
+					   "field-name", field_name,
+					   NULL);
+
+		alias = g_strdup_printf ("M%d", field_count);
+		table_name = tracker_get_metadata_table (tracker_field_get_data_type (def));
+
+		tracker_field_data_set_alias (field_data, alias);
+		tracker_field_data_set_table_name (field_data, table_name);
+		tracker_field_data_set_id_field (field_data, tracker_field_get_id (def));
+		tracker_field_data_set_data_type (field_data, tracker_field_get_data_type (def));
+		tracker_field_data_set_multiple_values (field_data, tracker_field_get_multiple_values (def));
 			
-		char *my_field = tracker_db_get_field_name (service, field_name);
+		this_field_name = tracker_db_get_field_name (service, field_name);
 
-		if (my_field) {
-			field_data->select_field = g_strdup_printf (" S.%s ", my_field);
-			g_free (my_field);
-			field_data->needs_join = FALSE;	
+		if (this_field_name) {
+			gchar *str;
+
+			str = g_strdup_printf (" S.%s ", this_field_name);
+			tracker_field_data_set_select_field (field_data, str);
+			tracker_field_data_set_needs_join (field_data, FALSE);
+			g_free (str);
+			g_free (this_field_name);
 		} else {
-			char *disp_field = tracker_ontology_get_display_field (def);
-			field_data->select_field = g_strdup_printf ("M%d.%s", field_count, disp_field);
-			g_free (disp_field);
-			field_data->needs_join = TRUE;
+			gchar *str;
+			gchar *display_field;
+
+			display_field = tracker_ontology_get_display_field (def);
+			str = g_strdup_printf ("M%d.%s", field_count, display_field);
+			tracker_field_data_set_select_field (field_data, str);
+			tracker_field_data_set_needs_join (field_data, TRUE);
+			g_free (str);
+			g_free (display_field);
 		}
 			
 		if (tracker_field_get_data_type (def) == TRACKER_FIELD_TYPE_DOUBLE) {
-			field_data->where_field = g_strdup_printf ("M%d.MetaDataDisplay", field_count);
+			where_field = g_strdup_printf ("M%d.MetaDataDisplay", field_count);
 		} else {
-			field_data->where_field = g_strdup_printf ("M%d.MetaDataValue", field_count);
+			where_field = g_strdup_printf ("M%d.MetaDataValue", field_count);
 		}
 
-	} else {
-		g_free (field_data);
-		return NULL;
+		tracker_field_data_set_where_field (field_data, where_field);
+		g_free (where_field);
 	}
 
-
 	return field_data;
 }
 
@@ -5255,18 +5273,3 @@
 	return FALSE;
 
 }
-
-void
-tracker_free_metadata_field (FieldData *field_data)
-{
-	g_return_if_fail (field_data);
-
-	g_free (field_data->alias);
-	g_free (field_data->where_field);
-	g_free (field_data->field_name);
-	g_free (field_data->select_field);
-	g_free (field_data->table_name);
-	g_free (field_data->id_field);
-
-	g_free (field_data);
-}

Modified: branches/indexer-split/src/trackerd/tracker-db-sqlite.h
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-db-sqlite.h	(original)
+++ branches/indexer-split/src/trackerd/tracker-db-sqlite.h	Fri May 23 11:06:05 2008
@@ -26,6 +26,7 @@
 #include <libtracker-db/tracker-db-interface.h>
 #include <libtracker-db/tracker-db-file-info.h>
 
+#include "tracker-field-data.h"
 #include "tracker-ontology.h"
 #include "tracker-indexer.h"
 #include "tracker-utils.h"
@@ -310,7 +311,7 @@
 void                tracker_db_delete_service                  (DBConnection   *db_con,
                                                                 guint32         id,
                                                                 const gchar    *uri);
-FieldData *         tracker_db_get_metadata_field              (DBConnection   *db_con,
+TrackerFieldData *  tracker_db_get_metadata_field              (DBConnection   *db_con,
                                                                 const gchar    *service,
                                                                 const gchar    *field_name,
                                                                 gint            field_count,

Modified: branches/indexer-split/src/trackerd/tracker-dbus-metadata.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-dbus-metadata.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-dbus-metadata.c	Fri May 23 11:06:05 2008
@@ -30,6 +30,7 @@
 #include "tracker-dbus.h"
 #include "tracker-dbus-metadata.h"
 #include "tracker-db.h"
+#include "tracker-field-data.h"
 #include "tracker-marshal.h"
 
 #define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TRACKER_TYPE_DBUS_METADATA, TrackerDBusMetadataPriv))
@@ -217,16 +218,16 @@
 	sql_join = g_string_new (" FROM Services S ");
 
 	for (i = 0; i < g_strv_length (keys); i++) {
-		FieldData *field;
+		TrackerFieldData *field_data;
 
-		field = tracker_db_get_metadata_field (db_con, 
-						       service_result, 
-						       keys[i], 
-						       i, 
-						       TRUE, 
-						       FALSE);
-
-		if (!field) {
+		field_data = tracker_db_get_metadata_field (db_con, 
+							    service_result, 
+							    keys[i], 
+							    i, 
+							    TRUE, 
+							    FALSE);
+ 
+		if (!field_data) {
 			g_string_free (sql_join, TRUE);
 			g_string_free (sql, TRUE);
 			g_free (service_result);
@@ -240,22 +241,24 @@
 		}
 
 		if (i == 0) {
-			g_string_append_printf (sql, " %s", field->select_field);
+			g_string_append_printf (sql, " %s", 
+						tracker_field_data_get_select_field (field_data));
 		} else {
-			g_string_append_printf (sql, ", %s", field->select_field);
+			g_string_append_printf (sql, ", %s", 
+						tracker_field_data_get_select_field (field_data));
 		}
 
-		if (field->needs_join) {
+		if (tracker_field_data_get_needs_join (field_data)) {
 			g_string_append_printf (sql_join, 
 						"\n LEFT OUTER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID = %s) ", 
-						field->table_name, 
-						field->alias, 
-						field->alias, 
-						field->alias, 
-						field->id_field);
+						tracker_field_data_get_table_name (field_data),
+						tracker_field_data_get_alias (field_data),
+						tracker_field_data_get_alias (field_data),
+						tracker_field_data_get_alias (field_data),
+						tracker_field_data_get_id_field (field_data));
 		}
 
-		tracker_free_metadata_field (field);
+		g_object_unref (field_data);
 	}
 
 	g_string_append (sql, sql_join->str);

Added: branches/indexer-split/src/trackerd/tracker-field-data.c
==============================================================================
--- (empty file)
+++ branches/indexer-split/src/trackerd/tracker-field-data.c	Fri May 23 11:06:05 2008
@@ -0,0 +1,637 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* 
+ * Copyright (C) 2006, Mr Jamie McCracken (jamiemcc gnome org)
+ * Copyright (C) 2008, Nokia (urho konttori nokia com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ */
+
+#include <string.h>
+#include <stdlib.h>
+
+#include <glib.h>
+
+#include "tracker-field-data.h"
+
+#define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TRACKER_TYPE_FIELD_DATA, TrackerFieldDataPriv))
+
+typedef struct _TrackerFieldDataPriv TrackerFieldDataPriv;
+
+struct _TrackerFieldDataPriv {
+	gchar 		 *alias;
+
+	gchar	 	 *table_name;
+	gchar 	 	 *field_name;
+
+	gchar	 	 *select_field;
+	gchar	 	 *where_field;
+	gchar	 	 *id_field;
+
+	TrackerFieldType  data_type;
+
+	gboolean          multiple_values;
+	gboolean          is_select;
+	gboolean          is_condition;
+	gboolean          needs_join;
+};
+
+static void field_data_finalize     (GObject      *object);
+static void field_data_get_property (GObject      *object,
+				     guint         param_id,
+				     GValue       *value,
+				     GParamSpec   *pspec);
+static void field_data_set_property (GObject      *object,
+				     guint         param_id,
+				     const GValue *value,
+				     GParamSpec   *pspec);
+
+enum {
+	PROP_0,
+	PROP_ALIAS,
+	PROP_TABLE_NAME,
+	PROP_FIELD_NAME,
+	PROP_SELECT_FIELD,
+	PROP_WHERE_FIELD,
+	PROP_ID_FIELD,
+	PROP_DATA_TYPE,
+	PROP_MULTIPLE_VALUES,
+	PROP_IS_SELECT,
+	PROP_IS_CONDITION,
+	PROP_NEEDS_JOIN
+};
+
+G_DEFINE_TYPE (TrackerFieldData, tracker_field_data, G_TYPE_OBJECT);
+
+static void
+tracker_field_data_class_init (TrackerFieldDataClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+	object_class->finalize     = field_data_finalize;
+	object_class->get_property = field_data_get_property;
+	object_class->set_property = field_data_set_property;
+
+	g_object_class_install_property (object_class,
+					 PROP_ALIAS,
+					 g_param_spec_string ("alias",
+							      "alias",
+							      "A name for this field data",
+							      NULL,
+							      G_PARAM_READWRITE));
+	g_object_class_install_property (object_class,
+					 PROP_TABLE_NAME,
+					 g_param_spec_string ("table-name",
+							      "Table name",
+							      "Table name",
+							      NULL,
+							      G_PARAM_READWRITE));
+	g_object_class_install_property (object_class,
+					 PROP_FIELD_NAME,
+					 g_param_spec_string ("field-name",
+							      "Field name",
+							      "Field name",
+							      NULL,
+							      G_PARAM_READWRITE));
+	g_object_class_install_property (object_class,
+					 PROP_SELECT_FIELD,
+					 g_param_spec_string ("select-field",
+							      "Select field",
+							      "Select field",
+							      NULL,
+							      G_PARAM_READWRITE));
+	g_object_class_install_property (object_class,
+					 PROP_WHERE_FIELD,
+					 g_param_spec_string ("where-field",
+							      "Where field",
+							      "Where field",
+							      NULL,
+							      G_PARAM_READWRITE));
+	g_object_class_install_property (object_class,
+					 PROP_ID_FIELD,
+					 g_param_spec_string ("id-field",
+							      "ID field",
+							      "ID field",
+							      NULL,
+							      G_PARAM_READWRITE));
+	g_object_class_install_property (object_class,
+					 PROP_DATA_TYPE,
+					 g_param_spec_enum ("data-type",
+							    "Data type",
+							    "TrackerField type",
+							    tracker_field_type_get_type (),
+							    TRACKER_FIELD_TYPE_INDEX,
+							    G_PARAM_READWRITE));
+	g_object_class_install_property (object_class,
+					 PROP_MULTIPLE_VALUES,
+					 g_param_spec_boolean ("multiple-values",
+							       "Multiple values",
+							       "Multiple values",
+							       FALSE,
+							       G_PARAM_READWRITE));
+	g_object_class_install_property (object_class,
+					 PROP_IS_SELECT,
+					 g_param_spec_boolean ("is-select",
+							       "Is select",
+							       "Is select",
+							       FALSE,
+							       G_PARAM_READWRITE));
+	g_object_class_install_property (object_class,
+					 PROP_IS_CONDITION,
+					 g_param_spec_boolean ("is-condition",
+							       "Is condition",
+							       "Is condition",
+							       FALSE,
+							       G_PARAM_READWRITE));
+	g_object_class_install_property (object_class,
+					 PROP_NEEDS_JOIN,
+					 g_param_spec_boolean ("needs-join",
+							       "Needs join",
+							       "Needs join",
+							       FALSE,
+							       G_PARAM_READWRITE));
+
+	g_type_class_add_private (object_class, sizeof (TrackerFieldDataPriv));
+}
+
+static void
+tracker_field_data_init (TrackerFieldData *field_data)
+{
+}
+
+static void 
+field_data_finalize (GObject *object)
+{
+	TrackerFieldDataPriv *priv;
+
+	priv = GET_PRIV (object);
+
+	g_free (priv->alias);
+
+	g_free (priv->table_name);
+	g_free (priv->field_name);
+
+	g_free (priv->select_field);
+	g_free (priv->where_field);
+	g_free (priv->id_field);
+
+	(G_OBJECT_CLASS (tracker_field_data_parent_class)->finalize) (object);
+}
+
+static void
+field_data_get_property (GObject    *object,
+			 guint       param_id,
+			 GValue     *value,
+			 GParamSpec *pspec)
+{
+	TrackerFieldDataPriv *priv;
+
+	priv = GET_PRIV (object);
+
+	switch (param_id) {
+	case PROP_ALIAS:
+		g_value_set_string (value, priv->alias);
+		break;
+	case PROP_TABLE_NAME:
+		g_value_set_string (value, priv->table_name);
+		break;
+	case PROP_FIELD_NAME:
+		g_value_set_string (value, priv->field_name);
+		break;
+	case PROP_SELECT_FIELD:
+		g_value_set_string (value, priv->select_field);
+		break;
+	case PROP_WHERE_FIELD:
+		g_value_set_string (value, priv->where_field);
+		break;
+	case PROP_ID_FIELD:
+		g_value_set_string (value, priv->id_field);
+		break;
+	case PROP_DATA_TYPE:
+		g_value_set_enum (value, priv->data_type);
+		break;
+	case PROP_MULTIPLE_VALUES:
+		g_value_set_boolean (value, priv->multiple_values);
+		break;
+	case PROP_IS_SELECT:
+		g_value_set_boolean (value, priv->is_select);
+		break;
+	case PROP_IS_CONDITION:
+		g_value_set_boolean (value, priv->is_condition);
+		break;
+	case PROP_NEEDS_JOIN:
+		g_value_set_boolean (value, priv->needs_join);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
+	};
+}
+
+static void
+field_data_set_property (GObject      *object,
+			 guint         param_id,
+			 const GValue *value,
+			 GParamSpec   *pspec)
+{
+	switch (param_id) {
+	case PROP_ALIAS:
+		tracker_field_data_set_alias (TRACKER_FIELD_DATA (object),
+					      g_value_get_string (value));
+		break;
+	case PROP_TABLE_NAME:
+		tracker_field_data_set_table_name (TRACKER_FIELD_DATA (object),
+						   g_value_get_string (value));
+		break;
+	case PROP_FIELD_NAME:
+		tracker_field_data_set_field_name (TRACKER_FIELD_DATA (object),
+						   g_value_get_string (value));
+		break;
+	case PROP_SELECT_FIELD:
+		tracker_field_data_set_select_field (TRACKER_FIELD_DATA (object),
+						     g_value_get_string (value));
+		break;
+	case PROP_WHERE_FIELD:
+		tracker_field_data_set_where_field (TRACKER_FIELD_DATA (object),
+						    g_value_get_string (value));
+		break;
+	case PROP_ID_FIELD:
+		tracker_field_data_set_id_field (TRACKER_FIELD_DATA (object),
+						 g_value_get_string (value));
+		break;
+	case PROP_DATA_TYPE:
+		tracker_field_data_set_data_type (TRACKER_FIELD_DATA (object),
+						 g_value_get_enum (value));
+		break;
+	case PROP_MULTIPLE_VALUES:
+		tracker_field_data_set_multiple_values (TRACKER_FIELD_DATA (object),
+							g_value_get_boolean (value));
+		break;
+	case PROP_IS_SELECT:
+		tracker_field_data_set_is_select (TRACKER_FIELD_DATA (object),
+						  g_value_get_boolean (value));
+		break;
+	case PROP_IS_CONDITION:
+		tracker_field_data_set_is_condition (TRACKER_FIELD_DATA (object),
+						     g_value_get_boolean (value));
+		break;
+	case PROP_NEEDS_JOIN:
+		tracker_field_data_set_needs_join (TRACKER_FIELD_DATA (object),
+						   g_value_get_boolean (value));
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
+	};
+}
+
+TrackerFieldData *
+tracker_field_data_new (void)
+{
+	TrackerFieldData *field_data;
+
+	field_data = g_object_new (TRACKER_TYPE_FIELD_DATA, NULL);
+
+	return field_data;
+}
+
+const gchar *
+tracker_field_data_get_alias (TrackerFieldData *field_data)
+{
+	TrackerFieldDataPriv *priv;
+	
+	g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), NULL);
+
+	priv = GET_PRIV (field_data);
+
+	return priv->alias;
+}
+
+const gchar *
+tracker_field_data_get_table_name (TrackerFieldData *field_data)
+{
+	TrackerFieldDataPriv *priv;
+	
+	g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), NULL);
+
+	priv = GET_PRIV (field_data);
+
+	return priv->table_name;
+}
+
+const gchar *
+tracker_field_data_get_field_name (TrackerFieldData *field_data)
+{
+	TrackerFieldDataPriv *priv;
+	
+	g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), NULL);
+
+	priv = GET_PRIV (field_data);
+
+	return priv->field_name;
+}
+
+const gchar *
+tracker_field_data_get_select_field (TrackerFieldData *field_data)
+{
+	TrackerFieldDataPriv *priv;
+	
+	g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), NULL);
+
+	priv = GET_PRIV (field_data);
+
+	return priv->select_field;
+}
+
+const gchar *
+tracker_field_data_get_where_field (TrackerFieldData *field_data)
+{
+	TrackerFieldDataPriv *priv;
+	
+	g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), NULL);
+
+	priv = GET_PRIV (field_data);
+
+	return priv->where_field;
+}
+
+const gchar *
+tracker_field_data_get_id_field (TrackerFieldData *field_data)
+{
+	TrackerFieldDataPriv *priv;
+	
+	g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), NULL);
+
+	priv = GET_PRIV (field_data);
+
+	return priv->id_field;
+}
+
+TrackerFieldType
+tracker_field_data_get_data_type (TrackerFieldData *field_data)
+{
+	TrackerFieldDataPriv *priv;
+	
+	g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), TRACKER_FIELD_TYPE_INDEX);
+
+	priv = GET_PRIV (field_data);
+
+	return priv->data_type;
+}
+
+gboolean
+tracker_field_data_get_multiple_values (TrackerFieldData *field_data)
+{
+	TrackerFieldDataPriv *priv;
+	
+	g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), FALSE);
+
+	priv = GET_PRIV (field_data);
+
+	return priv->multiple_values;
+}
+
+
+gboolean
+tracker_field_data_get_is_select (TrackerFieldData *field_data)
+{
+	TrackerFieldDataPriv *priv;
+	
+	g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), FALSE);
+
+	priv = GET_PRIV (field_data);
+
+	return priv->is_select;
+}
+
+gboolean
+tracker_field_data_get_is_condition (TrackerFieldData *field_data)
+{
+	TrackerFieldDataPriv *priv;
+	
+	g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), FALSE);
+
+	priv = GET_PRIV (field_data);
+
+	return priv->is_condition;
+}
+
+gboolean
+tracker_field_data_get_needs_join (TrackerFieldData *field_data)
+{
+	TrackerFieldDataPriv *priv;
+	
+	g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), FALSE);
+
+	priv = GET_PRIV (field_data);
+
+	return priv->needs_join;
+}
+
+void
+tracker_field_data_set_alias (TrackerFieldData *field_data,
+			      const gchar      *value)
+{
+	TrackerFieldDataPriv *priv;
+
+	g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+	priv = GET_PRIV (field_data);
+
+	g_free (priv->alias);
+
+	if (value) {
+		priv->alias = g_strdup (value);
+	} else {
+		priv->alias = NULL;
+	}
+
+	g_object_notify (G_OBJECT (field_data), "alias");
+}
+
+void
+tracker_field_data_set_table_name (TrackerFieldData *field_data,
+				   const gchar      *value)
+{
+	TrackerFieldDataPriv *priv;
+
+	g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+	priv = GET_PRIV (field_data);
+
+	g_free (priv->table_name);
+
+	if (value) {
+		priv->table_name = g_strdup (value);
+	} else {
+		priv->table_name = NULL;
+	}
+
+	g_object_notify (G_OBJECT (field_data), "table-name");
+}
+
+void
+tracker_field_data_set_field_name (TrackerFieldData *field_data,
+				   const gchar      *value)
+{
+	TrackerFieldDataPriv *priv;
+
+	g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+	priv = GET_PRIV (field_data);
+
+	g_free (priv->field_name);
+
+	if (value) {
+		priv->field_name = g_strdup (value);
+	} else {
+		priv->field_name = NULL;
+	}
+
+	g_object_notify (G_OBJECT (field_data), "field-name");
+}
+
+void
+tracker_field_data_set_select_field (TrackerFieldData *field_data,
+				     const gchar      *value)
+{
+	TrackerFieldDataPriv *priv;
+
+	g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+	priv = GET_PRIV (field_data);
+
+	g_free (priv->select_field);
+
+	if (value) {
+		priv->select_field = g_strdup (value);
+	} else {
+		priv->select_field = NULL;
+	}
+
+	g_object_notify (G_OBJECT (field_data), "select-field");
+}
+
+void
+tracker_field_data_set_where_field (TrackerFieldData *field_data,
+				    const gchar      *value)
+{
+	TrackerFieldDataPriv *priv;
+
+	g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+	priv = GET_PRIV (field_data);
+
+	g_free (priv->where_field);
+
+	if (value) {
+		priv->where_field = g_strdup (value);
+	} else {
+		priv->where_field = NULL;
+	}
+
+	g_object_notify (G_OBJECT (field_data), "where-field");
+}
+
+void
+tracker_field_data_set_id_field (TrackerFieldData *field_data,
+				 const gchar      *value)
+{
+	TrackerFieldDataPriv *priv;
+
+	g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+	priv = GET_PRIV (field_data);
+
+	g_free (priv->id_field);
+
+	if (value) {
+		priv->id_field = g_strdup (value);
+	} else {
+		priv->id_field = NULL;
+	}
+
+	g_object_notify (G_OBJECT (field_data), "id-field");
+}
+
+void
+tracker_field_data_set_data_type (TrackerFieldData *field_data,
+				  TrackerFieldType  value)
+{
+	TrackerFieldDataPriv *priv;
+
+	g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+	priv = GET_PRIV (field_data);
+
+	priv->data_type = value;
+	g_object_notify (G_OBJECT (field_data), "data-type");
+}
+
+void
+tracker_field_data_set_multiple_values (TrackerFieldData *field_data,
+					gboolean          value)
+{
+	TrackerFieldDataPriv *priv;
+
+	g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+	priv = GET_PRIV (field_data);
+
+	priv->multiple_values = value;
+	g_object_notify (G_OBJECT (field_data), "multiple-values");
+}
+
+void
+tracker_field_data_set_is_select (TrackerFieldData *field_data,
+				  gboolean          value)
+{
+	TrackerFieldDataPriv *priv;
+
+	g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+	priv = GET_PRIV (field_data);
+
+	priv->is_select = value;
+	g_object_notify (G_OBJECT (field_data), "is-select");
+}
+
+void
+tracker_field_data_set_is_condition (TrackerFieldData *field_data,
+				     gboolean          value)
+{
+	TrackerFieldDataPriv *priv;
+
+	g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+	priv = GET_PRIV (field_data);
+
+	priv->is_condition = value;
+	g_object_notify (G_OBJECT (field_data), "is-condition");
+}
+
+void
+tracker_field_data_set_needs_join (TrackerFieldData *field_data,
+				   gboolean          value)
+{
+	TrackerFieldDataPriv *priv;
+
+	g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+	priv = GET_PRIV (field_data);
+
+	priv->needs_join = value;
+	g_object_notify (G_OBJECT (field_data), "needs-join");
+}

Added: branches/indexer-split/src/trackerd/tracker-field-data.h
==============================================================================
--- (empty file)
+++ branches/indexer-split/src/trackerd/tracker-field-data.h	Fri May 23 11:06:05 2008
@@ -0,0 +1,91 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* 
+ * Copyright (C) 2006, Mr Jamie McCracken (jamiemcc gnome org)
+ * Copyright (C) 2008, Nokia (urho konttori nokia com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ */
+
+#ifndef __TRACKERD_FIELD_DATA_H__
+#define __TRACKERD_FIELD_DATA_H__
+
+#include <glib-object.h>
+
+#include "tracker-field.h"
+
+G_BEGIN_DECLS
+
+#define TRACKER_TYPE_FIELD_DATA         (tracker_field_data_get_type ())
+#define TRACKER_FIELD_DATA(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), TRACKER_TYPE_FIELD_DATA, TrackerFieldData))
+#define TRACKER_FIELD_DATA_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST ((k), TRACKER_TYPE_FIELD_DATA, TrackerFieldDataClass))
+#define TRACKER_IS_FIELD_DATA(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), TRACKER_TYPE_FIELD_DATA))
+#define TRACKER_IS_FIELD_DATA_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), TRACKER_TYPE_FIELD_DATA))
+#define TRACKER_FIELD_DATA_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TRACKER_TYPE_FIELD_DATA, TrackerFieldDataClass))
+
+typedef struct _TrackerFieldData      TrackerFieldData;
+typedef struct _TrackerFieldDataClass TrackerFieldDataClass;
+
+struct _TrackerFieldData {
+	GObject      parent;
+};
+
+struct _TrackerFieldDataClass {
+	GObjectClass parent_class;
+};
+
+GType             tracker_field_data_get_type            (void) G_GNUC_CONST;
+
+TrackerFieldData *tracker_field_data_new                 (void);
+
+const gchar *     tracker_field_data_get_alias           (TrackerFieldData *field_data);
+const gchar *     tracker_field_data_get_table_name      (TrackerFieldData *field_data);
+const gchar *     tracker_field_data_get_field_name      (TrackerFieldData *field_data);
+const gchar *     tracker_field_data_get_select_field    (TrackerFieldData *field_data);
+const gchar *     tracker_field_data_get_where_field     (TrackerFieldData *field_data);
+const gchar *     tracker_field_data_get_id_field        (TrackerFieldData *field_data);
+TrackerFieldType  tracker_field_data_get_data_type       (TrackerFieldData *field_data);
+gboolean          tracker_field_data_get_multiple_values (TrackerFieldData *field_data);
+gboolean          tracker_field_data_get_is_select       (TrackerFieldData *field_data);
+gboolean          tracker_field_data_get_is_condition    (TrackerFieldData *field_data);
+gboolean          tracker_field_data_get_needs_join      (TrackerFieldData *field_data);
+
+void              tracker_field_data_set_alias           (TrackerFieldData *field_data,
+							  const gchar      *value);
+void              tracker_field_data_set_table_name      (TrackerFieldData *field_data,
+							  const gchar      *value);
+void              tracker_field_data_set_field_name      (TrackerFieldData *field_data,
+							  const gchar      *value);
+void              tracker_field_data_set_select_field    (TrackerFieldData *field_data,
+							  const gchar      *value);
+void              tracker_field_data_set_where_field     (TrackerFieldData *field_data,
+							  const gchar      *value);
+void              tracker_field_data_set_id_field        (TrackerFieldData *field_data,
+							  const gchar      *value);
+void              tracker_field_data_set_data_type       (TrackerFieldData *field_data,
+							  TrackerFieldType  value);
+void              tracker_field_data_set_multiple_values (TrackerFieldData *field_data,
+							  gboolean          value);
+void              tracker_field_data_set_is_select       (TrackerFieldData *field_data,
+							  gboolean          value);
+void              tracker_field_data_set_is_condition    (TrackerFieldData *field_data,
+							  gboolean          value);
+void              tracker_field_data_set_needs_join      (TrackerFieldData *field_data,
+							  gboolean          value);
+
+G_END_DECLS
+
+#endif /* __TRACKERD_FIELD_DATA_H__ */
+

Modified: branches/indexer-split/src/trackerd/tracker-field.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-field.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-field.c	Fri May 23 11:06:05 2008
@@ -293,10 +293,6 @@
 		    const GValue *value,
 		    GParamSpec   *pspec)
 {
-	TrackerFieldPriv *priv;
-
-	priv = GET_PRIV (object);
-
 	switch (param_id) {
 	case PROP_ID:
 		tracker_field_set_id (TRACKER_FIELD (object),
@@ -610,7 +606,6 @@
 
 	priv->weight = value;
 	g_object_notify (G_OBJECT (field), "weight");
-
 }
 
 void
@@ -627,7 +622,6 @@
 	g_object_notify (G_OBJECT (field), "embedded");
 }
 
-
 void
 tracker_field_set_multiple_values (TrackerField *field,
 				   gboolean      value)

Modified: branches/indexer-split/src/trackerd/tracker-rdf-query.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-rdf-query.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-rdf-query.c	Fri May 23 11:06:05 2008
@@ -336,60 +336,63 @@
 
 
 
-static FieldData *
-add_metadata_field (ParserData *data, const char *field_name, gboolean is_select, gboolean is_condition)
+static TrackerFieldData *
+add_metadata_field (ParserData  *data, 
+                    const gchar *field_name, 
+                    gboolean     is_select, 
+                    gboolean     is_condition)
 {
-	gboolean     field_exists;
-	FieldData    *field_data;
-	const GSList *tmp;
+	TrackerFieldData *field_data;
+	gboolean          field_exists;
+	GSList           *l;
 
 	field_exists = FALSE;
 	field_data = NULL;
 
-	// check if field is already in list
-	for (tmp = data->fields; tmp; tmp = tmp->next) {
-		FieldData *tmp_field;
+	/* Check if field is already in list */
+	for (l = data->fields; l; l = l->next) {
+                const gchar *this_field_name;
+
+                this_field_name = tracker_field_data_get_field_name (l->data);
+                if (!this_field_name) {
+                        continue;
+                }
+
+                if (strcasecmp (this_field_name, field_name) == 0) {
+                        field_data = l->data;
+                        field_exists = TRUE;
+
+                        if (is_condition) {
+                                tracker_field_data_set_is_condition (field_data, TRUE);
+                        }
+
+                        if (is_select) {
+                                if (!tracker_field_data_get_is_select (field_data)) {
+                                        tracker_field_data_set_is_select (field_data, TRUE);
+                                        g_string_append_printf (data->sql_select, ", %s", 
+                                                                tracker_field_data_get_select_field (field_data));
+                                }
+                        }
 
-		tmp_field = tmp->data;
-
-		if (tmp_field && tmp_field->field_name) {
-			if (strcasecmp (tmp_field->field_name, field_name) == 0) {
-
-				field_data = tmp_field;
-		
-				field_exists = TRUE;
-	
-				if (is_condition) {
-					field_data->is_condition = TRUE;
-				} 
-
-				if (is_select) {
-					if (!field_data->is_select) {
-				
-						field_data->is_select = TRUE;
-						g_string_append_printf (data->sql_select, ", %s", field_data->select_field);
-					}
-					
-				}
-
-				break;
-				
-			}
+                        break;
 		}
 	}
-
 	
 
 	if (!field_exists) {
-
-		field_data = tracker_db_get_metadata_field (data->db_con, data->service, field_name, g_slist_length (data->fields), is_select, is_condition);
+		field_data = tracker_db_get_metadata_field (data->db_con, 
+                                                            data->service, 
+                                                            field_name, 
+                                                            g_slist_length (data->fields), 
+                                                            is_select, 
+                                                            is_condition);
 		if (field_data) {
 			data->fields = g_slist_prepend (data->fields, field_data);
 			if (is_select) {
-				g_string_append_printf (data->sql_select, ", %s", field_data->select_field);
+				g_string_append_printf (data->sql_select, ", %s", 
+                                                        tracker_field_data_get_select_field (field_data));
 			}
-
-		} 
+                } 
 	} 
 	
 	return field_data;
@@ -666,12 +669,17 @@
 static gboolean
 build_sql (ParserData *data)
 {
-	ParseState state;
-	char 	   *avalue, *value, *sub;
-	FieldData  *field_data;
-	GString    *str;
-
-	g_return_val_if_fail (data->current_field && data->current_operator != OP_NONE && data->current_value, FALSE);
+	TrackerFieldData  *field_data;
+	ParseState         state;
+	gchar             *avalue, *value, *sub;
+        const gchar       *where_field;
+	GString           *str;
+	gchar            **s;
+
+	g_return_val_if_fail (data->current_field && 
+                              data->current_operator != OP_NONE && 
+                              data->current_value, 
+                              FALSE);
 
 	str = g_string_new ("");
 
@@ -679,7 +687,9 @@
 
 	state = peek_state (data);
 
-	avalue = get_value (data->current_value, (state != STATE_END_DATE && state != STATE_END_INTEGER && state != STATE_END_FLOAT));
+	avalue = get_value (data->current_value, (state != STATE_END_DATE && 
+                                                  state != STATE_END_INTEGER && 
+                                                  state != STATE_END_FLOAT));
 
 	field_data = add_metadata_field (data, data->current_field, FALSE, TRUE);
 
@@ -690,9 +700,9 @@
 		return FALSE;
 	}
 
-	if (field_data->data_type ==  TRACKER_FIELD_TYPE_DATE) {
-		char *bvalue;
-		int cvalue;
+	if (tracker_field_data_get_data_type (field_data) == TRACKER_FIELD_TYPE_DATE) {
+		gchar *bvalue;
+		gint   cvalue;
 
 		bvalue = tracker_date_format (avalue);
 		g_debug (bvalue);
@@ -716,102 +726,112 @@
 		}
 	}
 
-	char **s;
+        where_field = tracker_field_data_get_where_field (field_data);
 
 	switch (data->current_operator) {
+        case OP_EQUALS:
+                sub = strchr (data->current_value, '*');
+                if (sub) {
+                        g_string_append_printf (str, " (%s glob '%s') ", 
+                                                where_field, 
+                                                data->current_value);
+                } else {
+                        TrackerFieldType data_type;
+
+                        data_type = tracker_field_data_get_data_type (field_data);
+
+                        if (data_type == TRACKER_FIELD_TYPE_DATE ||
+                            data_type == TRACKER_FIELD_TYPE_INTEGER ||
+                            data_type == TRACKER_FIELD_TYPE_DOUBLE) {
+                                g_string_append_printf (str, " (%s = %s) ", 
+                                                        where_field, 
+                                                        value);
+                        } else {
+                                g_string_append_printf (str, " (%s = '%s') ", 
+                                                        where_field, 
+                                                        value);
+                        }
+                }
+                break;
+                
+        case OP_GREATER:
+                g_string_append_printf (str, " (%s > %s) ", 
+                                        where_field, 
+                                        value);
+                break;
+
+        case OP_GREATER_EQUAL:
+                g_string_append_printf (str, " (%s >= %s) ", 
+                                        where_field, 
+                                        value);
+                break;
+
+        case OP_LESS:
+                g_string_append_printf (str, " (%s < %s) ", 
+                                        where_field, 
+                                        value);
+                break;
+
+        case OP_LESS_EQUAL:
+                g_string_append_printf (str, " (%s <= %s) ", 
+                                        where_field, 
+                                        value);
+                break;
+
+        case OP_CONTAINS:
+                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;
+                
+        case OP_STARTS:
+                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;
+                
+        case OP_REGEX:
+                g_string_append_printf (str, " (%s REGEXP '%s') ", 
+                                        where_field, 
+                                        data->current_value);
+                break;
 
-		case OP_EQUALS:
-
-			sub = strchr (data->current_value, '*');
-			if (sub) {
-				g_string_append_printf (str, " (%s glob '%s') ", field_data->where_field, data->current_value);
-			} else {
-				if (field_data->data_type == TRACKER_FIELD_TYPE_DATE 
-                                    || field_data->data_type == TRACKER_FIELD_TYPE_INTEGER 
-                                    || field_data->data_type == TRACKER_FIELD_TYPE_DOUBLE) {
-					g_string_append_printf (str, " (%s = %s) ", field_data->where_field, value);
-				} else {
-					g_string_append_printf (str, " (%s = '%s') ", field_data->where_field, value);
-				}
-			}
-
-			break;
-
-		case OP_GREATER:
-
-			g_string_append_printf (str, " (%s > %s) ", field_data->where_field, value);
-
-			break;
-
-		case OP_GREATER_EQUAL:
-
-			g_string_append_printf (str, " (%s >= %s) ", field_data->where_field, value);
-
-			break;
-
-		case OP_LESS:
-
-			g_string_append_printf (str, " (%s < %s) ", field_data->where_field, value);
-
-			break;
-
-		case OP_LESS_EQUAL:
-
-			g_string_append_printf (str, " (%s <= %s) ", field_data->where_field, value);
-
-			break;
-
-		case OP_CONTAINS:
-
-			sub = strchr (data->current_value, '*');
-
-			if (sub) {
-				g_string_append_printf (str, " (%s like '%s%s%s') ", field_data->where_field, "%", data->current_value, "%");
-			} else {
-				g_string_append_printf (str, " (%s like '%s%s%s') ", field_data->where_field, "%", data->current_value, "%");
-			}
-
-			break;
-
-		case OP_STARTS:
-			
-			sub = strchr (data->current_value, '*');
-
-			if (sub) {
-				g_string_append_printf (str, " (%s like '%s') ", field_data->where_field, data->current_value);
-			} else {
-				g_string_append_printf (str, " (%s like '%s%s') ", field_data->where_field, data->current_value, "%");
-			}
-			
-			break;
-
-		case OP_REGEX:
-
-			g_string_append_printf (str, " (%s REGEXP '%s') ", field_data->where_field, data->current_value);
-
-			break;
-
-		case OP_SET:
-
-			s = g_strsplit (data->current_value, ",", 0);
-			
-			if (s && s[0]) {
-
-				g_string_append_printf (str, " (%s in ('%s'", field_data->where_field, s[0]);
-
-				char **p;
-				for (p = s+1; *p; p++) {
-					g_string_append_printf (str, ",'%s'", *p); 					
-				}
-				g_string_append_printf (str, ") ) " ); 					
-					
-			}
-
-			break;
-
-		default:
+        case OP_SET:
+                s = g_strsplit (data->current_value, ",", 0);
+		
+                if (s && s[0]) {
+                        gchar **p;
 
-			break;
+                        g_string_append_printf (str, " (%s in ('%s'", 
+                                                where_field, 
+                                                s[0]);
+                        
+                        for (p = s + 1; *p; p++) {
+                                g_string_append_printf (str, ",'%s'", *p); 					
+                        }
+
+                        g_string_append_printf (str, ") ) " ); 					
+                }
+                break;
+                
+        default:
+                break;
 	}
 
 	data->sql_where = g_string_append (data->sql_where, str->str);
@@ -829,7 +849,6 @@
 	return TRUE;
 }
 
-
 static void
 end_element_handler (GMarkupParseContext *context,
 		     const gchar	 *element_name,
@@ -1079,13 +1098,13 @@
 		int i;
 
 		for (i = 0; i < field_count; i++) {
-			FieldData *field_data;
+			TrackerFieldData *field_data;
 
 			field_data = add_metadata_field (&data, fields[i], TRUE, FALSE);
 
 			if (!field_data) {
 				g_critical ("RDF Query failed: field %s not found", fields[i]);
-				g_slist_foreach (data.fields, (GFunc) tracker_free_metadata_field, NULL);
+				g_slist_foreach (data.fields, (GFunc) g_object_unref, NULL);
 				g_slist_free (data.fields);
 				g_string_free (data.sql_select, TRUE);
 				return NULL;
@@ -1195,7 +1214,7 @@
 		g_string_free (data.sql_order, TRUE);
 	}
 
-	g_slist_foreach (data.fields, (GFunc) tracker_free_metadata_field, NULL);
+	g_slist_foreach (data.fields, (GFunc) g_object_unref, NULL);
 	g_slist_free (data.fields);
 
 	g_slist_free (data.stack);

Modified: branches/indexer-split/src/trackerd/tracker-xesam-query.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-xesam-query.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-xesam-query.c	Fri May 23 11:06:05 2008
@@ -26,6 +26,7 @@
 #include <libtracker-common/tracker-utils.h>
 
 #include "tracker-xesam-query.h"
+#include "tracker-field-data.h"
 
 
 /* XESAM Query Condition
@@ -188,34 +189,49 @@
 static gboolean
 is_operator (ParseState state)
 {
-	return state == STATE_EQUALS || state == STATE_GREATER_THAN || state == STATE_LESS_THAN ||
-			state == STATE_CONTAINS || state == STATE_IN_SET || STATE_LESS_OR_EQUAL ||
-			STATE_GREATER_OR_EQUAL || state == STATE_STARTS_WITH || state == STATE_REGEX;
+	return 
+		state == STATE_EQUALS || 
+		state == STATE_GREATER_THAN || 
+		state == STATE_LESS_THAN ||
+		state == STATE_CONTAINS || 
+		state == STATE_IN_SET || 
+		state == STATE_LESS_OR_EQUAL ||
+		state == STATE_GREATER_OR_EQUAL || 
+		state == STATE_STARTS_WITH || 
+		state == STATE_REGEX;
 
 }
 
-
 static gboolean
 is_end_operator (ParseState state)
 {
-	return state == STATE_END_EQUALS || state == STATE_END_GREATER_THAN || state == STATE_END_LESS_THAN ||
-		        state == STATE_END_CONTAINS || state == STATE_END_IN_SET || STATE_END_LESS_OR_EQUAL ||
-			STATE_END_GREATER_OR_EQUAL || state == STATE_END_STARTS_WITH || state == STATE_END_REGEX;
-
+	return 
+		state == STATE_END_EQUALS || 
+		state == STATE_END_GREATER_THAN || 
+		state == STATE_END_LESS_THAN ||
+		state == STATE_END_CONTAINS || 
+		state == STATE_END_IN_SET || 
+		state == STATE_END_LESS_OR_EQUAL ||
+		state == STATE_END_GREATER_OR_EQUAL || 
+		state == STATE_END_STARTS_WITH || 
+		state == STATE_END_REGEX;
 }
 
-
 static gboolean
 is_logic (ParseState state)
 {
-	return state == STATE_AND || state == STATE_OR;
+	return 
+		state == STATE_AND || 
+		state == STATE_OR;
 }
 
 
 static gboolean
 is_end_logic (ParseState state)
 {
-	return state == STATE_END_AND || state == STATE_END_OR;
+	return 
+		state == STATE_END_AND || 
+		state == STATE_END_OR;
 }
 
 
@@ -338,19 +354,24 @@
 
 
 static GList *
-add_metadata_field (ParserData *data, const char *xesam_name, gboolean is_select, gboolean is_condition)
+add_metadata_field (ParserData *data, 
+		    const char *xesam_name, 
+		    gboolean    is_select, 
+		    gboolean    is_condition)
 {
-	gboolean           field_exists;
-	FieldData          *field_data;
-	const GSList       *tmp;
-	GList              *reply=NULL;
 	TrackerDBResultSet *result_set;
-	gboolean valid = TRUE;
+	TrackerFieldData   *field_data;
+	gboolean            field_exists;
+	const GSList       *l;
+	GList              *reply;
+	gboolean            valid;
 
+	reply = NULL;
 	field_exists = FALSE;
 	field_data = NULL;
+	valid = TRUE;
 
-	// Do the xesam mapping
+	/* Do the xesam mapping */
 	
 	result_set = tracker_get_xesam_metadata_names (data->db_con, xesam_name);
 	if (!result_set) {
@@ -362,54 +383,41 @@
 		
 		tracker_db_result_set_get (result_set, 0, &field_name, -1);
 
-		// check if field is already in list
-		for (tmp = data->fields; tmp; tmp = tmp->next) {
-			FieldData *tmp_field;
+		/* Check if field is already in list */
+		for (l = data->fields; l; l = l->next) {
+			const gchar *this_field_name;
 			
-			tmp_field = tmp->data;
+			this_field_name = tracker_field_data_get_field_name (l->data);
 			
-			if (tmp_field && tmp_field->field_name) {
-				if (strcasecmp (tmp_field->field_name, field_name) == 0) {
-					
-					field_data = tmp_field;
-					
-					field_exists = TRUE;
-					
-					if (is_condition) {
-						field_data->is_condition = TRUE;
-					} 
-					
-					if (is_select) {
-						if (!field_data->is_select) {
-							
-							field_data->is_select = TRUE;
-							//g_string_append_printf (data->sql_select, ", %s", field_data->select_field);
-						}
-						
-					}
-					
-					break;
-					
-				}
+			if (!this_field_name) {
+				continue;
+			}
+				
+			if (strcasecmp (this_field_name, field_name) != 0) {
+				continue;
 			}
+
+			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) {
-			
-			field_data = tracker_db_get_metadata_field (data->db_con, data->service, field_name, g_slist_length (data->fields), is_select, is_condition);
+			field_data = tracker_db_get_metadata_field (data->db_con, 
+								    data->service, 
+								    field_name, 
+								    g_slist_length (data->fields), 
+								    is_select, 
+								    is_condition);
 			if (field_data) {
 				data->fields = g_slist_prepend (data->fields, field_data);
-				if (is_select) {
-					//					g_string_append_printf (data->sql_select, ", %s", field_data->select_field);
-				}
-				
 			} 
 		} 
 		
-		reply = g_list_append(reply, field_data);
-
+		reply = g_list_append (reply, field_data);
 		valid = tracker_db_result_set_iter_next (result_set);
 		g_free (field_name);
 	}
@@ -419,11 +427,11 @@
 
 
 static void
-start_element_handler (GMarkupParseContext *context,
-		       const gchar	   *element_name,
+start_element_handler (GMarkupParseContext  *context,
+		       const gchar	    *element_name,
 		       const gchar	   **attribute_names,
 		       const gchar	   **attribute_values,
-		       gpointer		   user_data,
+		       gpointer		     user_data,
 		       GError		   **error)
 {
 	ParserData *data;
@@ -791,20 +799,27 @@
 static gboolean
 build_sql (ParserData *data)
 {
-	ParseState state;
-	char 	   *avalue, *value, *sub;
+	ParseState  state;
+	gchar 	   *avalue, *value, *sub;
 	GList      *field_data = NULL;
 	GList      *field_data_list = NULL;
 	GString    *str;
-	int        i=0;
+	gint        i = 0;
 
-	g_return_val_if_fail (data->current_field && data->current_operator != OP_NONE && data->current_value, FALSE);
+	g_return_val_if_fail (data->current_field && 
+			      data->current_operator != OP_NONE && 
+			      data->current_value, 
+			      FALSE);
 
 	data->statement_count++;
 
 	state = peek_state (data);
 
-	avalue = get_value (data->current_value, (state != STATE_END_DATE && state != STATE_END_INTEGER && state != STATE_END_FLOAT && state != STATE_END_BOOLEAN));
+	avalue = get_value (data->current_value, 
+			    (state != STATE_END_DATE && 
+			     state != STATE_END_INTEGER && 
+			     state != STATE_END_FLOAT && 
+			     state != STATE_END_BOOLEAN));
 
 	field_data_list = add_metadata_field (data, data->current_field, FALSE, TRUE);
 
@@ -820,16 +835,19 @@
 	field_data = g_list_first (field_data_list);
 
 	while (field_data) {
+		const gchar  *where_field;
+		gchar       **s;
+
 		i++;
 		str = g_string_new ("");
 	
 		if (i>1) {
 			g_string_append (str, " OR ");	
 		}
-
-		if (((FieldData *)field_data->data)->data_type ==  TRACKER_FIELD_TYPE_DATE) {
-			char *bvalue;
-			int cvalue;
+		
+		if (tracker_field_data_get_data_type (field_data->data) == TRACKER_FIELD_TYPE_DATE) {
+			gchar *bvalue;
+			gint   cvalue;
 			
 			bvalue = tracker_date_format (avalue);
 			g_debug (bvalue);
@@ -837,13 +855,17 @@
 			g_debug ("%d", cvalue);
 			value = tracker_int_to_string (cvalue);
 			g_free (bvalue);
-		} else if (state == STATE_END_BOOLEAN) { /* FIXME We do a state check here, because TRACKER_FIELD_TYPE_BOOLEAN is not in db */
+		} else if (state == STATE_END_BOOLEAN) { 
+			/* FIXME We do a state check here, because
+			 * TRACKER_FIELD_TYPE_BOOLEAN is not in db.
+			 */
 			if (!strcmp(avalue,"true")) {
 				value = g_strdup("1");
 			} else if(!strcmp(avalue,"false")) {
 				value = g_strdup("0");
 			} else {
-				return FALSE; /* TODO Add error message */
+				/* TODO Add error message */
+				return FALSE; 
 			}				         
 		} else {
 			value = g_strdup (avalue);
@@ -859,114 +881,124 @@
 			}
 		}
 
-		char **s;
+		where_field = tracker_field_data_get_where_field (field_data->data);
 		
 		switch (data->current_operator) {
-			
-		case OP_EQUALS:
-			
+		case OP_EQUALS: 
 			sub = strchr (data->current_value, '*');
+				
 			if (sub) {
-				g_string_append_printf (str, " (%s glob '%s') ", ((FieldData *)field_data->data)->where_field, data->current_value);
+				g_string_append_printf (str, " (%s glob '%s') ", 
+							where_field, 
+							data->current_value);
 			} else {
-				if (((FieldData *)field_data->data)->data_type == TRACKER_FIELD_TYPE_DATE 
-				    || ((FieldData *)field_data->data)->data_type == TRACKER_FIELD_TYPE_INTEGER 
-				    || ((FieldData *)field_data->data)->data_type == TRACKER_FIELD_TYPE_DOUBLE) {
-					g_string_append_printf (str, " (%s = %s) ", ((FieldData *)field_data->data)->where_field, value);
+				TrackerFieldType data_type;
+				
+				data_type = tracker_field_data_get_data_type (field_data->data);
+				
+				if (data_type == TRACKER_FIELD_TYPE_DATE ||
+				    data_type == TRACKER_FIELD_TYPE_INTEGER ||
+				    data_type == TRACKER_FIELD_TYPE_DOUBLE) {
+					g_string_append_printf (str, " (%s = %s) ", 
+								where_field, 
+								value);
 				} else {
-					g_string_append_printf (str, " (%s = '%s') ", ((FieldData *)field_data->data)->where_field, value);
+					g_string_append_printf (str, " (%s = '%s') ", 
+								where_field, 
+								value);
 				}
 			}
-			
 			break;
 			
 		case OP_GREATER:
-			
-			g_string_append_printf (str, " (%s > %s) ", ((FieldData *)field_data->data)->where_field, value);
-
+			g_string_append_printf (str, " (%s > %s) ", 
+						where_field,
+						value);
 			break;
 
 		case OP_GREATER_EQUAL:
-
-			g_string_append_printf (str, " (%s >= %s) ", ((FieldData *)field_data->data)->where_field, value);
-
+			g_string_append_printf (str, " (%s >= %s) ", 
+						where_field,
+						value);
 			break;
 
 		case OP_LESS:
-
-			g_string_append_printf (str, " (%s < %s) ", ((FieldData *)field_data->data)->where_field, value);
-
+			g_string_append_printf (str, " (%s < %s) ", 
+						where_field,
+						value);
 			break;
 
 		case OP_LESS_EQUAL:
-
-			g_string_append_printf (str, " (%s <= %s) ", ((FieldData *)field_data->data)->where_field, value);
-
+			g_string_append_printf (str, " (%s <= %s) ", 
+						where_field,
+						value);
 			break;
 
 		case OP_CONTAINS:
-
 			sub = strchr (data->current_value, '*');
 
 			if (sub) {
-				g_string_append_printf (str, " (%s like '%s%s%s') ", ((FieldData *)field_data->data)->where_field, "%", data->current_value, "%");
+				g_string_append_printf (str, " (%s like '%%%s%%') ", 
+							where_field, 
+							data->current_value);
 			} else {
-				g_string_append_printf (str, " (%s like '%s%s%s') ", ((FieldData *)field_data->data)->where_field, "%", data->current_value, "%");
+				g_string_append_printf (str, " (%s like '%%%s%%') ", 
+							where_field,
+							data->current_value);
 			}
-
 			break;
 
 		case OP_STARTS:
-			
 			sub = strchr (data->current_value, '*');
 
 			if (sub) {
-				g_string_append_printf (str, " (%s like '%s') ", ((FieldData *)field_data->data)->where_field, data->current_value);
+				g_string_append_printf (str, " (%s like '%s') ", 
+							where_field, 
+							data->current_value);
 			} else {
-				g_string_append_printf (str, " (%s like '%s%s') ", ((FieldData *)field_data->data)->where_field, data->current_value, "%");
+				g_string_append_printf (str, " (%s like '%s%%') ", 
+							where_field,
+							data->current_value);
 			}
 			
 			break;
 
 		case OP_REGEX:
-
-			g_string_append_printf (str, " (%s REGEXP '%s') ", ((FieldData *)field_data->data)->where_field, data->current_value);
-
+			g_string_append_printf (str, " (%s REGEXP '%s') ", 
+						where_field,
+						data->current_value);
 			break;
 
 		case OP_SET:
-
 			s = g_strsplit (data->current_value, ",", 0);
 			
 			if (s && s[0]) {
+				gchar **p;
 
-				g_string_append_printf (str, " (%s in ('%s'", ((FieldData *)field_data->data)->where_field, s[0]);
+				g_string_append_printf (str, " (%s in ('%s'", 
+							where_field, 
+							s[0]);
 
-				char **p;
-				for (p = s+1; *p; p++) {
-					g_string_append_printf (str, ",'%s'", *p); 					
+				for (p = s + 1; *p; p++) {
+					g_string_append_printf (str, ",'%s'", *p);
 				}
+
 				g_string_append_printf (str, ") ) " ); 					
-					
 			}
-
 			break;
 
 		default:
-			
 			break;
 		}
 		
 		data->sql_where = g_string_append (data->sql_where, str->str);
 		g_string_free (str, TRUE);
 		field_data = g_list_next (field_data);
-
 	}
 
 	data->sql_where = g_string_append (data->sql_where, " ) ");
 
 	g_free (avalue);
-
 	g_free (data->current_field);
 	data->current_field = NULL;
 
@@ -1222,19 +1254,31 @@
 		*where = NULL;
 
 	} else {
-		const GSList *tmp;
-		FieldData    *tmp_field;
+		GSList *l;
 
-		for (tmp = data.fields; tmp; tmp = tmp->next) {
-			tmp_field = tmp->data;
-
-			if (!tmp_field->is_condition) {
-				if (tmp_field->needs_join) {
-					g_string_append_printf (data.sql_from, "\n LEFT OUTER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID = %s) ", tmp_field->table_name, tmp_field->alias, tmp_field->alias, tmp_field->alias, tmp_field->id_field);
+		for (l = data.fields; l; l = l->next) {
+			if (!tracker_field_data_get_is_condition (l->data)) {
+				if (tracker_field_data_get_needs_join (l->data)) {
+					g_string_append_printf (data.sql_from, 
+								"\n LEFT OUTER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID = %s) ", 
+								tracker_field_data_get_table_name (l->data),
+								tracker_field_data_get_alias (l->data),
+								tracker_field_data_get_alias (l->data),
+								tracker_field_data_get_alias (l->data),
+								tracker_field_data_get_id_field (l->data));
 				}
 			} else {
-				char *related_metadata = tracker_get_related_metadata_names (db_con, tmp_field->field_name);
-				g_string_append_printf (data.sql_from, "\n INNER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID in (%s)) ", tmp_field->table_name, tmp_field->alias, tmp_field->alias, tmp_field->alias, related_metadata);
+				gchar *related_metadata;
+
+				related_metadata = tracker_get_related_metadata_names (db_con, 
+										       tracker_field_data_get_field_name (l->data));
+				g_string_append_printf (data.sql_from, 
+							"\n INNER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID in (%s)) ",
+							tracker_field_data_get_table_name (l->data),
+							tracker_field_data_get_alias (l->data),
+							tracker_field_data_get_alias (l->data),
+							tracker_field_data_get_alias (l->data),
+							related_metadata);
 				g_free (related_metadata);
 			}
 		}
@@ -1246,7 +1290,7 @@
 		g_string_free (data.sql_where, TRUE);
 	}
 
-	g_slist_foreach (data.fields, (GFunc) tracker_free_metadata_field, NULL);
+	g_slist_foreach (data.fields, (GFunc) g_object_unref, NULL);
 	g_slist_free (data.fields);
 
 	g_slist_free (data.stack);



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