[libgda] Fixed RecordCollection Unit Tests and Sample. Reached Milestone 1. * Gda to Gee.Collection Milestone
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgda] Fixed RecordCollection Unit Tests and Sample. Reached Milestone 1. * Gda to Gee.Collection Milestone
- Date: Tue, 10 Jan 2012 23:53:22 +0000 (UTC)
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]