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

@@ -11,13 +11,66 @@ import (
"github.com/DATA-DOG/go-sqlmock"
"github.com/zitadel/zitadel/internal/database"
"github.com/zitadel/zitadel/internal/domain"
"github.com/zitadel/zitadel/internal/errors"
)
var (
orgUniqueQuery = "SELECT COUNT(*) = 0 FROM projections.orgs LEFT JOIN projections.org_domains2 ON projections.orgs.id = projections.org_domains2.org_id AND projections.orgs.instance_id = projections.org_domains2.instance_id WHERE (projections.org_domains2.is_verified = $1 AND projections.orgs.instance_id = $2 AND (projections.org_domains2.domain ILIKE $3 OR projections.orgs.name ILIKE $4) AND projections.orgs.org_state <> $5)"
orgUniqueQuery = "SELECT COUNT(*) = 0 FROM projections.orgs LEFT JOIN projections.org_domains2 ON projections.orgs.id = projections.org_domains2.org_id AND projections.orgs.instance_id = projections.org_domains2.instance_id AS OF SYSTEM TIME '-1 ms' WHERE (projections.org_domains2.is_verified = $1 AND projections.orgs.instance_id = $2 AND (projections.org_domains2.domain ILIKE $3 OR projections.orgs.name ILIKE $4) AND projections.orgs.org_state <> $5)"
orgUniqueCols = []string{"is_unique"}
prepareOrgsQueryStmt = `SELECT projections.orgs.id,` +
` projections.orgs.creation_date,` +
` projections.orgs.change_date,` +
` projections.orgs.resource_owner,` +
` projections.orgs.org_state,` +
` projections.orgs.sequence,` +
` projections.orgs.name,` +
` projections.orgs.primary_domain,` +
` COUNT(*) OVER ()` +
` FROM projections.orgs` +
` AS OF SYSTEM TIME '-1 ms' `
prepareOrgsQueryCols = []string{
"id",
"creation_date",
"change_date",
"resource_owner",
"org_state",
"sequence",
"name",
"primary_domain",
"count",
}
prepareOrgQueryStmt = `SELECT projections.orgs.id,` +
` projections.orgs.creation_date,` +
` projections.orgs.change_date,` +
` projections.orgs.resource_owner,` +
` projections.orgs.org_state,` +
` projections.orgs.sequence,` +
` projections.orgs.name,` +
` projections.orgs.primary_domain` +
` FROM projections.orgs` +
` AS OF SYSTEM TIME '-1 ms' `
prepareOrgQueryCols = []string{
"id",
"creation_date",
"change_date",
"resource_owner",
"org_state",
"sequence",
"name",
"primary_domain",
}
prepareOrgUniqueStmt = `SELECT COUNT(*) = 0` +
` FROM projections.orgs` +
` LEFT JOIN projections.org_domains2 ON projections.orgs.id = projections.org_domains2.org_id AND projections.orgs.instance_id = projections.org_domains2.instance_id` +
` AS OF SYSTEM TIME '-1 ms' `
prepareOrgUniqueCols = []string{
"count",
}
)
func Test_OrgPrepares(t *testing.T) {
@@ -36,16 +89,7 @@ func Test_OrgPrepares(t *testing.T) {
prepare: prepareOrgsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.orgs.id,`+
` projections.orgs.creation_date,`+
` projections.orgs.change_date,`+
` projections.orgs.resource_owner,`+
` projections.orgs.org_state,`+
` projections.orgs.sequence,`+
` projections.orgs.name,`+
` projections.orgs.primary_domain,`+
` COUNT(*) OVER ()`+
` FROM projections.orgs`),
regexp.QuoteMeta(prepareOrgsQueryStmt),
nil,
nil,
),
@@ -57,27 +101,8 @@ func Test_OrgPrepares(t *testing.T) {
prepare: prepareOrgsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.orgs.id,`+
` projections.orgs.creation_date,`+
` projections.orgs.change_date,`+
` projections.orgs.resource_owner,`+
` projections.orgs.org_state,`+
` projections.orgs.sequence,`+
` projections.orgs.name,`+
` projections.orgs.primary_domain,`+
` COUNT(*) OVER ()`+
` FROM projections.orgs`),
[]string{
"id",
"creation_date",
"change_date",
"resource_owner",
"org_state",
"sequence",
"name",
"primary_domain",
"count",
},
regexp.QuoteMeta(prepareOrgsQueryStmt),
prepareOrgsQueryCols,
[][]driver.Value{
{
"id",
@@ -115,27 +140,8 @@ func Test_OrgPrepares(t *testing.T) {
prepare: prepareOrgsQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.orgs.id,`+
` projections.orgs.creation_date,`+
` projections.orgs.change_date,`+
` projections.orgs.resource_owner,`+
` projections.orgs.org_state,`+
` projections.orgs.sequence,`+
` projections.orgs.name,`+
` projections.orgs.primary_domain,`+
` COUNT(*) OVER ()`+
` FROM projections.orgs`),
[]string{
"id",
"creation_date",
"change_date",
"resource_owner",
"org_state",
"sequence",
"name",
"primary_domain",
"count",
},
regexp.QuoteMeta(prepareOrgsQueryStmt),
prepareOrgsQueryCols,
[][]driver.Value{
{
"id-1",
@@ -193,16 +199,7 @@ func Test_OrgPrepares(t *testing.T) {
prepare: prepareOrgsQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.orgs.id,`+
` projections.orgs.creation_date,`+
` projections.orgs.change_date,`+
` projections.orgs.resource_owner,`+
` projections.orgs.org_state,`+
` projections.orgs.sequence,`+
` projections.orgs.name,`+
` projections.orgs.primary_domain,`+
` COUNT(*) OVER ()`+
` FROM projections.orgs`),
regexp.QuoteMeta(prepareOrgsQueryStmt),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
@@ -219,15 +216,7 @@ func Test_OrgPrepares(t *testing.T) {
prepare: prepareOrgQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT projections.orgs.id,`+
` projections.orgs.creation_date,`+
` projections.orgs.change_date,`+
` projections.orgs.resource_owner,`+
` projections.orgs.org_state,`+
` projections.orgs.sequence,`+
` projections.orgs.name,`+
` projections.orgs.primary_domain`+
` FROM projections.orgs`),
regexp.QuoteMeta(prepareOrgQueryStmt),
nil,
nil,
),
@@ -245,25 +234,8 @@ func Test_OrgPrepares(t *testing.T) {
prepare: prepareOrgQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT projections.orgs.id,`+
` projections.orgs.creation_date,`+
` projections.orgs.change_date,`+
` projections.orgs.resource_owner,`+
` projections.orgs.org_state,`+
` projections.orgs.sequence,`+
` projections.orgs.name,`+
` projections.orgs.primary_domain`+
` FROM projections.orgs`),
[]string{
"id",
"creation_date",
"change_date",
"resource_owner",
"org_state",
"sequence",
"name",
"primary_domain",
},
regexp.QuoteMeta(prepareOrgQueryStmt),
prepareOrgQueryCols,
[]driver.Value{
"id",
testNow,
@@ -292,15 +264,7 @@ func Test_OrgPrepares(t *testing.T) {
prepare: prepareOrgQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT projections.orgs.id,`+
` projections.orgs.creation_date,`+
` projections.orgs.change_date,`+
` projections.orgs.resource_owner,`+
` projections.orgs.org_state,`+
` projections.orgs.sequence,`+
` projections.orgs.name,`+
` projections.orgs.primary_domain`+
` FROM projections.orgs`),
regexp.QuoteMeta(prepareOrgQueryStmt),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
@@ -317,8 +281,7 @@ func Test_OrgPrepares(t *testing.T) {
prepare: prepareOrgUniqueQuery,
want: want{
sqlExpectations: mockQueries(
regexp.QuoteMeta(`SELECT COUNT(*) = 0`+
` FROM projections.orgs`),
regexp.QuoteMeta(prepareOrgUniqueStmt),
nil,
nil,
),
@@ -336,11 +299,8 @@ func Test_OrgPrepares(t *testing.T) {
prepare: prepareOrgUniqueQuery,
want: want{
sqlExpectations: mockQuery(
regexp.QuoteMeta(`SELECT COUNT(*) = 0`+
` FROM projections.orgs`),
[]string{
"count",
},
regexp.QuoteMeta(prepareOrgUniqueStmt),
prepareOrgUniqueCols,
[]driver.Value{
1,
},
@@ -353,8 +313,7 @@ func Test_OrgPrepares(t *testing.T) {
prepare: prepareOrgUniqueQuery,
want: want{
sqlExpectations: mockQueryErr(
regexp.QuoteMeta(`SELECT COUNT(*) = 0`+
` FROM projections.orgs`),
regexp.QuoteMeta(prepareOrgUniqueStmt),
sql.ErrConnDone,
),
err: func(err error) (error, bool) {
@@ -369,7 +328,7 @@ func Test_OrgPrepares(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...)
})
}
}
@@ -456,7 +415,10 @@ func TestQueries_IsOrgUnique(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
q := &Queries{
client: client,
client: &database.DB{
DB: client,
Database: new(prepareDB),
},
}
gotIsUnique, err := q.IsOrgUnique(context.Background(), tt.args.name, tt.args.domain)