2019-03-03 17:54:43 +01:00
package tests
import (
"fmt"
2019-04-07 10:05:41 +02:00
"github.com/sub0zero/go-sqlbuilder/sqlbuilder"
"github.com/sub0zero/go-sqlbuilder/tests/.test_files/dvd_rental/dvds/model"
. "github.com/sub0zero/go-sqlbuilder/tests/.test_files/dvd_rental/dvds/table"
2019-03-03 17:54:43 +01:00
"gotest.tools/assert"
2019-04-03 14:18:58 +02:00
"strings"
2019-03-03 17:54:43 +01:00
"testing"
2019-03-14 09:18:23 +01:00
"time"
2019-03-03 17:54:43 +01:00
)
2019-03-14 09:18:23 +01:00
func TestSelect_ScanToStruct ( t * testing . T ) {
actor := model . Actor { }
2019-05-05 18:03:30 +02:00
query := Actor . SELECT ( Actor . AllColumns ) . ORDER_BY ( Actor . ActorID . ASC ( ) )
2019-04-03 11:03:07 +02:00
2019-04-29 14:39:48 +02:00
queryStr , args , err := query . Sql ( )
2019-04-03 11:03:07 +02:00
fmt . Println ( queryStr )
2019-04-14 17:55:10 +02:00
assert . Equal ( t , queryStr , ` SELECT actor.actor_id AS "actor.actor_id", actor.first_name AS "actor.first_name", actor.last_name AS "actor.last_name", actor.last_update AS "actor.last_update" FROM dvds.actor ORDER BY actor.actor_id ASC ` )
2019-04-29 14:39:48 +02:00
assert . Equal ( t , len ( args ) , 0 )
2019-04-03 11:03:07 +02:00
2019-04-20 19:49:29 +02:00
err = query . Query ( db , & actor )
2019-03-14 09:18:23 +01:00
assert . NilError ( t , err )
2019-03-05 18:55:47 +01:00
2019-03-14 09:18:23 +01:00
expectedActor := model . Actor {
ActorID : 1 ,
FirstName : "Penelope" ,
LastName : "Guiness" ,
2019-04-03 14:18:58 +02:00
LastUpdate : * timeWithoutTimeZone ( "2013-05-26 14:47:57.62" , 2 ) ,
2019-03-14 09:18:23 +01:00
}
assert . DeepEqual ( t , actor , expectedActor )
}
2019-05-05 12:37:23 +02:00
func TestClassicSelect ( t * testing . T ) {
query := sqlbuilder . SELECT ( Payment . AllColumns , Customer . AllColumns ) .
FROM ( Payment . INNER_JOIN ( Customer , Payment . CustomerID . Eq ( Customer . CustomerID ) ) ) .
2019-05-05 18:03:30 +02:00
ORDER_BY ( Payment . PaymentID . ASC ( ) ) .
2019-05-05 12:37:23 +02:00
LIMIT ( 30 )
queryStr , args , err := query . Sql ( )
assert . NilError ( t , err )
fmt . Println ( queryStr )
fmt . Println ( args )
dest := [ ] model . Payment { }
err = query . Query ( db , & dest )
assert . NilError ( t , err )
}
2019-03-14 09:18:23 +01:00
func TestSelect_ScanToSlice ( t * testing . T ) {
2019-03-05 18:55:47 +01:00
customers := [ ] model . Customer { }
2019-05-05 18:03:30 +02:00
query := Customer . SELECT ( Customer . AllColumns ) . ORDER_BY ( Customer . CustomerID . ASC ( ) )
2019-03-05 18:55:47 +01:00
2019-04-29 14:39:48 +02:00
queryStr , args , err := query . Sql ( )
2019-03-05 18:55:47 +01:00
assert . NilError ( t , err )
2019-03-30 10:17:32 +01:00
fmt . Println ( queryStr )
2019-04-29 14:39:48 +02:00
2019-03-16 14:13:35 +01:00
assert . Equal ( t , queryStr , ` SELECT customer.customer_id AS "customer.customer_id", customer.store_id AS "customer.store_id", customer.first_name AS "customer.first_name", customer.last_name AS "customer.last_name", customer.email AS "customer.email", customer.address_id AS "customer.address_id", customer.activebool AS "customer.activebool", customer.create_date AS "customer.create_date", customer.last_update AS "customer.last_update", customer.active AS "customer.active" FROM dvds.customer ORDER BY customer.customer_id ASC ` )
2019-04-29 14:39:48 +02:00
assert . Equal ( t , len ( args ) , 0 )
2019-03-05 18:55:47 +01:00
2019-04-20 19:49:29 +02:00
err = query . Query ( db , & customers )
2019-03-05 18:55:47 +01:00
assert . NilError ( t , err )
2019-03-14 09:18:23 +01:00
assert . Equal ( t , len ( customers ) , 599 )
2019-03-03 17:54:43 +01:00
2019-03-14 09:18:23 +01:00
assert . DeepEqual ( t , customer0 , customers [ 0 ] )
assert . DeepEqual ( t , customer1 , customers [ 1 ] )
assert . DeepEqual ( t , lastCustomer , customers [ 598 ] )
2019-03-03 17:54:43 +01:00
}
2019-03-09 14:20:44 +01:00
2019-05-05 12:37:23 +02:00
func TestSelectAndUnionInProjection ( t * testing . T ) {
query := Payment .
SELECT (
Payment . PaymentID ,
Customer . SELECT ( Customer . CustomerID ) . LIMIT ( 1 ) ,
sqlbuilder . UNION ( Payment . SELECT ( Payment . PaymentID ) . LIMIT ( 1 ) . OFFSET ( 10 ) , Payment . SELECT ( Payment . PaymentID ) . LIMIT ( 1 ) . OFFSET ( 2 ) ) . LIMIT ( 1 ) ,
) .
LIMIT ( 12 )
queryStr , args , err := query . Sql ( )
assert . NilError ( t , err )
fmt . Println ( queryStr )
fmt . Println ( args )
}
2019-04-03 11:03:07 +02:00
//func TestJoinQueryStruct(t *testing.T) {
//
// query := FilmActor.
// INNER_JOIN(Actor, FilmActor.ActorID.Eq(Actor.ActorID)).
// INNER_JOIN(Film, FilmActor.FilmID.Eq(Film.FilmID)).
// INNER_JOIN(Language, Film.LanguageID.Eq(Language.LanguageID)).
// SELECT(FilmActor.AllColumns, Film.AllColumns, Language.AllColumns, Actor.AllColumns).
2019-04-14 17:55:10 +02:00
// WHERE(FilmActor.ActorID.GtEq(1).And(FilmActor.ActorID.LteLiteral(2)))
2019-04-03 11:03:07 +02:00
//
2019-04-29 14:39:48 +02:00
// queryStr, args, err := query.Sql()
2019-04-03 11:03:07 +02:00
// assert.NilError(t, err)
// assert.Equal(t, queryStr, `SELECT film_actor.actor_id AS "film_actor.actor_id", film_actor.film_id AS "film_actor.film_id", film_actor.last_update AS "film_actor.last_update",film.film_id AS "film.film_id", film.title AS "film.title", film.description AS "film.description", film.release_year AS "film.release_year", film.language_id AS "film.language_id", film.rental_duration AS "film.rental_duration", film.rental_rate AS "film.rental_rate", film.length AS "film.length", film.replacement_cost AS "film.replacement_cost", film.rating AS "film.rating", film.last_update AS "film.last_update", film.special_features AS "film.special_features", film.fulltext AS "film.fulltext",language.language_id AS "language.language_id", language.name AS "language.name", language.last_update AS "language.last_update",actor.actor_id AS "actor.actor_id", actor.first_name AS "actor.first_name", actor.last_name AS "actor.last_name", actor.last_update AS "actor.last_update" FROM dvds.film_actor JOIN dvds.actor ON film_actor.actor_id = actor.actor_id JOIN dvds.film ON film_actor.film_id = film.film_id JOIN dvds.language ON film.language_id = language.language_id WHERE (film_actor.actor_id>=1 AND film_actor.actor_id<=2)`)
//
// //fmt.Println(queryStr)
//
// filmActor := []model.FilmActor{}
//
// err = query.Execute(db, &filmActor)
//
// assert.NilError(t, err)
//
// //fmt.Println("ACTORS: --------------------")
// //spew.Dump(filmActor)
//}
2019-03-14 09:18:23 +01:00
func TestJoinQuerySlice ( t * testing . T ) {
type FilmsPerLanguage struct {
Language * model . Language
2019-04-03 19:21:46 +02:00
Film [ ] model . Film
2019-03-14 09:18:23 +01:00
}
filmsPerLanguage := [ ] FilmsPerLanguage { }
limit := 15
2019-04-03 11:03:07 +02:00
query := Film .
INNER_JOIN ( Language , Film . LanguageID . Eq ( Language . LanguageID ) ) .
SELECT ( Language . AllColumns , Film . AllColumns ) .
2019-04-29 14:39:48 +02:00
WHERE ( Film . Rating . EqL ( string ( model . MpaaRating_NC17 ) ) ) .
LIMIT ( 15 )
2019-03-14 09:18:23 +01:00
2019-04-29 14:39:48 +02:00
queryStr , args , err := query . Sql ( )
2019-03-15 21:25:24 +01:00
assert . NilError ( t , err )
2019-04-29 14:39:48 +02:00
fmt . Println ( queryStr )
2019-05-03 12:51:57 +02:00
assert . Equal ( t , queryStr , ` SELECT language.language_id AS "language.language_id", language.name AS "language.name", language.last_update AS "language.last_update", film.film_id AS "film.film_id", film.title AS "film.title", film.description AS "film.description", film.release_year AS "film.release_year", film.language_id AS "film.language_id", film.rental_duration AS "film.rental_duration", film.rental_rate AS "film.rental_rate", film.length AS "film.length", film.replacement_cost AS "film.replacement_cost", film.rating AS "film.rating", film.last_update AS "film.last_update", film.special_features AS "film.special_features", film.fulltext AS "film.fulltext" FROM dvds.film JOIN dvds.language ON film.language_id = language.language_id WHERE film.rating = $1 LIMIT $2 ` )
2019-04-29 14:39:48 +02:00
assert . Equal ( t , len ( args ) , 2 )
assert . Equal ( t , args [ 0 ] , string ( model . MpaaRating_NC17 ) )
assert . Equal ( t , args [ 1 ] , int64 ( 15 ) )
2019-03-14 09:18:23 +01:00
2019-04-20 19:49:29 +02:00
err = query . Query ( db , & filmsPerLanguage )
2019-03-14 09:18:23 +01:00
assert . NilError ( t , err )
//fmt.Println("--------------- result --------------- ")
//spew.Dump(filmsPerLanguage)
2019-03-30 10:17:32 +01:00
//spew.Dump(filmsPerLanguage)
2019-03-14 09:18:23 +01:00
assert . Equal ( t , len ( filmsPerLanguage ) , 1 )
2019-04-03 19:21:46 +02:00
assert . Equal ( t , len ( filmsPerLanguage [ 0 ] . Film ) , limit )
englishFilms := filmsPerLanguage [ 0 ]
assert . Equal ( t , * englishFilms . Film [ 0 ] . Rating , model . MpaaRating_NC17 )
2019-03-14 09:18:23 +01:00
//spew.Dump(filmsPerLanguage)
filmsPerLanguageWithPtrs := [ ] * FilmsPerLanguage { }
2019-04-20 19:49:29 +02:00
err = query . Query ( db , & filmsPerLanguageWithPtrs )
2019-03-14 09:18:23 +01:00
assert . NilError ( t , err )
assert . Equal ( t , len ( filmsPerLanguage ) , 1 )
2019-04-03 19:21:46 +02:00
assert . Equal ( t , len ( filmsPerLanguage [ 0 ] . Film ) , limit )
2019-03-14 09:18:23 +01:00
}
func TestJoinQuerySliceWithPtrs ( t * testing . T ) {
type FilmsPerLanguage struct {
Language model . Language
2019-03-30 10:17:32 +01:00
Film * [ ] * model . Film
2019-03-14 09:18:23 +01:00
}
limit := int64 ( 3 )
2019-04-03 11:03:07 +02:00
query := Film . INNER_JOIN ( Language , Film . LanguageID . Eq ( Language . LanguageID ) ) .
SELECT ( Language . AllColumns , Film . AllColumns ) .
2019-04-29 14:39:48 +02:00
LIMIT ( limit )
2019-03-14 09:18:23 +01:00
filmsPerLanguageWithPtrs := [ ] * FilmsPerLanguage { }
2019-04-20 19:49:29 +02:00
err := query . Query ( db , & filmsPerLanguageWithPtrs )
2019-03-14 09:18:23 +01:00
//spew.Dump(filmsPerLanguageWithPtrs)
assert . NilError ( t , err )
assert . Equal ( t , len ( filmsPerLanguageWithPtrs ) , 1 )
2019-03-30 10:17:32 +01:00
assert . Equal ( t , len ( * filmsPerLanguageWithPtrs [ 0 ] . Film ) , int ( limit ) )
2019-03-14 09:18:23 +01:00
}
2019-03-15 21:55:43 +01:00
func TestSelect_WithoutUniqueColumnSelected ( t * testing . T ) {
2019-04-03 11:03:07 +02:00
query := Customer . SELECT ( Customer . FirstName , Customer . LastName , Customer . Email )
2019-03-15 21:55:43 +01:00
customers := [ ] model . Customer { }
2019-04-20 19:49:29 +02:00
err := query . Query ( db , & customers )
2019-03-15 21:55:43 +01:00
assert . NilError ( t , err )
//spew.Dump(customers)
assert . Equal ( t , len ( customers ) , 599 )
}
func TestSelectOrderByAscDesc ( t * testing . T ) {
customersAsc := [ ] model . Customer { }
2019-04-03 11:03:07 +02:00
err := Customer . SELECT ( Customer . CustomerID , Customer . FirstName , Customer . LastName ) .
2019-05-05 18:03:30 +02:00
ORDER_BY ( Customer . FirstName . ASC ( ) ) .
2019-04-20 19:49:29 +02:00
Query ( db , & customersAsc )
2019-03-15 21:55:43 +01:00
assert . NilError ( t , err )
firstCustomerAsc := customersAsc [ 0 ]
lastCustomerAsc := customersAsc [ len ( customersAsc ) - 1 ]
customersDesc := [ ] model . Customer { }
2019-04-03 11:03:07 +02:00
err = Customer . SELECT ( Customer . CustomerID , Customer . FirstName , Customer . LastName ) .
2019-05-05 18:03:30 +02:00
ORDER_BY ( Customer . FirstName . DESC ( ) ) .
2019-04-20 19:49:29 +02:00
Query ( db , & customersDesc )
2019-03-15 21:55:43 +01:00
assert . NilError ( t , err )
firstCustomerDesc := customersDesc [ 0 ]
lastCustomerDesc := customersDesc [ len ( customersAsc ) - 1 ]
assert . DeepEqual ( t , firstCustomerAsc , lastCustomerDesc )
assert . DeepEqual ( t , lastCustomerAsc , firstCustomerDesc )
customersAscDesc := [ ] model . Customer { }
2019-04-03 11:03:07 +02:00
err = Customer . SELECT ( Customer . CustomerID , Customer . FirstName , Customer . LastName ) .
2019-05-05 18:03:30 +02:00
ORDER_BY ( Customer . FirstName . ASC ( ) , Customer . LastName . DESC ( ) ) .
2019-04-20 19:49:29 +02:00
Query ( db , & customersAscDesc )
2019-03-15 21:55:43 +01:00
assert . NilError ( t , err )
customerAscDesc326 := model . Customer {
CustomerID : 67 ,
FirstName : "Kelly" ,
LastName : "Torres" ,
}
customerAscDesc327 := model . Customer {
CustomerID : 546 ,
FirstName : "Kelly" ,
LastName : "Knott" ,
}
assert . DeepEqual ( t , customerAscDesc326 , customersAscDesc [ 326 ] )
assert . DeepEqual ( t , customerAscDesc327 , customersAscDesc [ 327 ] )
}
2019-03-16 14:13:35 +01:00
func TestSelectFullJoin ( t * testing . T ) {
query := Customer .
2019-04-03 11:03:07 +02:00
FULL_JOIN ( Address , Customer . AddressID . Eq ( Address . AddressID ) ) .
SELECT ( Customer . AllColumns , Address . AllColumns ) .
2019-05-05 18:03:30 +02:00
ORDER_BY ( Customer . CustomerID . ASC ( ) )
2019-03-16 14:13:35 +01:00
2019-04-29 14:39:48 +02:00
queryStr , args , err := query . Sql ( )
2019-03-16 14:13:35 +01:00
assert . NilError ( t , err )
2019-05-03 12:51:57 +02:00
assert . Equal ( t , queryStr , ` SELECT customer.customer_id AS "customer.customer_id", customer.store_id AS "customer.store_id", customer.first_name AS "customer.first_name", customer.last_name AS "customer.last_name", customer.email AS "customer.email", customer.address_id AS "customer.address_id", customer.activebool AS "customer.activebool", customer.create_date AS "customer.create_date", customer.last_update AS "customer.last_update", customer.active AS "customer.active", address.address_id AS "address.address_id", address.address AS "address.address", address.address2 AS "address.address2", address.district AS "address.district", address.city_id AS "address.city_id", address.postal_code AS "address.postal_code", address.phone AS "address.phone", address.last_update AS "address.last_update" FROM dvds.customer FULL JOIN dvds.address ON customer.address_id = address.address_id ORDER BY customer.customer_id ASC ` )
2019-04-29 14:39:48 +02:00
assert . Equal ( t , len ( args ) , 0 )
2019-03-16 14:13:35 +01:00
allCustomersAndAddress := [ ] struct {
Address * model . Address
Customer * model . Customer
} { }
2019-04-20 19:49:29 +02:00
err = query . Query ( db , & allCustomersAndAddress )
2019-03-16 14:13:35 +01:00
assert . NilError ( t , err )
assert . Equal ( t , len ( allCustomersAndAddress ) , 603 )
assert . DeepEqual ( t , allCustomersAndAddress [ 0 ] . Customer , & customer0 )
assert . Assert ( t , allCustomersAndAddress [ 0 ] . Address != nil )
lastCustomerAddress := allCustomersAndAddress [ len ( allCustomersAndAddress ) - 1 ]
assert . Assert ( t , lastCustomerAddress . Customer == nil )
assert . Assert ( t , lastCustomerAddress . Address != nil )
}
func TestSelectFullCrossJoin ( t * testing . T ) {
query := Customer .
2019-05-05 12:37:23 +02:00
CROSS_JOIN ( Address ) .
2019-04-03 11:03:07 +02:00
SELECT ( Customer . AllColumns , Address . AllColumns ) .
2019-05-05 18:03:30 +02:00
ORDER_BY ( Customer . CustomerID . ASC ( ) ) .
2019-04-29 14:39:48 +02:00
LIMIT ( 1000 )
2019-03-16 14:13:35 +01:00
2019-04-29 14:39:48 +02:00
queryStr , args , err := query . Sql ( )
2019-03-16 14:13:35 +01:00
assert . NilError ( t , err )
2019-05-03 12:51:57 +02:00
assert . Equal ( t , queryStr , ` SELECT customer.customer_id AS "customer.customer_id", customer.store_id AS "customer.store_id", customer.first_name AS "customer.first_name", customer.last_name AS "customer.last_name", customer.email AS "customer.email", customer.address_id AS "customer.address_id", customer.activebool AS "customer.activebool", customer.create_date AS "customer.create_date", customer.last_update AS "customer.last_update", customer.active AS "customer.active", address.address_id AS "address.address_id", address.address AS "address.address", address.address2 AS "address.address2", address.district AS "address.district", address.city_id AS "address.city_id", address.postal_code AS "address.postal_code", address.phone AS "address.phone", address.last_update AS "address.last_update" FROM dvds.customer CROSS JOIN dvds.address ORDER BY customer.customer_id ASC LIMIT $1 ` )
2019-04-29 14:39:48 +02:00
assert . Equal ( t , len ( args ) , 1 )
2019-03-16 14:13:35 +01:00
customerAddresCrosJoined := [ ] model . Customer { }
2019-04-20 19:49:29 +02:00
err = query . Query ( db , & customerAddresCrosJoined )
2019-03-16 14:13:35 +01:00
2019-03-17 10:21:44 +01:00
assert . Equal ( t , len ( customerAddresCrosJoined ) , 1000 )
2019-03-16 14:13:35 +01:00
assert . NilError ( t , err )
}
2019-03-16 20:41:06 +01:00
func TestSelectSelfJoin ( t * testing . T ) {
2019-05-05 18:03:30 +02:00
f1 := Film . AS ( "f1" )
2019-03-16 20:41:06 +01:00
//spew.Dump(f1)
2019-05-05 18:03:30 +02:00
f2 := Film . AS ( "f2" )
2019-03-16 20:41:06 +01:00
query := f1 .
2019-04-03 11:03:07 +02:00
INNER_JOIN ( f2 , f1 . FilmID . NotEq ( f2 . FilmID ) . And ( f1 . Length . Eq ( f2 . Length ) ) ) .
SELECT ( f1 . AllColumns , f2 . AllColumns ) .
2019-05-05 18:03:30 +02:00
ORDER_BY ( f1 . FilmID . ASC ( ) )
2019-03-16 20:41:06 +01:00
2019-04-29 14:39:48 +02:00
queryStr , args , err := query . Sql ( )
assert . Equal ( t , len ( args ) , 0 )
2019-03-16 20:41:06 +01:00
assert . NilError ( t , err )
fmt . Println ( queryStr )
type F1 model . Film
type F2 model . Film
theSameLengthFilms := [ ] struct {
F1 F1
F2 F2
} { }
2019-04-20 19:49:29 +02:00
err = query . Query ( db , & theSameLengthFilms )
2019-03-16 20:41:06 +01:00
assert . NilError ( t , err )
2019-03-30 10:17:32 +01:00
//spew.Dump(theSameLengthFilms[0])
2019-03-16 20:41:06 +01:00
assert . Equal ( t , len ( theSameLengthFilms ) , 6972 )
}
2019-03-17 20:41:03 +01:00
func TestSelectAliasColumn ( t * testing . T ) {
2019-05-05 18:03:30 +02:00
f1 := Film . AS ( "f1" )
f2 := Film . AS ( "f2" )
2019-03-17 20:41:03 +01:00
type thesameLengthFilms struct {
Title1 string
Title2 string
Length int16
}
query := f1 .
2019-04-03 11:03:07 +02:00
INNER_JOIN ( f2 , f1 . FilmID . NotEq ( f2 . FilmID ) . And ( f1 . Length . Eq ( f2 . Length ) ) ) .
2019-05-05 18:03:30 +02:00
SELECT ( f1 . Title . AS ( "thesame_length_films.title1" ) ,
f2 . Title . AS ( "thesame_length_films.title2" ) ,
f1 . Length . AS ( "thesame_length_films.length" ) ) .
ORDER_BY ( f1 . Length . ASC ( ) , f1 . Title . ASC ( ) , f2 . Title . ASC ( ) ) .
2019-04-29 14:39:48 +02:00
LIMIT ( 1000 )
2019-03-17 20:41:03 +01:00
2019-04-29 14:39:48 +02:00
queryStr , args , err := query . Sql ( )
2019-03-17 20:41:03 +01:00
assert . NilError ( t , err )
2019-05-03 12:51:57 +02:00
assert . Equal ( t , len ( args ) , 1 )
2019-03-17 20:41:03 +01:00
fmt . Println ( queryStr )
films := [ ] thesameLengthFilms { }
2019-04-20 19:49:29 +02:00
err = query . Query ( db , & films )
2019-03-17 20:41:03 +01:00
assert . NilError ( t , err )
//spew.Dump(films)
assert . Equal ( t , len ( films ) , 1000 )
2019-03-30 10:17:32 +01:00
assert . DeepEqual ( t , films [ 0 ] , thesameLengthFilms { "Alien Center" , "Iron Moon" , 46 } )
}
type Manager staff
type staff struct {
StaffID int32 ` sql:"unique" `
FirstName string
LastName string
//Address *model.Address
//Email *string
//StoreID int16
//Active bool
//Username string
//Password *string
//LastUpdate time.Time
* Manager //`sqlbuilder:"manager"`
}
func TestSelectSelfReferenceType ( t * testing . T ) {
2019-05-05 18:03:30 +02:00
manager := Staff . AS ( "manager" )
2019-03-30 10:17:32 +01:00
query := Staff .
2019-04-03 11:03:07 +02:00
INNER_JOIN ( Address , Staff . AddressID . Eq ( Address . AddressID ) ) .
INNER_JOIN ( manager , Staff . StaffID . Eq ( manager . StaffID ) ) .
SELECT ( Staff . StaffID , Staff . FirstName , Staff . LastName , Address . AllColumns , manager . StaffID , manager . FirstName )
2019-03-30 10:17:32 +01:00
2019-04-29 14:39:48 +02:00
queryStr , args , err := query . Sql ( )
2019-03-30 10:17:32 +01:00
assert . NilError ( t , err )
fmt . Println ( queryStr )
2019-04-29 14:39:48 +02:00
assert . Equal ( t , len ( args ) , 0 )
2019-03-30 10:17:32 +01:00
staffs := [ ] staff { }
2019-04-20 19:49:29 +02:00
err = query . Query ( db , & staffs )
2019-03-30 10:17:32 +01:00
assert . NilError ( t , err )
//spew.Dump(staffs)
}
func TestSubQuery ( t * testing . T ) {
2019-04-03 11:03:07 +02:00
//selectStmtTable := Actor.SELECT(Actor.FirstName, Actor.LastName).AsTable("table_expression")
2019-03-30 10:17:32 +01:00
//
2019-04-03 11:03:07 +02:00
//query := selectStmtTable.SELECT(
2019-05-05 18:03:30 +02:00
// selectStmtTable.RefStringColumn(Actor.FirstName).AS("nesto"),
// selectStmtTable.RefIntColumnName("actor.last_name").AS("nesto2"),
2019-03-30 10:17:32 +01:00
// )
//
2019-04-29 14:39:48 +02:00
//queryStr, args, err := query.Sql()
2019-03-30 10:17:32 +01:00
//
//assert.NilError(t, err)
//
//fmt.Println(queryStr)
2019-04-03 11:03:07 +02:00
//
2019-04-29 14:39:48 +02:00
//avrgCustomer := sqlbuilder.NumExp(Customer.SELECT(Customer.LastName).LIMIT(1))
2019-03-30 10:17:32 +01:00
//
//Customer.
2019-04-03 11:03:07 +02:00
// INNER_JOIN(selectStmtTable, Customer.LastName.Eq(selectStmtTable.RefStringColumn(Actor.FirstName))).
// SELECT(Customer.AllColumns, selectStmtTable.RefIntColumnName("first_name")).
2019-04-14 17:55:10 +02:00
// WHERE(Actor.LastName.Neq(avrgCustomer))
2019-03-30 10:17:32 +01:00
2019-04-03 11:03:07 +02:00
rFilmsOnly := Film . SELECT ( Film . FilmID , Film . Title , Film . Rating ) .
2019-04-29 14:39:48 +02:00
WHERE ( Film . Rating . EqL ( "R" ) ) .
2019-03-30 10:17:32 +01:00
AsTable ( "films" )
2019-04-03 11:03:07 +02:00
query := Actor . INNER_JOIN ( FilmActor , Actor . ActorID . Eq ( FilmActor . FilmID ) ) .
INNER_JOIN ( rFilmsOnly , FilmActor . FilmID . Eq ( rFilmsOnly . RefIntColumn ( Film . FilmID ) ) ) .
SELECT (
2019-03-30 10:17:32 +01:00
Actor . AllColumns ,
FilmActor . AllColumns ,
2019-05-05 18:03:30 +02:00
rFilmsOnly . RefStringColumn ( Film . Title ) . AS ( "film.title" ) ,
rFilmsOnly . RefStringColumn ( Film . Rating ) . AS ( "film.rating" ) ,
2019-03-30 10:17:32 +01:00
)
2019-04-29 14:39:48 +02:00
queryStr , args , err := query . Sql ( )
2019-03-30 10:17:32 +01:00
assert . NilError ( t , err )
2019-04-29 14:39:48 +02:00
assert . Equal ( t , len ( args ) , 1 )
2019-03-30 10:17:32 +01:00
fmt . Println ( queryStr )
}
func TestSelectFunctions ( t * testing . T ) {
2019-05-05 18:03:30 +02:00
query := Film . SELECT ( sqlbuilder . MAX ( Film . RentalRate ) . AS ( "max_film_rate" ) )
2019-03-30 10:17:32 +01:00
2019-04-29 14:39:48 +02:00
str , args , err := query . Sql ( )
2019-03-30 10:17:32 +01:00
assert . NilError ( t , err )
assert . Equal ( t , str , ` SELECT MAX(film.rental_rate) AS "max_film_rate" FROM dvds.film ` )
2019-04-29 14:39:48 +02:00
assert . Equal ( t , len ( args ) , 0 )
2019-03-30 10:17:32 +01:00
fmt . Println ( str )
}
func TestSelectQueryScalar ( t * testing . T ) {
2019-04-03 11:03:07 +02:00
maxFilmRentalRate := sqlbuilder . NumExp ( Film . SELECT ( sqlbuilder . MAX ( Film . RentalRate ) ) )
2019-03-30 10:17:32 +01:00
2019-04-03 11:03:07 +02:00
query := Film . SELECT ( Film . AllColumns ) .
2019-04-29 14:39:48 +02:00
WHERE ( Film . RentalRate . Eq ( maxFilmRentalRate ) ) .
2019-05-05 18:03:30 +02:00
ORDER_BY ( Film . FilmID . ASC ( ) )
2019-03-30 10:17:32 +01:00
2019-04-29 14:39:48 +02:00
queryStr , args , err := query . Sql ( )
2019-03-30 10:17:32 +01:00
assert . NilError ( t , err )
2019-04-29 14:39:48 +02:00
assert . Equal ( t , len ( args ) , 0 )
2019-03-30 10:17:32 +01:00
fmt . Println ( queryStr )
maxRentalRateFilms := [ ] model . Film { }
2019-04-20 19:49:29 +02:00
err = query . Query ( db , & maxRentalRateFilms )
2019-03-30 10:17:32 +01:00
assert . NilError ( t , err )
assert . Equal ( t , len ( maxRentalRateFilms ) , 336 )
2019-04-03 19:21:46 +02:00
gRating := model . MpaaRating_G
2019-03-30 10:17:32 +01:00
assert . DeepEqual ( t , maxRentalRateFilms [ 0 ] , model . Film {
FilmID : 2 ,
Title : "Ace Goldfinger" ,
Description : stringPtr ( "A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China" ) ,
ReleaseYear : int32Ptr ( 2006 ) ,
Language : nil ,
RentalRate : 4.99 ,
Length : int16Ptr ( 48 ) ,
ReplacementCost : 12.99 ,
2019-04-03 19:21:46 +02:00
Rating : & gRating ,
2019-03-30 10:17:32 +01:00
RentalDuration : 3 ,
2019-04-03 14:18:58 +02:00
LastUpdate : * timeWithoutTimeZone ( "2013-05-26 14:50:58.951" , 3 ) ,
2019-03-30 10:17:32 +01:00
SpecialFeatures : stringPtr ( "{Trailers,\"Deleted Scenes\"}" ) ,
Fulltext : "'ace':1 'administr':9 'ancient':19 'astound':4 'car':17 'china':20 'databas':8 'epistl':5 'explor':12 'find':15 'goldfing':2 'must':14" ,
} )
//spew.Dump(maxRentalRateFilms[0])
}
func TestSelectGroupByHaving ( t * testing . T ) {
customersPaymentQuery := Payment .
2019-04-03 11:03:07 +02:00
SELECT (
2019-05-05 18:03:30 +02:00
Payment . CustomerID . AS ( "customer_payment_sum.customer_id" ) ,
sqlbuilder . SUM ( Payment . Amount ) . AS ( "customer_payment_sum.amount_sum" ) ,
2019-03-30 10:17:32 +01:00
) .
2019-04-29 14:39:48 +02:00
GROUP_BY ( Payment . CustomerID ) .
2019-05-05 18:03:30 +02:00
ORDER_BY ( sqlbuilder . SUM ( Payment . Amount ) . ASC ( ) ) .
2019-04-29 14:39:48 +02:00
HAVING ( sqlbuilder . SUM ( Payment . Amount ) . Gt ( sqlbuilder . NewNumericLiteral ( 100 ) ) )
2019-03-30 10:17:32 +01:00
2019-04-29 14:39:48 +02:00
queryStr , args , err := customersPaymentQuery . Sql ( )
2019-03-30 10:17:32 +01:00
assert . NilError ( t , err )
fmt . Println ( queryStr )
2019-04-29 14:39:48 +02:00
assert . Equal ( t , len ( args ) , 1 )
2019-05-03 12:51:57 +02:00
assert . Equal ( t , queryStr , ` SELECT payment.customer_id AS "customer_payment_sum.customer_id", SUM(payment.amount) AS "customer_payment_sum.amount_sum" FROM dvds.payment GROUP BY payment.customer_id HAVING SUM(payment.amount)>$1 ORDER BY SUM(payment.amount) ASC ` )
2019-03-30 10:17:32 +01:00
type CustomerPaymentSum struct {
CustomerID int16
AmountSum float64
}
customerPaymentSum := [ ] CustomerPaymentSum { }
2019-04-20 19:49:29 +02:00
err = customersPaymentQuery . Query ( db , & customerPaymentSum )
2019-03-30 10:17:32 +01:00
assert . NilError ( t , err )
assert . Equal ( t , len ( customerPaymentSum ) , 296 )
assert . DeepEqual ( t , customerPaymentSum [ 0 ] , CustomerPaymentSum {
CustomerID : 135 ,
AmountSum : 100.72 ,
} )
}
func TestSelectGroupBy2 ( t * testing . T ) {
type CustomerWithAmounts struct {
Customer * model . Customer
AmountSum float64
}
customersWithAmounts := [ ] CustomerWithAmounts { }
customersPaymentSubQuery := Payment .
2019-04-03 11:03:07 +02:00
SELECT (
2019-03-30 10:17:32 +01:00
Payment . CustomerID ,
2019-05-05 18:03:30 +02:00
sqlbuilder . SUM ( Payment . Amount ) . AS ( "amount_sum" ) ,
2019-03-30 10:17:32 +01:00
) .
2019-04-29 14:39:48 +02:00
GROUP_BY ( Payment . CustomerID )
2019-03-30 10:17:32 +01:00
customersPaymentTable := customersPaymentSubQuery . AsTable ( "customer_payment_sum" )
2019-04-03 11:03:07 +02:00
amountSumColumn := customersPaymentTable . RefIntColumnName ( "amount_sum" )
2019-03-30 10:17:32 +01:00
query := Customer .
2019-04-03 11:03:07 +02:00
INNER_JOIN ( customersPaymentTable , Customer . CustomerID . Eq ( customersPaymentTable . RefIntColumn ( Payment . CustomerID ) ) ) .
2019-05-05 18:03:30 +02:00
SELECT ( Customer . AllColumns , amountSumColumn . AS ( "customer_with_amounts.amount_sum" ) ) .
ORDER_BY ( amountSumColumn . ASC ( ) )
2019-03-30 10:17:32 +01:00
2019-04-29 14:39:48 +02:00
queryStr , args , err := query . Sql ( )
2019-03-30 10:17:32 +01:00
assert . NilError ( t , err )
fmt . Println ( queryStr )
2019-04-29 14:39:48 +02:00
assert . Equal ( t , len ( args ) , 0 )
2019-03-30 10:17:32 +01:00
2019-04-20 19:49:29 +02:00
err = query . Query ( db , & customersWithAmounts )
2019-03-30 10:17:32 +01:00
assert . NilError ( t , err )
//spew.Dump(customersWithAmounts)
assert . Equal ( t , len ( customersWithAmounts ) , 599 )
assert . DeepEqual ( t , customersWithAmounts [ 0 ] . Customer , & model . Customer {
CustomerID : 318 ,
StoreID : 1 ,
FirstName : "Brian" ,
LastName : "Wyman" ,
Email : stringPtr ( "brian.wyman@sakilacustomer.org" ) ,
Activebool : true ,
2019-04-03 14:18:58 +02:00
CreateDate : * timeWithoutTimeZone ( "2006-02-14 00:00:00" , 0 ) ,
LastUpdate : timeWithoutTimeZone ( "2013-05-26 14:49:45.738" , 3 ) ,
2019-03-30 10:17:32 +01:00
Active : int32Ptr ( 1 ) ,
} )
assert . Equal ( t , customersWithAmounts [ 0 ] . AmountSum , 27.93 )
2019-04-03 14:18:58 +02:00
}
func TestSelectTimeColumns ( t * testing . T ) {
query := Payment . SELECT ( Payment . AllColumns ) .
2019-04-29 14:39:48 +02:00
WHERE ( Payment . PaymentDate . LtEqL ( "2007-02-14 22:16:01" ) ) .
2019-05-05 18:03:30 +02:00
ORDER_BY ( Payment . PaymentDate . ASC ( ) )
2019-04-03 14:18:58 +02:00
2019-04-29 14:39:48 +02:00
queryStr , args , err := query . Sql ( )
2019-04-03 14:18:58 +02:00
assert . NilError ( t , err )
2019-04-29 14:39:48 +02:00
assert . Equal ( t , len ( args ) , 1 )
2019-04-03 14:18:58 +02:00
fmt . Println ( queryStr )
payments := [ ] model . Payment { }
2019-03-30 10:17:32 +01:00
2019-04-20 19:49:29 +02:00
err = query . Query ( db , & payments )
2019-04-03 14:18:58 +02:00
assert . NilError ( t , err )
//spew.Dump(payments)
assert . Equal ( t , len ( payments ) , 9 )
assert . DeepEqual ( t , payments [ 0 ] , model . Payment {
PaymentID : 17793 ,
Amount : 2.99 ,
PaymentDate : * timeWithoutTimeZone ( "2007-02-14 21:21:59.996577" , 6 ) ,
} )
2019-03-30 10:17:32 +01:00
}
2019-05-03 11:59:18 +02:00
func TestUnion ( t * testing . T ) {
query := sqlbuilder . UNION (
Payment .
2019-05-05 18:03:30 +02:00
SELECT ( Payment . PaymentID . AS ( "payment.payment_id" ) , Payment . Amount ) .
2019-05-03 11:59:18 +02:00
WHERE ( Payment . Amount . LtEqL ( 100 ) ) ,
Payment .
SELECT ( Payment . PaymentID , Payment . Amount ) .
WHERE ( Payment . Amount . GtEqL ( 200 ) ) ,
) .
2019-05-05 18:03:30 +02:00
ORDER_BY ( sqlbuilder . RefColumn ( "payment.payment_id" ) . ASC ( ) , Payment . Amount . DESC ( ) ) .
2019-05-03 11:59:18 +02:00
LIMIT ( 10 ) . OFFSET ( 20 )
queryStr , args , err := query . Sql ( )
assert . NilError ( t , err )
fmt . Println ( queryStr )
fmt . Println ( args )
dest := [ ] model . Payment { }
err = query . Query ( db , & dest )
assert . NilError ( t , err )
assert . Equal ( t , len ( dest ) , 10 )
assert . DeepEqual ( t , dest [ 0 ] , model . Payment {
PaymentID : 17523 ,
Amount : 4.99 ,
} )
assert . DeepEqual ( t , dest [ 1 ] , model . Payment {
PaymentID : 17524 ,
Amount : 0.99 ,
} )
assert . DeepEqual ( t , dest [ 9 ] , model . Payment {
PaymentID : 17532 ,
Amount : 8.99 ,
} )
}
2019-03-30 10:17:32 +01:00
func int16Ptr ( i int16 ) * int16 {
return & i
2019-03-17 20:41:03 +01:00
}
2019-03-14 09:18:23 +01:00
func int32Ptr ( i int32 ) * int32 {
return & i
}
func stringPtr ( s string ) * string {
return & s
}
2019-04-03 14:18:58 +02:00
func timeWithoutTimeZone ( t string , precision int ) * time . Time {
precisionStr := ""
if precision > 0 {
precisionStr = "." + strings . Repeat ( "9" , precision )
}
time , err := time . Parse ( "2006-01-02 15:04:05" + precisionStr + " +0000" , t + " +0000" )
2019-03-14 09:18:23 +01:00
if err != nil {
panic ( err )
}
return & time
}
2019-03-16 14:13:35 +01:00
var customer0 = model . Customer {
CustomerID : 1 ,
StoreID : 1 ,
FirstName : "Mary" ,
LastName : "Smith" ,
Email : stringPtr ( "mary.smith@sakilacustomer.org" ) ,
Address : nil ,
Activebool : true ,
2019-04-03 14:18:58 +02:00
CreateDate : * timeWithoutTimeZone ( "2006-02-14 00:00:00" , 0 ) ,
LastUpdate : timeWithoutTimeZone ( "2013-05-26 14:49:45.738" , 3 ) ,
2019-03-16 14:13:35 +01:00
Active : int32Ptr ( 1 ) ,
}
var customer1 = model . Customer {
CustomerID : 2 ,
StoreID : 1 ,
FirstName : "Patricia" ,
LastName : "Johnson" ,
Email : stringPtr ( "patricia.johnson@sakilacustomer.org" ) ,
Address : nil ,
Activebool : true ,
2019-04-03 14:18:58 +02:00
CreateDate : * timeWithoutTimeZone ( "2006-02-14 00:00:00" , 0 ) ,
LastUpdate : timeWithoutTimeZone ( "2013-05-26 14:49:45.738" , 3 ) ,
2019-03-16 14:13:35 +01:00
Active : int32Ptr ( 1 ) ,
}
var lastCustomer = model . Customer {
CustomerID : 599 ,
StoreID : 2 ,
FirstName : "Austin" ,
LastName : "Cintron" ,
Email : stringPtr ( "austin.cintron@sakilacustomer.org" ) ,
Address : nil ,
Activebool : true ,
2019-04-03 14:18:58 +02:00
CreateDate : * timeWithoutTimeZone ( "2006-02-14 00:00:00" , 0 ) ,
LastUpdate : timeWithoutTimeZone ( "2013-05-26 14:49:45.738" , 3 ) ,
2019-03-16 14:13:35 +01:00
Active : int32Ptr ( 1 ) ,
}