From 9a3f12ea5fbd97271de30a425d5abf767c03f401 Mon Sep 17 00:00:00 2001 From: Christian King Date: Thu, 17 Oct 2019 13:27:18 -0400 Subject: [PATCH] Fix issue with using UUID primary keys in complex return types When using a UUID as a primary key with PostgreSQL the grouping was defaulting to the row which caused incorrect results to be returned. --- qrm/utill.go | 4 +- tests/postgres/sample_test.go | 148 ++++++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+), 1 deletion(-) diff --git a/qrm/utill.go b/qrm/utill.go index 7b6edaa..baee26e 100644 --- a/qrm/utill.go +++ b/qrm/utill.go @@ -170,7 +170,9 @@ func isSimpleModelType(objType reflect.Type) bool { case reflect.Slice: return objType.Elem().Kind() == reflect.Uint8 //[]byte case reflect.Struct: - return objType == timeType || objType == uuidType // time.Time || uuid.UUID + return objType == timeType + case reflect.Array: + return objType == uuidType // uuid.UUID returns reflect.Array kind } return false diff --git a/tests/postgres/sample_test.go b/tests/postgres/sample_test.go index 32502a5..41c62f8 100644 --- a/tests/postgres/sample_test.go +++ b/tests/postgres/sample_test.go @@ -30,6 +30,154 @@ WHERE all_types.uuid = 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'; assert.DeepEqual(t, result.UUIDPtr, UUIDPtr("a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11")) } +func TestUUIDComplex(t *testing.T) { + query := Person.INNER_JOIN(PersonPhone, PersonPhone.PersonID.EQ(Person.PersonID)). + SELECT(Person.AllColumns, PersonPhone.AllColumns). + ORDER_BY(Person.PersonID.ASC(), PersonPhone.PhoneID.ASC()) + + t.Run("slice of structs", func(t *testing.T) { + + var dest []struct { + model.Person + Phones []struct { + model.PersonPhone + } + } + + err := query.Query(db, &dest) + + assert.NilError(t, err) + assert.Equal(t, len(dest), 2) + testutils.AssertJSON(t, dest, ` +[ + { + "PersonID": "b68dbff4-a87d-11e9-a7f2-98ded00c39c6", + "FirstName": "Sad", + "LastName": "John", + "Mood": "sad", + "Phones": [ + { + "PhoneID": "02b61cc4-d500-4847-bd36-111eccbc7a51", + "PhoneNumber": "212-555-1211", + "PersonID": "b68dbff4-a87d-11e9-a7f2-98ded00c39c6" + } + ] + }, + { + "PersonID": "b68dbff6-a87d-11e9-a7f2-98ded00c39c8", + "FirstName": "Ok", + "LastName": "John", + "Mood": "ok", + "Phones": [ + { + "PhoneID": "02b61cc4-d500-4847-bd36-111eccbc7a52", + "PhoneNumber": "212-555-1212", + "PersonID": "b68dbff6-a87d-11e9-a7f2-98ded00c39c8" + }, + { + "PhoneID": "02b61cc4-d500-4847-bd36-111eccbc7a53", + "PhoneNumber": "212-555-1213", + "PersonID": "b68dbff6-a87d-11e9-a7f2-98ded00c39c8" + } + ] + } +] +`) + + }) + + t.Run("single struct", func(t *testing.T) { + singleQuery := query.WHERE(Person.PersonID.EQ(String("b68dbff6-a87d-11e9-a7f2-98ded00c39c8"))) + + var dest struct { + model.Person + Phones []struct { + model.PersonPhone + } + } + err := singleQuery.Query(db, &dest) + assert.NilError(t, err) + + testutils.AssertJSON(t, dest, ` +{ + "PersonID": "b68dbff6-a87d-11e9-a7f2-98ded00c39c8", + "FirstName": "Ok", + "LastName": "John", + "Mood": "ok", + "Phones": [ + { + "PhoneID": "02b61cc4-d500-4847-bd36-111eccbc7a52", + "PhoneNumber": "212-555-1212", + "PersonID": "b68dbff6-a87d-11e9-a7f2-98ded00c39c8" + }, + { + "PhoneID": "02b61cc4-d500-4847-bd36-111eccbc7a53", + "PhoneNumber": "212-555-1213", + "PersonID": "b68dbff6-a87d-11e9-a7f2-98ded00c39c8" + } + ] +} +`) + }) + + t.Run("slice of structs left join", func(t *testing.T) { + leftQuery := Person.LEFT_JOIN(PersonPhone, PersonPhone.PersonID.EQ(Person.PersonID)). + SELECT(Person.AllColumns, PersonPhone.AllColumns). + ORDER_BY(Person.PersonID.ASC(), PersonPhone.PhoneID.ASC()) + var dest []struct { + model.Person + Phones []struct { + model.PersonPhone + } + } + err := leftQuery.Query(db, &dest) + + assert.NilError(t, err) + testutils.AssertJSON(t, dest, ` +[ + { + "PersonID": "b68dbff4-a87d-11e9-a7f2-98ded00c39c6", + "FirstName": "Sad", + "LastName": "John", + "Mood": "sad", + "Phones": [ + { + "PhoneID": "02b61cc4-d500-4847-bd36-111eccbc7a51", + "PhoneNumber": "212-555-1211", + "PersonID": "b68dbff4-a87d-11e9-a7f2-98ded00c39c6" + } + ] + }, + { + "PersonID": "b68dbff5-a87d-11e9-a7f2-98ded00c39c7", + "FirstName": "Ok", + "LastName": "John", + "Mood": "ok", + "Phones": null + }, + { + "PersonID": "b68dbff6-a87d-11e9-a7f2-98ded00c39c8", + "FirstName": "Ok", + "LastName": "John", + "Mood": "ok", + "Phones": [ + { + "PhoneID": "02b61cc4-d500-4847-bd36-111eccbc7a52", + "PhoneNumber": "212-555-1212", + "PersonID": "b68dbff6-a87d-11e9-a7f2-98ded00c39c8" + }, + { + "PhoneID": "02b61cc4-d500-4847-bd36-111eccbc7a53", + "PhoneNumber": "212-555-1213", + "PersonID": "b68dbff6-a87d-11e9-a7f2-98ded00c39c8" + } + ] + } +] +`) + }) + +} func TestEnumType(t *testing.T) { query := Person. SELECT(Person.AllColumns)