Fix for bug226.

Add struct fieldName to groupKey to have a unique groupKey for each field object.
This commit is contained in:
go-jet 2023-04-13 10:45:08 +02:00
parent c7962aba71
commit 14bd3b6c3b
2 changed files with 93 additions and 19 deletions

View file

@ -238,7 +238,7 @@ func mapRowToStruct(
if fieldMap.complexType { if fieldMap.complexType {
var changed bool var changed bool
changed, err = mapRowToDestinationValue(scanContext, groupKey, fieldValue, &field) changed, err = mapRowToDestinationValue(scanContext, concat(groupKey, ":", field.Name), fieldValue, &field)
if err != nil { if err != nil {
return return

View file

@ -387,42 +387,115 @@ LIMIT 15;
require.Equal(t, len(filmsPerLanguage[0].Film), limit) require.Equal(t, len(filmsPerLanguage[0].Film), limit)
} }
// https://github.com/go-jet/jet/issues/226
func TestGroupingBug226(t *testing.T) { func TestGroupingBug226(t *testing.T) {
type Address1 struct {
model.Address type Staffs struct {
StaffList []model.Staff
} }
type Staff1 struct { type MyStore struct {
model.Staff
}
type Store1 struct {
model.Store model.Store
Address *Address1 StaffList []model.Staff
Staffs []Staff1 Staffs Staffs
} }
stmt := SELECT( stmt := SELECT(
Store.AllColumns, Store.AllColumns,
Address.AllColumns,
Staff.AllColumns, Staff.AllColumns,
).FROM( ).FROM(
Store.INNER_JOIN( Store.INNER_JOIN(
Address,
Address.AddressID.EQ(Store.AddressID),
).INNER_JOIN(
Staff, Staff,
Staff.StoreID.EQ(Store.StoreID), Staff.StoreID.EQ(Store.StoreID),
), ),
) )
var dest []Store1 var dest []MyStore
err := stmt.Query(db, &dest) err := stmt.Query(db, &dest)
require.NoError(t, err) require.NoError(t, err)
testutils.PrintJson(dest) testutils.AssertJSON(t, dest, `
[
{
"StoreID": 1,
"ManagerStaffID": 1,
"AddressID": 1,
"LastUpdate": "2006-02-15T09:57:12Z",
"StaffList": [
{
"StaffID": 1,
"FirstName": "Mike",
"LastName": "Hillyer",
"AddressID": 3,
"Email": "Mike.Hillyer@sakilastaff.com",
"StoreID": 1,
"Active": true,
"Username": "Mike",
"Password": "8cb2237d0679ca88db6464eac60da96345513964",
"LastUpdate": "2006-05-16T16:13:11.79328Z",
"Picture": "iVBORw0KWgo="
}
],
"Staffs": {
"StaffList": [
{
"StaffID": 1,
"FirstName": "Mike",
"LastName": "Hillyer",
"AddressID": 3,
"Email": "Mike.Hillyer@sakilastaff.com",
"StoreID": 1,
"Active": true,
"Username": "Mike",
"Password": "8cb2237d0679ca88db6464eac60da96345513964",
"LastUpdate": "2006-05-16T16:13:11.79328Z",
"Picture": "iVBORw0KWgo="
}
]
}
},
{
"StoreID": 2,
"ManagerStaffID": 2,
"AddressID": 2,
"LastUpdate": "2006-02-15T09:57:12Z",
"StaffList": [
{
"StaffID": 2,
"FirstName": "Jon",
"LastName": "Stephens",
"AddressID": 4,
"Email": "Jon.Stephens@sakilastaff.com",
"StoreID": 2,
"Active": true,
"Username": "Jon",
"Password": "8cb2237d0679ca88db6464eac60da96345513964",
"LastUpdate": "2006-05-16T16:13:11.79328Z",
"Picture": null
}
],
"Staffs": {
"StaffList": [
{
"StaffID": 2,
"FirstName": "Jon",
"LastName": "Stephens",
"AddressID": 4,
"Email": "Jon.Stephens@sakilastaff.com",
"StoreID": 2,
"Active": true,
"Username": "Jon",
"Password": "8cb2237d0679ca88db6464eac60da96345513964",
"LastUpdate": "2006-05-16T16:13:11.79328Z",
"Picture": null
}
]
}
}
]
`)
} }
func TestExecution1(t *testing.T) { func TestExecution1(t *testing.T) {
@ -470,14 +543,15 @@ ORDER BY city.city_id, address.address_id, customer.customer_id;
Customers []struct { Customers []struct {
model.Customer model.Customer
Address model.Address Address []model.Address
} }
} }
err := stmt.Query(db, &dest) err := stmt.Query(db, &dest)
require.NoError(t, err) require.NoError(t, err)
testutils.PrintJson(dest)
require.Equal(t, len(dest), 2) require.Equal(t, len(dest), 2)
require.Equal(t, dest[0].City.City, "London") require.Equal(t, dest[0].City.City, "London")
require.Equal(t, dest[1].City.City, "York") require.Equal(t, dest[1].City.City, "York")
@ -498,7 +572,7 @@ func TestExecution2(t *testing.T) {
ID int32 `sql:"primary_key"` ID int32 `sql:"primary_key"`
LastName *string LastName *string
Address MyAddress Address []MyAddress
} }
type MyCity struct { type MyCity struct {