@contember/engine-content-api 2.0.3 → 2.0.7
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/src/ExecutionContainer.cjs +3 -2
- package/dist/development/src/ExecutionContainer.cjs.map +1 -1
- package/dist/development/src/ExecutionContainer.js +3 -2
- 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/src/ExecutionContainer.cjs +3 -2
- package/dist/production/src/ExecutionContainer.cjs.map +1 -1
- package/dist/production/src/ExecutionContainer.js +3 -2
- 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/tsconfig.tsbuildinfo +1 -1
- package/dist/types/ExecutionContainer.d.ts +3 -2
- package/dist/types/ExecutionContainer.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 +16 -11
- package/src/ExecutionContainer.ts +3 -2
- package/src/mapper/select/optimizer/WhereOptimizer.ts +10 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contember/engine-content-api",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.7",
|
|
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.0.
|
|
30
|
-
"@contember/dic": "2.0.
|
|
31
|
-
"@contember/graphql-utils": "2.0.
|
|
32
|
-
"@contember/logger": "2.0.
|
|
33
|
-
"@contember/schema": "2.0.
|
|
34
|
-
"@contember/schema-definition": "2.0.
|
|
35
|
-
"@contember/schema-utils": "2.0.
|
|
29
|
+
"@contember/database": "2.0.7",
|
|
30
|
+
"@contember/dic": "2.0.7",
|
|
31
|
+
"@contember/graphql-utils": "2.0.7",
|
|
32
|
+
"@contember/logger": "2.0.7",
|
|
33
|
+
"@contember/schema": "2.0.7",
|
|
34
|
+
"@contember/schema-definition": "2.0.7",
|
|
35
|
+
"@contember/schema-utils": "2.0.7",
|
|
36
36
|
"fast-deep-equal": "^3.1.3"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@contember/database-tester": "2.0.
|
|
40
|
-
"@contember/schema-definition": "2.0.
|
|
39
|
+
"@contember/database-tester": "2.0.7",
|
|
40
|
+
"@contember/schema-definition": "2.0.7",
|
|
41
41
|
"@types/node": "^20.16.11",
|
|
42
42
|
"graphql": "^16.9.0",
|
|
43
43
|
"pg": "^8.12.0"
|
|
@@ -46,5 +46,10 @@
|
|
|
46
46
|
"graphql": ">= 14.6.0",
|
|
47
47
|
"pg": "^8.9.0"
|
|
48
48
|
},
|
|
49
|
-
"type": "module"
|
|
49
|
+
"type": "module",
|
|
50
|
+
"repository": {
|
|
51
|
+
"type": "git",
|
|
52
|
+
"url": "git+https://github.com/contember/contember.git",
|
|
53
|
+
"directory": "packages/engine-content-api"
|
|
54
|
+
}
|
|
50
55
|
}
|
|
@@ -31,7 +31,7 @@ import { Client, DatabaseMetadata, SelectBuilder as DbSelectBuilder } from '@con
|
|
|
31
31
|
import { 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 {
|
|
@@ -69,6 +69,7 @@ export class ExecutionContainerFactory {
|
|
|
69
69
|
|
|
70
70
|
constructor(
|
|
71
71
|
private readonly providers: Providers,
|
|
72
|
+
private readonly whereOptimizerOptions?: WhereOptimizerOptions,
|
|
72
73
|
) {
|
|
73
74
|
}
|
|
74
75
|
|
|
@@ -108,7 +109,7 @@ export class ExecutionContainerFactory {
|
|
|
108
109
|
.addService('pathFactory', () =>
|
|
109
110
|
new PathFactory())
|
|
110
111
|
.addService('whereOptimized', ({ schema }) =>
|
|
111
|
-
new WhereOptimizer(schema.model, new ConditionOptimizer()))
|
|
112
|
+
new WhereOptimizer(schema.model, new ConditionOptimizer(), this.whereOptimizerOptions))
|
|
112
113
|
.addService('whereBuilder', ({ joinBuilder, conditionBuilder, pathFactory, whereOptimized, schema }) =>
|
|
113
114
|
new WhereBuilder(
|
|
114
115
|
schema.model,
|
|
@@ -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]
|