[libgda/libgda-vala] Fixed DataModelIterator.filter function and its Unit Test.



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]