[libgda] Fixed RecordCollection Unit Tests and Sample. Reached Milestone 1. * Gda to Gee.Collection Milestone



commit 0a65b7f6a40478cac818ef3f089257fcd6d0953e
Author: Daniel Espinosa <despinosa src gnome org>
Date:   Tue Jan 10 17:47:10 2012 -0600

    Fixed RecordCollection Unit Tests and Sample. Reached Milestone 1.
    * Gda to Gee.Collection Milestone 1 Reached.
    * All Unit Tests and samples compiles and run
    * Updated Gda-5.0.gir and libgda-5.0.vapi due to  annotation fixes

 libgda/Gda-5.0.gir                        |    2 +-
 libgda/data/RecordCollection.vala         |   97 +++++++++------
 libgda/libgda-5.0.vapi                    |    2 +-
 samples/vala/SampleDataModelIterable.vala |   32 +-----
 tests/vala/CheckDataModelIterator.vala    |  191 ++++++++++++++++-------------
 5 files changed, 167 insertions(+), 157 deletions(-)
---
diff --git a/libgda/Gda-5.0.gir b/libgda/Gda-5.0.gir
index b1de661..ea6e22e 100644
--- a/libgda/Gda-5.0.gir
+++ b/libgda/Gda-5.0.gir
@@ -2286,7 +2286,7 @@ Warning: the @cnc object may change the list if connection events occur</doc>
       <method name="get_meta_store"
               c:identifier="gda_connection_get_meta_store">
         <doc xml:whitespace="preserve">Get or initializes the #GdaMetaStore associated to @cnc</doc>
-        <return-value transfer-ownership="full">
+        <return-value transfer-ownership="none">
           <doc xml:whitespace="preserve">a #GdaMetaStore object</doc>
           <type name="MetaStore" c:type="GdaMetaStore*"/>
         </return-value>
