@contember/engine-content-api 2.1.0-alpha.24 → 2.1.0-alpha.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/development/index.cjs +0 -2
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js +0 -2
- package/dist/development/index.js.map +1 -1
- package/dist/development/src/ExecutionContainer.cjs +4 -3
- package/dist/development/src/ExecutionContainer.cjs.map +1 -1
- package/dist/development/src/ExecutionContainer.js +4 -3
- package/dist/development/src/ExecutionContainer.js.map +1 -1
- package/dist/development/src/mapper/select/optimizer/WhereOptimizer.cjs +6 -2
- package/dist/development/src/mapper/select/optimizer/WhereOptimizer.cjs.map +1 -1
- package/dist/development/src/mapper/select/optimizer/WhereOptimizer.js +6 -2
- package/dist/development/src/mapper/select/optimizer/WhereOptimizer.js.map +1 -1
- package/dist/production/index.cjs +0 -2
- package/dist/production/index.cjs.map +1 -1
- package/dist/production/index.js +0 -2
- package/dist/production/index.js.map +1 -1
- package/dist/production/src/ExecutionContainer.cjs +4 -3
- package/dist/production/src/ExecutionContainer.cjs.map +1 -1
- package/dist/production/src/ExecutionContainer.js +4 -3
- package/dist/production/src/ExecutionContainer.js.map +1 -1
- package/dist/production/src/mapper/select/optimizer/WhereOptimizer.cjs +6 -2
- package/dist/production/src/mapper/select/optimizer/WhereOptimizer.cjs.map +1 -1
- package/dist/production/src/mapper/select/optimizer/WhereOptimizer.js +6 -2
- package/dist/production/src/mapper/select/optimizer/WhereOptimizer.js.map +1 -1
- package/dist/tests/src/test.d.ts.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/types/ExecutionContainer.d.ts +13 -3
- package/dist/types/ExecutionContainer.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/mapper/select/optimizer/WhereOptimizer.d.ts +6 -1
- package/dist/types/mapper/select/optimizer/WhereOptimizer.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -10
- package/src/ExecutionContainer.ts +7 -3
- package/src/index.ts +2 -1
- package/src/mapper/select/optimizer/WhereOptimizer.ts +10 -1
- package/tests/src/test.ts +1 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contember/engine-content-api",
|
|
3
|
-
"version": "2.1.0-alpha.
|
|
3
|
+
"version": "2.1.0-alpha.26",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"main": "./dist/production/index.js",
|
|
6
6
|
"typings": "./dist/types/index.d.ts",
|
|
@@ -26,18 +26,18 @@
|
|
|
26
26
|
"generate": "gql-gen --config graphql.codegen.yml"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@contember/database": "2.1.0-alpha.
|
|
30
|
-
"@contember/dic": "2.1.0-alpha.
|
|
31
|
-
"@contember/graphql-utils": "2.1.0-alpha.
|
|
32
|
-
"@contember/logger": "2.1.0-alpha.
|
|
33
|
-
"@contember/schema": "2.1.0-alpha.
|
|
34
|
-
"@contember/schema-definition": "2.1.0-alpha.
|
|
35
|
-
"@contember/schema-utils": "2.1.0-alpha.
|
|
29
|
+
"@contember/database": "2.1.0-alpha.26",
|
|
30
|
+
"@contember/dic": "2.1.0-alpha.26",
|
|
31
|
+
"@contember/graphql-utils": "2.1.0-alpha.26",
|
|
32
|
+
"@contember/logger": "2.1.0-alpha.26",
|
|
33
|
+
"@contember/schema": "2.1.0-alpha.26",
|
|
34
|
+
"@contember/schema-definition": "2.1.0-alpha.26",
|
|
35
|
+
"@contember/schema-utils": "2.1.0-alpha.26",
|
|
36
36
|
"fast-deep-equal": "^3.1.3"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@contember/database-tester": "2.1.0-alpha.
|
|
40
|
-
"@contember/schema-definition": "2.1.0-alpha.
|
|
39
|
+
"@contember/database-tester": "2.1.0-alpha.26",
|
|
40
|
+
"@contember/schema-definition": "2.1.0-alpha.26",
|
|
41
41
|
"@types/node": "^20.17.22",
|
|
42
42
|
"graphql": "^16.9.0",
|
|
43
43
|
"pg": "^8.12.0"
|
|
@@ -31,7 +31,7 @@ import { Client, DatabaseMetadata, SelectBuilder as DbSelectBuilder } from '@con
|
|
|
31
31
|
import { ParsedMembership, Providers } from '@contember/schema-utils'
|
|
32
32
|
import { PaginatedHasManyExecutionHandler } from './extensions/paginatedHasMany/PaginatedHasManyExecutionHandler'
|
|
33
33
|
import { PaginatedHasManyFieldProvider } from './extensions/paginatedHasMany/PaginatedHasManyFieldProvider'
|
|
34
|
-
import { WhereOptimizer } from './mapper/select/optimizer/WhereOptimizer'
|
|
34
|
+
import { WhereOptimizer, WhereOptimizerOptions } from './mapper/select/optimizer/WhereOptimizer'
|
|
35
35
|
import { ConditionOptimizer } from './mapper/select/optimizer/ConditionOptimizer'
|
|
36
36
|
import { GraphQlQueryAstFactory, MutationResolver, ReadResolver, ValidationResolver } from './resolvers'
|
|
37
37
|
import {
|
|
@@ -54,6 +54,7 @@ export type ExecutionContainerArgs = {
|
|
|
54
54
|
systemSchema: string
|
|
55
55
|
project: { slug: string }
|
|
56
56
|
stage: { id: string; slug: string }
|
|
57
|
+
userInfo: { ipAddress: string | null; userAgent: string | null }
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
export interface ExecutionContainer {
|
|
@@ -71,6 +72,7 @@ export class ExecutionContainerFactory {
|
|
|
71
72
|
|
|
72
73
|
constructor(
|
|
73
74
|
private readonly providers: Providers,
|
|
75
|
+
private readonly whereOptimizerOptions?: WhereOptimizerOptions,
|
|
74
76
|
) {
|
|
75
77
|
}
|
|
76
78
|
|
|
@@ -79,7 +81,7 @@ export class ExecutionContainerFactory {
|
|
|
79
81
|
return this.hooks.reduce((acc, cb) => cb(acc), builder)
|
|
80
82
|
}
|
|
81
83
|
|
|
82
|
-
createBuilderInternal({ permissions, identityVariables, identityId, db, schema, schemaMeta, systemSchema, stage, project, schemaDatabaseMetadata }: ExecutionContainerArgs) {
|
|
84
|
+
createBuilderInternal({ permissions, identityVariables, identityId, db, schema, schemaMeta, systemSchema, stage, project, schemaDatabaseMetadata, userInfo }: ExecutionContainerArgs) {
|
|
83
85
|
return new Builder({})
|
|
84
86
|
.addService('systemSchema', () =>
|
|
85
87
|
systemSchema)
|
|
@@ -95,6 +97,8 @@ export class ExecutionContainerFactory {
|
|
|
95
97
|
schemaMeta)
|
|
96
98
|
.addService('schemaDatabaseMetadata', () =>
|
|
97
99
|
schemaDatabaseMetadata)
|
|
100
|
+
.addService('userInfo', () =>
|
|
101
|
+
userInfo)
|
|
98
102
|
.addService('providers', () =>
|
|
99
103
|
this.providers)
|
|
100
104
|
.addService('variableInjector', ({ schema }) =>
|
|
@@ -110,7 +114,7 @@ export class ExecutionContainerFactory {
|
|
|
110
114
|
.addService('pathFactory', () =>
|
|
111
115
|
new PathFactory())
|
|
112
116
|
.addService('whereOptimized', ({ schema }) =>
|
|
113
|
-
new WhereOptimizer(schema.model, new ConditionOptimizer()))
|
|
117
|
+
new WhereOptimizer(schema.model, new ConditionOptimizer(), this.whereOptimizerOptions))
|
|
114
118
|
.addService('whereBuilder', ({ joinBuilder, conditionBuilder, pathFactory, whereOptimized, schema }) =>
|
|
115
119
|
new WhereBuilder(
|
|
116
120
|
schema.model,
|
package/src/index.ts
CHANGED
|
@@ -18,16 +18,25 @@ export interface WhereOptimizationHints {
|
|
|
18
18
|
|
|
19
19
|
type OptimizedOperand = Input.OptionalWhere | undefined | boolean
|
|
20
20
|
|
|
21
|
+
export type WhereOptimizerOptions = {
|
|
22
|
+
disable?: boolean
|
|
23
|
+
maxCrossOptimizationInput?: number
|
|
24
|
+
}
|
|
25
|
+
|
|
21
26
|
export class WhereOptimizer {
|
|
22
27
|
private static eliminableRelations = new Set<Model.AnyRelationContext['type']>(['oneHasMany', 'oneHasOneInverse', 'oneHasOneOwning'])
|
|
23
28
|
|
|
24
29
|
constructor(
|
|
25
30
|
private readonly model: Model.Schema,
|
|
26
31
|
private readonly conditionOptimizer: ConditionOptimizer,
|
|
32
|
+
private readonly options?: WhereOptimizerOptions,
|
|
27
33
|
) {
|
|
28
34
|
}
|
|
29
35
|
|
|
30
36
|
public optimize(where: Input.OptionalWhere, entity: Model.Entity, { relationPath = [], evaluatedPredicates = [] }: WhereOptimizationHints = {}): Input.OptionalWhere {
|
|
37
|
+
if (this.options?.disable) {
|
|
38
|
+
return where
|
|
39
|
+
}
|
|
31
40
|
let processedRelationPath: ExtendedRelationContext[] = []
|
|
32
41
|
for (const i in relationPath) {
|
|
33
42
|
const el = relationPath[i]
|
|
@@ -134,7 +143,7 @@ export class WhereOptimizer {
|
|
|
134
143
|
private crossOptimize(operands: Input.OptionalWhere[], entity: Model.Entity, replacement: Input.Condition, relationPath: ExtendedRelationContext[]): (Input.OptionalWhere | boolean)[] {
|
|
135
144
|
let result: (Input.OptionalWhere | boolean)[] = operands
|
|
136
145
|
let copied = false
|
|
137
|
-
const count = result.length
|
|
146
|
+
const count = Math.min(result.length, this.options?.maxCrossOptimizationInput ?? 50)
|
|
138
147
|
for (let i = 0; i < count; i++) {
|
|
139
148
|
for (let j = 0; j < count; j++) {
|
|
140
149
|
const a = result[j]
|
package/tests/src/test.ts
CHANGED
|
@@ -113,6 +113,7 @@ export const execute = async (test: Test) => {
|
|
|
113
113
|
stage: { id: '00000000-0000-0000-0000-000000000000', slug: 'live' },
|
|
114
114
|
project: { slug: 'test' },
|
|
115
115
|
schemaDatabaseMetadata: emptyDatabaseMetadata,
|
|
116
|
+
userInfo: { ipAddress: null, userAgent: null },
|
|
116
117
|
}),
|
|
117
118
|
timer: (label: any, cb: any) => cb(),
|
|
118
119
|
},
|