@contember/engine-content-api 2.1.0-alpha.25 → 2.1.0-alpha.27
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/ConditionBuilder.cjs +6 -2
- package/dist/development/src/mapper/select/ConditionBuilder.cjs.map +1 -1
- package/dist/development/src/mapper/select/ConditionBuilder.js +7 -3
- package/dist/development/src/mapper/select/ConditionBuilder.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/development/src/schema/ConditionTypeProvider.cjs +2 -0
- package/dist/development/src/schema/ConditionTypeProvider.cjs.map +1 -1
- package/dist/development/src/schema/ConditionTypeProvider.js +2 -0
- package/dist/development/src/schema/ConditionTypeProvider.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/ConditionBuilder.cjs +6 -2
- package/dist/production/src/mapper/select/ConditionBuilder.cjs.map +1 -1
- package/dist/production/src/mapper/select/ConditionBuilder.js +7 -3
- package/dist/production/src/mapper/select/ConditionBuilder.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/production/src/schema/ConditionTypeProvider.cjs +2 -0
- package/dist/production/src/schema/ConditionTypeProvider.cjs.map +1 -1
- package/dist/production/src/schema/ConditionTypeProvider.js +2 -0
- package/dist/production/src/schema/ConditionTypeProvider.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/ConditionBuilder.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/schema/ConditionTypeProvider.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -10
- package/src/ExecutionContainer.ts +3 -2
- package/src/mapper/select/ConditionBuilder.ts +10 -4
- package/src/mapper/select/optimizer/WhereOptimizer.ts +10 -1
- package/src/schema/ConditionTypeProvider.ts +3 -0
- package/tests/cases/integration/graphQlSchema/schema-column-types.gql +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.27",
|
|
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 {
|
|
@@ -72,6 +72,7 @@ export class ExecutionContainerFactory {
|
|
|
72
72
|
|
|
73
73
|
constructor(
|
|
74
74
|
private readonly providers: Providers,
|
|
75
|
+
private readonly whereOptimizerOptions?: WhereOptimizerOptions,
|
|
75
76
|
) {
|
|
76
77
|
}
|
|
77
78
|
|
|
@@ -113,7 +114,7 @@ export class ExecutionContainerFactory {
|
|
|
113
114
|
.addService('pathFactory', () =>
|
|
114
115
|
new PathFactory())
|
|
115
116
|
.addService('whereOptimized', ({ schema }) =>
|
|
116
|
-
new WhereOptimizer(schema.model, new ConditionOptimizer()))
|
|
117
|
+
new WhereOptimizer(schema.model, new ConditionOptimizer(), this.whereOptimizerOptions))
|
|
117
118
|
.addService('whereBuilder', ({ joinBuilder, conditionBuilder, pathFactory, whereOptimized, schema }) =>
|
|
118
119
|
new WhereBuilder(
|
|
119
120
|
schema.model,
|
|
@@ -50,11 +50,17 @@ export class ConditionBuilder {
|
|
|
50
50
|
gte: (builder, value) => builder.compare(columnIdentifier, Operator.gte, value),
|
|
51
51
|
|
|
52
52
|
includes: (builder, value) => {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
if (columnType.type === Model.ColumnType.Json) {
|
|
54
|
+
// For JSON columns, use @> operator to check if JSON contains the value
|
|
55
|
+
return builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ?::jsonb`, JSON.stringify(value))
|
|
56
|
+
} else {
|
|
57
|
+
// For array columns, use @> operator with array casting
|
|
58
|
+
const cast = columnType.type === Model.ColumnType.Enum
|
|
59
|
+
? `${Compiler.SCHEMA_PLACEHOLDER}."${columnType.columnType}"`
|
|
60
|
+
: columnType.columnType
|
|
56
61
|
|
|
57
|
-
|
|
62
|
+
return builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ARRAY[?]::${cast}[]`, value)
|
|
63
|
+
}
|
|
58
64
|
},
|
|
59
65
|
maxLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) <= ?`, value),
|
|
60
66
|
minLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) >= ?`, value),
|
|
@@ -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]
|
|
@@ -60,6 +60,9 @@ export class ConditionTypeProvider {
|
|
|
60
60
|
conditions.lte = { type: type }
|
|
61
61
|
conditions.gt = { type: type }
|
|
62
62
|
conditions.gte = { type: type }
|
|
63
|
+
} else {
|
|
64
|
+
// For JSON columns, add the includes operator
|
|
65
|
+
conditions.includes = { type: type }
|
|
63
66
|
}
|
|
64
67
|
if (column.type === Model.ColumnType.String) {
|
|
65
68
|
conditions.contains = { type: GraphQLString }
|