diff --git a/libgda/data/RecordCollection.vala b/libgda/data/RecordCollection.vala
index 614d438..7df04c4 100644
--- a/libgda/data/RecordCollection.vala
+++ b/libgda/data/RecordCollection.vala
@@ -139,60 +139,66 @@ namespace GdaData {
 		private DataModelIter _iter;
 		private DbTable<Value?> _table;
 		private int _length = -1;
-		private HashMap<int,int> _elements = new HashMap<int,int>();
+		private int init_row = -1;
+		private HashMap<int,int> _elements;
 		private int filter_pos = -1;
 		
 		public RecordCollectionIterator (DataModelIter iter, DbTable<Value?> table)
 		{
 			_iter = iter;
 			_table = table;
-			_length = _iter.data_model.get_n_rows ();
+			_elements = new HashMap<int,int>();
 		}
 		
-		private RecordCollectionIterator.filtered_elements (DataModelIter iter, DbTable table, 
-															HashMap<int,int> elements)
+		private RecordCollectionIterator.filtered (DataModelIter iter, DbTable<Value?> table, 
+											int init, int offset, int length, 
+											HashMap<int,int> elements, int filter_pos)
 		{
 			_iter = iter;
 			_table = table;
-			_length = _iter.data_model.get_n_rows ();
 			_elements = elements;
-		}
-		private RecordCollectionIterator.with_lenght (DataModelIter iter, DbTable table, int length)
-		{
-			_iter = iter;
-			_table = table;
-			if (length >= 0 && _iter.is_valid ())
-				_length = _iter.current_row + length;
-			if (_length > _iter.data_model.get_n_rows ())
-				_length = _iter.data_model.get_n_rows ();
+			this.filter_pos = filter_pos;
+			if (init < 0 && offset >= 0) init = 0;
+			if (init >= 0 && init < _iter.data_model.get_n_rows ()
+				&& init + offset >= 0
+				&& init + offset < _iter.data_model.get_n_rows ())
+			{
+				_iter.move_to_row (init + offset);
+				init_row = _iter.current_row;
+				if (length >= 0 && init + length < _iter.data_model.get_n_rows ())
+				{
+					_length = length;
+				}
+			}
+			else
+				init_row = -10; // Invalidate all the interator
+			if (_elements.size > 0)
+				init_row = -1; // Validate interator due to filtered values
 		}
 		
 		// Traversable Interface
 		public Gee.Iterator<DbRecord<Value?>> chop (int offset, int length = -1) 
-			requires (offset <= _iter.data_model.get_n_rows ())
-			requires (offset + length <= _iter.data_model.get_n_rows ())
 		{
 			var iter = _iter.data_model.create_iter ();
-			iter.move_to_row (offset);
-			return new RecordCollectionIterator.with_lenght (iter, _table, length);
+			return new RecordCollectionIterator.filtered (iter, _table, _iter.current_row, 
+									offset, length, _elements, filter_pos);
 		}
 		public Gee.Iterator<DbRecord<Value?>> filter (owned Gee.Predicate<DbRecord<Value?>> f) 
 		{
 			var elements = new Gee.HashMap <int,int> ();
-			while (_iter.move_next ()) {
+			int pos = -1;
+			while (this.next ()) {
 				var r = this.get ();
 				if (f(r)) {
-					stdout.printf ("SELECTED row: " + _iter.current_row.to_string () 
-									+ "Values:\n" + this.get().to_string ());
-					elements.set (++filter_pos, _iter.current_row);
+					elements.set (++pos, _iter.current_row);
 				}
 			}
 			var iter = _iter.data_model.create_iter ();
-			return new RecordCollectionIterator.filtered_elements (iter, _table, elements);
+			return new RecordCollectionIterator.filtered (iter, _table, -1, 0, -1, elements, -1);
 		}
 		public new void @foreach (Gee.ForallFunc<DbRecord<Value?>> f) 
 		{
-			while (_iter.move_next ()) {
+			while (this.next ()) {
 				var r = this.get ();
 				f(r);
 			}
@@ -215,24 +221,25 @@ namespace GdaData {
 		}
 		public bool has_next () 
 		{
-			return (_iter.current_row + 1 <= _iter.data_model.get_n_rows ()) ||
-					(_iter.current_row + 1 <= _length) ? true : false;
+			if ((_length >= 0) && (_iter.current_row + 1 < _length + init_row)
+					&& (_iter.current_row + 1 > _iter.data_model.get_n_rows ())) 
+				return false;
+			if (_elements.size > 0)
+				return filter_pos + 1 < _elements.size ? true : false;
+			
+			return _iter.current_row + 1 <= _iter.data_model.get_n_rows () ? true : false;
 		}
 		public bool next () 
 		{ 
-			bool ret = false;
-			if (_elements.size > 0 && ++filter_pos < _elements.size) {
-				_iter.move_to_row (_elements.get (filter_pos));
-			}
-			else {
-				if (this.has_next ())
-					ret = _iter.move_next ();
-				else {
-					ret = false;
-					_iter.invalidate_contents ();
+			if (this.has_next ()) {
+				if (_elements.size > 0) {
+					_iter.move_to_row (_elements.get (++filter_pos));
+					return true;
 				}
+				else
+					return _iter.move_next ();
 			}
-			return ret;
+			return false;
 		}
 		public void remove () { _iter.data_model.remove_row (_iter.current_row); }
 		public bool read_only 
@@ -244,6 +251,20 @@ namespace GdaData {
 					return false;
 			}
 		}
-		public bool valid { get { return _iter.is_valid (); } }
+		public bool valid { 
+			get { 
+				if (init_row == -10)
+					return false;
+					
+				if (_length >= 0)
+					return (_iter.current_row >= init_row)
+							&& (_iter.current_row < _length + init_row) ? true : false;
+				if (_elements.size > 0)
+					return filter_pos < _elements.size;
+				
+				return (_iter.current_row >= 0) && 
+						(_iter.current_row < _iter.data_model.get_n_rows ())? true : false; 
+			}
+		}
 	}
 }
diff --git a/libgda/libgda-5.0.vapi b/libgda/libgda-5.0.vapi
index 82d47ac..fc60ff8 100644
--- a/libgda/libgda-5.0.vapi
+++ b/libgda/libgda-5.0.vapi
@@ -142,7 +142,7 @@ namespace Gda {
 		public unowned string get_cnc_string ();
 		public unowned string get_dsn ();
 		public unowned GLib.List<Gda.ConnectionEvent> get_events ();
-		public Gda.MetaStore get_meta_store ();
+		public unowned Gda.MetaStore get_meta_store ();
 		public Gda.DataModel get_meta_store_data_v (Gda.ConnectionMetaType meta_type, GLib.List<Gda.Holder> filters) throws GLib.Error;
 		public Gda.ConnectionOptions get_options ();
 		public unowned Gda.PStmt get_prepared_statement (Gda.Statement gda_stmt);
diff --git a/samples/vala/SampleDataModelIterable.vala b/samples/vala/SampleDataModelIterable.vala
index 0f3e509..3ac6e76 100644
--- a/samples/vala/SampleDataModelIterable.vala
+++ b/samples/vala/SampleDataModelIterable.vala
@@ -62,11 +62,11 @@ namespace Sample {
 			foreach (DbRecord<Value?> r in itermodel) {
 				stdout.printf (r.to_string ());
 			}
-			stdout.printf ("Iterating over all Records in DataModel using a Gee.Iterator\n");
+			stdout.printf ("\nIterating over all Records in DataModel using a Gee.Iterator\n");
 			var iter = itermodel.iterator ();
 			while (iter.next ())
 			{
-				stdout.printf (iter.get ().to_string ());
+				stdout.printf (iter.get ().to_string () + "\n");
 			}
 			stdout.printf ("\n");
 		}
@@ -117,33 +117,6 @@ namespace Sample {
 			}
 			stdout.printf ("\n");
 		}
-		public void streaming ()
-		{
-			/* FIXME: This code doesn't return YIELDED strings maybe becasue Lazy is not correctly built. 
-				In theory stream() function is working correctly*/
-			stdout.printf ("Streaming Values: Fist field type STRING will be YIELDED...\n");
-			var iter = itermodel.stream<string> (
-				(state, g, out lazy) =>	{
-					if (state == Gee.Traversable.Stream.CONTINUE) {
-						var r = g.value;
-						foreach (DbField<Value?> f in r.fields) {
-							if (f.value.type () == typeof (string)) {
-								stdout.printf ("Value to YIELD: %s\n", Gda.value_stringify (f.value));
-								string ts = "YIELDED Value = " + Gda.value_stringify (f.value) + "\n";
-								lazy = new Gee.Lazy<string>.from_value (ts.dup ());
-							}
-						}
-						return Gee.Traversable.Stream.YIELD;
-					}
-					return Gee.Traversable.Stream.END;
-				}
-			);
-			stdout.printf ("Printing Streamed Values...\n");
-			while (iter.next ()) {
-				stdout.printf (iter.get());
-			}
-			stdout.printf ("\n");
-		}
 				
 		public static int main (string[] args) {
 			stdout.printf ("Demo for Gda.DataModelIterator...\n");
@@ -156,7 +129,6 @@ namespace Sample {
 				return 1;
 			}
 			app.iterating ();
-			app.streaming ();
 			app.choping ();
 			app.filtering ();
 			return 0;
diff --git a/tests/vala/CheckDataModelIterator.vala b/tests/vala/CheckDataModelIterator.vala
index ab12900..b50708d 100644
--- a/tests/vala/CheckDataModelIterator.vala
+++ b/tests/vala/CheckDataModelIterator.vala
@@ -52,24 +52,13 @@ namespace Check {
 			throws Error
 		{
 			int fails = 0;
-			stdout.printf ("Iterating over all Records in DataModel using foreach...\n");
+			stdout.printf (">>> TESTING: Iterating over all Records in DataModel using foreach...\n");
 			int i = 0;
-			foreach (DbRecord<Value?> r in itermodel) {
-				string t = r.to_string ();
-				if (t == null) {
-					fails++;
-					break;
-				}
-				i++;
-				stdout.printf (t + "\n");
-			}
-			if (fails > 0 || i != 6)
-				stdout.printf ("----- FAIL "+ fails.to_string () + "\n");
-			else
-				stdout.printf ("+++++ PASS\n");
-			stdout.printf ("Iterating using an Gee.Iterator...\n");
+			stdout.printf ("Iterating using a Gee.Iterator...\n");
 			i = 0;
 			var iter = itermodel.iterator ();
+			if (iter == null)
+				stdout.printf ("----- FAIL "+ (++fails).to_string () + "\n");
 			while (iter.next ()) {
 				string t2 = iter.get ().to_string ();
 				if (t2 == null) {
@@ -85,43 +74,116 @@ namespace Check {
 				stdout.printf ("----- FAIL "+ fails.to_string () + "\n");
 			else
 				stdout.printf ("+++++ PASS\n");
+			stdout.printf ("Iterating using foreach instruction...\n");
+			i = 0;
+			foreach (DbRecord<Value?> r in itermodel) {
+				string t = r.to_string ();
+				if (t == null) {
+					fails++;
+					break;
+				}
+				i++;
+				stdout.printf (t + "\n");
+			}
+			if (fails > 0 || i != 6)
+				stdout.printf ("----- FAIL "+ fails.to_string () + "\n");
+			else
+				stdout.printf ("+++++ PASS\n");
 			return fails;
 		}
 		
 		public int choping ()
 		{
 			int fails = 0;
-			stdout.printf ("Choping to get the 2nd DbRecord...\n");
+			stdout.printf (">>> TESTING: Chopping...\n");
+			stdout.printf (" to get the 2nd DbRecord...\n");
 			var iter = itermodel.chop (1);
+			if (!iter.valid)
+				stdout.printf ("----- FAIL: " + (++fails).to_string () + "\n");
 			stdout.printf (iter.get ().to_string () + "\n");
 			var name = (string) iter.get().get_value ("name");
 			if (name == "Jhon")
 				stdout.printf ("+++++ PASS\n");
 			else {
 				fails++;
-				stdout.printf ("----- FAIL: " + (fails++).to_string () + "\n");
+				stdout.printf ("----- FAIL: " + (++fails).to_string () + "\n");
 			}
+			
 			stdout.printf ("Choping to get the 4th to 5th DbRecords...\n");
-			var iter2 = itermodel.chop (3,4);
+			var iter2 = itermodel.chop (3,2);
+			if (!iter2.valid)
+				stdout.printf ("----- FAIL: " + (fails++).to_string () + "\n");
+			
 			stdout.printf ("Iterating over chopped records...\n");
-			while (iter2.next ()) {
-				stdout.printf (iter2.get ().to_string ());
-				var name2 = (string) iter.get().get_value ("name");
-				if (name2 == "Jack" || name2 == "Elsy")
-					stdout.printf ("+++++ PASS\n");
-				else {
-					fails++;
-					stdout.printf ("----- FAIL: " + (fails++).to_string () + "\n");
+			int i = 0;
+			while (iter2.valid) {
+				i++;
+				stdout.printf (iter2.get ().to_string () + "\n");
+				var name2 = (string) iter2.get().get_value ("name");
+				if (i==1) {
+					if (name2 != "Jack") {
+						fails++;
+						stdout.printf ("----- FAIL: " + (++fails).to_string () + "\n");
+						break;
+					}
 				}
+				if (i==2) {
+					if (name2 != "Elsy") {
+						fails++;
+						stdout.printf ("----- FAIL: " + (++fails).to_string () + "\n");
+						break;
+					}
+				}
+				iter2.next ();
 			}
-			stdout.printf ("\n");
+			if (i!=2) {
+				fails++;
+				stdout.printf ("----- FAIL: " + (++fails).to_string () + "\n");
+			}
+			stdout.printf ("+++++ PASS\n");
+			
+			stdout.printf ("Choping offset = 7 must fail...\n");
+			var iter3 = itermodel.chop (7);
+			if (iter3.valid)
+				stdout.printf ("----- FAIL: " + (++fails).to_string () + "\n");
+			if (!iter3.next ())
+				stdout.printf ("----- FAIL: " + (++fails).to_string () + "\n");
+			if (fails == 0)
+				stdout.printf ("+++++ PASS\n");
+			stdout.printf ("Choping offset = 6 length = 0 must fail...\n");
+			var iter4 = itermodel.chop (6,0);
+			if (iter4.valid)
+				stdout.printf ("----- FAIL: " + (++fails).to_string () + "\n");
+			if (!iter4.next ())
+				stdout.printf ("----- FAIL: " + (++fails).to_string () + "\n");
+			if (fails == 0)
+				stdout.printf ("+++++ PASS\n");
+			
+			stdout.printf ("Choping offset = 5 length = 1...\n");
+			var iter5 = itermodel.chop (5,1);
+			if (!iter5.valid)
+				stdout.printf ("----- FAIL: " + (++fails).to_string () + "\n");
+			if (iter5.next ())
+				stdout.printf ("----- FAIL: " + (++fails).to_string () + "\n");
+			if (fails == 0)
+				stdout.printf ("+++++ PASS\n");
+			stdout.printf ("Choping offset = 3 length = 1...\n");
+			var iter6 = itermodel.chop (3,2);
+			if (!iter6.valid)
+				stdout.printf ("----- FAIL: " + (++fails).to_string () + "\n");
+			var tr = iter6.get().get_value ("name");
+			if (tr==null)
+				stdout.printf ("----- FAIL: " + (++fails).to_string () + "\n");
+
+			if (fails == 0)
+				stdout.printf ("+++++ PASS: " + "\n");
 			return fails;
 		}
 		
 		public int filtering ()
 		{
 			int fails = 0;			
-			stdout.printf ("Filtering Records: Any field type STRING with a letter 'x'...\n");
+			stdout.printf (">>> TESTING: Filtering Records: Any field type STRING with a letter 'J'...\n");
 			
 			var iter = itermodel.filter (
 			(g) => {
@@ -129,7 +191,7 @@ namespace Check {
 				foreach (DbField<Value?> fl in g.fields) {
 					string t = Gda.value_stringify (fl.value);
 					stdout.printf ("Value to check: " + t);
-					if (t.contains ("x")) {
+					if (t.contains ("J")) { 
 						ret = true;
 						stdout.printf ("...SELECTED\n");
 						break;
@@ -143,15 +205,13 @@ namespace Check {
 				return ret;
 			}
 			);
-			stdout.printf ("Printing Filtered Values...\n");
-			iter.next ();
-			stdout.printf ("Row 1:\n" + iter.get ().to_string () + "\n");
-			iter.next ();
-			stdout.printf ("Row 2:\n" + iter.get ().to_string () + "\n");
-			if(iter.next ()) {
-				fails++;
-				stdout.printf ("(INCORRECT) )Row 3:\n" + iter.get().to_string () + "\n");
-				stdout.printf ("----- FAIL" + fails.to_string () + "\n");
+			stdout.printf ("\nPrinting Filtered Values...\n");
+			int i = 0;
+			while (iter.next ()) {
+				stdout.printf ("Row"+(++i).to_string()+":\n" + iter.get ().to_string () + "\n");
+			}
+			if(i != 3) {
+				stdout.printf ("----- FAIL" + (++fails).to_string () + "\n");
 			}
 			else
 				stdout.printf ("+++++ PASS\n");
@@ -162,7 +222,7 @@ namespace Check {
 			int fails = 0;
 			/* FIXME: This code doesn't return YIELDED strings maybe becasue Lazy is not correctly built. 
 				In theory stream() function is working correctly*/
-			stdout.printf ("Streaming Values: Fist field type STRING will be YIELDED...\n");
+			stdout.printf (">>> TESTING: Streaming Values: Fist field type STRING will be YIELDED...\n");
 			var iter = itermodel.stream<string> (
 				(state, g, out lazy) =>	{
 					if (state == Gee.Traversable.Stream.CONTINUE) {
@@ -189,68 +249,25 @@ namespace Check {
 		public int InitIter()
 			throws Error
 		{
-			stdout.printf (">>> NEW TEST: GdaData.RecordCollection & RecordCollectionIterator API tests\n"
-						 	+ ">>> Testing Iterable, Traversable Interfaces\n");
+			stdout.printf (">>> TESTING: Initializing DbRecordCollection/RecordCollection\n");
 			int fails = 0;
 			var model = this.connection.execute_select_command ("SELECT * FROM user");
-			stdout.printf ("DataModel rows:\n" + model.dump_as_string ());
 			stdout.printf ("Setting up Table...");
 			var t = new Table<Value?> ();
 			t.connection = this.connection;
 			t.name = "user";
 			stdout.printf ("+++++ PASS\n");
-			stdout.printf ("Setting up DbRecordCollection...\n");
+			stdout.printf ("Setting up DbRecordCollection...");
 			itermodel = new RecordCollection (model, t);
-			
-//			stdout.printf ("Getting iterator...\n");
-//			var iter = itermodel.iterator ();
-//			stdout.printf ("Go to first row...\n");
-//			iter.next ();
-//			stdout.printf ("Getting firts row...\n");
-//			var r = iter.get ();
-//			stdout.printf ("First Record contents: \n" + r.to_string ());
-//			stdout.printf ("Iterating over all Records in DataModel\n");
-//			foreach (DbRecord<Value?> record in itermodel) {
-//				stdout.printf (record.to_string ());
-//			}
-//			
-//			stdout.printf ("Choping to get first record id= 1\n");
-//			var iter2 = itermodel.chop (0,0);
-//			iter2.next ();
-//			var v = iter.get ().get_field ("id").value;
-//			if (v.type () == typeof (int))
-//				stdout.printf ("ID=%i\n", (int) v);
-//			else {
-//				fails++;
-//				stdout.printf ("FAIL:'%i': Expected type = '%s'," +
-//							   " but Value is type = '%s'" +
-//							   " with value = %s\n",
-//							   fails, typeof (int).name (), v.type_name (), 
-//							   Gda.value_stringify (v));			
-//			}
-//			
-//			stdout.printf ("Choping to get 5th Value = 'Jhon'\n");
-//			var iter3 = itermodel.chop (1,0);
-//			iter3.next ();
-//			var v2 = iter2.get ().get_value ("name");
-//			if (v2.type () == typeof (string))
-//				stdout.printf ("Name = %s;\n", (string) v2);
-//			else {
-//				fails++;
-//				stdout.printf ("FAIL:'%i': Expected type = '%s'," +
-//							   " but Value is type = '%s'" +
-//							   " with value = %s\n", 
-//							   fails, typeof (string).name (), v2.type_name (), 
-//							   Gda.value_stringify (v2));			
-//			}
-			// FIXME: test filter and stream
+			stdout.printf ("+++++ PASS\n");
+			stdout.printf ("DataModel rows:\n" + model.dump_as_string ());
 			return fails;
 		}
 		
 		public int t2 ()
 		{
 			stdout.printf (">>> NEW TEST: GdaData.RecordCollection & RecordCollectionIterator API tests\n"
-							+ ">>> Testing Collection Interface\n");
+							+ ">>> Testing Collection, Iterator, Traversable Interfaces implementation\n");
 			int fails = 0;
 			var model = this.connection.execute_select_command ("SELECT * FROM user");
 			((DataSelect) model).compute_modification_statements ();



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