tracker r1601 - in branches/xesam-support: . src/trackerd



Author: pvanhoof
Date: Mon Jun  9 09:09:34 2008
New Revision: 1601
URL: http://svn.gnome.org/viewvc/tracker?rev=1601&view=rev

Log:
2008-06-09  Philip Van Hoof  <pvanhoof gnome org>

        * src/trackerd/tracker-xesam-live-search.c: get_hit_data improvements



Modified:
   branches/xesam-support/ChangeLog
   branches/xesam-support/src/trackerd/tracker-xesam-live-search.c

Modified: branches/xesam-support/src/trackerd/tracker-xesam-live-search.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-xesam-live-search.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-xesam-live-search.c	Mon Jun  9 09:09:34 2008
@@ -520,6 +520,28 @@
 	}
 }
 
+
+typedef enum {
+	ARRAY_OF_INT,
+	ARRAY_OF_STRING,
+	SANE_TYPE
+} OntologyType;
+
+static OntologyType
+get_type_for (TrackerXesamLiveSearch *self, gint column)
+{
+	// todo
+	return SANE_TYPE;
+}
+
+static inline void
+foreach_row_put_in_result (gpointer key, gpointer value, gpointer user_data)
+{
+	GPtrArray *result = user_data;
+	GPtrArray *row = value;
+	g_ptr_array_add (result, row);
+}
+
 /**
  * Retrieving Hits
  * The return value of GetHits and GetHitData is a sorted array of hits. A hit 
@@ -548,44 +570,126 @@
 	      GPtrArray              **hit_data,
 	      gint                     field_count)
 {
-	GPtrArray *result;
+	GPtrArray  *result = g_ptr_array_new ();
+	GHashTable *rows = g_hash_table_new (g_int_hash, g_int_equal);
 	gboolean   valid = TRUE;
-	gint       column;
-
-	result = g_ptr_array_new ();
 
 	while (valid) {
+		gint       column;
 		GPtrArray *row;
+		//GValue     value_in = {0, };
+		gboolean   insert = FALSE;
 
-		row = g_ptr_array_new();
+		// remove static here
+		static gint       key;
 
-		for (column = 0; column < field_count; column++) {
-			GValue *value;
-			GValue  value_in = {0, };
-
-			value = g_new0 (GValue, 1);
+		// _tracker_db_result_set_get_value (result_set, 0, &value_in);
+		// key must be the first column, as an int, unique per row that
+		// must actually be returned. Example:
+		//
+		// 1, a, b, c, 1
+		// 1, a, b, c, 2
+		// 1, a, b, c, 3
+		// 1, a, b, c, 4
+		// 2, a, b, c, 1
+		// 3, a, b, c, 1
+		// 4, a, b, c, 2
+		// 5, a, b, c, 2
+		//
+		// for:
+		//
+		//[
+		//  [a, b, c, [1, 2, 3, 4]]
+		//  [a, b, c, [1]]
+		//  [a, b, c, [1]]
+		//  [a, b, c, [2]]
+		//  [a, b, c, [2]]
+		//]
+		//
+		// key = g_value_get_int (&value_in);
+
+		key++;
+
+		row = g_hash_table_lookup (rows, &key);
+
+		if (!row) {
+			row = g_ptr_array_new ();
+			insert = TRUE;
+		}
 
-			/* Question for ottela: how will we do list-values like
-			 * xesam:userKeywords? That's a column with comma's? or
-			 * how is this done? An extra result_set to loop? An
-			 * extra query? A union?
-			 */
+		for (column = 0; column < field_count; column++) {
+			GValue cur_value = {0, };
 
-			_tracker_db_result_set_get_value (result_set, column, &value_in);
+			_tracker_db_result_set_get_value (result_set, column, &cur_value);
 
-			g_value_init (value, G_VALUE_TYPE (&value_in));
-			g_value_copy (&value_in, value);
+			switch (get_type_for (self, column)) {
+				case ARRAY_OF_STRING: {
+					GValue *variant;
+					GPtrArray *my_array;
+
+					if (row->len <= (unsigned int) column) {
+						variant = g_new0 (GValue, 1);
+						g_value_init (variant, dbus_g_type_get_struct("GValueArray", G_TYPE_STRING));
+						my_array =  g_ptr_array_new ();
+						g_value_set_boxed_take_ownership (variant, my_array);
+						g_ptr_array_add (row, variant);
+					} else {
+						variant = g_ptr_array_index (row, column);
+						my_array = g_value_get_boxed (variant);
+					}
+
+					g_ptr_array_add  (my_array, 
+							       g_value_dup_string (&cur_value));
+
+				}
+				break;
+
+				case ARRAY_OF_INT: {
+					GValue *variant;
+					GArray *my_array;
+					gint int_val;
+
+					if (row->len <= (unsigned int) column) {
+						variant = g_new0 (GValue, 1);
+						g_value_init (variant, dbus_g_type_get_struct("GValueArray", G_TYPE_INT));
+						my_array =  g_array_new (FALSE, TRUE, sizeof (gint));
+						g_value_set_boxed_take_ownership (variant, my_array);
+						g_ptr_array_add (row, variant);
+					} else {
+						variant = g_ptr_array_index (row, column);
+						my_array = g_value_get_boxed (variant);
+					}
+
+					int_val = g_value_get_int (&cur_value);
+					g_array_append_val (my_array, int_val);
+				}
+				break;
+
+				case SANE_TYPE:
+				default: {
+					GValue *value = g_new0 (GValue, 1);
+					g_value_init (value, G_VALUE_TYPE (&cur_value));
+					g_value_copy (&cur_value, value);
+					g_ptr_array_add (row, value);
+				}
+				break;
+			}
+			g_value_unset (&cur_value);
+		}
 
-			g_value_unset (&value_in);
 
-			g_ptr_array_add (row, value);
+		if (insert) {
+			g_hash_table_insert (rows, &key, row);
+		} else {
+			g_hash_table_replace (rows, &key, row);
 		}
 
-		g_ptr_array_add (result, row);
-
 		valid = tracker_db_result_set_iter_next (result_set);
 	}
 
+	g_hash_table_foreach (rows, foreach_row_put_in_result, result);
+	g_hash_table_destroy (rows);
+
 	*hit_data = result;
 }
 



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