From 1e70a8e9943ea91a4cc1dd148715cbd1c4e8a094 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Carlos=20Nieto?= <xiam@menteslibres.org>
Date: Tue, 12 Mar 2013 08:45:48 -0400
Subject: [PATCH] Fixing #14

---
 mongo/collection.go           |  5 ++++
 mongo/mongo_test.go           | 49 +++++++++++++++++++++++++++++++++++
 mysql/collection.go           |  4 +--
 mysql/mysql_test.go           | 49 +++++++++++++++++++++++++++++++++++
 postgresql/collection.go      |  4 +--
 postgresql/postgresql_test.go | 49 +++++++++++++++++++++++++++++++++++
 sqlite/collection.go          |  4 +--
 sqlite/sqlite_test.go         | 49 +++++++++++++++++++++++++++++++++++
 8 files changed, 207 insertions(+), 6 deletions(-)

diff --git a/mongo/collection.go b/mongo/collection.go
index e2fd8a83..25679361 100644
--- a/mongo/collection.go
+++ b/mongo/collection.go
@@ -374,6 +374,8 @@ func (self *SourceCollection) buildQuery(terms ...interface{}) *mgo.Query {
 // Transforms data from db.Item format into mgo format.
 func toInternal(val interface{}) interface{} {
 
+	// TODO: use reflection to target kinds and not just types.
+
 	switch t := val.(type) {
 	case []db.Id:
 		ids := make([]bson.ObjectId, len(t))
@@ -402,6 +404,9 @@ func toInternal(val interface{}) interface{} {
 
 // Transforms data from mgo format into db.Item format.
 func toNative(val interface{}) interface{} {
+
+	// TODO: use reflection to target kinds and not just types.
+
 	switch t := val.(type) {
 	case bson.M:
 		v := map[string]interface{}{}
diff --git a/mongo/mongo_test.go b/mongo/mongo_test.go
index 355c0e19..ed607055 100644
--- a/mongo/mongo_test.go
+++ b/mongo/mongo_test.go
@@ -416,6 +416,29 @@ func TestFind(t *testing.T) {
 
 }
 
+// Tests limit and offset.
+func TestLimitOffset(t *testing.T) {
+
+	var err error
+
+	sess, err := db.Open(wrapperName, settings)
+
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	defer sess.Close()
+
+	people, _ := sess.Collection("people")
+
+	items, _ := people.FindAll(db.Limit(2), db.Offset(1))
+
+	if len(items) != 2 {
+		t.Fatalf("Test failed")
+	}
+
+}
+
 // Tries to delete rows.
 func TestDelete(t *testing.T) {
 	sess, err := db.Open(wrapperName, settings)
@@ -634,6 +657,7 @@ func TestRelationStruct(t *testing.T) {
 // Tests datatype conversions.
 func TestDataTypes(t *testing.T) {
 	var res db.Result
+	var items []db.Item
 
 	sess, err := db.Open(wrapperName, settings)
 
@@ -680,6 +704,31 @@ func TestDataTypes(t *testing.T) {
 		t.Fatalf(err.Error())
 	}
 
+	// Testing date ranges
+	items, err = dataTypes.FindAll(db.Cond{
+		"date": time.Now(),
+	})
+
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	if len(items) > 0 {
+		t.Fatalf("Expecting no results.")
+	}
+
+	items, err = dataTypes.FindAll(db.Cond{
+		"date <=": time.Now(),
+	})
+
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	if len(items) != 2 {
+		t.Fatalf("Expecting some results.")
+	}
+
 	// Testing struct
 	sresults := []testValuesStruct{}
 
diff --git a/mysql/collection.go b/mysql/collection.go
index b910b8b3..365803e7 100644
--- a/mysql/collection.go
+++ b/mysql/collection.go
@@ -148,7 +148,7 @@ func (self *Table) compileSet(term db.Set) (string, db.SqlArgs) {
 	i := 0
 	for key, arg := range term {
 		sql[i] = fmt.Sprintf("%s = ?", key)
-		args[i] = to.String(arg)
+		args[i] = toInternal(arg)
 		i++
 	}
 
@@ -212,7 +212,7 @@ func (self *Table) compileStatement(where db.Cond) (string, []string) {
 		key = strings.Trim(key, " ")
 		chunks := strings.Split(key, " ")
 
-		strval := to.String(val)
+		strval := toInternal(val)
 
 		if len(chunks) >= 2 {
 			return fmt.Sprintf("%s %s ?", chunks[0], chunks[1]), []string{strval}
diff --git a/mysql/mysql_test.go b/mysql/mysql_test.go
index 293a75e3..dc161b5e 100644
--- a/mysql/mysql_test.go
+++ b/mysql/mysql_test.go
@@ -325,6 +325,29 @@ func TestFind(t *testing.T) {
 
 }
 
+// Tests limit and offset.
+func TestLimitOffset(t *testing.T) {
+
+	var err error
+
+	sess, err := db.Open(wrapperName, settings)
+
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	defer sess.Close()
+
+	people, _ := sess.Collection("people")
+
+	items, _ := people.FindAll(db.Limit(2), db.Offset(1))
+
+	if len(items) != 2 {
+		t.Fatalf("Test failed")
+	}
+
+}
+
 // Tries to delete rows.
 func TestDelete(t *testing.T) {
 	sess, err := db.Open(wrapperName, settings)
@@ -543,6 +566,7 @@ func TestRelationStruct(t *testing.T) {
 // Tests datatype conversions.
 func TestDataTypes(t *testing.T) {
 	var res db.Result
+	var items []db.Item
 
 	sess, err := db.Open(wrapperName, settings)
 
@@ -589,6 +613,31 @@ func TestDataTypes(t *testing.T) {
 		t.Fatalf(err.Error())
 	}
 
+	// Testing date ranges
+	items, err = dataTypes.FindAll(db.Cond{
+		"_date": time.Now(),
+	})
+
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	if len(items) > 0 {
+		t.Fatalf("Expecting no results.")
+	}
+
+	items, err = dataTypes.FindAll(db.Cond{
+		"_date <=": time.Now(),
+	})
+
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	if len(items) != 2 {
+		t.Fatalf("Expecting some results.")
+	}
+
 	// Testing struct
 	sresults := []testValuesStruct{}
 
diff --git a/postgresql/collection.go b/postgresql/collection.go
index ec8d4ed0..69bf0b88 100644
--- a/postgresql/collection.go
+++ b/postgresql/collection.go
@@ -171,7 +171,7 @@ func (self *Table) compileSet(term db.Set) (string, db.SqlArgs) {
 	i := 0
 	for key, arg := range term {
 		sql[i] = fmt.Sprintf("%s = ?", key)
-		args[i] = to.String(arg)
+		args[i] = toInternal(arg)
 		i++
 	}
 
@@ -235,7 +235,7 @@ func (self *Table) compileStatement(where db.Cond) (string, []string) {
 		key = strings.Trim(key, " ")
 		chunks := strings.Split(key, " ")
 
-		strval := to.String(val)
+		strval := toInternal(val)
 
 		if len(chunks) >= 2 {
 			return fmt.Sprintf("%s %s ?", chunks[0], chunks[1]), []string{strval}
diff --git a/postgresql/postgresql_test.go b/postgresql/postgresql_test.go
index dd3f6bb0..9f03f03d 100644
--- a/postgresql/postgresql_test.go
+++ b/postgresql/postgresql_test.go
@@ -325,6 +325,29 @@ func TestFind(t *testing.T) {
 
 }
 
+// Tests limit and offset.
+func TestLimitOffset(t *testing.T) {
+
+	var err error
+
+	sess, err := db.Open(wrapperName, settings)
+
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	defer sess.Close()
+
+	people, _ := sess.Collection("people")
+
+	items, _ := people.FindAll(db.Limit(2), db.Offset(1))
+
+	if len(items) != 2 {
+		t.Fatalf("Test failed")
+	}
+
+}
+
 // Tries to delete rows.
 func TestDelete(t *testing.T) {
 	sess, err := db.Open(wrapperName, settings)
@@ -543,6 +566,7 @@ func TestRelationStruct(t *testing.T) {
 // Tests datatype conversions.
 func TestDataTypes(t *testing.T) {
 	var res db.Result
+	var items []db.Item
 
 	sess, err := db.Open(wrapperName, settings)
 
@@ -589,6 +613,31 @@ func TestDataTypes(t *testing.T) {
 		t.Fatalf(err.Error())
 	}
 
+	// Testing date ranges
+	items, err = dataTypes.FindAll(db.Cond{
+		"_date": time.Now(),
+	})
+
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	if len(items) > 0 {
+		t.Fatalf("Expecting no results.")
+	}
+
+	items, err = dataTypes.FindAll(db.Cond{
+		"_date <=": time.Now(),
+	})
+
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	if len(items) != 2 {
+		t.Fatalf("Expecting some results.")
+	}
+
 	// Testing struct
 	sresults := []testValuesStruct{}
 
diff --git a/sqlite/collection.go b/sqlite/collection.go
index b3fff717..84559cc6 100644
--- a/sqlite/collection.go
+++ b/sqlite/collection.go
@@ -149,7 +149,7 @@ func (self *Table) compileSet(term db.Set) (string, db.SqlArgs) {
 	i := 0
 	for key, arg := range term {
 		sql[i] = fmt.Sprintf("%s = ?", key)
-		args[i] = to.String(arg)
+		args[i] = toInternal(arg)
 		i++
 	}
 
@@ -213,7 +213,7 @@ func (self *Table) compileStatement(where db.Cond) (string, []string) {
 		key = strings.Trim(key, " ")
 		chunks := strings.Split(key, " ")
 
-		strval := to.String(val)
+		strval := toInternal(val)
 
 		if len(chunks) >= 2 {
 			return fmt.Sprintf("%s %s ?", chunks[0], chunks[1]), []string{strval}
diff --git a/sqlite/sqlite_test.go b/sqlite/sqlite_test.go
index 4a10c30e..3126449d 100644
--- a/sqlite/sqlite_test.go
+++ b/sqlite/sqlite_test.go
@@ -316,6 +316,29 @@ func TestFind(t *testing.T) {
 
 }
 
+// Tests limit and offset.
+func TestLimitOffset(t *testing.T) {
+
+	var err error
+
+	sess, err := db.Open(wrapperName, settings)
+
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	defer sess.Close()
+
+	people, _ := sess.Collection("people")
+
+	items, _ := people.FindAll(db.Limit(2), db.Offset(1))
+
+	if len(items) != 2 {
+		t.Fatalf("Test failed")
+	}
+
+}
+
 // Tries to delete rows.
 func TestDelete(t *testing.T) {
 	sess, err := db.Open(wrapperName, settings)
@@ -534,6 +557,7 @@ func TestRelationStruct(t *testing.T) {
 // Tests datatype conversions.
 func TestDataTypes(t *testing.T) {
 	var res db.Result
+	var items []db.Item
 
 	sess, err := db.Open(wrapperName, settings)
 
@@ -580,6 +604,31 @@ func TestDataTypes(t *testing.T) {
 		t.Fatalf(err.Error())
 	}
 
+	// Testing date ranges
+	items, err = dataTypes.FindAll(db.Cond{
+		"_date": time.Now(),
+	})
+
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	if len(items) > 0 {
+		t.Fatalf("Expecting no results.")
+	}
+
+	items, err = dataTypes.FindAll(db.Cond{
+		"_date <=": time.Now(),
+	})
+
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	if len(items) != 2 {
+		t.Fatalf("Expecting some results.")
+	}
+
 	// Testing struct
 	sresults := []testValuesStruct{}
 
-- 
GitLab