[libgda/libgda-vala] Fixed DataModelIterator.filter function and its Unit Test.
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgda/libgda-vala] Fixed DataModelIterator.filter function and its Unit Test.
- Date: Tue, 6 Dec 2011 23:08:05 +0000 (UTC)
commit 4245df88a419868909bfceab41914651e94dc4c2
Author: Daniel Espinosa <despinosa src gnome org>
Date: Tue Dec 6 14:12:37 2011 -0600
Fixed DataModelIterator.filter function and its Unit Test.
libgda/data/DataModelIterator.vala | 47 +++++++++++++++++++------------
tests/vala/CheckDataModelIterator.vala | 27 ++++++++++++++++++
2 files changed, 56 insertions(+), 18 deletions(-)
---
diff --git a/libgda/data/DataModelIterator.vala b/libgda/data/DataModelIterator.vala
index 8de8119..b5b4e3b 100644
--- a/libgda/data/DataModelIterator.vala
+++ b/libgda/data/DataModelIterator.vala
@@ -99,7 +99,7 @@
this.iter = model.create_iter ();
this._current_pos = -1;
this.pos_init = 0;
- this.maxpos = this.iter.data_model.get_n_columns () * this.iter.data_model.get_n_rows () - 1;
+ this.maxpos = this.iter.data_model.get_n_columns () * this.iter.data_model.get_n_rows ();
this.filtered = false;
}
@@ -122,9 +122,9 @@
private DataModelIterator.filtered_elements (Gda.DataModel model, Gee.HashMap <int, int> elements)
{
this.iter = model.create_iter ();
- this._current_pos = 0;
+ this._current_pos = -1;
this.pos_init = 0;
- this.maxpos = this.iter.data_model.get_n_columns () * this.iter.data_model.get_n_rows () - 1;
+ this.maxpos = this.iter.data_model.get_n_columns () * this.iter.data_model.get_n_rows ();
this.filtered = true;
this.elements = elements;
}
@@ -154,23 +154,28 @@
}
else
{
- while (true) {
- if (this.elements.has_key (++this._current_pos))
+ bool ret = false;
+ while (this.has_next ()) {
+ if (this.elements.has_key (++this._current_pos)) {
+ int r = this.elements.get (this._current_pos);
+ ret = true;
+ this.iter.move_to_row (r);
break;
+ }
}
- return this.iter.move_to_row (this._current_pos / this.iter.data_model.get_n_columns ());
+
+ if (this._current_pos > this.maxpos)
+ this.iter.invalidate_contents ();
+ return ret;
}
}
public bool has_next () {
- if (this.iter.is_valid ()) {
- int pos = this._current_pos;
- if (++pos > this.maxpos)
- return false;
- else
- return true;
- }
- return false;
+ int pos = this._current_pos + 1;
+ if (pos < this.maxpos && pos >= this.pos_init)
+ return true;
+
+ return false;
}
/**
@@ -207,12 +212,18 @@
public Gee.Iterator<Value?> filter (owned Gee.Predicate<Value?> f)
{
var elements = new Gee.HashMap <int,int> ();
- for (int i = 0; i < this.maxpos; i++) {
+ for (int i = this.pos_init; i < this.maxpos; i++) {
int row = i / this.iter.data_model.get_n_columns ();
int col = i - row * this.iter.data_model.get_n_columns ();
- Value v = this.iter.data_model.get_value_at (row, col);
- if (f (v))
- elements.set (row, col);
+ try {
+ Value v = this.iter.data_model.get_value_at (col, row);
+ if (f (v))
+ elements.set (i, row);
+ }
+ catch (Error e) {
+ stdout.printf ("ERROR***DataModelIterator: %s\n", e.message);
+ continue;
+ }
}
return new DataModelIterator.filtered_elements (this.iter.data_model, elements);
}
diff --git a/tests/vala/CheckDataModelIterator.vala b/tests/vala/CheckDataModelIterator.vala
index 9fba6c5..bdb5647 100644
--- a/tests/vala/CheckDataModelIterator.vala
+++ b/tests/vala/CheckDataModelIterator.vala
@@ -142,10 +142,37 @@ namespace Check {
}
}
}
+
+ stdout.printf ("Filtering Values: Any STRING with a letter 'n'...\n");
+ var iter4 = itermodel.filter (Filter);
+ stdout.printf ("Printing Filtered Values...\n");
+ while (iter4.next ()) {
+ Value v4 = iter4.get ();
+ stdout.printf ("Row: %i, Col: %i\t%s\t\t%s\n",
+ ((GdaData.DataModelIterator) iter4).current_row,
+ ((GdaData.DataModelIterator) iter4).current_column,
+ typeof (int).name (), Gda.value_stringify (v4));
+ }
return fails;
}
+ private bool Filter (Value? g)
+ {
+ bool ret = false;
+ if (g.type () == typeof (string)) {
+ string t = (string) g;
+ if (t.contains ("n"))
+ ret = true;
+ else
+ ret = false;
+ }
+ else
+ ret = false;
+ stdout.printf ("To be Included?: %s, %s\n", Gda.value_stringify (g), ret == true ? "TRUE" : "FALSE");
+ return ret;
+ }
+
public static int main (string[] args) {
stdout.printf ("Checking Gda.DataModelIterator implementation...\n");
int failures = 0;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]