tracker r1601 - in branches/xesam-support: . src/trackerd
- From: pvanhoof svn gnome org
- To: svn-commits-list gnome org
- Subject: tracker r1601 - in branches/xesam-support: . src/trackerd
- Date: Mon, 9 Jun 2008 09:09:35 +0000 (UTC)
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]