perf: query data AS OF SYSTEM TIME (#5231)

Queries the data in the storage layser at the timestamp when the call hit the API layer
This commit is contained in:
Silvan
2023-02-27 22:36:43 +01:00
committed by GitHub
parent 80003939ad
commit e38abdcdf3
170 changed files with 3101 additions and 3169 deletions

View File

@@ -8,7 +8,6 @@ import (
"regexp"
"testing"
sq "github.com/Masterminds/squirrel"
"golang.org/x/text/language"
"github.com/zitadel/zitadel/internal/database"
@@ -59,7 +58,8 @@ var (
` ON login_names.user_id = projections.users8.id AND login_names.instance_id = projections.users8.instance_id` +
` LEFT JOIN` +
` (` + preferredLoginNameQuery + `) AS preferred_login_name` +
` ON preferred_login_name.user_id = projections.users8.id AND preferred_login_name.instance_id = projections.users8.instance_id`
` ON preferred_login_name.user_id = projections.users8.id AND preferred_login_name.instance_id = projections.users8.instance_id` +
` AS OF SYSTEM TIME '-1 ms'`
userCols = []string{
"id",
"creation_date",
@@ -106,7 +106,8 @@ var (
` projections.users8_humans.gender,` +
` projections.users8_humans.avatar_key` +
` FROM projections.users8` +
` LEFT JOIN projections.users8_humans ON projections.users8.id = projections.users8_humans.user_id AND projections.users8.instance_id = projections.users8_humans.instance_id`
` LEFT JOIN projections.users8_humans ON projections.users8.id = projections.users8_humans.user_id AND projections.users8.instance_id = projections.users8_humans.instance_id` +
` AS OF SYSTEM TIME '-1 ms'`
profileCols = []string{
"id",
"creation_date",
@@ -131,7 +132,8 @@ var (
` projections.users8_humans.email,` +
` projections.users8_humans.is_email_verified` +
` FROM projections.users8` +
` LEFT JOIN projections.users8_humans ON projections.users8.id = projections.users8_humans.user_id AND projections.users8.instance_id = projections.users8_humans.instance_id`
` LEFT JOIN projections.users8_humans ON projections.users8.id = projections.users8_humans.user_id AND projections.users8.instance_id = projections.users8_humans.instance_id` +
` AS OF SYSTEM TIME '-1 ms'`
emailCols = []string{
"id",
"creation_date",
@@ -151,7 +153,8 @@ var (
` projections.users8_humans.phone,` +
` projections.users8_humans.is_phone_verified` +
` FROM projections.users8` +
` LEFT JOIN projections.users8_humans ON projections.users8.id = projections.users8_humans.user_id AND projections.users8.instance_id = projections.users8_humans.instance_id`
` LEFT JOIN projections.users8_humans ON projections.users8.id = projections.users8_humans.user_id AND projections.users8.instance_id = projections.users8_humans.instance_id` +
` AS OF SYSTEM TIME '-1 ms'`
phoneCols = []string{
"id",
"creation_date",
@@ -169,7 +172,8 @@ var (
` projections.users8_humans.email,` +
` projections.users8_humans.is_email_verified` +
` FROM projections.users8` +
` LEFT JOIN projections.users8_humans ON projections.users8.id = projections.users8_humans.user_id AND projections.users8.instance_id = projections.users8_humans.instance_id`
` LEFT JOIN projections.users8_humans ON projections.users8.id = projections.users8_humans.user_id AND projections.users8.instance_id = projections.users8_humans.instance_id` +
` AS OF SYSTEM TIME '-1 ms'`
userUniqueCols = []string{
"id",
"state",
@@ -211,7 +215,8 @@ var (
` ON login_names.user_id = projections.users8.id AND login_names.instance_id = projections.users8.instance_id` +
` LEFT JOIN` +
` (` + preferredLoginNameQuery + `) AS preferred_login_name` +
` ON preferred_login_name.user_id = projections.users8.id AND preferred_login_name.instance_id = projections.users8.instance_id`
` ON preferred_login_name.user_id = projections.users8.id AND preferred_login_name.instance_id = projections.users8.instance_id` +
` AS OF SYSTEM TIME '-1 ms'`
notifyUserCols = []string{
"id",
"creation_date",
@@ -277,7 +282,8 @@ var (
` ON login_names.user_id = projections.users8.id AND login_names.instance_id = projections.users8.instance_id` +
` LEFT JOIN` +
` (` + preferredLoginNameQuery + `) AS preferred_login_name` +
` ON preferred_login_name.user_id = projections.users8.id AND preferred_login_name.instance_id = projections.users8.instance_id`
` ON preferred_login_name.user_id = projections.users8.id AND preferred_login_name.instance_id = projections.users8.instance_id` +
` AS OF SYSTEM TIME '-1 ms'`
usersCols = []string{
"id",
"creation_date",
@@ -324,10 +330,8 @@ func Test_UserPrepares(t *testing.T) {
object interface{}
}{
{
name: "prepareUserQuery no result",
prepare: func() (sq.SelectBuilder, func(*sql.Row) (*User, error)) {
return prepareUserQuery()
},
name: "prepareUserQuery no result",
prepare: prepareUserQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(userQuery),
@@ -344,10 +348,8 @@ func Test_UserPrepares(t *testing.T) {
object: (*User)(nil),
},
{
name: "prepareUserQuery human found",
prepare: func() (sq.SelectBuilder, func(*sql.Row) (*User, error)) {
return prepareUserQuery()
},
name: "prepareUserQuery human found",
prepare: prepareUserQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(userQuery),
@@ -413,10 +415,8 @@ func Test_UserPrepares(t *testing.T) {
},
},
{
name: "prepareUserQuery machine found",
prepare: func() (sq.SelectBuilder, func(*sql.Row) (*User, error)) {
return prepareUserQuery()
},
name: "prepareUserQuery machine found",
prepare: prepareUserQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(userQuery),
@@ -475,10 +475,8 @@ func Test_UserPrepares(t *testing.T) {
},
},
{
name: "prepareUserQuery sql err",
prepare: func() (sq.SelectBuilder, func(*sql.Row) (*User, error)) {
return prepareUserQuery()
},
name: "prepareUserQuery sql err",
prepare: prepareUserQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(userQuery),
@@ -842,10 +840,8 @@ func Test_UserPrepares(t *testing.T) {
object: nil,
},
{
name: "prepareNotifyUserQuery no result",
prepare: func() (sq.SelectBuilder, func(*sql.Row) (*NotifyUser, error)) {
return prepareNotifyUserQuery()
},
name: "prepareNotifyUserQuery no result",
prepare: prepareNotifyUserQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(notifyUserQuery),
@@ -862,10 +858,8 @@ func Test_UserPrepares(t *testing.T) {
object: (*NotifyUser)(nil),
},
{
name: "prepareNotifyUserQuery notify found",
prepare: func() (sq.SelectBuilder, func(*sql.Row) (*NotifyUser, error)) {
return prepareNotifyUserQuery()
},
name: "prepareNotifyUserQuery notify found",
prepare: prepareNotifyUserQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(notifyUserQuery),
@@ -927,10 +921,8 @@ func Test_UserPrepares(t *testing.T) {
},
},
{
name: "prepareNotifyUserQuery not notify found (error)",
prepare: func() (sq.SelectBuilder, func(*sql.Row) (*NotifyUser, error)) {
return prepareNotifyUserQuery()
},
name: "prepareNotifyUserQuery not notify found (error)",
prepare: prepareNotifyUserQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(notifyUserQuery),
@@ -974,10 +966,8 @@ func Test_UserPrepares(t *testing.T) {
object: (*NotifyUser)(nil),
},
{
name: "prepareNotifyUserQuery sql err",
prepare: func() (sq.SelectBuilder, func(*sql.Row) (*NotifyUser, error)) {
return prepareNotifyUserQuery()
},
name: "prepareNotifyUserQuery sql err",
prepare: prepareNotifyUserQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(notifyUserQuery),
@@ -993,10 +983,8 @@ func Test_UserPrepares(t *testing.T) {
object: nil,
},
{
name: "prepareUsersQuery no result",
prepare: func() (sq.SelectBuilder, func(*sql.Rows) (*Users, error)) {
return prepareUsersQuery()
},
name: "prepareUsersQuery no result",
prepare: prepareUsersQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(usersQuery),
@@ -1013,10 +1001,8 @@ func Test_UserPrepares(t *testing.T) {
object: &Users{Users: []*User{}},
},
{
name: "prepareUsersQuery one result",
prepare: func() (sq.SelectBuilder, func(*sql.Rows) (*Users, error)) {
return prepareUsersQuery()
},
name: "prepareUsersQuery one result",
prepare: prepareUsersQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(usersQuery),
@@ -1090,10 +1076,8 @@ func Test_UserPrepares(t *testing.T) {
},
},
{
name: "prepareUsersQuery multiple results",
prepare: func() (sq.SelectBuilder, func(*sql.Rows) (*Users, error)) {
return prepareUsersQuery()
},
name: "prepareUsersQuery multiple results",
prepare: prepareUsersQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(usersQuery),
@@ -1216,10 +1200,8 @@ func Test_UserPrepares(t *testing.T) {
},
},
{
name: "prepareUsersQuery sql err",
prepare: func() (sq.SelectBuilder, func(*sql.Rows) (*Users, error)) {
return prepareUsersQuery()
},
name: "prepareUsersQuery sql err",
prepare: prepareUsersQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(usersQuery),
@@ -1237,7 +1219,7 @@ func Test_UserPrepares(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
assertPrepare(t, tt.prepare, tt.object, tt.want.sqlExpectations, tt.want.err)
assertPrepare(t, tt.prepare, tt.object, tt.want.sqlExpectations, tt.want.err, defaultPrepareArgs...)
})
}
}