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