@contember/engine-content-api 2.0.2 → 2.0.4
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 +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/Result.cjs.map +1 -1
- package/dist/development/src/mapper/Result.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/mapper/update/Updater.cjs +15 -3
- package/dist/development/src/mapper/update/Updater.cjs.map +1 -1
- package/dist/development/src/mapper/update/Updater.js +16 -4
- package/dist/development/src/mapper/update/Updater.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/Result.cjs.map +1 -1
- package/dist/production/src/mapper/Result.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/mapper/update/Updater.cjs +15 -3
- package/dist/production/src/mapper/update/Updater.cjs.map +1 -1
- package/dist/production/src/mapper/update/Updater.js +16 -4
- package/dist/production/src/mapper/update/Updater.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/Result.d.ts +2 -2
- package/dist/types/mapper/Result.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/mapper/update/Updater.d.ts +1 -5
- package/dist/types/mapper/update/Updater.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -10
- package/src/ExecutionContainer.ts +5 -4
- package/src/mapper/Result.ts +1 -1
- package/src/mapper/select/optimizer/WhereOptimizer.ts +10 -1
- package/src/mapper/update/Updater.ts +16 -5
- package/tests/cases/integration/graphQlRequests/update/additionalFilter.test.ts +51 -2
|
@@ -2,13 +2,11 @@ import { SqlUpdateInputProcessor } from "./SqlUpdateInputProcessor.js";
|
|
|
2
2
|
import { acceptFieldVisitor } from "@contember/schema-utils";
|
|
3
3
|
import "@contember/schema";
|
|
4
4
|
import { UpdateInputVisitor } from "../../inputProcessing/UpdateInputVisitor.js";
|
|
5
|
-
import { MutationNothingToDo, NothingToDoReason, MutationNoResultError, MutationUpdateOk } from "../Result.js";
|
|
5
|
+
import { MutationEntryNotFoundError, MutationNothingToDo, NothingToDoReason, MutationNoResultError, MutationUpdateOk } from "../Result.js";
|
|
6
6
|
import { rowDataToFieldValues } from "../ColumnValue.js";
|
|
7
7
|
class Updater {
|
|
8
|
-
constructor(schema,
|
|
8
|
+
constructor(schema, updateBuilderFactory) {
|
|
9
9
|
this.schema = schema;
|
|
10
|
-
this.schemaDatabaseMetadata = schemaDatabaseMetadata;
|
|
11
|
-
this.predicateFactory = predicateFactory;
|
|
12
10
|
this.updateBuilderFactory = updateBuilderFactory;
|
|
13
11
|
}
|
|
14
12
|
async update(mapper, entity, primaryValue, data, filter) {
|
|
@@ -47,6 +45,20 @@ class Updater {
|
|
|
47
45
|
}
|
|
48
46
|
const result = await updateBuilder.execute(mapper);
|
|
49
47
|
if (!result.executed) {
|
|
48
|
+
if (filter && Object.keys(filter).length > 0) {
|
|
49
|
+
const where = {
|
|
50
|
+
and: [
|
|
51
|
+
filter,
|
|
52
|
+
{
|
|
53
|
+
[entity.primary]: { eq: primaryValue }
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
};
|
|
57
|
+
const count = await mapper.count(entity, where);
|
|
58
|
+
if (!count) {
|
|
59
|
+
return [new MutationEntryNotFoundError([], where)];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
50
62
|
resultList.unshift(new MutationNothingToDo([], NothingToDoReason.noData));
|
|
51
63
|
} else if (result.affectedRows !== 1) {
|
|
52
64
|
return [new MutationNoResultError([])];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Updater.js","sources":["../../../../../../packages/engine-content-api/src/mapper/update/Updater.ts"],"sourcesContent":["import { SqlUpdateInputProcessor, SqlUpdateInputProcessorResult } from './SqlUpdateInputProcessor'\nimport { UpdateInputVisitor } from '../../inputProcessing'\nimport { Input, Model } from '@contember/schema'\nimport {
|
|
1
|
+
{"version":3,"file":"Updater.js","sources":["../../../../../../packages/engine-content-api/src/mapper/update/Updater.ts"],"sourcesContent":["import { SqlUpdateInputProcessor, SqlUpdateInputProcessorResult } from './SqlUpdateInputProcessor'\nimport { UpdateInputVisitor } from '../../inputProcessing'\nimport { Input, Model } from '@contember/schema'\nimport { UpdateBuilderFactory } from './UpdateBuilderFactory'\nimport { Mapper } from '../Mapper'\nimport { acceptFieldVisitor } from '@contember/schema-utils'\nimport { MutationEntryNotFoundError, MutationNoResultError, MutationNothingToDo, MutationResultList, MutationUpdateOk, NothingToDoReason } from '../Result'\nimport { UpdateBuilder } from './UpdateBuilder'\nimport { rowDataToFieldValues } from '../ColumnValue'\nimport { MapperInput } from '../types'\n\nexport class Updater {\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly updateBuilderFactory: UpdateBuilderFactory,\n\t) {}\n\n\tpublic async update(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tprimaryValue: Input.PrimaryValue,\n\t\tdata: MapperInput.UpdateDataInput,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tconst updateBuilder = this.updateBuilderFactory.create(entity, primaryValue)\n\n\t\tconst predicateFields = Object.keys(data)\n\t\tupdateBuilder.addPredicates(predicateFields)\n\t\tif (filter && Object.keys(filter).length > 0) {\n\t\t\tupdateBuilder.addOldWhere(filter)\n\t\t}\n\n\t\tconst visitor = new UpdateInputVisitor<SqlUpdateInputProcessorResult>(\n\t\t\tnew SqlUpdateInputProcessor(primaryValue, data, updateBuilder, mapper),\n\t\t\tthis.schema,\n\t\t\tdata,\n\t\t)\n\t\tconst resultList: MutationResultList = []\n\t\tconst postUpdates: Exclude<SqlUpdateInputProcessorResult, MutationResultList>[] = []\n\n\t\tfor (const key of Object.keys(data)) {\n\t\t\tconst resultSet = await acceptFieldVisitor(\n\t\t\t\tthis.schema,\n\t\t\t\tentity,\n\t\t\t\tkey,\n\t\t\t\tvisitor,\n\t\t\t)\n\t\t\tfor (const result of resultSet) {\n\t\t\t\tif (typeof result === 'function') {\n\t\t\t\t\tpostUpdates.push(result)\n\t\t\t\t} else {\n\t\t\t\t\tfor (const resultItem of await result) {\n\t\t\t\t\t\tresultList.push(resultItem)\n\t\t\t\t\t\tif (resultItem.error) {\n\t\t\t\t\t\t\treturn resultList\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst result = await updateBuilder.execute(mapper)\n\n\t\tif (!result.executed) {\n\t\t\tif (filter && Object.keys(filter).length > 0) {\n\t\t\t\t// direct update was not invoked, but we still need to check if the row matches the filter\n\t\t\t\tconst where: Input.OptionalWhere = {\n\t\t\t\t\tand: [\n\t\t\t\t\t\tfilter,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t[entity.primary]: { eq: primaryValue },\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t}\n\t\t\t\tconst count = await mapper.count(entity, where)\n\t\t\t\tif (!count) {\n\t\t\t\t\treturn [new MutationEntryNotFoundError([], where)]\n\t\t\t\t}\n\t\t\t}\n\t\t\tresultList.unshift(new MutationNothingToDo([], NothingToDoReason.noData))\n\t\t} else if (result.affectedRows !== 1) {\n\t\t\treturn [new MutationNoResultError([])]\n\t\t} else {\n\t\t\tconst okResult = new MutationUpdateOk([], entity, primaryValue, data, rowDataToFieldValues(result.values))\n\t\t\tresultList.unshift(okResult)\n\t\t}\n\n\t\tfor (const postUpdate of postUpdates) {\n\t\t\tconst postInsertResult = await postUpdate({ primary: primaryValue })\n\t\t\tfor (const result of postInsertResult) {\n\t\t\t\tresultList.push(result)\n\t\t\t\tif (result.error) {\n\t\t\t\t\treturn resultList\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn resultList\n\t}\n\n\tpublic async updateCb(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tprimaryValue: Input.PrimaryValue,\n\t\tbuilderCb: (builder: UpdateBuilder) => void,\n\t): Promise<MutationResultList> {\n\t\tconst updateBuilder = this.updateBuilderFactory.create(entity, primaryValue)\n\n\t\tbuilderCb(updateBuilder)\n\n\t\tconst result = await updateBuilder.execute(mapper)\n\n\t\tif (!result.executed) {\n\t\t\treturn [new MutationNothingToDo([], NothingToDoReason.noData)]\n\t\t}\n\t\tif (result.affectedRows !== 1) {\n\t\t\treturn [new MutationNoResultError([])]\n\t\t}\n\t\treturn [new MutationUpdateOk([], entity, primaryValue, {}, rowDataToFieldValues(result.values))]\n\t}\n}\n"],"names":["result"],"mappings":"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"}
|
|
@@ -49,8 +49,9 @@ var __defProp = Object.defineProperty;
|
|
|
49
49
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
50
50
|
var __publicField = (obj, key, value) => __defNormalProp(obj, key + "", value);
|
|
51
51
|
class ExecutionContainerFactory {
|
|
52
|
-
constructor(providers) {
|
|
52
|
+
constructor(providers, whereOptimizerOptions) {
|
|
53
53
|
this.providers = providers;
|
|
54
|
+
this.whereOptimizerOptions = whereOptimizerOptions;
|
|
54
55
|
__publicField(this, "hooks", []);
|
|
55
56
|
}
|
|
56
57
|
createBuilder(args) {
|
|
@@ -58,7 +59,7 @@ class ExecutionContainerFactory {
|
|
|
58
59
|
return this.hooks.reduce((acc, cb) => cb(acc), builder);
|
|
59
60
|
}
|
|
60
61
|
createBuilderInternal({ permissions, identityVariables, identityId, db, schema, schemaMeta, systemSchema, stage, project, schemaDatabaseMetadata }) {
|
|
61
|
-
return new dic.Builder({}).addService("systemSchema", () => systemSchema).addService("db", () => db).addService("project", () => project).addService("stage", () => stage).addService("schema", () => schema).addService("schemaMeta", () => schemaMeta).addService("schemaDatabaseMetadata", () => schemaDatabaseMetadata).addService("providers", () => this.providers).addService("variableInjector", ({ schema: schema2 }) => new VariableInjector.VariableInjector(schema2.model, identityVariables)).addService("predicateFactory", ({ variableInjector, schema: schema2 }) => new PredicateFactory.PredicateFactory(permissions, schema2.model, variableInjector)).addService("predicatesInjector", ({ predicateFactory, schema: schema2 }) => new PredicatesInjector.PredicatesInjector(schema2.model, predicateFactory)).addService("joinBuilder", ({ schema: schema2 }) => new JoinBuilder.JoinBuilder(schema2.model)).addService("conditionBuilder", () => new ConditionBuilder.ConditionBuilder()).addService("pathFactory", () => new Path.PathFactory()).addService("whereOptimized", ({ schema: schema2 }) => new WhereOptimizer.WhereOptimizer(schema2.model, new ConditionOptimizer.ConditionOptimizer())).addService("whereBuilder", ({ joinBuilder, conditionBuilder, pathFactory, whereOptimized, schema: schema2 }) => new WhereBuilder.WhereBuilder(
|
|
62
|
+
return new dic.Builder({}).addService("systemSchema", () => systemSchema).addService("db", () => db).addService("project", () => project).addService("stage", () => stage).addService("schema", () => schema).addService("schemaMeta", () => schemaMeta).addService("schemaDatabaseMetadata", () => schemaDatabaseMetadata).addService("providers", () => this.providers).addService("variableInjector", ({ schema: schema2 }) => new VariableInjector.VariableInjector(schema2.model, identityVariables)).addService("predicateFactory", ({ variableInjector, schema: schema2 }) => new PredicateFactory.PredicateFactory(permissions, schema2.model, variableInjector)).addService("predicatesInjector", ({ predicateFactory, schema: schema2 }) => new PredicatesInjector.PredicatesInjector(schema2.model, predicateFactory)).addService("joinBuilder", ({ schema: schema2 }) => new JoinBuilder.JoinBuilder(schema2.model)).addService("conditionBuilder", () => new ConditionBuilder.ConditionBuilder()).addService("pathFactory", () => new Path.PathFactory()).addService("whereOptimized", ({ schema: schema2 }) => new WhereOptimizer.WhereOptimizer(schema2.model, new ConditionOptimizer.ConditionOptimizer(), this.whereOptimizerOptions)).addService("whereBuilder", ({ joinBuilder, conditionBuilder, pathFactory, whereOptimized, schema: schema2 }) => new WhereBuilder.WhereBuilder(
|
|
62
63
|
schema2.model,
|
|
63
64
|
joinBuilder,
|
|
64
65
|
conditionBuilder,
|
|
@@ -84,7 +85,7 @@ class ExecutionContainerFactory {
|
|
|
84
85
|
predicateFactory
|
|
85
86
|
);
|
|
86
87
|
}
|
|
87
|
-
}()).addService("insertBuilderFactory", ({ whereBuilder, pathFactory, schema: schema2, predicateFactory }) => new InsertBuilderFactory.InsertBuilderFactory(schema2.model, whereBuilder, pathFactory, predicateFactory)).addService("updateBuilderFactory", ({ whereBuilder, pathFactory, schema: schema2, predicateFactory }) => new UpdateBuilderFactory.UpdateBuilderFactory(schema2.model, whereBuilder, pathFactory, predicateFactory)).addService("connectJunctionHandler", () => new JunctionTableManager.JunctionConnectHandler()).addService("disconnectJunctionHandler", ({}) => new JunctionTableManager.JunctionDisconnectHandler()).addService("junctionTableManager", ({ predicateFactory, whereBuilder, connectJunctionHandler, disconnectJunctionHandler, pathFactory, schema: schema2 }) => new JunctionTableManager.JunctionTableManager(schema2.model, predicateFactory, whereBuilder, connectJunctionHandler, disconnectJunctionHandler, pathFactory)).addService("deleteExecutor", ({ predicateFactory, updateBuilderFactory, whereBuilder, pathFactory, schema: schema2 }) => new DeleteExecutor.DeleteExecutor(schema2.model, predicateFactory, whereBuilder, updateBuilderFactory, pathFactory)).addService("updater", ({
|
|
88
|
+
}()).addService("insertBuilderFactory", ({ whereBuilder, pathFactory, schema: schema2, predicateFactory }) => new InsertBuilderFactory.InsertBuilderFactory(schema2.model, whereBuilder, pathFactory, predicateFactory)).addService("updateBuilderFactory", ({ whereBuilder, pathFactory, schema: schema2, predicateFactory }) => new UpdateBuilderFactory.UpdateBuilderFactory(schema2.model, whereBuilder, pathFactory, predicateFactory)).addService("connectJunctionHandler", () => new JunctionTableManager.JunctionConnectHandler()).addService("disconnectJunctionHandler", ({}) => new JunctionTableManager.JunctionDisconnectHandler()).addService("junctionTableManager", ({ predicateFactory, whereBuilder, connectJunctionHandler, disconnectJunctionHandler, pathFactory, schema: schema2 }) => new JunctionTableManager.JunctionTableManager(schema2.model, predicateFactory, whereBuilder, connectJunctionHandler, disconnectJunctionHandler, pathFactory)).addService("deleteExecutor", ({ predicateFactory, updateBuilderFactory, whereBuilder, pathFactory, schema: schema2 }) => new DeleteExecutor.DeleteExecutor(schema2.model, predicateFactory, whereBuilder, updateBuilderFactory, pathFactory)).addService("updater", ({ updateBuilderFactory, schema: schema2 }) => new Updater.Updater(schema2.model, updateBuilderFactory)).addService("inserter", ({ insertBuilderFactory, providers, schema: schema2, schemaDatabaseMetadata: schemaDatabaseMetadata2 }) => new Inserter.Inserter(schema2.model, schemaDatabaseMetadata2, insertBuilderFactory, providers)).addService("mapperFactory", ({ predicatesInjector, selectBuilderFactory, uniqueWhereExpander, whereBuilder, junctionTableManager, deleteExecutor, updater, inserter, pathFactory, providers, schema: schema2, schemaDatabaseMetadata: schemaDatabaseMetadata2 }) => {
|
|
88
89
|
return new MapperFactory.MapperFactory(
|
|
89
90
|
db,
|
|
90
91
|
identityId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExecutionContainer.cjs","sources":["../../../../packages/engine-content-api/src/ExecutionContainer.ts"],"sourcesContent":["import { PredicateFactory, PredicatesInjector, VariableInjector } from './acl'\nimport {\n\tConditionBuilder,\n\tFieldsVisitorFactory,\n\tJoinBuilder,\n\tMetaHandler,\n\tOrderByBuilder,\n\tRelationFetcher,\n\tWhereBuilder,\n} from './mapper/select'\nimport { UniqueWhereExpander } from './inputProcessing'\nimport { HasManyToHasOneReducer, HasManyToHasOneReducerExecutionHandler } from './extensions'\nimport {\n\tDeleteExecutor,\n\tInsertBuilderFactory,\n\tInserter,\n\tJunctionConnectHandler,\n\tJunctionDisconnectHandler,\n\tJunctionTableManager,\n\tMapperFactory,\n\tPathFactory,\n\tSelectBuilder,\n\tSelectBuilderFactory,\n\tSelectHydrator,\n\tUpdateBuilderFactory,\n\tUpdater,\n} from './mapper'\nimport { Builder } from '@contember/dic'\nimport { Acl, Model, Schema } from '@contember/schema'\nimport { Client, DatabaseMetadata, SelectBuilder as DbSelectBuilder } from '@contember/database'\nimport { Providers } from '@contember/schema-utils'\nimport { PaginatedHasManyExecutionHandler } from './extensions/paginatedHasMany/PaginatedHasManyExecutionHandler'\nimport { PaginatedHasManyFieldProvider } from './extensions/paginatedHasMany/PaginatedHasManyFieldProvider'\nimport { WhereOptimizer } from './mapper/select/optimizer/WhereOptimizer'\nimport { ConditionOptimizer } from './mapper/select/optimizer/ConditionOptimizer'\nimport { GraphQlQueryAstFactory, MutationResolver, ReadResolver, ValidationResolver } from './resolvers'\nimport {\n\tColumnValueResolver,\n\tDependencyCollector,\n\tEntityRulesResolver, InputPreValidator,\n\tQueryAstFactory,\n\tValidationDataSelector,\n} from './input-validation'\n\nexport type ExecutionContainerArgs = {\n\tschema: Schema\n\tschemaMeta: { id?: number }\n\tschemaDatabaseMetadata: DatabaseMetadata\n\tdb: Client\n\tidentityId: string\n\tidentityVariables: Acl.VariablesMap\n\tpermissions: Acl.Permissions\n\tsystemSchema: string\n\tproject: { slug: string }\n\tstage: { id: string; slug: string }\n}\n\nexport interface ExecutionContainer {\n\treadResolver: ReadResolver\n\tmutationResolver: MutationResolver\n\tvalidationResolver: ValidationResolver\n}\n\nexport type ExecutionContainerBuilder = ReturnType<ExecutionContainerFactory['createBuilderInternal']>\nexport type ExecutionContainerHook = (builder: ExecutionContainerBuilder) => ExecutionContainerBuilder\n\nexport class ExecutionContainerFactory {\n\tpublic readonly hooks: ExecutionContainerHook[] = []\n\n\tconstructor(\n\t\tprivate readonly providers: Providers,\n\t) {\n\t}\n\n\tcreateBuilder(args: ExecutionContainerArgs): ExecutionContainerBuilder {\n\t\tconst builder = this.createBuilderInternal(args)\n\t\treturn this.hooks.reduce((acc, cb) => cb(acc), builder)\n\t}\n\n\tcreateBuilderInternal({ permissions, identityVariables, identityId, db, schema, schemaMeta, systemSchema, stage, project, schemaDatabaseMetadata }: ExecutionContainerArgs) {\n\t\treturn new Builder({})\n\t\t\t.addService('systemSchema', () =>\n\t\t\t\tsystemSchema)\n\t\t\t.addService('db', () =>\n\t\t\t\tdb)\n\t\t\t.addService('project', () =>\n\t\t\t\tproject)\n\t\t\t.addService('stage', () =>\n\t\t\t\tstage)\n\t\t\t.addService('schema', () =>\n\t\t\t\tschema)\n\t\t\t.addService('schemaMeta', () =>\n\t\t\t\tschemaMeta)\n\t\t\t.addService('schemaDatabaseMetadata', () =>\n\t\t\t\tschemaDatabaseMetadata)\n\t\t\t.addService('providers', () =>\n\t\t\t\tthis.providers)\n\t\t\t.addService('variableInjector', ({ schema }) =>\n\t\t\t\tnew VariableInjector(schema.model, identityVariables))\n\t\t\t.addService('predicateFactory', ({ variableInjector, schema }) =>\n\t\t\t\tnew PredicateFactory(permissions, schema.model, variableInjector))\n\t\t\t.addService('predicatesInjector', ({ predicateFactory, schema }) =>\n\t\t\t\tnew PredicatesInjector(schema.model, predicateFactory))\n\t\t\t.addService('joinBuilder', ({ schema }) =>\n\t\t\t\tnew JoinBuilder(schema.model))\n\t\t\t.addService('conditionBuilder', () =>\n\t\t\t\tnew ConditionBuilder())\n\t\t\t.addService('pathFactory', () =>\n\t\t\t\tnew PathFactory())\n\t\t\t.addService('whereOptimized', ({ schema }) =>\n\t\t\t\tnew WhereOptimizer(schema.model, new ConditionOptimizer()))\n\t\t\t.addService('whereBuilder', ({ joinBuilder, conditionBuilder, pathFactory, whereOptimized, schema }) =>\n\t\t\t\tnew WhereBuilder(\n\t\t\t\t\tschema.model,\n\t\t\t\t\tjoinBuilder,\n\t\t\t\t\tconditionBuilder,\n\t\t\t\t\tpathFactory,\n\t\t\t\t\twhereOptimized,\n\t\t\t\t\t(schema.settings.content?.useExistsInHasManyFilter ?? schema.settings.useExistsInHasManyFilter) === true,\n\t\t\t\t))\n\t\t\t.addService('orderByBuilder', ({ joinBuilder, schema }) =>\n\t\t\t\tnew OrderByBuilder(schema.model, joinBuilder))\n\t\t\t.addService('relationFetcher', ({ whereBuilder, orderByBuilder, predicatesInjector, pathFactory }) =>\n\t\t\t\tnew RelationFetcher(whereBuilder, orderByBuilder, predicatesInjector, pathFactory))\n\t\t\t.addService('fieldsVisitorFactory', ({ relationFetcher, predicateFactory, schema }) =>\n\t\t\t\tnew FieldsVisitorFactory(relationFetcher, predicateFactory, schema.settings.content ?? {}))\n\t\t\t.addService('metaHandler', ({ whereBuilder, predicateFactory }) =>\n\t\t\t\tnew MetaHandler(whereBuilder, predicateFactory))\n\t\t\t.addService('uniqueWhereExpander', ({ schema }) =>\n\t\t\t\tnew UniqueWhereExpander(schema.model))\n\t\t\t.addService('hasManyToHasOneReducer', ({ uniqueWhereExpander, schema }) =>\n\t\t\t\tnew HasManyToHasOneReducerExecutionHandler(schema.model, uniqueWhereExpander))\n\t\t\t.addService('paginatedHasManyExecutionHandler', ({ relationFetcher, schema }) =>\n\t\t\t\tnew PaginatedHasManyExecutionHandler(schema.model, relationFetcher))\n\t\t\t.addService('selectHandlers', ({ hasManyToHasOneReducer, paginatedHasManyExecutionHandler }) => ({\n\t\t\t\t[HasManyToHasOneReducer.extensionName]: hasManyToHasOneReducer,\n\t\t\t\t[PaginatedHasManyFieldProvider.extensionName]: paginatedHasManyExecutionHandler,\n\t\t\t}))\n\t\t\t.addService('selectBuilderFactory', ({ whereBuilder, orderByBuilder, fieldsVisitorFactory, metaHandler, selectHandlers, pathFactory, predicateFactory, schema }) =>\n\t\t\t\tnew (class implements SelectBuilderFactory {\n\t\t\t\t\tcreate(qb: DbSelectBuilder, hydrator: SelectHydrator, relationPath: Model.AnyRelationContext[]): SelectBuilder {\n\t\t\t\t\t\treturn new SelectBuilder(\n\t\t\t\t\t\t\tschema.model,\n\t\t\t\t\t\t\twhereBuilder,\n\t\t\t\t\t\t\torderByBuilder,\n\t\t\t\t\t\t\tmetaHandler,\n\t\t\t\t\t\t\tqb,\n\t\t\t\t\t\t\thydrator,\n\t\t\t\t\t\t\tfieldsVisitorFactory,\n\t\t\t\t\t\t\tselectHandlers,\n\t\t\t\t\t\t\tpathFactory,\n\t\t\t\t\t\t\trelationPath,\n\t\t\t\t\t\t\tpredicateFactory,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t})())\n\t\t\t.addService('insertBuilderFactory', ({ whereBuilder, pathFactory, schema, predicateFactory }) =>\n\t\t\t\tnew InsertBuilderFactory(schema.model, whereBuilder, pathFactory, predicateFactory))\n\t\t\t.addService('updateBuilderFactory', ({ whereBuilder, pathFactory, schema, predicateFactory }) =>\n\t\t\t\tnew UpdateBuilderFactory(schema.model, whereBuilder, pathFactory, predicateFactory))\n\t\t\t.addService('connectJunctionHandler', () =>\n\t\t\t\tnew JunctionConnectHandler())\n\t\t\t.addService('disconnectJunctionHandler', ({}) =>\n\t\t\t\tnew JunctionDisconnectHandler())\n\t\t\t.addService('junctionTableManager', ({ predicateFactory, whereBuilder, connectJunctionHandler, disconnectJunctionHandler, pathFactory, schema }) =>\n\t\t\t\tnew JunctionTableManager(schema.model, predicateFactory, whereBuilder, connectJunctionHandler, disconnectJunctionHandler, pathFactory))\n\t\t\t.addService('deleteExecutor', ({ predicateFactory, updateBuilderFactory, whereBuilder, pathFactory, schema }) =>\n\t\t\t\tnew DeleteExecutor(schema.model, predicateFactory, whereBuilder, updateBuilderFactory, pathFactory))\n\t\t\t.addService('updater', ({ predicateFactory, updateBuilderFactory, schema, schemaDatabaseMetadata }) =>\n\t\t\t\tnew Updater(schema.model, schemaDatabaseMetadata, predicateFactory, updateBuilderFactory))\n\t\t\t.addService('inserter', ({ insertBuilderFactory, providers, schema, schemaDatabaseMetadata }) =>\n\t\t\t\tnew Inserter(schema.model, schemaDatabaseMetadata, insertBuilderFactory, providers))\n\t\t\t.addService('mapperFactory', ({ predicatesInjector, selectBuilderFactory, uniqueWhereExpander, whereBuilder, junctionTableManager, deleteExecutor, updater, inserter, pathFactory, providers, schema, schemaDatabaseMetadata }) => {\n\t\t\t\treturn new MapperFactory(\n\t\t\t\t\tdb,\n\t\t\t\t\tidentityId,\n\t\t\t\t\tschema.model,\n\t\t\t\t\tschemaDatabaseMetadata,\n\t\t\t\t\tpredicatesInjector,\n\t\t\t\t\tselectBuilderFactory,\n\t\t\t\t\tuniqueWhereExpander,\n\t\t\t\t\twhereBuilder,\n\t\t\t\t\tjunctionTableManager,\n\t\t\t\t\tdeleteExecutor,\n\t\t\t\t\tupdater,\n\t\t\t\t\tinserter,\n\t\t\t\t\tpathFactory,\n\t\t\t\t\tproviders,\n\t\t\t\t)\n\t\t\t})\n\n\t\t\t.addService('queryAstFactory', () =>\n\t\t\t\tnew GraphQlQueryAstFactory())\n\t\t\t.addService('readResolver', ({ mapperFactory, queryAstFactory }) =>\n\t\t\t\tnew ReadResolver(mapperFactory, queryAstFactory))\n\t\t\t.addService('validationDependencyCollector', () =>\n\t\t\t\tnew DependencyCollector())\n\t\t\t.addService('validationQueryAstFactory', ({ schema }) =>\n\t\t\t\tnew QueryAstFactory(schema.model))\n\t\t\t.addService('dataSelector', ({ validationQueryAstFactory, schema }) =>\n\t\t\t\tnew ValidationDataSelector(schema.model, validationQueryAstFactory))\n\t\t\t.addService('columnValueResolver', ({ providers }) =>\n\t\t\t\tnew ColumnValueResolver(providers))\n\t\t\t.addService('entityRulesResolver', ({ schema }) =>\n\t\t\t\tnew EntityRulesResolver(schema.validation, schema.model))\n\t\t\t.addService('inputPreValidator', ({ entityRulesResolver, columnValueResolver, dataSelector, schema }) =>\n\t\t\t\tnew InputPreValidator(schema.model, entityRulesResolver, columnValueResolver, dataSelector))\n\t\t\t.addService('mutationResolver', ({ mapperFactory, inputPreValidator, queryAstFactory, schema, schemaDatabaseMetadata }) =>\n\t\t\t\tnew MutationResolver(schema.model, mapperFactory, inputPreValidator, queryAstFactory, schemaDatabaseMetadata))\n\t\t\t.addService('validationResolver', ({ inputPreValidator, mapperFactory }) =>\n\t\t\t\tnew ValidationResolver(mapperFactory, inputPreValidator))\n\t}\n\n\tpublic create(args: ExecutionContainerArgs): ExecutionContainer {\n\t\treturn this.createBuilder(args).build().pick('validationResolver', 'readResolver', 'mutationResolver')\n\t}\n}\n\n"],"names":["Builder","schema","VariableInjector","PredicateFactory","PredicatesInjector","JoinBuilder","ConditionBuilder","PathFactory","WhereOptimizer","ConditionOptimizer","WhereBuilder","OrderByBuilder","RelationFetcher","FieldsVisitorFactory","MetaHandler","UniqueWhereExpander","HasManyToHasOneReducerExecutionHandler","PaginatedHasManyExecutionHandler","HasManyToHasOneReducer","PaginatedHasManyFieldProvider","SelectBuilder","InsertBuilderFactory","UpdateBuilderFactory","JunctionConnectHandler","JunctionDisconnectHandler","JunctionTableManager","DeleteExecutor","schemaDatabaseMetadata","Updater","Inserter","MapperFactory","GraphQlQueryAstFactory","ReadResolver","DependencyCollector","QueryAstFactory","ValidationDataSelector","ColumnValueResolver","EntityRulesResolver","InputPreValidator","MutationResolver","ValidationResolver"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ExecutionContainer.cjs","sources":["../../../../packages/engine-content-api/src/ExecutionContainer.ts"],"sourcesContent":["import { PredicateFactory, PredicatesInjector, VariableInjector } from './acl'\nimport {\n\tConditionBuilder,\n\tFieldsVisitorFactory,\n\tJoinBuilder,\n\tMetaHandler,\n\tOrderByBuilder,\n\tRelationFetcher,\n\tWhereBuilder,\n} from './mapper/select'\nimport { UniqueWhereExpander } from './inputProcessing'\nimport { HasManyToHasOneReducer, HasManyToHasOneReducerExecutionHandler } from './extensions'\nimport {\n\tDeleteExecutor,\n\tInsertBuilderFactory,\n\tInserter,\n\tJunctionConnectHandler,\n\tJunctionDisconnectHandler,\n\tJunctionTableManager,\n\tMapperFactory,\n\tPathFactory,\n\tSelectBuilder,\n\tSelectBuilderFactory,\n\tSelectHydrator,\n\tUpdateBuilderFactory,\n\tUpdater,\n} from './mapper'\nimport { Builder } from '@contember/dic'\nimport { Acl, Model, Schema } from '@contember/schema'\nimport { Client, DatabaseMetadata, SelectBuilder as DbSelectBuilder } from '@contember/database'\nimport { Providers } from '@contember/schema-utils'\nimport { PaginatedHasManyExecutionHandler } from './extensions/paginatedHasMany/PaginatedHasManyExecutionHandler'\nimport { PaginatedHasManyFieldProvider } from './extensions/paginatedHasMany/PaginatedHasManyFieldProvider'\nimport { WhereOptimizer, WhereOptimizerOptions } from './mapper/select/optimizer/WhereOptimizer'\nimport { ConditionOptimizer } from './mapper/select/optimizer/ConditionOptimizer'\nimport { GraphQlQueryAstFactory, MutationResolver, ReadResolver, ValidationResolver } from './resolvers'\nimport {\n\tColumnValueResolver,\n\tDependencyCollector,\n\tEntityRulesResolver, InputPreValidator,\n\tQueryAstFactory,\n\tValidationDataSelector,\n} from './input-validation'\n\nexport type ExecutionContainerArgs = {\n\tschema: Schema\n\tschemaMeta: { id?: number }\n\tschemaDatabaseMetadata: DatabaseMetadata\n\tdb: Client\n\tidentityId: string\n\tidentityVariables: Acl.VariablesMap\n\tpermissions: Acl.Permissions\n\tsystemSchema: string\n\tproject: { slug: string }\n\tstage: { id: string; slug: string }\n}\n\nexport interface ExecutionContainer {\n\treadResolver: ReadResolver\n\tmutationResolver: MutationResolver\n\tvalidationResolver: ValidationResolver\n}\n\nexport type ExecutionContainerBuilder = ReturnType<ExecutionContainerFactory['createBuilderInternal']>\nexport type ExecutionContainerHook = (builder: ExecutionContainerBuilder) => ExecutionContainerBuilder\n\nexport class ExecutionContainerFactory {\n\tpublic readonly hooks: ExecutionContainerHook[] = []\n\n\tconstructor(\n\t\tprivate readonly providers: Providers,\n\t\tprivate readonly whereOptimizerOptions?: WhereOptimizerOptions,\n\t) {\n\t}\n\n\tcreateBuilder(args: ExecutionContainerArgs): ExecutionContainerBuilder {\n\t\tconst builder = this.createBuilderInternal(args)\n\t\treturn this.hooks.reduce((acc, cb) => cb(acc), builder)\n\t}\n\n\tcreateBuilderInternal({ permissions, identityVariables, identityId, db, schema, schemaMeta, systemSchema, stage, project, schemaDatabaseMetadata }: ExecutionContainerArgs) {\n\t\treturn new Builder({})\n\t\t\t.addService('systemSchema', () =>\n\t\t\t\tsystemSchema)\n\t\t\t.addService('db', () =>\n\t\t\t\tdb)\n\t\t\t.addService('project', () =>\n\t\t\t\tproject)\n\t\t\t.addService('stage', () =>\n\t\t\t\tstage)\n\t\t\t.addService('schema', () =>\n\t\t\t\tschema)\n\t\t\t.addService('schemaMeta', () =>\n\t\t\t\tschemaMeta)\n\t\t\t.addService('schemaDatabaseMetadata', () =>\n\t\t\t\tschemaDatabaseMetadata)\n\t\t\t.addService('providers', () =>\n\t\t\t\tthis.providers)\n\t\t\t.addService('variableInjector', ({ schema }) =>\n\t\t\t\tnew VariableInjector(schema.model, identityVariables))\n\t\t\t.addService('predicateFactory', ({ variableInjector, schema }) =>\n\t\t\t\tnew PredicateFactory(permissions, schema.model, variableInjector))\n\t\t\t.addService('predicatesInjector', ({ predicateFactory, schema }) =>\n\t\t\t\tnew PredicatesInjector(schema.model, predicateFactory))\n\t\t\t.addService('joinBuilder', ({ schema }) =>\n\t\t\t\tnew JoinBuilder(schema.model))\n\t\t\t.addService('conditionBuilder', () =>\n\t\t\t\tnew ConditionBuilder())\n\t\t\t.addService('pathFactory', () =>\n\t\t\t\tnew PathFactory())\n\t\t\t.addService('whereOptimized', ({ schema }) =>\n\t\t\t\tnew WhereOptimizer(schema.model, new ConditionOptimizer(), this.whereOptimizerOptions))\n\t\t\t.addService('whereBuilder', ({ joinBuilder, conditionBuilder, pathFactory, whereOptimized, schema }) =>\n\t\t\t\tnew WhereBuilder(\n\t\t\t\t\tschema.model,\n\t\t\t\t\tjoinBuilder,\n\t\t\t\t\tconditionBuilder,\n\t\t\t\t\tpathFactory,\n\t\t\t\t\twhereOptimized,\n\t\t\t\t\t(schema.settings.content?.useExistsInHasManyFilter ?? schema.settings.useExistsInHasManyFilter) === true,\n\t\t\t\t))\n\t\t\t.addService('orderByBuilder', ({ joinBuilder, schema }) =>\n\t\t\t\tnew OrderByBuilder(schema.model, joinBuilder))\n\t\t\t.addService('relationFetcher', ({ whereBuilder, orderByBuilder, predicatesInjector, pathFactory }) =>\n\t\t\t\tnew RelationFetcher(whereBuilder, orderByBuilder, predicatesInjector, pathFactory))\n\t\t\t.addService('fieldsVisitorFactory', ({ relationFetcher, predicateFactory, schema }) =>\n\t\t\t\tnew FieldsVisitorFactory(relationFetcher, predicateFactory, schema.settings.content ?? {}))\n\t\t\t.addService('metaHandler', ({ whereBuilder, predicateFactory }) =>\n\t\t\t\tnew MetaHandler(whereBuilder, predicateFactory))\n\t\t\t.addService('uniqueWhereExpander', ({ schema }) =>\n\t\t\t\tnew UniqueWhereExpander(schema.model))\n\t\t\t.addService('hasManyToHasOneReducer', ({ uniqueWhereExpander, schema }) =>\n\t\t\t\tnew HasManyToHasOneReducerExecutionHandler(schema.model, uniqueWhereExpander))\n\t\t\t.addService('paginatedHasManyExecutionHandler', ({ relationFetcher, schema }) =>\n\t\t\t\tnew PaginatedHasManyExecutionHandler(schema.model, relationFetcher))\n\t\t\t.addService('selectHandlers', ({ hasManyToHasOneReducer, paginatedHasManyExecutionHandler }) => ({\n\t\t\t\t[HasManyToHasOneReducer.extensionName]: hasManyToHasOneReducer,\n\t\t\t\t[PaginatedHasManyFieldProvider.extensionName]: paginatedHasManyExecutionHandler,\n\t\t\t}))\n\t\t\t.addService('selectBuilderFactory', ({ whereBuilder, orderByBuilder, fieldsVisitorFactory, metaHandler, selectHandlers, pathFactory, predicateFactory, schema }) =>\n\t\t\t\tnew (class implements SelectBuilderFactory {\n\t\t\t\t\tcreate(qb: DbSelectBuilder, hydrator: SelectHydrator, relationPath: Model.AnyRelationContext[]): SelectBuilder {\n\t\t\t\t\t\treturn new SelectBuilder(\n\t\t\t\t\t\t\tschema.model,\n\t\t\t\t\t\t\twhereBuilder,\n\t\t\t\t\t\t\torderByBuilder,\n\t\t\t\t\t\t\tmetaHandler,\n\t\t\t\t\t\t\tqb,\n\t\t\t\t\t\t\thydrator,\n\t\t\t\t\t\t\tfieldsVisitorFactory,\n\t\t\t\t\t\t\tselectHandlers,\n\t\t\t\t\t\t\tpathFactory,\n\t\t\t\t\t\t\trelationPath,\n\t\t\t\t\t\t\tpredicateFactory,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t})())\n\t\t\t.addService('insertBuilderFactory', ({ whereBuilder, pathFactory, schema, predicateFactory }) =>\n\t\t\t\tnew InsertBuilderFactory(schema.model, whereBuilder, pathFactory, predicateFactory))\n\t\t\t.addService('updateBuilderFactory', ({ whereBuilder, pathFactory, schema, predicateFactory }) =>\n\t\t\t\tnew UpdateBuilderFactory(schema.model, whereBuilder, pathFactory, predicateFactory))\n\t\t\t.addService('connectJunctionHandler', () =>\n\t\t\t\tnew JunctionConnectHandler())\n\t\t\t.addService('disconnectJunctionHandler', ({}) =>\n\t\t\t\tnew JunctionDisconnectHandler())\n\t\t\t.addService('junctionTableManager', ({ predicateFactory, whereBuilder, connectJunctionHandler, disconnectJunctionHandler, pathFactory, schema }) =>\n\t\t\t\tnew JunctionTableManager(schema.model, predicateFactory, whereBuilder, connectJunctionHandler, disconnectJunctionHandler, pathFactory))\n\t\t\t.addService('deleteExecutor', ({ predicateFactory, updateBuilderFactory, whereBuilder, pathFactory, schema }) =>\n\t\t\t\tnew DeleteExecutor(schema.model, predicateFactory, whereBuilder, updateBuilderFactory, pathFactory))\n\t\t\t.addService('updater', ({ updateBuilderFactory, schema }) =>\n\t\t\t\tnew Updater(schema.model, updateBuilderFactory))\n\t\t\t.addService('inserter', ({ insertBuilderFactory, providers, schema, schemaDatabaseMetadata }) =>\n\t\t\t\tnew Inserter(schema.model, schemaDatabaseMetadata, insertBuilderFactory, providers))\n\t\t\t.addService('mapperFactory', ({ predicatesInjector, selectBuilderFactory, uniqueWhereExpander, whereBuilder, junctionTableManager, deleteExecutor, updater, inserter, pathFactory, providers, schema, schemaDatabaseMetadata }) => {\n\t\t\t\treturn new MapperFactory(\n\t\t\t\t\tdb,\n\t\t\t\t\tidentityId,\n\t\t\t\t\tschema.model,\n\t\t\t\t\tschemaDatabaseMetadata,\n\t\t\t\t\tpredicatesInjector,\n\t\t\t\t\tselectBuilderFactory,\n\t\t\t\t\tuniqueWhereExpander,\n\t\t\t\t\twhereBuilder,\n\t\t\t\t\tjunctionTableManager,\n\t\t\t\t\tdeleteExecutor,\n\t\t\t\t\tupdater,\n\t\t\t\t\tinserter,\n\t\t\t\t\tpathFactory,\n\t\t\t\t\tproviders,\n\t\t\t\t)\n\t\t\t})\n\n\t\t\t.addService('queryAstFactory', () =>\n\t\t\t\tnew GraphQlQueryAstFactory())\n\t\t\t.addService('readResolver', ({ mapperFactory, queryAstFactory }) =>\n\t\t\t\tnew ReadResolver(mapperFactory, queryAstFactory))\n\t\t\t.addService('validationDependencyCollector', () =>\n\t\t\t\tnew DependencyCollector())\n\t\t\t.addService('validationQueryAstFactory', ({ schema }) =>\n\t\t\t\tnew QueryAstFactory(schema.model))\n\t\t\t.addService('dataSelector', ({ validationQueryAstFactory, schema }) =>\n\t\t\t\tnew ValidationDataSelector(schema.model, validationQueryAstFactory))\n\t\t\t.addService('columnValueResolver', ({ providers }) =>\n\t\t\t\tnew ColumnValueResolver(providers))\n\t\t\t.addService('entityRulesResolver', ({ schema }) =>\n\t\t\t\tnew EntityRulesResolver(schema.validation, schema.model))\n\t\t\t.addService('inputPreValidator', ({ entityRulesResolver, columnValueResolver, dataSelector, schema }) =>\n\t\t\t\tnew InputPreValidator(schema.model, entityRulesResolver, columnValueResolver, dataSelector))\n\t\t\t.addService('mutationResolver', ({ mapperFactory, inputPreValidator, queryAstFactory, schema, schemaDatabaseMetadata }) =>\n\t\t\t\tnew MutationResolver(schema.model, mapperFactory, inputPreValidator, queryAstFactory, schemaDatabaseMetadata))\n\t\t\t.addService('validationResolver', ({ inputPreValidator, mapperFactory }) =>\n\t\t\t\tnew ValidationResolver(mapperFactory, inputPreValidator))\n\t}\n\n\tpublic create(args: ExecutionContainerArgs): ExecutionContainer {\n\t\treturn this.createBuilder(args).build().pick('validationResolver', 'readResolver', 'mutationResolver')\n\t}\n}\n\n"],"names":["Builder","schema","VariableInjector","PredicateFactory","PredicatesInjector","JoinBuilder","ConditionBuilder","PathFactory","WhereOptimizer","ConditionOptimizer","WhereBuilder","OrderByBuilder","RelationFetcher","FieldsVisitorFactory","MetaHandler","UniqueWhereExpander","HasManyToHasOneReducerExecutionHandler","PaginatedHasManyExecutionHandler","HasManyToHasOneReducer","PaginatedHasManyFieldProvider","SelectBuilder","InsertBuilderFactory","UpdateBuilderFactory","JunctionConnectHandler","JunctionDisconnectHandler","JunctionTableManager","DeleteExecutor","Updater","schemaDatabaseMetadata","Inserter","MapperFactory","GraphQlQueryAstFactory","ReadResolver","DependencyCollector","QueryAstFactory","ValidationDataSelector","ColumnValueResolver","EntityRulesResolver","InputPreValidator","MutationResolver","ValidationResolver"],"mappings":"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"}
|
|
@@ -47,8 +47,9 @@ var __defProp = Object.defineProperty;
|
|
|
47
47
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
48
48
|
var __publicField = (obj, key, value) => __defNormalProp(obj, key + "", value);
|
|
49
49
|
class ExecutionContainerFactory {
|
|
50
|
-
constructor(providers) {
|
|
50
|
+
constructor(providers, whereOptimizerOptions) {
|
|
51
51
|
this.providers = providers;
|
|
52
|
+
this.whereOptimizerOptions = whereOptimizerOptions;
|
|
52
53
|
__publicField(this, "hooks", []);
|
|
53
54
|
}
|
|
54
55
|
createBuilder(args) {
|
|
@@ -56,7 +57,7 @@ class ExecutionContainerFactory {
|
|
|
56
57
|
return this.hooks.reduce((acc, cb) => cb(acc), builder);
|
|
57
58
|
}
|
|
58
59
|
createBuilderInternal({ permissions, identityVariables, identityId, db, schema, schemaMeta, systemSchema, stage, project, schemaDatabaseMetadata }) {
|
|
59
|
-
return new Builder({}).addService("systemSchema", () => systemSchema).addService("db", () => db).addService("project", () => project).addService("stage", () => stage).addService("schema", () => schema).addService("schemaMeta", () => schemaMeta).addService("schemaDatabaseMetadata", () => schemaDatabaseMetadata).addService("providers", () => this.providers).addService("variableInjector", ({ schema: schema2 }) => new VariableInjector(schema2.model, identityVariables)).addService("predicateFactory", ({ variableInjector, schema: schema2 }) => new PredicateFactory(permissions, schema2.model, variableInjector)).addService("predicatesInjector", ({ predicateFactory, schema: schema2 }) => new PredicatesInjector(schema2.model, predicateFactory)).addService("joinBuilder", ({ schema: schema2 }) => new JoinBuilder(schema2.model)).addService("conditionBuilder", () => new ConditionBuilder()).addService("pathFactory", () => new PathFactory()).addService("whereOptimized", ({ schema: schema2 }) => new WhereOptimizer(schema2.model, new ConditionOptimizer())).addService("whereBuilder", ({ joinBuilder, conditionBuilder, pathFactory, whereOptimized, schema: schema2 }) => new WhereBuilder(
|
|
60
|
+
return new Builder({}).addService("systemSchema", () => systemSchema).addService("db", () => db).addService("project", () => project).addService("stage", () => stage).addService("schema", () => schema).addService("schemaMeta", () => schemaMeta).addService("schemaDatabaseMetadata", () => schemaDatabaseMetadata).addService("providers", () => this.providers).addService("variableInjector", ({ schema: schema2 }) => new VariableInjector(schema2.model, identityVariables)).addService("predicateFactory", ({ variableInjector, schema: schema2 }) => new PredicateFactory(permissions, schema2.model, variableInjector)).addService("predicatesInjector", ({ predicateFactory, schema: schema2 }) => new PredicatesInjector(schema2.model, predicateFactory)).addService("joinBuilder", ({ schema: schema2 }) => new JoinBuilder(schema2.model)).addService("conditionBuilder", () => new ConditionBuilder()).addService("pathFactory", () => new PathFactory()).addService("whereOptimized", ({ schema: schema2 }) => new WhereOptimizer(schema2.model, new ConditionOptimizer(), this.whereOptimizerOptions)).addService("whereBuilder", ({ joinBuilder, conditionBuilder, pathFactory, whereOptimized, schema: schema2 }) => new WhereBuilder(
|
|
60
61
|
schema2.model,
|
|
61
62
|
joinBuilder,
|
|
62
63
|
conditionBuilder,
|
|
@@ -82,7 +83,7 @@ class ExecutionContainerFactory {
|
|
|
82
83
|
predicateFactory
|
|
83
84
|
);
|
|
84
85
|
}
|
|
85
|
-
}()).addService("insertBuilderFactory", ({ whereBuilder, pathFactory, schema: schema2, predicateFactory }) => new InsertBuilderFactory(schema2.model, whereBuilder, pathFactory, predicateFactory)).addService("updateBuilderFactory", ({ whereBuilder, pathFactory, schema: schema2, predicateFactory }) => new UpdateBuilderFactory(schema2.model, whereBuilder, pathFactory, predicateFactory)).addService("connectJunctionHandler", () => new JunctionConnectHandler()).addService("disconnectJunctionHandler", ({}) => new JunctionDisconnectHandler()).addService("junctionTableManager", ({ predicateFactory, whereBuilder, connectJunctionHandler, disconnectJunctionHandler, pathFactory, schema: schema2 }) => new JunctionTableManager(schema2.model, predicateFactory, whereBuilder, connectJunctionHandler, disconnectJunctionHandler, pathFactory)).addService("deleteExecutor", ({ predicateFactory, updateBuilderFactory, whereBuilder, pathFactory, schema: schema2 }) => new DeleteExecutor(schema2.model, predicateFactory, whereBuilder, updateBuilderFactory, pathFactory)).addService("updater", ({
|
|
86
|
+
}()).addService("insertBuilderFactory", ({ whereBuilder, pathFactory, schema: schema2, predicateFactory }) => new InsertBuilderFactory(schema2.model, whereBuilder, pathFactory, predicateFactory)).addService("updateBuilderFactory", ({ whereBuilder, pathFactory, schema: schema2, predicateFactory }) => new UpdateBuilderFactory(schema2.model, whereBuilder, pathFactory, predicateFactory)).addService("connectJunctionHandler", () => new JunctionConnectHandler()).addService("disconnectJunctionHandler", ({}) => new JunctionDisconnectHandler()).addService("junctionTableManager", ({ predicateFactory, whereBuilder, connectJunctionHandler, disconnectJunctionHandler, pathFactory, schema: schema2 }) => new JunctionTableManager(schema2.model, predicateFactory, whereBuilder, connectJunctionHandler, disconnectJunctionHandler, pathFactory)).addService("deleteExecutor", ({ predicateFactory, updateBuilderFactory, whereBuilder, pathFactory, schema: schema2 }) => new DeleteExecutor(schema2.model, predicateFactory, whereBuilder, updateBuilderFactory, pathFactory)).addService("updater", ({ updateBuilderFactory, schema: schema2 }) => new Updater(schema2.model, updateBuilderFactory)).addService("inserter", ({ insertBuilderFactory, providers, schema: schema2, schemaDatabaseMetadata: schemaDatabaseMetadata2 }) => new Inserter(schema2.model, schemaDatabaseMetadata2, insertBuilderFactory, providers)).addService("mapperFactory", ({ predicatesInjector, selectBuilderFactory, uniqueWhereExpander, whereBuilder, junctionTableManager, deleteExecutor, updater, inserter, pathFactory, providers, schema: schema2, schemaDatabaseMetadata: schemaDatabaseMetadata2 }) => {
|
|
86
87
|
return new MapperFactory(
|
|
87
88
|
db,
|
|
88
89
|
identityId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExecutionContainer.js","sources":["../../../../packages/engine-content-api/src/ExecutionContainer.ts"],"sourcesContent":["import { PredicateFactory, PredicatesInjector, VariableInjector } from './acl'\nimport {\n\tConditionBuilder,\n\tFieldsVisitorFactory,\n\tJoinBuilder,\n\tMetaHandler,\n\tOrderByBuilder,\n\tRelationFetcher,\n\tWhereBuilder,\n} from './mapper/select'\nimport { UniqueWhereExpander } from './inputProcessing'\nimport { HasManyToHasOneReducer, HasManyToHasOneReducerExecutionHandler } from './extensions'\nimport {\n\tDeleteExecutor,\n\tInsertBuilderFactory,\n\tInserter,\n\tJunctionConnectHandler,\n\tJunctionDisconnectHandler,\n\tJunctionTableManager,\n\tMapperFactory,\n\tPathFactory,\n\tSelectBuilder,\n\tSelectBuilderFactory,\n\tSelectHydrator,\n\tUpdateBuilderFactory,\n\tUpdater,\n} from './mapper'\nimport { Builder } from '@contember/dic'\nimport { Acl, Model, Schema } from '@contember/schema'\nimport { Client, DatabaseMetadata, SelectBuilder as DbSelectBuilder } from '@contember/database'\nimport { Providers } from '@contember/schema-utils'\nimport { PaginatedHasManyExecutionHandler } from './extensions/paginatedHasMany/PaginatedHasManyExecutionHandler'\nimport { PaginatedHasManyFieldProvider } from './extensions/paginatedHasMany/PaginatedHasManyFieldProvider'\nimport { WhereOptimizer } from './mapper/select/optimizer/WhereOptimizer'\nimport { ConditionOptimizer } from './mapper/select/optimizer/ConditionOptimizer'\nimport { GraphQlQueryAstFactory, MutationResolver, ReadResolver, ValidationResolver } from './resolvers'\nimport {\n\tColumnValueResolver,\n\tDependencyCollector,\n\tEntityRulesResolver, InputPreValidator,\n\tQueryAstFactory,\n\tValidationDataSelector,\n} from './input-validation'\n\nexport type ExecutionContainerArgs = {\n\tschema: Schema\n\tschemaMeta: { id?: number }\n\tschemaDatabaseMetadata: DatabaseMetadata\n\tdb: Client\n\tidentityId: string\n\tidentityVariables: Acl.VariablesMap\n\tpermissions: Acl.Permissions\n\tsystemSchema: string\n\tproject: { slug: string }\n\tstage: { id: string; slug: string }\n}\n\nexport interface ExecutionContainer {\n\treadResolver: ReadResolver\n\tmutationResolver: MutationResolver\n\tvalidationResolver: ValidationResolver\n}\n\nexport type ExecutionContainerBuilder = ReturnType<ExecutionContainerFactory['createBuilderInternal']>\nexport type ExecutionContainerHook = (builder: ExecutionContainerBuilder) => ExecutionContainerBuilder\n\nexport class ExecutionContainerFactory {\n\tpublic readonly hooks: ExecutionContainerHook[] = []\n\n\tconstructor(\n\t\tprivate readonly providers: Providers,\n\t) {\n\t}\n\n\tcreateBuilder(args: ExecutionContainerArgs): ExecutionContainerBuilder {\n\t\tconst builder = this.createBuilderInternal(args)\n\t\treturn this.hooks.reduce((acc, cb) => cb(acc), builder)\n\t}\n\n\tcreateBuilderInternal({ permissions, identityVariables, identityId, db, schema, schemaMeta, systemSchema, stage, project, schemaDatabaseMetadata }: ExecutionContainerArgs) {\n\t\treturn new Builder({})\n\t\t\t.addService('systemSchema', () =>\n\t\t\t\tsystemSchema)\n\t\t\t.addService('db', () =>\n\t\t\t\tdb)\n\t\t\t.addService('project', () =>\n\t\t\t\tproject)\n\t\t\t.addService('stage', () =>\n\t\t\t\tstage)\n\t\t\t.addService('schema', () =>\n\t\t\t\tschema)\n\t\t\t.addService('schemaMeta', () =>\n\t\t\t\tschemaMeta)\n\t\t\t.addService('schemaDatabaseMetadata', () =>\n\t\t\t\tschemaDatabaseMetadata)\n\t\t\t.addService('providers', () =>\n\t\t\t\tthis.providers)\n\t\t\t.addService('variableInjector', ({ schema }) =>\n\t\t\t\tnew VariableInjector(schema.model, identityVariables))\n\t\t\t.addService('predicateFactory', ({ variableInjector, schema }) =>\n\t\t\t\tnew PredicateFactory(permissions, schema.model, variableInjector))\n\t\t\t.addService('predicatesInjector', ({ predicateFactory, schema }) =>\n\t\t\t\tnew PredicatesInjector(schema.model, predicateFactory))\n\t\t\t.addService('joinBuilder', ({ schema }) =>\n\t\t\t\tnew JoinBuilder(schema.model))\n\t\t\t.addService('conditionBuilder', () =>\n\t\t\t\tnew ConditionBuilder())\n\t\t\t.addService('pathFactory', () =>\n\t\t\t\tnew PathFactory())\n\t\t\t.addService('whereOptimized', ({ schema }) =>\n\t\t\t\tnew WhereOptimizer(schema.model, new ConditionOptimizer()))\n\t\t\t.addService('whereBuilder', ({ joinBuilder, conditionBuilder, pathFactory, whereOptimized, schema }) =>\n\t\t\t\tnew WhereBuilder(\n\t\t\t\t\tschema.model,\n\t\t\t\t\tjoinBuilder,\n\t\t\t\t\tconditionBuilder,\n\t\t\t\t\tpathFactory,\n\t\t\t\t\twhereOptimized,\n\t\t\t\t\t(schema.settings.content?.useExistsInHasManyFilter ?? schema.settings.useExistsInHasManyFilter) === true,\n\t\t\t\t))\n\t\t\t.addService('orderByBuilder', ({ joinBuilder, schema }) =>\n\t\t\t\tnew OrderByBuilder(schema.model, joinBuilder))\n\t\t\t.addService('relationFetcher', ({ whereBuilder, orderByBuilder, predicatesInjector, pathFactory }) =>\n\t\t\t\tnew RelationFetcher(whereBuilder, orderByBuilder, predicatesInjector, pathFactory))\n\t\t\t.addService('fieldsVisitorFactory', ({ relationFetcher, predicateFactory, schema }) =>\n\t\t\t\tnew FieldsVisitorFactory(relationFetcher, predicateFactory, schema.settings.content ?? {}))\n\t\t\t.addService('metaHandler', ({ whereBuilder, predicateFactory }) =>\n\t\t\t\tnew MetaHandler(whereBuilder, predicateFactory))\n\t\t\t.addService('uniqueWhereExpander', ({ schema }) =>\n\t\t\t\tnew UniqueWhereExpander(schema.model))\n\t\t\t.addService('hasManyToHasOneReducer', ({ uniqueWhereExpander, schema }) =>\n\t\t\t\tnew HasManyToHasOneReducerExecutionHandler(schema.model, uniqueWhereExpander))\n\t\t\t.addService('paginatedHasManyExecutionHandler', ({ relationFetcher, schema }) =>\n\t\t\t\tnew PaginatedHasManyExecutionHandler(schema.model, relationFetcher))\n\t\t\t.addService('selectHandlers', ({ hasManyToHasOneReducer, paginatedHasManyExecutionHandler }) => ({\n\t\t\t\t[HasManyToHasOneReducer.extensionName]: hasManyToHasOneReducer,\n\t\t\t\t[PaginatedHasManyFieldProvider.extensionName]: paginatedHasManyExecutionHandler,\n\t\t\t}))\n\t\t\t.addService('selectBuilderFactory', ({ whereBuilder, orderByBuilder, fieldsVisitorFactory, metaHandler, selectHandlers, pathFactory, predicateFactory, schema }) =>\n\t\t\t\tnew (class implements SelectBuilderFactory {\n\t\t\t\t\tcreate(qb: DbSelectBuilder, hydrator: SelectHydrator, relationPath: Model.AnyRelationContext[]): SelectBuilder {\n\t\t\t\t\t\treturn new SelectBuilder(\n\t\t\t\t\t\t\tschema.model,\n\t\t\t\t\t\t\twhereBuilder,\n\t\t\t\t\t\t\torderByBuilder,\n\t\t\t\t\t\t\tmetaHandler,\n\t\t\t\t\t\t\tqb,\n\t\t\t\t\t\t\thydrator,\n\t\t\t\t\t\t\tfieldsVisitorFactory,\n\t\t\t\t\t\t\tselectHandlers,\n\t\t\t\t\t\t\tpathFactory,\n\t\t\t\t\t\t\trelationPath,\n\t\t\t\t\t\t\tpredicateFactory,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t})())\n\t\t\t.addService('insertBuilderFactory', ({ whereBuilder, pathFactory, schema, predicateFactory }) =>\n\t\t\t\tnew InsertBuilderFactory(schema.model, whereBuilder, pathFactory, predicateFactory))\n\t\t\t.addService('updateBuilderFactory', ({ whereBuilder, pathFactory, schema, predicateFactory }) =>\n\t\t\t\tnew UpdateBuilderFactory(schema.model, whereBuilder, pathFactory, predicateFactory))\n\t\t\t.addService('connectJunctionHandler', () =>\n\t\t\t\tnew JunctionConnectHandler())\n\t\t\t.addService('disconnectJunctionHandler', ({}) =>\n\t\t\t\tnew JunctionDisconnectHandler())\n\t\t\t.addService('junctionTableManager', ({ predicateFactory, whereBuilder, connectJunctionHandler, disconnectJunctionHandler, pathFactory, schema }) =>\n\t\t\t\tnew JunctionTableManager(schema.model, predicateFactory, whereBuilder, connectJunctionHandler, disconnectJunctionHandler, pathFactory))\n\t\t\t.addService('deleteExecutor', ({ predicateFactory, updateBuilderFactory, whereBuilder, pathFactory, schema }) =>\n\t\t\t\tnew DeleteExecutor(schema.model, predicateFactory, whereBuilder, updateBuilderFactory, pathFactory))\n\t\t\t.addService('updater', ({ predicateFactory, updateBuilderFactory, schema, schemaDatabaseMetadata }) =>\n\t\t\t\tnew Updater(schema.model, schemaDatabaseMetadata, predicateFactory, updateBuilderFactory))\n\t\t\t.addService('inserter', ({ insertBuilderFactory, providers, schema, schemaDatabaseMetadata }) =>\n\t\t\t\tnew Inserter(schema.model, schemaDatabaseMetadata, insertBuilderFactory, providers))\n\t\t\t.addService('mapperFactory', ({ predicatesInjector, selectBuilderFactory, uniqueWhereExpander, whereBuilder, junctionTableManager, deleteExecutor, updater, inserter, pathFactory, providers, schema, schemaDatabaseMetadata }) => {\n\t\t\t\treturn new MapperFactory(\n\t\t\t\t\tdb,\n\t\t\t\t\tidentityId,\n\t\t\t\t\tschema.model,\n\t\t\t\t\tschemaDatabaseMetadata,\n\t\t\t\t\tpredicatesInjector,\n\t\t\t\t\tselectBuilderFactory,\n\t\t\t\t\tuniqueWhereExpander,\n\t\t\t\t\twhereBuilder,\n\t\t\t\t\tjunctionTableManager,\n\t\t\t\t\tdeleteExecutor,\n\t\t\t\t\tupdater,\n\t\t\t\t\tinserter,\n\t\t\t\t\tpathFactory,\n\t\t\t\t\tproviders,\n\t\t\t\t)\n\t\t\t})\n\n\t\t\t.addService('queryAstFactory', () =>\n\t\t\t\tnew GraphQlQueryAstFactory())\n\t\t\t.addService('readResolver', ({ mapperFactory, queryAstFactory }) =>\n\t\t\t\tnew ReadResolver(mapperFactory, queryAstFactory))\n\t\t\t.addService('validationDependencyCollector', () =>\n\t\t\t\tnew DependencyCollector())\n\t\t\t.addService('validationQueryAstFactory', ({ schema }) =>\n\t\t\t\tnew QueryAstFactory(schema.model))\n\t\t\t.addService('dataSelector', ({ validationQueryAstFactory, schema }) =>\n\t\t\t\tnew ValidationDataSelector(schema.model, validationQueryAstFactory))\n\t\t\t.addService('columnValueResolver', ({ providers }) =>\n\t\t\t\tnew ColumnValueResolver(providers))\n\t\t\t.addService('entityRulesResolver', ({ schema }) =>\n\t\t\t\tnew EntityRulesResolver(schema.validation, schema.model))\n\t\t\t.addService('inputPreValidator', ({ entityRulesResolver, columnValueResolver, dataSelector, schema }) =>\n\t\t\t\tnew InputPreValidator(schema.model, entityRulesResolver, columnValueResolver, dataSelector))\n\t\t\t.addService('mutationResolver', ({ mapperFactory, inputPreValidator, queryAstFactory, schema, schemaDatabaseMetadata }) =>\n\t\t\t\tnew MutationResolver(schema.model, mapperFactory, inputPreValidator, queryAstFactory, schemaDatabaseMetadata))\n\t\t\t.addService('validationResolver', ({ inputPreValidator, mapperFactory }) =>\n\t\t\t\tnew ValidationResolver(mapperFactory, inputPreValidator))\n\t}\n\n\tpublic create(args: ExecutionContainerArgs): ExecutionContainer {\n\t\treturn this.createBuilder(args).build().pick('validationResolver', 'readResolver', 'mutationResolver')\n\t}\n}\n\n"],"names":["schema","schemaDatabaseMetadata"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ExecutionContainer.js","sources":["../../../../packages/engine-content-api/src/ExecutionContainer.ts"],"sourcesContent":["import { PredicateFactory, PredicatesInjector, VariableInjector } from './acl'\nimport {\n\tConditionBuilder,\n\tFieldsVisitorFactory,\n\tJoinBuilder,\n\tMetaHandler,\n\tOrderByBuilder,\n\tRelationFetcher,\n\tWhereBuilder,\n} from './mapper/select'\nimport { UniqueWhereExpander } from './inputProcessing'\nimport { HasManyToHasOneReducer, HasManyToHasOneReducerExecutionHandler } from './extensions'\nimport {\n\tDeleteExecutor,\n\tInsertBuilderFactory,\n\tInserter,\n\tJunctionConnectHandler,\n\tJunctionDisconnectHandler,\n\tJunctionTableManager,\n\tMapperFactory,\n\tPathFactory,\n\tSelectBuilder,\n\tSelectBuilderFactory,\n\tSelectHydrator,\n\tUpdateBuilderFactory,\n\tUpdater,\n} from './mapper'\nimport { Builder } from '@contember/dic'\nimport { Acl, Model, Schema } from '@contember/schema'\nimport { Client, DatabaseMetadata, SelectBuilder as DbSelectBuilder } from '@contember/database'\nimport { Providers } from '@contember/schema-utils'\nimport { PaginatedHasManyExecutionHandler } from './extensions/paginatedHasMany/PaginatedHasManyExecutionHandler'\nimport { PaginatedHasManyFieldProvider } from './extensions/paginatedHasMany/PaginatedHasManyFieldProvider'\nimport { WhereOptimizer, WhereOptimizerOptions } from './mapper/select/optimizer/WhereOptimizer'\nimport { ConditionOptimizer } from './mapper/select/optimizer/ConditionOptimizer'\nimport { GraphQlQueryAstFactory, MutationResolver, ReadResolver, ValidationResolver } from './resolvers'\nimport {\n\tColumnValueResolver,\n\tDependencyCollector,\n\tEntityRulesResolver, InputPreValidator,\n\tQueryAstFactory,\n\tValidationDataSelector,\n} from './input-validation'\n\nexport type ExecutionContainerArgs = {\n\tschema: Schema\n\tschemaMeta: { id?: number }\n\tschemaDatabaseMetadata: DatabaseMetadata\n\tdb: Client\n\tidentityId: string\n\tidentityVariables: Acl.VariablesMap\n\tpermissions: Acl.Permissions\n\tsystemSchema: string\n\tproject: { slug: string }\n\tstage: { id: string; slug: string }\n}\n\nexport interface ExecutionContainer {\n\treadResolver: ReadResolver\n\tmutationResolver: MutationResolver\n\tvalidationResolver: ValidationResolver\n}\n\nexport type ExecutionContainerBuilder = ReturnType<ExecutionContainerFactory['createBuilderInternal']>\nexport type ExecutionContainerHook = (builder: ExecutionContainerBuilder) => ExecutionContainerBuilder\n\nexport class ExecutionContainerFactory {\n\tpublic readonly hooks: ExecutionContainerHook[] = []\n\n\tconstructor(\n\t\tprivate readonly providers: Providers,\n\t\tprivate readonly whereOptimizerOptions?: WhereOptimizerOptions,\n\t) {\n\t}\n\n\tcreateBuilder(args: ExecutionContainerArgs): ExecutionContainerBuilder {\n\t\tconst builder = this.createBuilderInternal(args)\n\t\treturn this.hooks.reduce((acc, cb) => cb(acc), builder)\n\t}\n\n\tcreateBuilderInternal({ permissions, identityVariables, identityId, db, schema, schemaMeta, systemSchema, stage, project, schemaDatabaseMetadata }: ExecutionContainerArgs) {\n\t\treturn new Builder({})\n\t\t\t.addService('systemSchema', () =>\n\t\t\t\tsystemSchema)\n\t\t\t.addService('db', () =>\n\t\t\t\tdb)\n\t\t\t.addService('project', () =>\n\t\t\t\tproject)\n\t\t\t.addService('stage', () =>\n\t\t\t\tstage)\n\t\t\t.addService('schema', () =>\n\t\t\t\tschema)\n\t\t\t.addService('schemaMeta', () =>\n\t\t\t\tschemaMeta)\n\t\t\t.addService('schemaDatabaseMetadata', () =>\n\t\t\t\tschemaDatabaseMetadata)\n\t\t\t.addService('providers', () =>\n\t\t\t\tthis.providers)\n\t\t\t.addService('variableInjector', ({ schema }) =>\n\t\t\t\tnew VariableInjector(schema.model, identityVariables))\n\t\t\t.addService('predicateFactory', ({ variableInjector, schema }) =>\n\t\t\t\tnew PredicateFactory(permissions, schema.model, variableInjector))\n\t\t\t.addService('predicatesInjector', ({ predicateFactory, schema }) =>\n\t\t\t\tnew PredicatesInjector(schema.model, predicateFactory))\n\t\t\t.addService('joinBuilder', ({ schema }) =>\n\t\t\t\tnew JoinBuilder(schema.model))\n\t\t\t.addService('conditionBuilder', () =>\n\t\t\t\tnew ConditionBuilder())\n\t\t\t.addService('pathFactory', () =>\n\t\t\t\tnew PathFactory())\n\t\t\t.addService('whereOptimized', ({ schema }) =>\n\t\t\t\tnew WhereOptimizer(schema.model, new ConditionOptimizer(), this.whereOptimizerOptions))\n\t\t\t.addService('whereBuilder', ({ joinBuilder, conditionBuilder, pathFactory, whereOptimized, schema }) =>\n\t\t\t\tnew WhereBuilder(\n\t\t\t\t\tschema.model,\n\t\t\t\t\tjoinBuilder,\n\t\t\t\t\tconditionBuilder,\n\t\t\t\t\tpathFactory,\n\t\t\t\t\twhereOptimized,\n\t\t\t\t\t(schema.settings.content?.useExistsInHasManyFilter ?? schema.settings.useExistsInHasManyFilter) === true,\n\t\t\t\t))\n\t\t\t.addService('orderByBuilder', ({ joinBuilder, schema }) =>\n\t\t\t\tnew OrderByBuilder(schema.model, joinBuilder))\n\t\t\t.addService('relationFetcher', ({ whereBuilder, orderByBuilder, predicatesInjector, pathFactory }) =>\n\t\t\t\tnew RelationFetcher(whereBuilder, orderByBuilder, predicatesInjector, pathFactory))\n\t\t\t.addService('fieldsVisitorFactory', ({ relationFetcher, predicateFactory, schema }) =>\n\t\t\t\tnew FieldsVisitorFactory(relationFetcher, predicateFactory, schema.settings.content ?? {}))\n\t\t\t.addService('metaHandler', ({ whereBuilder, predicateFactory }) =>\n\t\t\t\tnew MetaHandler(whereBuilder, predicateFactory))\n\t\t\t.addService('uniqueWhereExpander', ({ schema }) =>\n\t\t\t\tnew UniqueWhereExpander(schema.model))\n\t\t\t.addService('hasManyToHasOneReducer', ({ uniqueWhereExpander, schema }) =>\n\t\t\t\tnew HasManyToHasOneReducerExecutionHandler(schema.model, uniqueWhereExpander))\n\t\t\t.addService('paginatedHasManyExecutionHandler', ({ relationFetcher, schema }) =>\n\t\t\t\tnew PaginatedHasManyExecutionHandler(schema.model, relationFetcher))\n\t\t\t.addService('selectHandlers', ({ hasManyToHasOneReducer, paginatedHasManyExecutionHandler }) => ({\n\t\t\t\t[HasManyToHasOneReducer.extensionName]: hasManyToHasOneReducer,\n\t\t\t\t[PaginatedHasManyFieldProvider.extensionName]: paginatedHasManyExecutionHandler,\n\t\t\t}))\n\t\t\t.addService('selectBuilderFactory', ({ whereBuilder, orderByBuilder, fieldsVisitorFactory, metaHandler, selectHandlers, pathFactory, predicateFactory, schema }) =>\n\t\t\t\tnew (class implements SelectBuilderFactory {\n\t\t\t\t\tcreate(qb: DbSelectBuilder, hydrator: SelectHydrator, relationPath: Model.AnyRelationContext[]): SelectBuilder {\n\t\t\t\t\t\treturn new SelectBuilder(\n\t\t\t\t\t\t\tschema.model,\n\t\t\t\t\t\t\twhereBuilder,\n\t\t\t\t\t\t\torderByBuilder,\n\t\t\t\t\t\t\tmetaHandler,\n\t\t\t\t\t\t\tqb,\n\t\t\t\t\t\t\thydrator,\n\t\t\t\t\t\t\tfieldsVisitorFactory,\n\t\t\t\t\t\t\tselectHandlers,\n\t\t\t\t\t\t\tpathFactory,\n\t\t\t\t\t\t\trelationPath,\n\t\t\t\t\t\t\tpredicateFactory,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t})())\n\t\t\t.addService('insertBuilderFactory', ({ whereBuilder, pathFactory, schema, predicateFactory }) =>\n\t\t\t\tnew InsertBuilderFactory(schema.model, whereBuilder, pathFactory, predicateFactory))\n\t\t\t.addService('updateBuilderFactory', ({ whereBuilder, pathFactory, schema, predicateFactory }) =>\n\t\t\t\tnew UpdateBuilderFactory(schema.model, whereBuilder, pathFactory, predicateFactory))\n\t\t\t.addService('connectJunctionHandler', () =>\n\t\t\t\tnew JunctionConnectHandler())\n\t\t\t.addService('disconnectJunctionHandler', ({}) =>\n\t\t\t\tnew JunctionDisconnectHandler())\n\t\t\t.addService('junctionTableManager', ({ predicateFactory, whereBuilder, connectJunctionHandler, disconnectJunctionHandler, pathFactory, schema }) =>\n\t\t\t\tnew JunctionTableManager(schema.model, predicateFactory, whereBuilder, connectJunctionHandler, disconnectJunctionHandler, pathFactory))\n\t\t\t.addService('deleteExecutor', ({ predicateFactory, updateBuilderFactory, whereBuilder, pathFactory, schema }) =>\n\t\t\t\tnew DeleteExecutor(schema.model, predicateFactory, whereBuilder, updateBuilderFactory, pathFactory))\n\t\t\t.addService('updater', ({ updateBuilderFactory, schema }) =>\n\t\t\t\tnew Updater(schema.model, updateBuilderFactory))\n\t\t\t.addService('inserter', ({ insertBuilderFactory, providers, schema, schemaDatabaseMetadata }) =>\n\t\t\t\tnew Inserter(schema.model, schemaDatabaseMetadata, insertBuilderFactory, providers))\n\t\t\t.addService('mapperFactory', ({ predicatesInjector, selectBuilderFactory, uniqueWhereExpander, whereBuilder, junctionTableManager, deleteExecutor, updater, inserter, pathFactory, providers, schema, schemaDatabaseMetadata }) => {\n\t\t\t\treturn new MapperFactory(\n\t\t\t\t\tdb,\n\t\t\t\t\tidentityId,\n\t\t\t\t\tschema.model,\n\t\t\t\t\tschemaDatabaseMetadata,\n\t\t\t\t\tpredicatesInjector,\n\t\t\t\t\tselectBuilderFactory,\n\t\t\t\t\tuniqueWhereExpander,\n\t\t\t\t\twhereBuilder,\n\t\t\t\t\tjunctionTableManager,\n\t\t\t\t\tdeleteExecutor,\n\t\t\t\t\tupdater,\n\t\t\t\t\tinserter,\n\t\t\t\t\tpathFactory,\n\t\t\t\t\tproviders,\n\t\t\t\t)\n\t\t\t})\n\n\t\t\t.addService('queryAstFactory', () =>\n\t\t\t\tnew GraphQlQueryAstFactory())\n\t\t\t.addService('readResolver', ({ mapperFactory, queryAstFactory }) =>\n\t\t\t\tnew ReadResolver(mapperFactory, queryAstFactory))\n\t\t\t.addService('validationDependencyCollector', () =>\n\t\t\t\tnew DependencyCollector())\n\t\t\t.addService('validationQueryAstFactory', ({ schema }) =>\n\t\t\t\tnew QueryAstFactory(schema.model))\n\t\t\t.addService('dataSelector', ({ validationQueryAstFactory, schema }) =>\n\t\t\t\tnew ValidationDataSelector(schema.model, validationQueryAstFactory))\n\t\t\t.addService('columnValueResolver', ({ providers }) =>\n\t\t\t\tnew ColumnValueResolver(providers))\n\t\t\t.addService('entityRulesResolver', ({ schema }) =>\n\t\t\t\tnew EntityRulesResolver(schema.validation, schema.model))\n\t\t\t.addService('inputPreValidator', ({ entityRulesResolver, columnValueResolver, dataSelector, schema }) =>\n\t\t\t\tnew InputPreValidator(schema.model, entityRulesResolver, columnValueResolver, dataSelector))\n\t\t\t.addService('mutationResolver', ({ mapperFactory, inputPreValidator, queryAstFactory, schema, schemaDatabaseMetadata }) =>\n\t\t\t\tnew MutationResolver(schema.model, mapperFactory, inputPreValidator, queryAstFactory, schemaDatabaseMetadata))\n\t\t\t.addService('validationResolver', ({ inputPreValidator, mapperFactory }) =>\n\t\t\t\tnew ValidationResolver(mapperFactory, inputPreValidator))\n\t}\n\n\tpublic create(args: ExecutionContainerArgs): ExecutionContainer {\n\t\treturn this.createBuilder(args).build().pick('validationResolver', 'readResolver', 'mutationResolver')\n\t}\n}\n\n"],"names":["schema","schemaDatabaseMetadata"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Result.cjs","sources":["../../../../../packages/engine-content-api/src/mapper/Result.ts"],"sourcesContent":["import { Input, Model, Value } from '@contember/schema'\nimport { MapperInput } from './types'\n\nexport enum MutationResultType {\n\tok = 'ok',\n\tnothingToDo = 'nothingToDo',\n\tnotFoundError = 'notFoundError',\n\tconstraintViolationError = 'constraintViolationError',\n\tnoResultError = 'noResultError',\n\tvalidationError = 'validationError',\n\tinputError = 'inputError',\n\tsqlError = 'sqlError',\n}\n\nexport enum MutationResultHint {\n\tsqlError = 'sqlError',\n\tsubSequentSqlError = 'subsequentSqlError',\n}\n\nexport enum ModificationType {\n\tcreate = 'create',\n\tupdate = 'update',\n\tdelete = 'delete',\n\tjunctionUpdate = 'junctionUpdate',\n}\n\nexport type MutationResult =\n\t| MutationUpdateOk\n\t| MutationCreateOk\n\t| MutationDeleteOk\n\t| MutationJunctionUpdateOk\n\t| MutationEntryNotFoundError\n\t| MutationNothingToDo\n\t| MutationConstraintViolationError\n\t| MutationNoResultError\n\t| MutationInputError\n\t| MutationSqlError\n\nexport type MutationResultList = MutationResult[]\n\ntype Path = ({ field: string } | { index: number; alias?: string })[]\n\ninterface MutationResultInterface {\n\terror: boolean\n\tresult: MutationResultType\n\tpaths: Path[]\n\tmessage?: string\n\thints: MutationResultHint[]\n}\n\nexport type RowValues = { [fieldName: string]: Value.FieldValue }\n\nexport class MutationUpdateOk implements MutationResultInterface {\n\terror = false\n\tresult = MutationResultType.ok as const\n\ttype = ModificationType.update as const\n\thints: MutationResultHint[] = []\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly entity: Model.Entity,\n\t\tpublic readonly primary: Value.PrimaryValue,\n\t\tpublic readonly input: MapperInput.UpdateDataInput,\n\t\tpublic readonly values: RowValues,\n\t\tpublic readonly oldValues?: RowValues,\n\t) {}\n}\n\nexport class MutationCreateOk implements MutationResultInterface {\n\terror = false\n\tresult = MutationResultType.ok as const\n\ttype = ModificationType.create as const\n\thints: MutationResultHint[] = []\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly entity: Model.Entity,\n\t\tpublic readonly primary: Value.PrimaryValue,\n\t\tpublic readonly input: MapperInput.CreateDataInput,\n\t\tpublic readonly values: RowValues,\n\t) {}\n}\n\nexport class MutationDeleteOk implements MutationResultInterface {\n\terror = false\n\tresult = MutationResultType.ok as const\n\ttype = ModificationType.delete as const\n\thints: MutationResultHint[] = []\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly entity: Model.Entity,\n\t\tpublic readonly primary: Value.PrimaryValue,\n\t) {}\n}\n\nexport class MutationJunctionUpdateOk implements MutationResultInterface {\n\terror = false\n\tresult = MutationResultType.ok as const\n\ttype = ModificationType.junctionUpdate as const\n\thints: MutationResultHint[] = []\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly entity: Model.Entity,\n\t\tpublic readonly relation: Model.ManyHasManyOwningRelation,\n\t\tpublic readonly owningUnique: Input.PrimaryValue,\n\t\tpublic readonly inverseUnique: Input.PrimaryValue,\n\t) {}\n}\n\nexport enum NothingToDoReason {\n\tnoData = 'noData',\n\temptyRelation = 'emptyRelation',\n\talreadyExists = 'alreadyExists',\n\taborted = 'aborted',\n\talreadyDeleted = 'alreadyDeleted',\n}\n\nexport class MutationNothingToDo implements MutationResultInterface {\n\terror = false\n\tresult = MutationResultType.nothingToDo as const\n\thints: MutationResultHint[] = []\n\n\tconstructor(public readonly paths: Path[], public readonly reason: NothingToDoReason) {}\n}\n\nexport enum InputErrorKind {\n\tnonUniqueWhere = 'nonUniqueWhere',\n\tinvalidData = 'invalidData',\n}\n\nexport class MutationInputError implements MutationResultInterface {\n\terror = true\n\tresult = MutationResultType.inputError as const\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly kind: InputErrorKind,\n\t\tpublic readonly message?: string,\n\t\tpublic readonly hints: MutationResultHint[] = [],\n\t) {}\n}\n\nexport class MutationSqlError implements MutationResultInterface {\n\terror = true\n\tresult = MutationResultType.sqlError as const\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly message?: string,\n\t\tpublic readonly hints: MutationResultHint[] = [],\n\t) {}\n}\n\nexport enum ConstraintType {\n\tnotNull = 'notNull',\n\tuniqueKey = 'uniqueKey',\n\tforeignKey = 'foreignKey',\n}\n\nexport class MutationConstraintViolationError implements MutationResultInterface {\n\terror = true\n\tresult = MutationResultType.constraintViolationError as const\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly constraint: ConstraintType,\n\t\tpublic readonly message?: string,\n\t\tpublic readonly hints: MutationResultHint[] = [],\n\t) {}\n}\n\n// maybe denied by acl\nexport class MutationEntryNotFoundError implements MutationResultInterface {\n\terror = true\n\tresult = MutationResultType.notFoundError as const\n\thints: MutationResultHint[] = []\n\tmessage: string\n\n\tconstructor(public readonly paths: Path[], public readonly where: Input.UniqueWhere | Input.
|
|
1
|
+
{"version":3,"file":"Result.cjs","sources":["../../../../../packages/engine-content-api/src/mapper/Result.ts"],"sourcesContent":["import { Input, Model, Value } from '@contember/schema'\nimport { MapperInput } from './types'\n\nexport enum MutationResultType {\n\tok = 'ok',\n\tnothingToDo = 'nothingToDo',\n\tnotFoundError = 'notFoundError',\n\tconstraintViolationError = 'constraintViolationError',\n\tnoResultError = 'noResultError',\n\tvalidationError = 'validationError',\n\tinputError = 'inputError',\n\tsqlError = 'sqlError',\n}\n\nexport enum MutationResultHint {\n\tsqlError = 'sqlError',\n\tsubSequentSqlError = 'subsequentSqlError',\n}\n\nexport enum ModificationType {\n\tcreate = 'create',\n\tupdate = 'update',\n\tdelete = 'delete',\n\tjunctionUpdate = 'junctionUpdate',\n}\n\nexport type MutationResult =\n\t| MutationUpdateOk\n\t| MutationCreateOk\n\t| MutationDeleteOk\n\t| MutationJunctionUpdateOk\n\t| MutationEntryNotFoundError\n\t| MutationNothingToDo\n\t| MutationConstraintViolationError\n\t| MutationNoResultError\n\t| MutationInputError\n\t| MutationSqlError\n\nexport type MutationResultList = MutationResult[]\n\ntype Path = ({ field: string } | { index: number; alias?: string })[]\n\ninterface MutationResultInterface {\n\terror: boolean\n\tresult: MutationResultType\n\tpaths: Path[]\n\tmessage?: string\n\thints: MutationResultHint[]\n}\n\nexport type RowValues = { [fieldName: string]: Value.FieldValue }\n\nexport class MutationUpdateOk implements MutationResultInterface {\n\terror = false\n\tresult = MutationResultType.ok as const\n\ttype = ModificationType.update as const\n\thints: MutationResultHint[] = []\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly entity: Model.Entity,\n\t\tpublic readonly primary: Value.PrimaryValue,\n\t\tpublic readonly input: MapperInput.UpdateDataInput,\n\t\tpublic readonly values: RowValues,\n\t\tpublic readonly oldValues?: RowValues,\n\t) {}\n}\n\nexport class MutationCreateOk implements MutationResultInterface {\n\terror = false\n\tresult = MutationResultType.ok as const\n\ttype = ModificationType.create as const\n\thints: MutationResultHint[] = []\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly entity: Model.Entity,\n\t\tpublic readonly primary: Value.PrimaryValue,\n\t\tpublic readonly input: MapperInput.CreateDataInput,\n\t\tpublic readonly values: RowValues,\n\t) {}\n}\n\nexport class MutationDeleteOk implements MutationResultInterface {\n\terror = false\n\tresult = MutationResultType.ok as const\n\ttype = ModificationType.delete as const\n\thints: MutationResultHint[] = []\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly entity: Model.Entity,\n\t\tpublic readonly primary: Value.PrimaryValue,\n\t) {}\n}\n\nexport class MutationJunctionUpdateOk implements MutationResultInterface {\n\terror = false\n\tresult = MutationResultType.ok as const\n\ttype = ModificationType.junctionUpdate as const\n\thints: MutationResultHint[] = []\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly entity: Model.Entity,\n\t\tpublic readonly relation: Model.ManyHasManyOwningRelation,\n\t\tpublic readonly owningUnique: Input.PrimaryValue,\n\t\tpublic readonly inverseUnique: Input.PrimaryValue,\n\t) {}\n}\n\nexport enum NothingToDoReason {\n\tnoData = 'noData',\n\temptyRelation = 'emptyRelation',\n\talreadyExists = 'alreadyExists',\n\taborted = 'aborted',\n\talreadyDeleted = 'alreadyDeleted',\n}\n\nexport class MutationNothingToDo implements MutationResultInterface {\n\terror = false\n\tresult = MutationResultType.nothingToDo as const\n\thints: MutationResultHint[] = []\n\n\tconstructor(public readonly paths: Path[], public readonly reason: NothingToDoReason) {}\n}\n\nexport enum InputErrorKind {\n\tnonUniqueWhere = 'nonUniqueWhere',\n\tinvalidData = 'invalidData',\n}\n\nexport class MutationInputError implements MutationResultInterface {\n\terror = true\n\tresult = MutationResultType.inputError as const\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly kind: InputErrorKind,\n\t\tpublic readonly message?: string,\n\t\tpublic readonly hints: MutationResultHint[] = [],\n\t) {}\n}\n\nexport class MutationSqlError implements MutationResultInterface {\n\terror = true\n\tresult = MutationResultType.sqlError as const\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly message?: string,\n\t\tpublic readonly hints: MutationResultHint[] = [],\n\t) {}\n}\n\nexport enum ConstraintType {\n\tnotNull = 'notNull',\n\tuniqueKey = 'uniqueKey',\n\tforeignKey = 'foreignKey',\n}\n\nexport class MutationConstraintViolationError implements MutationResultInterface {\n\terror = true\n\tresult = MutationResultType.constraintViolationError as const\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly constraint: ConstraintType,\n\t\tpublic readonly message?: string,\n\t\tpublic readonly hints: MutationResultHint[] = [],\n\t) {}\n}\n\n// maybe denied by acl\nexport class MutationEntryNotFoundError implements MutationResultInterface {\n\terror = true\n\tresult = MutationResultType.notFoundError as const\n\thints: MutationResultHint[] = []\n\tmessage: string\n\n\tconstructor(public readonly paths: Path[], public readonly where: Input.UniqueWhere | Input.OptionalWhere) {\n\t\tthis.message = 'for input ' + JSON.stringify(where)\n\t}\n}\n\n// possibly denied by acl\nexport class MutationNoResultError implements MutationResultInterface {\n\terror = true\n\tresult = MutationResultType.noResultError as const\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly message?: string,\n\t\tpublic readonly hints: MutationResultHint[] = [],\n\t) {}\n}\n\nexport const prependPath = (path: Path, results: MutationResultList): MutationResultList =>\n\tresults.map(it => ({\n\t\t...it,\n\t\tpaths: (it.paths.length === 0 ? [[]] : it.paths).map(it => [...path, ...it]),\n\t}))\n\nexport const getInsertPrimary = (result: MutationResultList) =>\n\tresult[0] && result[0].result === MutationResultType.ok && result[0].type === ModificationType.create\n\t\t? result[0].primary\n\t\t: undefined\n"],"names":["MutationResultType","MutationResultHint","NothingToDoReason","InputErrorKind","ConstraintType","it"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Result.js","sources":["../../../../../packages/engine-content-api/src/mapper/Result.ts"],"sourcesContent":["import { Input, Model, Value } from '@contember/schema'\nimport { MapperInput } from './types'\n\nexport enum MutationResultType {\n\tok = 'ok',\n\tnothingToDo = 'nothingToDo',\n\tnotFoundError = 'notFoundError',\n\tconstraintViolationError = 'constraintViolationError',\n\tnoResultError = 'noResultError',\n\tvalidationError = 'validationError',\n\tinputError = 'inputError',\n\tsqlError = 'sqlError',\n}\n\nexport enum MutationResultHint {\n\tsqlError = 'sqlError',\n\tsubSequentSqlError = 'subsequentSqlError',\n}\n\nexport enum ModificationType {\n\tcreate = 'create',\n\tupdate = 'update',\n\tdelete = 'delete',\n\tjunctionUpdate = 'junctionUpdate',\n}\n\nexport type MutationResult =\n\t| MutationUpdateOk\n\t| MutationCreateOk\n\t| MutationDeleteOk\n\t| MutationJunctionUpdateOk\n\t| MutationEntryNotFoundError\n\t| MutationNothingToDo\n\t| MutationConstraintViolationError\n\t| MutationNoResultError\n\t| MutationInputError\n\t| MutationSqlError\n\nexport type MutationResultList = MutationResult[]\n\ntype Path = ({ field: string } | { index: number; alias?: string })[]\n\ninterface MutationResultInterface {\n\terror: boolean\n\tresult: MutationResultType\n\tpaths: Path[]\n\tmessage?: string\n\thints: MutationResultHint[]\n}\n\nexport type RowValues = { [fieldName: string]: Value.FieldValue }\n\nexport class MutationUpdateOk implements MutationResultInterface {\n\terror = false\n\tresult = MutationResultType.ok as const\n\ttype = ModificationType.update as const\n\thints: MutationResultHint[] = []\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly entity: Model.Entity,\n\t\tpublic readonly primary: Value.PrimaryValue,\n\t\tpublic readonly input: MapperInput.UpdateDataInput,\n\t\tpublic readonly values: RowValues,\n\t\tpublic readonly oldValues?: RowValues,\n\t) {}\n}\n\nexport class MutationCreateOk implements MutationResultInterface {\n\terror = false\n\tresult = MutationResultType.ok as const\n\ttype = ModificationType.create as const\n\thints: MutationResultHint[] = []\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly entity: Model.Entity,\n\t\tpublic readonly primary: Value.PrimaryValue,\n\t\tpublic readonly input: MapperInput.CreateDataInput,\n\t\tpublic readonly values: RowValues,\n\t) {}\n}\n\nexport class MutationDeleteOk implements MutationResultInterface {\n\terror = false\n\tresult = MutationResultType.ok as const\n\ttype = ModificationType.delete as const\n\thints: MutationResultHint[] = []\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly entity: Model.Entity,\n\t\tpublic readonly primary: Value.PrimaryValue,\n\t) {}\n}\n\nexport class MutationJunctionUpdateOk implements MutationResultInterface {\n\terror = false\n\tresult = MutationResultType.ok as const\n\ttype = ModificationType.junctionUpdate as const\n\thints: MutationResultHint[] = []\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly entity: Model.Entity,\n\t\tpublic readonly relation: Model.ManyHasManyOwningRelation,\n\t\tpublic readonly owningUnique: Input.PrimaryValue,\n\t\tpublic readonly inverseUnique: Input.PrimaryValue,\n\t) {}\n}\n\nexport enum NothingToDoReason {\n\tnoData = 'noData',\n\temptyRelation = 'emptyRelation',\n\talreadyExists = 'alreadyExists',\n\taborted = 'aborted',\n\talreadyDeleted = 'alreadyDeleted',\n}\n\nexport class MutationNothingToDo implements MutationResultInterface {\n\terror = false\n\tresult = MutationResultType.nothingToDo as const\n\thints: MutationResultHint[] = []\n\n\tconstructor(public readonly paths: Path[], public readonly reason: NothingToDoReason) {}\n}\n\nexport enum InputErrorKind {\n\tnonUniqueWhere = 'nonUniqueWhere',\n\tinvalidData = 'invalidData',\n}\n\nexport class MutationInputError implements MutationResultInterface {\n\terror = true\n\tresult = MutationResultType.inputError as const\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly kind: InputErrorKind,\n\t\tpublic readonly message?: string,\n\t\tpublic readonly hints: MutationResultHint[] = [],\n\t) {}\n}\n\nexport class MutationSqlError implements MutationResultInterface {\n\terror = true\n\tresult = MutationResultType.sqlError as const\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly message?: string,\n\t\tpublic readonly hints: MutationResultHint[] = [],\n\t) {}\n}\n\nexport enum ConstraintType {\n\tnotNull = 'notNull',\n\tuniqueKey = 'uniqueKey',\n\tforeignKey = 'foreignKey',\n}\n\nexport class MutationConstraintViolationError implements MutationResultInterface {\n\terror = true\n\tresult = MutationResultType.constraintViolationError as const\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly constraint: ConstraintType,\n\t\tpublic readonly message?: string,\n\t\tpublic readonly hints: MutationResultHint[] = [],\n\t) {}\n}\n\n// maybe denied by acl\nexport class MutationEntryNotFoundError implements MutationResultInterface {\n\terror = true\n\tresult = MutationResultType.notFoundError as const\n\thints: MutationResultHint[] = []\n\tmessage: string\n\n\tconstructor(public readonly paths: Path[], public readonly where: Input.UniqueWhere | Input.
|
|
1
|
+
{"version":3,"file":"Result.js","sources":["../../../../../packages/engine-content-api/src/mapper/Result.ts"],"sourcesContent":["import { Input, Model, Value } from '@contember/schema'\nimport { MapperInput } from './types'\n\nexport enum MutationResultType {\n\tok = 'ok',\n\tnothingToDo = 'nothingToDo',\n\tnotFoundError = 'notFoundError',\n\tconstraintViolationError = 'constraintViolationError',\n\tnoResultError = 'noResultError',\n\tvalidationError = 'validationError',\n\tinputError = 'inputError',\n\tsqlError = 'sqlError',\n}\n\nexport enum MutationResultHint {\n\tsqlError = 'sqlError',\n\tsubSequentSqlError = 'subsequentSqlError',\n}\n\nexport enum ModificationType {\n\tcreate = 'create',\n\tupdate = 'update',\n\tdelete = 'delete',\n\tjunctionUpdate = 'junctionUpdate',\n}\n\nexport type MutationResult =\n\t| MutationUpdateOk\n\t| MutationCreateOk\n\t| MutationDeleteOk\n\t| MutationJunctionUpdateOk\n\t| MutationEntryNotFoundError\n\t| MutationNothingToDo\n\t| MutationConstraintViolationError\n\t| MutationNoResultError\n\t| MutationInputError\n\t| MutationSqlError\n\nexport type MutationResultList = MutationResult[]\n\ntype Path = ({ field: string } | { index: number; alias?: string })[]\n\ninterface MutationResultInterface {\n\terror: boolean\n\tresult: MutationResultType\n\tpaths: Path[]\n\tmessage?: string\n\thints: MutationResultHint[]\n}\n\nexport type RowValues = { [fieldName: string]: Value.FieldValue }\n\nexport class MutationUpdateOk implements MutationResultInterface {\n\terror = false\n\tresult = MutationResultType.ok as const\n\ttype = ModificationType.update as const\n\thints: MutationResultHint[] = []\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly entity: Model.Entity,\n\t\tpublic readonly primary: Value.PrimaryValue,\n\t\tpublic readonly input: MapperInput.UpdateDataInput,\n\t\tpublic readonly values: RowValues,\n\t\tpublic readonly oldValues?: RowValues,\n\t) {}\n}\n\nexport class MutationCreateOk implements MutationResultInterface {\n\terror = false\n\tresult = MutationResultType.ok as const\n\ttype = ModificationType.create as const\n\thints: MutationResultHint[] = []\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly entity: Model.Entity,\n\t\tpublic readonly primary: Value.PrimaryValue,\n\t\tpublic readonly input: MapperInput.CreateDataInput,\n\t\tpublic readonly values: RowValues,\n\t) {}\n}\n\nexport class MutationDeleteOk implements MutationResultInterface {\n\terror = false\n\tresult = MutationResultType.ok as const\n\ttype = ModificationType.delete as const\n\thints: MutationResultHint[] = []\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly entity: Model.Entity,\n\t\tpublic readonly primary: Value.PrimaryValue,\n\t) {}\n}\n\nexport class MutationJunctionUpdateOk implements MutationResultInterface {\n\terror = false\n\tresult = MutationResultType.ok as const\n\ttype = ModificationType.junctionUpdate as const\n\thints: MutationResultHint[] = []\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly entity: Model.Entity,\n\t\tpublic readonly relation: Model.ManyHasManyOwningRelation,\n\t\tpublic readonly owningUnique: Input.PrimaryValue,\n\t\tpublic readonly inverseUnique: Input.PrimaryValue,\n\t) {}\n}\n\nexport enum NothingToDoReason {\n\tnoData = 'noData',\n\temptyRelation = 'emptyRelation',\n\talreadyExists = 'alreadyExists',\n\taborted = 'aborted',\n\talreadyDeleted = 'alreadyDeleted',\n}\n\nexport class MutationNothingToDo implements MutationResultInterface {\n\terror = false\n\tresult = MutationResultType.nothingToDo as const\n\thints: MutationResultHint[] = []\n\n\tconstructor(public readonly paths: Path[], public readonly reason: NothingToDoReason) {}\n}\n\nexport enum InputErrorKind {\n\tnonUniqueWhere = 'nonUniqueWhere',\n\tinvalidData = 'invalidData',\n}\n\nexport class MutationInputError implements MutationResultInterface {\n\terror = true\n\tresult = MutationResultType.inputError as const\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly kind: InputErrorKind,\n\t\tpublic readonly message?: string,\n\t\tpublic readonly hints: MutationResultHint[] = [],\n\t) {}\n}\n\nexport class MutationSqlError implements MutationResultInterface {\n\terror = true\n\tresult = MutationResultType.sqlError as const\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly message?: string,\n\t\tpublic readonly hints: MutationResultHint[] = [],\n\t) {}\n}\n\nexport enum ConstraintType {\n\tnotNull = 'notNull',\n\tuniqueKey = 'uniqueKey',\n\tforeignKey = 'foreignKey',\n}\n\nexport class MutationConstraintViolationError implements MutationResultInterface {\n\terror = true\n\tresult = MutationResultType.constraintViolationError as const\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly constraint: ConstraintType,\n\t\tpublic readonly message?: string,\n\t\tpublic readonly hints: MutationResultHint[] = [],\n\t) {}\n}\n\n// maybe denied by acl\nexport class MutationEntryNotFoundError implements MutationResultInterface {\n\terror = true\n\tresult = MutationResultType.notFoundError as const\n\thints: MutationResultHint[] = []\n\tmessage: string\n\n\tconstructor(public readonly paths: Path[], public readonly where: Input.UniqueWhere | Input.OptionalWhere) {\n\t\tthis.message = 'for input ' + JSON.stringify(where)\n\t}\n}\n\n// possibly denied by acl\nexport class MutationNoResultError implements MutationResultInterface {\n\terror = true\n\tresult = MutationResultType.noResultError as const\n\n\tconstructor(\n\t\tpublic readonly paths: Path[],\n\t\tpublic readonly message?: string,\n\t\tpublic readonly hints: MutationResultHint[] = [],\n\t) {}\n}\n\nexport const prependPath = (path: Path, results: MutationResultList): MutationResultList =>\n\tresults.map(it => ({\n\t\t...it,\n\t\tpaths: (it.paths.length === 0 ? [[]] : it.paths).map(it => [...path, ...it]),\n\t}))\n\nexport const getInsertPrimary = (result: MutationResultList) =>\n\tresult[0] && result[0].result === MutationResultType.ok && result[0].type === ModificationType.create\n\t\t? result[0].primary\n\t\t: undefined\n"],"names":["MutationResultType","MutationResultHint","NothingToDoReason","InputErrorKind","ConstraintType","it"],"mappings":"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"}
|
|
@@ -7,11 +7,15 @@ var __defProp = Object.defineProperty;
|
|
|
7
7
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
8
|
var __publicField = (obj, key, value) => __defNormalProp(obj, key + "", value);
|
|
9
9
|
const _WhereOptimizer = class _WhereOptimizer2 {
|
|
10
|
-
constructor(model, conditionOptimizer) {
|
|
10
|
+
constructor(model, conditionOptimizer, options) {
|
|
11
11
|
this.model = model;
|
|
12
12
|
this.conditionOptimizer = conditionOptimizer;
|
|
13
|
+
this.options = options;
|
|
13
14
|
}
|
|
14
15
|
optimize(where, entity, { relationPath = [], evaluatedPredicates = [] } = {}) {
|
|
16
|
+
if (this.options?.disable) {
|
|
17
|
+
return where;
|
|
18
|
+
}
|
|
15
19
|
let processedRelationPath = [];
|
|
16
20
|
for (const i in relationPath) {
|
|
17
21
|
const el = relationPath[i];
|
|
@@ -107,7 +111,7 @@ const _WhereOptimizer = class _WhereOptimizer2 {
|
|
|
107
111
|
crossOptimize(operands, entity, replacement, relationPath) {
|
|
108
112
|
let result = operands;
|
|
109
113
|
let copied = false;
|
|
110
|
-
const count = result.length;
|
|
114
|
+
const count = Math.min(result.length, this.options?.maxCrossOptimizationInput ?? 50);
|
|
111
115
|
for (let i = 0; i < count; i++) {
|
|
112
116
|
for (let j = 0; j < count; j++) {
|
|
113
117
|
const a = result[j];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WhereOptimizer.cjs","sources":["../../../../../../../packages/engine-content-api/src/mapper/select/optimizer/WhereOptimizer.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { ConditionOptimizer } from './ConditionOptimizer'\nimport { acceptFieldVisitor } from '@contember/schema-utils'\nimport { optimizeAnd, optimizeNot, optimizeOr } from './helpers'\nimport { replaceWhere } from './WhereReplacer'\n\ntype ExtendedRelationContext =\n\t& {\n\t\tcontext: Model.AnyRelationContext\n\t\tcanEliminate: boolean\n\t\tisLast: boolean\n\t}\n\nexport interface WhereOptimizationHints {\n\trelationPath?: Model.AnyRelationContext[]\n\tevaluatedPredicates?: Input.OptionalWhere[]\n}\n\ntype OptimizedOperand = Input.OptionalWhere | undefined | boolean\n\nexport class WhereOptimizer {\n\tprivate static eliminableRelations = new Set<Model.AnyRelationContext['type']>(['oneHasMany', 'oneHasOneInverse', 'oneHasOneOwning'])\n\n\tconstructor(\n\t\tprivate readonly model: Model.Schema,\n\t\tprivate readonly conditionOptimizer: ConditionOptimizer,\n\t) {\n\t}\n\n\tpublic optimize(where: Input.OptionalWhere, entity: Model.Entity, { relationPath = [], evaluatedPredicates = [] }: WhereOptimizationHints = {}): Input.OptionalWhere {\n\t\tlet processedRelationPath: ExtendedRelationContext[] = []\n\t\tfor (const i in relationPath) {\n\t\t\tconst el = relationPath[i]\n\t\t\tif (!WhereOptimizer.eliminableRelations.has(el.type)) {\n\t\t\t\tprocessedRelationPath = []\n\t\t\t} else {\n\t\t\t\tprocessedRelationPath.push({ context: el, canEliminate: true, isLast: Number(i) === relationPath.length })\n\t\t\t}\n\t\t}\n\t\tlet result = this.optimizeWhere(where, entity, processedRelationPath)\n\n\t\tif (typeof result === 'boolean') {\n\t\t\treturn { [entity.primary]: { [result ? 'always' : 'never']: true } }\n\t\t}\n\t\tlet changed = false\n\t\tfor (const evaluated of evaluatedPredicates) {\n\t\t\tconst evaluatedPredicate = this.optimize(evaluated, entity)\n\t\t\tconst newResult = replaceWhere(result, evaluatedPredicate, { [entity.primary]: { always: true } })\n\t\t\tif (newResult !== result) {\n\t\t\t\tresult = newResult\n\t\t\t\tchanged = true\n\t\t\t}\n\t\t}\n\t\tif (changed) {\n\t\t\treturn this.optimize(result, entity)\n\t\t}\n\n\t\treturn result\n\t}\n\n\tprivate optimizeWhere(where: Input.OptionalWhere, entity: Model.Entity, relationPath: ExtendedRelationContext[]): Input.OptionalWhere | boolean {\n\t\tconst operands: OptimizedOperand[] = []\n\n\t\tfor (const key in where) {\n\t\t\tconst value = where[key]\n\t\t\tlet operand: OptimizedOperand = undefined\n\t\t\tif (value === undefined || value === null) {\n\t\t\t\tcontinue\n\t\t\t} else if (key === 'and') {\n\t\t\t\tconst innerOperands: (Input.OptionalWhere | boolean)[] = []\n\t\t\t\tfor (const innerValue of value as readonly Input.OptionalWhere[]) {\n\t\t\t\t\tconst innerOperand = this.optimizeWhere(innerValue, entity, relationPath)\n\t\t\t\t\tif (innerOperand === false) {\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\t\t\t\t\tinnerOperands.push(innerOperand)\n\t\t\t\t}\n\t\t\t\toperand = this.optimizeAnd(innerOperands, entity, relationPath)\n\t\t\t} else if (key === 'or') {\n\t\t\t\tconst innerOperands: (Input.OptionalWhere | boolean)[] = []\n\t\t\t\tfor (const innerValue of value as readonly Input.OptionalWhere[]) {\n\t\t\t\t\tconst innerOperand = this.optimizeWhere(innerValue, entity, relationPath)\n\t\t\t\t\tif (innerOperand === true) {\n\t\t\t\t\t\toperand = true\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tinnerOperands.push(innerOperand)\n\t\t\t\t}\n\t\t\t\tif (operand !== true) {\n\t\t\t\t\toperand = this.optimizeOr(innerOperands, entity, relationPath)\n\t\t\t\t}\n\n\t\t\t} else if (key === 'not') {\n\t\t\t\toperand = optimizeNot(this.optimizeWhere(value as Input.OptionalWhere, entity, relationPath))\n\n\t\t\t} else {\n\t\t\t\toperand = this.resolveFieldValue(entity, key, value, relationPath)\n\t\t\t}\n\n\t\t\tif (operand === false) {\n\t\t\t\treturn false\n\n\t\t\t} else if (operand !== undefined) {\n\t\t\t\toperands.push(operand)\n\t\t\t}\n\t\t}\n\t\treturn this.optimizeAnd(operands, entity, relationPath)\n\t}\n\n\tprivate optimizeOr(operands: readonly OptimizedOperand[], entity: Model.Entity, relationPath: ExtendedRelationContext[]): Input.OptionalWhere | boolean {\n\t\tconst optimized = optimizeOr(operands)\n\t\tif (typeof optimized === 'boolean' || !Array.isArray(optimized.or)) {\n\t\t\treturn optimized\n\t\t}\n\t\tconst result = this.crossOptimize(optimized.or, entity, { never: true }, relationPath)\n\t\tif (result === optimized.or) {\n\t\t\treturn optimized\n\t\t}\n\t\treturn optimizeOr(result)\n\t}\n\n\tprivate optimizeAnd(operands: readonly OptimizedOperand[], entity: Model.Entity, relationPath: ExtendedRelationContext[]): Input.OptionalWhere | boolean {\n\t\tconst optimized = optimizeAnd(operands)\n\t\tif (typeof optimized === 'boolean' || !Array.isArray(optimized.and)) {\n\t\t\treturn optimized\n\t\t}\n\t\tconst result = this.crossOptimize(optimized.and, entity, { always: true }, relationPath)\n\t\tif (result === optimized.and) {\n\t\t\treturn optimized\n\t\t}\n\t\treturn optimizeAnd(result)\n\t}\n\n\tprivate crossOptimize(operands: Input.OptionalWhere[], entity: Model.Entity, replacement: Input.Condition, relationPath: ExtendedRelationContext[]): (Input.OptionalWhere | boolean)[] {\n\t\tlet result: (Input.OptionalWhere | boolean)[] = operands\n\t\tlet copied = false\n\t\tconst count = result.length\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tfor (let j = 0; j < count; j++) {\n\t\t\t\tconst a = result[j]\n\t\t\t\tconst b = result[i]\n\t\t\t\tif (i !== j && typeof a !== 'boolean' && typeof b !== 'boolean') {\n\t\t\t\t\tconst elResult = replaceWhere(a, b, { [entity.primary]: replacement }, {\n\t\t\t\t\t\treplaceSubOperands: true,\n\t\t\t\t\t})\n\t\t\t\t\tif (elResult !== a) {\n\t\t\t\t\t\tif (!copied) {\n\t\t\t\t\t\t\tresult = [...result]\n\t\t\t\t\t\t\tcopied = true\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult[j] = this.optimizeWhere(elResult, entity, relationPath)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result\n\t}\n\n\tprivate resolveFieldValue(entity: Model.Entity, key: string, value: Input.OptionalWhere[string], relationPath: ExtendedRelationContext[]) {\n\t\treturn acceptFieldVisitor<Input.OptionalWhere | boolean>(this.model, entity, key, {\n\t\t\tvisitColumn: () => {\n\t\t\t\tconst optimizedCondition = this.conditionOptimizer.optimize(value as Input.Condition)\n\n\t\t\t\tif (typeof optimizedCondition === 'boolean') {\n\t\t\t\t\treturn optimizedCondition\n\t\t\t\t}\n\n\t\t\t\treturn { [key]: optimizedCondition }\n\t\t\t},\n\t\t\tvisitRelation: context => {\n\t\t\t\tlet where = value as Input.OptionalWhere\n\t\t\t\tconst newRelationPath: ExtendedRelationContext[] = [...relationPath]\n\t\t\t\tconst length = relationPath.length\n\t\t\t\tif (length > 0 && relationPath[length - 1].context.targetRelation?.name === context.relation.name) {\n\t\t\t\t\tconst item = newRelationPath.pop()\n\t\t\t\t\tconst type = item!.context.type\n\t\t\t\t\tif (item?.canEliminate && (type === 'oneHasMany' || type === 'oneHasOneOwning' || type === 'oneHasOneInverse')) {\n\t\t\t\t\t\twhere = replaceWhere(where, { [context.targetEntity.primary]: { isNull: true } }, { [context.targetEntity.primary]: { never: true } })\n\t\t\t\t\t\twhere = replaceWhere(where, { [context.targetEntity.primary]: { isNull: false } }, { [context.targetEntity.primary]: { always: true } })\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// first level relation - we are sure root exists\n\t\t\t\t\tconst canEliminate = length === 0 || relationPath[length - 1].isLast\n\t\t\t\t\tnewRelationPath.push({ context, isLast: false, canEliminate })\n\t\t\t\t}\n\t\t\t\tconst optimizedWhere = this.optimizeWhere(where, context.targetEntity, newRelationPath)\n\n\t\t\t\tif (typeof optimizedWhere === 'boolean') {\n\t\t\t\t\treturn optimizedWhere\n\t\t\t\t}\n\n\t\t\t\treturn { [key]: optimizedWhere }\n\t\t\t},\n\t\t})\n\t}\n}\n"],"names":["_WhereOptimizer","replaceWhere","optimizeNot","optimizeOr","optimizeAnd","acceptFieldVisitor"],"mappings":";;;;;;;;AAoBO,MAAM,kBAAN,MAAMA,iBAAe;AAAA,EAG3B,YACkB,OACA,oBAChB;AAFgB,SAAA,QAAA;AACA,SAAA,qBAAA;AAAA,EAAA;AAAA,EAIX,SAAS,OAA4B,QAAsB,EAAE,eAAe,CAAA,GAAI,sBAAsB,GAA+B,IAAA,IAAyB;AACpK,QAAI,wBAAmD,CAAC;AACxD,eAAW,KAAK,cAAc;AACvB,YAAA,KAAK,aAAa,CAAC;AACzB,UAAI,CAACA,iBAAe,oBAAoB,IAAI,GAAG,IAAI,GAAG;AACrD,gCAAwB,CAAC;AAAA,MAAA,OACnB;AACN,8BAAsB,KAAK,EAAE,SAAS,IAAI,cAAc,MAAM,QAAQ,OAAO,CAAC,MAAM,aAAa,OAAA,CAAQ;AAAA,MAAA;AAAA,IAC1G;AAED,QAAI,SAAS,KAAK,cAAc,OAAO,QAAQ,qBAAqB;AAEhE,QAAA,OAAO,WAAW,WAAW;AAChC,aAAO,EAAE,CAAC,OAAO,OAAO,GAAG,EAAE,CAAC,SAAS,WAAW,OAAO,GAAG,OAAO;AAAA,IAAA;AAEpE,QAAI,UAAU;AACd,eAAW,aAAa,qBAAqB;AAC5C,YAAM,qBAAqB,KAAK,SAAS,WAAW,MAAM;AAC1D,YAAM,YAAYC,cAAAA,aAAa,QAAQ,oBAAoB,EAAE,CAAC,OAAO,OAAO,GAAG,EAAE,QAAQ,QAAQ;AACjG,UAAI,cAAc,QAAQ;AAChB,iBAAA;AACC,kBAAA;AAAA,MAAA;AAAA,IACX;AAED,QAAI,SAAS;AACL,aAAA,KAAK,SAAS,QAAQ,MAAM;AAAA,IAAA;AAG7B,WAAA;AAAA,EAAA;AAAA,EAGA,cAAc,OAA4B,QAAsB,cAAwE;AAC/I,UAAM,WAA+B,CAAC;AAEtC,eAAW,OAAO,OAAO;AAClB,YAAA,QAAQ,MAAM,GAAG;AACvB,UAAI,UAA4B;AAC5B,UAAA,UAAU,UAAa,UAAU,MAAM;AAC1C;AAAA,MAAA,WACU,QAAQ,OAAO;AACzB,cAAM,gBAAmD,CAAC;AAC1D,mBAAW,cAAc,OAAyC;AACjE,gBAAM,eAAe,KAAK,cAAc,YAAY,QAAQ,YAAY;AACxE,cAAI,iBAAiB,OAAO;AACpB,mBAAA;AAAA,UAAA;AAER,wBAAc,KAAK,YAAY;AAAA,QAAA;AAEhC,kBAAU,KAAK,YAAY,eAAe,QAAQ,YAAY;AAAA,MAAA,WACpD,QAAQ,MAAM;AACxB,cAAM,gBAAmD,CAAC;AAC1D,mBAAW,cAAc,OAAyC;AACjE,gBAAM,eAAe,KAAK,cAAc,YAAY,QAAQ,YAAY;AACxE,cAAI,iBAAiB,MAAM;AAChB,sBAAA;AACV;AAAA,UAAA;AAED,wBAAc,KAAK,YAAY;AAAA,QAAA;AAEhC,YAAI,YAAY,MAAM;AACrB,oBAAU,KAAK,WAAW,eAAe,QAAQ,YAAY;AAAA,QAAA;AAAA,MAC9D,WAEU,QAAQ,OAAO;AACzB,kBAAUC,oBAAY,KAAK,cAAc,OAA8B,QAAQ,YAAY,CAAC;AAAA,MAAA,OAEtF;AACN,kBAAU,KAAK,kBAAkB,QAAQ,KAAK,OAAO,YAAY;AAAA,MAAA;AAGlE,UAAI,YAAY,OAAO;AACf,eAAA;AAAA,MAAA,WAEG,YAAY,QAAW;AACjC,iBAAS,KAAK,OAAO;AAAA,MAAA;AAAA,IACtB;AAED,WAAO,KAAK,YAAY,UAAU,QAAQ,YAAY;AAAA,EAAA;AAAA,EAG/C,WAAW,UAAuC,QAAsB,cAAwE;AACjJ,UAAA,YAAYC,mBAAW,QAAQ;AACjC,QAAA,OAAO,cAAc,aAAa,CAAC,MAAM,QAAQ,UAAU,EAAE,GAAG;AAC5D,aAAA;AAAA,IAAA;AAEF,UAAA,SAAS,KAAK,cAAc,UAAU,IAAI,QAAQ,EAAE,OAAO,KAAK,GAAG,YAAY;AACjF,QAAA,WAAW,UAAU,IAAI;AACrB,aAAA;AAAA,IAAA;AAER,WAAOA,QAAAA,WAAW,MAAM;AAAA,EAAA;AAAA,EAGjB,YAAY,UAAuC,QAAsB,cAAwE;AAClJ,UAAA,YAAYC,oBAAY,QAAQ;AAClC,QAAA,OAAO,cAAc,aAAa,CAAC,MAAM,QAAQ,UAAU,GAAG,GAAG;AAC7D,aAAA;AAAA,IAAA;AAEF,UAAA,SAAS,KAAK,cAAc,UAAU,KAAK,QAAQ,EAAE,QAAQ,KAAK,GAAG,YAAY;AACnF,QAAA,WAAW,UAAU,KAAK;AACtB,aAAA;AAAA,IAAA;AAER,WAAOA,QAAAA,YAAY,MAAM;AAAA,EAAA;AAAA,EAGlB,cAAc,UAAiC,QAAsB,aAA8B,cAA4E;AACtL,QAAI,SAA4C;AAChD,QAAI,SAAS;AACb,UAAM,QAAQ,OAAO;AACrB,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC/B,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AACzB,cAAA,IAAI,OAAO,CAAC;AACZ,cAAA,IAAI,OAAO,CAAC;AAClB,YAAI,MAAM,KAAK,OAAO,MAAM,aAAa,OAAO,MAAM,WAAW;AAC1D,gBAAA,WAAWH,cAAa,aAAA,GAAG,GAAG,EAAE,CAAC,OAAO,OAAO,GAAG,eAAe;AAAA,YACtE,oBAAoB;AAAA,UAAA,CACpB;AACD,cAAI,aAAa,GAAG;AACnB,gBAAI,CAAC,QAAQ;AACH,uBAAA,CAAC,GAAG,MAAM;AACV,uBAAA;AAAA,YAAA;AAEV,mBAAO,CAAC,IAAI,KAAK,cAAc,UAAU,QAAQ,YAAY;AAAA,UAAA;AAAA,QAC9D;AAAA,MACD;AAAA,IACD;AAEM,WAAA;AAAA,EAAA;AAAA,EAGA,kBAAkB,QAAsB,KAAa,OAAoC,cAAyC;AACzI,WAAOI,YAAkD,mBAAA,KAAK,OAAO,QAAQ,KAAK;AAAA,MACjF,aAAa,MAAM;AAClB,cAAM,qBAAqB,KAAK,mBAAmB,SAAS,KAAwB;AAEhF,YAAA,OAAO,uBAAuB,WAAW;AACrC,iBAAA;AAAA,QAAA;AAGR,eAAO,EAAE,CAAC,GAAG,GAAG,mBAAmB;AAAA,MACpC;AAAA,MACA,eAAe,CAAW,YAAA;AACzB,YAAI,QAAQ;AACN,cAAA,kBAA6C,CAAC,GAAG,YAAY;AACnE,cAAM,SAAS,aAAa;AACxB,YAAA,SAAS,KAAK,aAAa,SAAS,CAAC,EAAE,QAAQ,gBAAgB,SAAS,QAAQ,SAAS,MAAM;AAC5F,gBAAA,OAAO,gBAAgB,IAAI;AAC3B,gBAAA,OAAO,KAAM,QAAQ;AAC3B,cAAI,MAAM,iBAAiB,SAAS,gBAAgB,SAAS,qBAAqB,SAAS,qBAAqB;AACvG,oBAAAJ,cAAA,aAAa,OAAO,EAAE,CAAC,QAAQ,aAAa,OAAO,GAAG,EAAE,QAAQ,KAAA,KAAU,EAAE,CAAC,QAAQ,aAAa,OAAO,GAAG,EAAE,OAAO,KAAK,GAAG;AAC7H,oBAAAA,cAAA,aAAa,OAAO,EAAE,CAAC,QAAQ,aAAa,OAAO,GAAG,EAAE,QAAQ,MAAA,KAAW,EAAE,CAAC,QAAQ,aAAa,OAAO,GAAG,EAAE,QAAQ,KAAK,GAAG;AAAA,UAAA;AAAA,QACxI,OACM;AAEN,gBAAM,eAAe,WAAW,KAAK,aAAa,SAAS,CAAC,EAAE;AAC9D,0BAAgB,KAAK,EAAE,SAAS,QAAQ,OAAO,cAAc;AAAA,QAAA;AAE9D,cAAM,iBAAiB,KAAK,cAAc,OAAO,QAAQ,cAAc,eAAe;AAElF,YAAA,OAAO,mBAAmB,WAAW;AACjC,iBAAA;AAAA,QAAA;AAGR,eAAO,EAAE,CAAC,GAAG,GAAG,eAAe;AAAA,MAAA;AAAA,IAChC,CACA;AAAA,EAAA;AAEH;AA9KC,cADY,iBACG,uBAA0B,oBAAA,IAAsC,CAAC,cAAc,oBAAoB,iBAAiB,CAAC,CAAA;AAD9H,IAAM,iBAAN;;"}
|
|
1
|
+
{"version":3,"file":"WhereOptimizer.cjs","sources":["../../../../../../../packages/engine-content-api/src/mapper/select/optimizer/WhereOptimizer.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { ConditionOptimizer } from './ConditionOptimizer'\nimport { acceptFieldVisitor } from '@contember/schema-utils'\nimport { optimizeAnd, optimizeNot, optimizeOr } from './helpers'\nimport { replaceWhere } from './WhereReplacer'\n\ntype ExtendedRelationContext =\n\t& {\n\t\tcontext: Model.AnyRelationContext\n\t\tcanEliminate: boolean\n\t\tisLast: boolean\n\t}\n\nexport interface WhereOptimizationHints {\n\trelationPath?: Model.AnyRelationContext[]\n\tevaluatedPredicates?: Input.OptionalWhere[]\n}\n\ntype OptimizedOperand = Input.OptionalWhere | undefined | boolean\n\nexport type WhereOptimizerOptions = {\n\tdisable?: boolean\n\tmaxCrossOptimizationInput?: number\n}\n\nexport class WhereOptimizer {\n\tprivate static eliminableRelations = new Set<Model.AnyRelationContext['type']>(['oneHasMany', 'oneHasOneInverse', 'oneHasOneOwning'])\n\n\tconstructor(\n\t\tprivate readonly model: Model.Schema,\n\t\tprivate readonly conditionOptimizer: ConditionOptimizer,\n\t\tprivate readonly options?: WhereOptimizerOptions,\n\t) {\n\t}\n\n\tpublic optimize(where: Input.OptionalWhere, entity: Model.Entity, { relationPath = [], evaluatedPredicates = [] }: WhereOptimizationHints = {}): Input.OptionalWhere {\n\t\tif (this.options?.disable) {\n\t\t\treturn where\n\t\t}\n\t\tlet processedRelationPath: ExtendedRelationContext[] = []\n\t\tfor (const i in relationPath) {\n\t\t\tconst el = relationPath[i]\n\t\t\tif (!WhereOptimizer.eliminableRelations.has(el.type)) {\n\t\t\t\tprocessedRelationPath = []\n\t\t\t} else {\n\t\t\t\tprocessedRelationPath.push({ context: el, canEliminate: true, isLast: Number(i) === relationPath.length })\n\t\t\t}\n\t\t}\n\t\tlet result = this.optimizeWhere(where, entity, processedRelationPath)\n\n\t\tif (typeof result === 'boolean') {\n\t\t\treturn { [entity.primary]: { [result ? 'always' : 'never']: true } }\n\t\t}\n\t\tlet changed = false\n\t\tfor (const evaluated of evaluatedPredicates) {\n\t\t\tconst evaluatedPredicate = this.optimize(evaluated, entity)\n\t\t\tconst newResult = replaceWhere(result, evaluatedPredicate, { [entity.primary]: { always: true } })\n\t\t\tif (newResult !== result) {\n\t\t\t\tresult = newResult\n\t\t\t\tchanged = true\n\t\t\t}\n\t\t}\n\t\tif (changed) {\n\t\t\treturn this.optimize(result, entity)\n\t\t}\n\n\t\treturn result\n\t}\n\n\tprivate optimizeWhere(where: Input.OptionalWhere, entity: Model.Entity, relationPath: ExtendedRelationContext[]): Input.OptionalWhere | boolean {\n\t\tconst operands: OptimizedOperand[] = []\n\n\t\tfor (const key in where) {\n\t\t\tconst value = where[key]\n\t\t\tlet operand: OptimizedOperand = undefined\n\t\t\tif (value === undefined || value === null) {\n\t\t\t\tcontinue\n\t\t\t} else if (key === 'and') {\n\t\t\t\tconst innerOperands: (Input.OptionalWhere | boolean)[] = []\n\t\t\t\tfor (const innerValue of value as readonly Input.OptionalWhere[]) {\n\t\t\t\t\tconst innerOperand = this.optimizeWhere(innerValue, entity, relationPath)\n\t\t\t\t\tif (innerOperand === false) {\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\t\t\t\t\tinnerOperands.push(innerOperand)\n\t\t\t\t}\n\t\t\t\toperand = this.optimizeAnd(innerOperands, entity, relationPath)\n\t\t\t} else if (key === 'or') {\n\t\t\t\tconst innerOperands: (Input.OptionalWhere | boolean)[] = []\n\t\t\t\tfor (const innerValue of value as readonly Input.OptionalWhere[]) {\n\t\t\t\t\tconst innerOperand = this.optimizeWhere(innerValue, entity, relationPath)\n\t\t\t\t\tif (innerOperand === true) {\n\t\t\t\t\t\toperand = true\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tinnerOperands.push(innerOperand)\n\t\t\t\t}\n\t\t\t\tif (operand !== true) {\n\t\t\t\t\toperand = this.optimizeOr(innerOperands, entity, relationPath)\n\t\t\t\t}\n\n\t\t\t} else if (key === 'not') {\n\t\t\t\toperand = optimizeNot(this.optimizeWhere(value as Input.OptionalWhere, entity, relationPath))\n\n\t\t\t} else {\n\t\t\t\toperand = this.resolveFieldValue(entity, key, value, relationPath)\n\t\t\t}\n\n\t\t\tif (operand === false) {\n\t\t\t\treturn false\n\n\t\t\t} else if (operand !== undefined) {\n\t\t\t\toperands.push(operand)\n\t\t\t}\n\t\t}\n\t\treturn this.optimizeAnd(operands, entity, relationPath)\n\t}\n\n\tprivate optimizeOr(operands: readonly OptimizedOperand[], entity: Model.Entity, relationPath: ExtendedRelationContext[]): Input.OptionalWhere | boolean {\n\t\tconst optimized = optimizeOr(operands)\n\t\tif (typeof optimized === 'boolean' || !Array.isArray(optimized.or)) {\n\t\t\treturn optimized\n\t\t}\n\t\tconst result = this.crossOptimize(optimized.or, entity, { never: true }, relationPath)\n\t\tif (result === optimized.or) {\n\t\t\treturn optimized\n\t\t}\n\t\treturn optimizeOr(result)\n\t}\n\n\tprivate optimizeAnd(operands: readonly OptimizedOperand[], entity: Model.Entity, relationPath: ExtendedRelationContext[]): Input.OptionalWhere | boolean {\n\t\tconst optimized = optimizeAnd(operands)\n\t\tif (typeof optimized === 'boolean' || !Array.isArray(optimized.and)) {\n\t\t\treturn optimized\n\t\t}\n\t\tconst result = this.crossOptimize(optimized.and, entity, { always: true }, relationPath)\n\t\tif (result === optimized.and) {\n\t\t\treturn optimized\n\t\t}\n\t\treturn optimizeAnd(result)\n\t}\n\n\tprivate crossOptimize(operands: Input.OptionalWhere[], entity: Model.Entity, replacement: Input.Condition, relationPath: ExtendedRelationContext[]): (Input.OptionalWhere | boolean)[] {\n\t\tlet result: (Input.OptionalWhere | boolean)[] = operands\n\t\tlet copied = false\n\t\tconst count = Math.min(result.length, this.options?.maxCrossOptimizationInput ?? 50)\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tfor (let j = 0; j < count; j++) {\n\t\t\t\tconst a = result[j]\n\t\t\t\tconst b = result[i]\n\t\t\t\tif (i !== j && typeof a !== 'boolean' && typeof b !== 'boolean') {\n\t\t\t\t\tconst elResult = replaceWhere(a, b, { [entity.primary]: replacement }, {\n\t\t\t\t\t\treplaceSubOperands: true,\n\t\t\t\t\t})\n\t\t\t\t\tif (elResult !== a) {\n\t\t\t\t\t\tif (!copied) {\n\t\t\t\t\t\t\tresult = [...result]\n\t\t\t\t\t\t\tcopied = true\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult[j] = this.optimizeWhere(elResult, entity, relationPath)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result\n\t}\n\n\tprivate resolveFieldValue(entity: Model.Entity, key: string, value: Input.OptionalWhere[string], relationPath: ExtendedRelationContext[]) {\n\t\treturn acceptFieldVisitor<Input.OptionalWhere | boolean>(this.model, entity, key, {\n\t\t\tvisitColumn: () => {\n\t\t\t\tconst optimizedCondition = this.conditionOptimizer.optimize(value as Input.Condition)\n\n\t\t\t\tif (typeof optimizedCondition === 'boolean') {\n\t\t\t\t\treturn optimizedCondition\n\t\t\t\t}\n\n\t\t\t\treturn { [key]: optimizedCondition }\n\t\t\t},\n\t\t\tvisitRelation: context => {\n\t\t\t\tlet where = value as Input.OptionalWhere\n\t\t\t\tconst newRelationPath: ExtendedRelationContext[] = [...relationPath]\n\t\t\t\tconst length = relationPath.length\n\t\t\t\tif (length > 0 && relationPath[length - 1].context.targetRelation?.name === context.relation.name) {\n\t\t\t\t\tconst item = newRelationPath.pop()\n\t\t\t\t\tconst type = item!.context.type\n\t\t\t\t\tif (item?.canEliminate && (type === 'oneHasMany' || type === 'oneHasOneOwning' || type === 'oneHasOneInverse')) {\n\t\t\t\t\t\twhere = replaceWhere(where, { [context.targetEntity.primary]: { isNull: true } }, { [context.targetEntity.primary]: { never: true } })\n\t\t\t\t\t\twhere = replaceWhere(where, { [context.targetEntity.primary]: { isNull: false } }, { [context.targetEntity.primary]: { always: true } })\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// first level relation - we are sure root exists\n\t\t\t\t\tconst canEliminate = length === 0 || relationPath[length - 1].isLast\n\t\t\t\t\tnewRelationPath.push({ context, isLast: false, canEliminate })\n\t\t\t\t}\n\t\t\t\tconst optimizedWhere = this.optimizeWhere(where, context.targetEntity, newRelationPath)\n\n\t\t\t\tif (typeof optimizedWhere === 'boolean') {\n\t\t\t\t\treturn optimizedWhere\n\t\t\t\t}\n\n\t\t\t\treturn { [key]: optimizedWhere }\n\t\t\t},\n\t\t})\n\t}\n}\n"],"names":["_WhereOptimizer","replaceWhere","optimizeNot","optimizeOr","optimizeAnd","acceptFieldVisitor"],"mappings":";;;;;;;;AAyBO,MAAM,kBAAN,MAAMA,iBAAe;AAAA,EAG3B,YACkB,OACA,oBACA,SAChB;AAHgB,SAAA,QAAA;AACA,SAAA,qBAAA;AACA,SAAA,UAAA;AAAA,EAAA;AAAA,EAIX,SAAS,OAA4B,QAAsB,EAAE,eAAe,CAAA,GAAI,sBAAsB,GAA+B,IAAA,IAAyB;AAChK,QAAA,KAAK,SAAS,SAAS;AACnB,aAAA;AAAA,IAAA;AAER,QAAI,wBAAmD,CAAC;AACxD,eAAW,KAAK,cAAc;AACvB,YAAA,KAAK,aAAa,CAAC;AACzB,UAAI,CAACA,iBAAe,oBAAoB,IAAI,GAAG,IAAI,GAAG;AACrD,gCAAwB,CAAC;AAAA,MAAA,OACnB;AACN,8BAAsB,KAAK,EAAE,SAAS,IAAI,cAAc,MAAM,QAAQ,OAAO,CAAC,MAAM,aAAa,OAAA,CAAQ;AAAA,MAAA;AAAA,IAC1G;AAED,QAAI,SAAS,KAAK,cAAc,OAAO,QAAQ,qBAAqB;AAEhE,QAAA,OAAO,WAAW,WAAW;AAChC,aAAO,EAAE,CAAC,OAAO,OAAO,GAAG,EAAE,CAAC,SAAS,WAAW,OAAO,GAAG,OAAO;AAAA,IAAA;AAEpE,QAAI,UAAU;AACd,eAAW,aAAa,qBAAqB;AAC5C,YAAM,qBAAqB,KAAK,SAAS,WAAW,MAAM;AAC1D,YAAM,YAAYC,cAAAA,aAAa,QAAQ,oBAAoB,EAAE,CAAC,OAAO,OAAO,GAAG,EAAE,QAAQ,QAAQ;AACjG,UAAI,cAAc,QAAQ;AAChB,iBAAA;AACC,kBAAA;AAAA,MAAA;AAAA,IACX;AAED,QAAI,SAAS;AACL,aAAA,KAAK,SAAS,QAAQ,MAAM;AAAA,IAAA;AAG7B,WAAA;AAAA,EAAA;AAAA,EAGA,cAAc,OAA4B,QAAsB,cAAwE;AAC/I,UAAM,WAA+B,CAAC;AAEtC,eAAW,OAAO,OAAO;AAClB,YAAA,QAAQ,MAAM,GAAG;AACvB,UAAI,UAA4B;AAC5B,UAAA,UAAU,UAAa,UAAU,MAAM;AAC1C;AAAA,MAAA,WACU,QAAQ,OAAO;AACzB,cAAM,gBAAmD,CAAC;AAC1D,mBAAW,cAAc,OAAyC;AACjE,gBAAM,eAAe,KAAK,cAAc,YAAY,QAAQ,YAAY;AACxE,cAAI,iBAAiB,OAAO;AACpB,mBAAA;AAAA,UAAA;AAER,wBAAc,KAAK,YAAY;AAAA,QAAA;AAEhC,kBAAU,KAAK,YAAY,eAAe,QAAQ,YAAY;AAAA,MAAA,WACpD,QAAQ,MAAM;AACxB,cAAM,gBAAmD,CAAC;AAC1D,mBAAW,cAAc,OAAyC;AACjE,gBAAM,eAAe,KAAK,cAAc,YAAY,QAAQ,YAAY;AACxE,cAAI,iBAAiB,MAAM;AAChB,sBAAA;AACV;AAAA,UAAA;AAED,wBAAc,KAAK,YAAY;AAAA,QAAA;AAEhC,YAAI,YAAY,MAAM;AACrB,oBAAU,KAAK,WAAW,eAAe,QAAQ,YAAY;AAAA,QAAA;AAAA,MAC9D,WAEU,QAAQ,OAAO;AACzB,kBAAUC,oBAAY,KAAK,cAAc,OAA8B,QAAQ,YAAY,CAAC;AAAA,MAAA,OAEtF;AACN,kBAAU,KAAK,kBAAkB,QAAQ,KAAK,OAAO,YAAY;AAAA,MAAA;AAGlE,UAAI,YAAY,OAAO;AACf,eAAA;AAAA,MAAA,WAEG,YAAY,QAAW;AACjC,iBAAS,KAAK,OAAO;AAAA,MAAA;AAAA,IACtB;AAED,WAAO,KAAK,YAAY,UAAU,QAAQ,YAAY;AAAA,EAAA;AAAA,EAG/C,WAAW,UAAuC,QAAsB,cAAwE;AACjJ,UAAA,YAAYC,mBAAW,QAAQ;AACjC,QAAA,OAAO,cAAc,aAAa,CAAC,MAAM,QAAQ,UAAU,EAAE,GAAG;AAC5D,aAAA;AAAA,IAAA;AAEF,UAAA,SAAS,KAAK,cAAc,UAAU,IAAI,QAAQ,EAAE,OAAO,KAAK,GAAG,YAAY;AACjF,QAAA,WAAW,UAAU,IAAI;AACrB,aAAA;AAAA,IAAA;AAER,WAAOA,QAAAA,WAAW,MAAM;AAAA,EAAA;AAAA,EAGjB,YAAY,UAAuC,QAAsB,cAAwE;AAClJ,UAAA,YAAYC,oBAAY,QAAQ;AAClC,QAAA,OAAO,cAAc,aAAa,CAAC,MAAM,QAAQ,UAAU,GAAG,GAAG;AAC7D,aAAA;AAAA,IAAA;AAEF,UAAA,SAAS,KAAK,cAAc,UAAU,KAAK,QAAQ,EAAE,QAAQ,KAAK,GAAG,YAAY;AACnF,QAAA,WAAW,UAAU,KAAK;AACtB,aAAA;AAAA,IAAA;AAER,WAAOA,QAAAA,YAAY,MAAM;AAAA,EAAA;AAAA,EAGlB,cAAc,UAAiC,QAAsB,aAA8B,cAA4E;AACtL,QAAI,SAA4C;AAChD,QAAI,SAAS;AACP,UAAA,QAAQ,KAAK,IAAI,OAAO,QAAQ,KAAK,SAAS,6BAA6B,EAAE;AACnF,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC/B,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AACzB,cAAA,IAAI,OAAO,CAAC;AACZ,cAAA,IAAI,OAAO,CAAC;AAClB,YAAI,MAAM,KAAK,OAAO,MAAM,aAAa,OAAO,MAAM,WAAW;AAC1D,gBAAA,WAAWH,cAAa,aAAA,GAAG,GAAG,EAAE,CAAC,OAAO,OAAO,GAAG,eAAe;AAAA,YACtE,oBAAoB;AAAA,UAAA,CACpB;AACD,cAAI,aAAa,GAAG;AACnB,gBAAI,CAAC,QAAQ;AACH,uBAAA,CAAC,GAAG,MAAM;AACV,uBAAA;AAAA,YAAA;AAEV,mBAAO,CAAC,IAAI,KAAK,cAAc,UAAU,QAAQ,YAAY;AAAA,UAAA;AAAA,QAC9D;AAAA,MACD;AAAA,IACD;AAEM,WAAA;AAAA,EAAA;AAAA,EAGA,kBAAkB,QAAsB,KAAa,OAAoC,cAAyC;AACzI,WAAOI,YAAkD,mBAAA,KAAK,OAAO,QAAQ,KAAK;AAAA,MACjF,aAAa,MAAM;AAClB,cAAM,qBAAqB,KAAK,mBAAmB,SAAS,KAAwB;AAEhF,YAAA,OAAO,uBAAuB,WAAW;AACrC,iBAAA;AAAA,QAAA;AAGR,eAAO,EAAE,CAAC,GAAG,GAAG,mBAAmB;AAAA,MACpC;AAAA,MACA,eAAe,CAAW,YAAA;AACzB,YAAI,QAAQ;AACN,cAAA,kBAA6C,CAAC,GAAG,YAAY;AACnE,cAAM,SAAS,aAAa;AACxB,YAAA,SAAS,KAAK,aAAa,SAAS,CAAC,EAAE,QAAQ,gBAAgB,SAAS,QAAQ,SAAS,MAAM;AAC5F,gBAAA,OAAO,gBAAgB,IAAI;AAC3B,gBAAA,OAAO,KAAM,QAAQ;AAC3B,cAAI,MAAM,iBAAiB,SAAS,gBAAgB,SAAS,qBAAqB,SAAS,qBAAqB;AACvG,oBAAAJ,cAAA,aAAa,OAAO,EAAE,CAAC,QAAQ,aAAa,OAAO,GAAG,EAAE,QAAQ,KAAA,KAAU,EAAE,CAAC,QAAQ,aAAa,OAAO,GAAG,EAAE,OAAO,KAAK,GAAG;AAC7H,oBAAAA,cAAA,aAAa,OAAO,EAAE,CAAC,QAAQ,aAAa,OAAO,GAAG,EAAE,QAAQ,MAAA,KAAW,EAAE,CAAC,QAAQ,aAAa,OAAO,GAAG,EAAE,QAAQ,KAAK,GAAG;AAAA,UAAA;AAAA,QACxI,OACM;AAEN,gBAAM,eAAe,WAAW,KAAK,aAAa,SAAS,CAAC,EAAE;AAC9D,0BAAgB,KAAK,EAAE,SAAS,QAAQ,OAAO,cAAc;AAAA,QAAA;AAE9D,cAAM,iBAAiB,KAAK,cAAc,OAAO,QAAQ,cAAc,eAAe;AAElF,YAAA,OAAO,mBAAmB,WAAW;AACjC,iBAAA;AAAA,QAAA;AAGR,eAAO,EAAE,CAAC,GAAG,GAAG,eAAe;AAAA,MAAA;AAAA,IAChC,CACA;AAAA,EAAA;AAEH;AAlLC,cADY,iBACG,uBAA0B,oBAAA,IAAsC,CAAC,cAAc,oBAAoB,iBAAiB,CAAC,CAAA;AAD9H,IAAM,iBAAN;;"}
|
|
@@ -5,11 +5,15 @@ var __defProp = Object.defineProperty;
|
|
|
5
5
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
6
|
var __publicField = (obj, key, value) => __defNormalProp(obj, key + "", value);
|
|
7
7
|
const _WhereOptimizer = class _WhereOptimizer2 {
|
|
8
|
-
constructor(model, conditionOptimizer) {
|
|
8
|
+
constructor(model, conditionOptimizer, options) {
|
|
9
9
|
this.model = model;
|
|
10
10
|
this.conditionOptimizer = conditionOptimizer;
|
|
11
|
+
this.options = options;
|
|
11
12
|
}
|
|
12
13
|
optimize(where, entity, { relationPath = [], evaluatedPredicates = [] } = {}) {
|
|
14
|
+
if (this.options?.disable) {
|
|
15
|
+
return where;
|
|
16
|
+
}
|
|
13
17
|
let processedRelationPath = [];
|
|
14
18
|
for (const i in relationPath) {
|
|
15
19
|
const el = relationPath[i];
|
|
@@ -105,7 +109,7 @@ const _WhereOptimizer = class _WhereOptimizer2 {
|
|
|
105
109
|
crossOptimize(operands, entity, replacement, relationPath) {
|
|
106
110
|
let result = operands;
|
|
107
111
|
let copied = false;
|
|
108
|
-
const count = result.length;
|
|
112
|
+
const count = Math.min(result.length, this.options?.maxCrossOptimizationInput ?? 50);
|
|
109
113
|
for (let i = 0; i < count; i++) {
|
|
110
114
|
for (let j = 0; j < count; j++) {
|
|
111
115
|
const a = result[j];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WhereOptimizer.js","sources":["../../../../../../../packages/engine-content-api/src/mapper/select/optimizer/WhereOptimizer.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { ConditionOptimizer } from './ConditionOptimizer'\nimport { acceptFieldVisitor } from '@contember/schema-utils'\nimport { optimizeAnd, optimizeNot, optimizeOr } from './helpers'\nimport { replaceWhere } from './WhereReplacer'\n\ntype ExtendedRelationContext =\n\t& {\n\t\tcontext: Model.AnyRelationContext\n\t\tcanEliminate: boolean\n\t\tisLast: boolean\n\t}\n\nexport interface WhereOptimizationHints {\n\trelationPath?: Model.AnyRelationContext[]\n\tevaluatedPredicates?: Input.OptionalWhere[]\n}\n\ntype OptimizedOperand = Input.OptionalWhere | undefined | boolean\n\nexport class WhereOptimizer {\n\tprivate static eliminableRelations = new Set<Model.AnyRelationContext['type']>(['oneHasMany', 'oneHasOneInverse', 'oneHasOneOwning'])\n\n\tconstructor(\n\t\tprivate readonly model: Model.Schema,\n\t\tprivate readonly conditionOptimizer: ConditionOptimizer,\n\t) {\n\t}\n\n\tpublic optimize(where: Input.OptionalWhere, entity: Model.Entity, { relationPath = [], evaluatedPredicates = [] }: WhereOptimizationHints = {}): Input.OptionalWhere {\n\t\tlet processedRelationPath: ExtendedRelationContext[] = []\n\t\tfor (const i in relationPath) {\n\t\t\tconst el = relationPath[i]\n\t\t\tif (!WhereOptimizer.eliminableRelations.has(el.type)) {\n\t\t\t\tprocessedRelationPath = []\n\t\t\t} else {\n\t\t\t\tprocessedRelationPath.push({ context: el, canEliminate: true, isLast: Number(i) === relationPath.length })\n\t\t\t}\n\t\t}\n\t\tlet result = this.optimizeWhere(where, entity, processedRelationPath)\n\n\t\tif (typeof result === 'boolean') {\n\t\t\treturn { [entity.primary]: { [result ? 'always' : 'never']: true } }\n\t\t}\n\t\tlet changed = false\n\t\tfor (const evaluated of evaluatedPredicates) {\n\t\t\tconst evaluatedPredicate = this.optimize(evaluated, entity)\n\t\t\tconst newResult = replaceWhere(result, evaluatedPredicate, { [entity.primary]: { always: true } })\n\t\t\tif (newResult !== result) {\n\t\t\t\tresult = newResult\n\t\t\t\tchanged = true\n\t\t\t}\n\t\t}\n\t\tif (changed) {\n\t\t\treturn this.optimize(result, entity)\n\t\t}\n\n\t\treturn result\n\t}\n\n\tprivate optimizeWhere(where: Input.OptionalWhere, entity: Model.Entity, relationPath: ExtendedRelationContext[]): Input.OptionalWhere | boolean {\n\t\tconst operands: OptimizedOperand[] = []\n\n\t\tfor (const key in where) {\n\t\t\tconst value = where[key]\n\t\t\tlet operand: OptimizedOperand = undefined\n\t\t\tif (value === undefined || value === null) {\n\t\t\t\tcontinue\n\t\t\t} else if (key === 'and') {\n\t\t\t\tconst innerOperands: (Input.OptionalWhere | boolean)[] = []\n\t\t\t\tfor (const innerValue of value as readonly Input.OptionalWhere[]) {\n\t\t\t\t\tconst innerOperand = this.optimizeWhere(innerValue, entity, relationPath)\n\t\t\t\t\tif (innerOperand === false) {\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\t\t\t\t\tinnerOperands.push(innerOperand)\n\t\t\t\t}\n\t\t\t\toperand = this.optimizeAnd(innerOperands, entity, relationPath)\n\t\t\t} else if (key === 'or') {\n\t\t\t\tconst innerOperands: (Input.OptionalWhere | boolean)[] = []\n\t\t\t\tfor (const innerValue of value as readonly Input.OptionalWhere[]) {\n\t\t\t\t\tconst innerOperand = this.optimizeWhere(innerValue, entity, relationPath)\n\t\t\t\t\tif (innerOperand === true) {\n\t\t\t\t\t\toperand = true\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tinnerOperands.push(innerOperand)\n\t\t\t\t}\n\t\t\t\tif (operand !== true) {\n\t\t\t\t\toperand = this.optimizeOr(innerOperands, entity, relationPath)\n\t\t\t\t}\n\n\t\t\t} else if (key === 'not') {\n\t\t\t\toperand = optimizeNot(this.optimizeWhere(value as Input.OptionalWhere, entity, relationPath))\n\n\t\t\t} else {\n\t\t\t\toperand = this.resolveFieldValue(entity, key, value, relationPath)\n\t\t\t}\n\n\t\t\tif (operand === false) {\n\t\t\t\treturn false\n\n\t\t\t} else if (operand !== undefined) {\n\t\t\t\toperands.push(operand)\n\t\t\t}\n\t\t}\n\t\treturn this.optimizeAnd(operands, entity, relationPath)\n\t}\n\n\tprivate optimizeOr(operands: readonly OptimizedOperand[], entity: Model.Entity, relationPath: ExtendedRelationContext[]): Input.OptionalWhere | boolean {\n\t\tconst optimized = optimizeOr(operands)\n\t\tif (typeof optimized === 'boolean' || !Array.isArray(optimized.or)) {\n\t\t\treturn optimized\n\t\t}\n\t\tconst result = this.crossOptimize(optimized.or, entity, { never: true }, relationPath)\n\t\tif (result === optimized.or) {\n\t\t\treturn optimized\n\t\t}\n\t\treturn optimizeOr(result)\n\t}\n\n\tprivate optimizeAnd(operands: readonly OptimizedOperand[], entity: Model.Entity, relationPath: ExtendedRelationContext[]): Input.OptionalWhere | boolean {\n\t\tconst optimized = optimizeAnd(operands)\n\t\tif (typeof optimized === 'boolean' || !Array.isArray(optimized.and)) {\n\t\t\treturn optimized\n\t\t}\n\t\tconst result = this.crossOptimize(optimized.and, entity, { always: true }, relationPath)\n\t\tif (result === optimized.and) {\n\t\t\treturn optimized\n\t\t}\n\t\treturn optimizeAnd(result)\n\t}\n\n\tprivate crossOptimize(operands: Input.OptionalWhere[], entity: Model.Entity, replacement: Input.Condition, relationPath: ExtendedRelationContext[]): (Input.OptionalWhere | boolean)[] {\n\t\tlet result: (Input.OptionalWhere | boolean)[] = operands\n\t\tlet copied = false\n\t\tconst count = result.length\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tfor (let j = 0; j < count; j++) {\n\t\t\t\tconst a = result[j]\n\t\t\t\tconst b = result[i]\n\t\t\t\tif (i !== j && typeof a !== 'boolean' && typeof b !== 'boolean') {\n\t\t\t\t\tconst elResult = replaceWhere(a, b, { [entity.primary]: replacement }, {\n\t\t\t\t\t\treplaceSubOperands: true,\n\t\t\t\t\t})\n\t\t\t\t\tif (elResult !== a) {\n\t\t\t\t\t\tif (!copied) {\n\t\t\t\t\t\t\tresult = [...result]\n\t\t\t\t\t\t\tcopied = true\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult[j] = this.optimizeWhere(elResult, entity, relationPath)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result\n\t}\n\n\tprivate resolveFieldValue(entity: Model.Entity, key: string, value: Input.OptionalWhere[string], relationPath: ExtendedRelationContext[]) {\n\t\treturn acceptFieldVisitor<Input.OptionalWhere | boolean>(this.model, entity, key, {\n\t\t\tvisitColumn: () => {\n\t\t\t\tconst optimizedCondition = this.conditionOptimizer.optimize(value as Input.Condition)\n\n\t\t\t\tif (typeof optimizedCondition === 'boolean') {\n\t\t\t\t\treturn optimizedCondition\n\t\t\t\t}\n\n\t\t\t\treturn { [key]: optimizedCondition }\n\t\t\t},\n\t\t\tvisitRelation: context => {\n\t\t\t\tlet where = value as Input.OptionalWhere\n\t\t\t\tconst newRelationPath: ExtendedRelationContext[] = [...relationPath]\n\t\t\t\tconst length = relationPath.length\n\t\t\t\tif (length > 0 && relationPath[length - 1].context.targetRelation?.name === context.relation.name) {\n\t\t\t\t\tconst item = newRelationPath.pop()\n\t\t\t\t\tconst type = item!.context.type\n\t\t\t\t\tif (item?.canEliminate && (type === 'oneHasMany' || type === 'oneHasOneOwning' || type === 'oneHasOneInverse')) {\n\t\t\t\t\t\twhere = replaceWhere(where, { [context.targetEntity.primary]: { isNull: true } }, { [context.targetEntity.primary]: { never: true } })\n\t\t\t\t\t\twhere = replaceWhere(where, { [context.targetEntity.primary]: { isNull: false } }, { [context.targetEntity.primary]: { always: true } })\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// first level relation - we are sure root exists\n\t\t\t\t\tconst canEliminate = length === 0 || relationPath[length - 1].isLast\n\t\t\t\t\tnewRelationPath.push({ context, isLast: false, canEliminate })\n\t\t\t\t}\n\t\t\t\tconst optimizedWhere = this.optimizeWhere(where, context.targetEntity, newRelationPath)\n\n\t\t\t\tif (typeof optimizedWhere === 'boolean') {\n\t\t\t\t\treturn optimizedWhere\n\t\t\t\t}\n\n\t\t\t\treturn { [key]: optimizedWhere }\n\t\t\t},\n\t\t})\n\t}\n}\n"],"names":["_WhereOptimizer"],"mappings":";;;;;;AAoBO,MAAM,kBAAN,MAAMA,iBAAe;AAAA,EAG3B,YACkB,OACA,oBAChB;AAFgB,SAAA,QAAA;AACA,SAAA,qBAAA;AAAA,EAAA;AAAA,EAIX,SAAS,OAA4B,QAAsB,EAAE,eAAe,CAAA,GAAI,sBAAsB,GAA+B,IAAA,IAAyB;AACpK,QAAI,wBAAmD,CAAC;AACxD,eAAW,KAAK,cAAc;AACvB,YAAA,KAAK,aAAa,CAAC;AACzB,UAAI,CAACA,iBAAe,oBAAoB,IAAI,GAAG,IAAI,GAAG;AACrD,gCAAwB,CAAC;AAAA,MAAA,OACnB;AACN,8BAAsB,KAAK,EAAE,SAAS,IAAI,cAAc,MAAM,QAAQ,OAAO,CAAC,MAAM,aAAa,OAAA,CAAQ;AAAA,MAAA;AAAA,IAC1G;AAED,QAAI,SAAS,KAAK,cAAc,OAAO,QAAQ,qBAAqB;AAEhE,QAAA,OAAO,WAAW,WAAW;AAChC,aAAO,EAAE,CAAC,OAAO,OAAO,GAAG,EAAE,CAAC,SAAS,WAAW,OAAO,GAAG,OAAO;AAAA,IAAA;AAEpE,QAAI,UAAU;AACd,eAAW,aAAa,qBAAqB;AAC5C,YAAM,qBAAqB,KAAK,SAAS,WAAW,MAAM;AAC1D,YAAM,YAAY,aAAa,QAAQ,oBAAoB,EAAE,CAAC,OAAO,OAAO,GAAG,EAAE,QAAQ,QAAQ;AACjG,UAAI,cAAc,QAAQ;AAChB,iBAAA;AACC,kBAAA;AAAA,MAAA;AAAA,IACX;AAED,QAAI,SAAS;AACL,aAAA,KAAK,SAAS,QAAQ,MAAM;AAAA,IAAA;AAG7B,WAAA;AAAA,EAAA;AAAA,EAGA,cAAc,OAA4B,QAAsB,cAAwE;AAC/I,UAAM,WAA+B,CAAC;AAEtC,eAAW,OAAO,OAAO;AAClB,YAAA,QAAQ,MAAM,GAAG;AACvB,UAAI,UAA4B;AAC5B,UAAA,UAAU,UAAa,UAAU,MAAM;AAC1C;AAAA,MAAA,WACU,QAAQ,OAAO;AACzB,cAAM,gBAAmD,CAAC;AAC1D,mBAAW,cAAc,OAAyC;AACjE,gBAAM,eAAe,KAAK,cAAc,YAAY,QAAQ,YAAY;AACxE,cAAI,iBAAiB,OAAO;AACpB,mBAAA;AAAA,UAAA;AAER,wBAAc,KAAK,YAAY;AAAA,QAAA;AAEhC,kBAAU,KAAK,YAAY,eAAe,QAAQ,YAAY;AAAA,MAAA,WACpD,QAAQ,MAAM;AACxB,cAAM,gBAAmD,CAAC;AAC1D,mBAAW,cAAc,OAAyC;AACjE,gBAAM,eAAe,KAAK,cAAc,YAAY,QAAQ,YAAY;AACxE,cAAI,iBAAiB,MAAM;AAChB,sBAAA;AACV;AAAA,UAAA;AAED,wBAAc,KAAK,YAAY;AAAA,QAAA;AAEhC,YAAI,YAAY,MAAM;AACrB,oBAAU,KAAK,WAAW,eAAe,QAAQ,YAAY;AAAA,QAAA;AAAA,MAC9D,WAEU,QAAQ,OAAO;AACzB,kBAAU,YAAY,KAAK,cAAc,OAA8B,QAAQ,YAAY,CAAC;AAAA,MAAA,OAEtF;AACN,kBAAU,KAAK,kBAAkB,QAAQ,KAAK,OAAO,YAAY;AAAA,MAAA;AAGlE,UAAI,YAAY,OAAO;AACf,eAAA;AAAA,MAAA,WAEG,YAAY,QAAW;AACjC,iBAAS,KAAK,OAAO;AAAA,MAAA;AAAA,IACtB;AAED,WAAO,KAAK,YAAY,UAAU,QAAQ,YAAY;AAAA,EAAA;AAAA,EAG/C,WAAW,UAAuC,QAAsB,cAAwE;AACjJ,UAAA,YAAY,WAAW,QAAQ;AACjC,QAAA,OAAO,cAAc,aAAa,CAAC,MAAM,QAAQ,UAAU,EAAE,GAAG;AAC5D,aAAA;AAAA,IAAA;AAEF,UAAA,SAAS,KAAK,cAAc,UAAU,IAAI,QAAQ,EAAE,OAAO,KAAK,GAAG,YAAY;AACjF,QAAA,WAAW,UAAU,IAAI;AACrB,aAAA;AAAA,IAAA;AAER,WAAO,WAAW,MAAM;AAAA,EAAA;AAAA,EAGjB,YAAY,UAAuC,QAAsB,cAAwE;AAClJ,UAAA,YAAY,YAAY,QAAQ;AAClC,QAAA,OAAO,cAAc,aAAa,CAAC,MAAM,QAAQ,UAAU,GAAG,GAAG;AAC7D,aAAA;AAAA,IAAA;AAEF,UAAA,SAAS,KAAK,cAAc,UAAU,KAAK,QAAQ,EAAE,QAAQ,KAAK,GAAG,YAAY;AACnF,QAAA,WAAW,UAAU,KAAK;AACtB,aAAA;AAAA,IAAA;AAER,WAAO,YAAY,MAAM;AAAA,EAAA;AAAA,EAGlB,cAAc,UAAiC,QAAsB,aAA8B,cAA4E;AACtL,QAAI,SAA4C;AAChD,QAAI,SAAS;AACb,UAAM,QAAQ,OAAO;AACrB,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC/B,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AACzB,cAAA,IAAI,OAAO,CAAC;AACZ,cAAA,IAAI,OAAO,CAAC;AAClB,YAAI,MAAM,KAAK,OAAO,MAAM,aAAa,OAAO,MAAM,WAAW;AAC1D,gBAAA,WAAW,aAAa,GAAG,GAAG,EAAE,CAAC,OAAO,OAAO,GAAG,eAAe;AAAA,YACtE,oBAAoB;AAAA,UAAA,CACpB;AACD,cAAI,aAAa,GAAG;AACnB,gBAAI,CAAC,QAAQ;AACH,uBAAA,CAAC,GAAG,MAAM;AACV,uBAAA;AAAA,YAAA;AAEV,mBAAO,CAAC,IAAI,KAAK,cAAc,UAAU,QAAQ,YAAY;AAAA,UAAA;AAAA,QAC9D;AAAA,MACD;AAAA,IACD;AAEM,WAAA;AAAA,EAAA;AAAA,EAGA,kBAAkB,QAAsB,KAAa,OAAoC,cAAyC;AACzI,WAAO,mBAAkD,KAAK,OAAO,QAAQ,KAAK;AAAA,MACjF,aAAa,MAAM;AAClB,cAAM,qBAAqB,KAAK,mBAAmB,SAAS,KAAwB;AAEhF,YAAA,OAAO,uBAAuB,WAAW;AACrC,iBAAA;AAAA,QAAA;AAGR,eAAO,EAAE,CAAC,GAAG,GAAG,mBAAmB;AAAA,MACpC;AAAA,MACA,eAAe,CAAW,YAAA;AACzB,YAAI,QAAQ;AACN,cAAA,kBAA6C,CAAC,GAAG,YAAY;AACnE,cAAM,SAAS,aAAa;AACxB,YAAA,SAAS,KAAK,aAAa,SAAS,CAAC,EAAE,QAAQ,gBAAgB,SAAS,QAAQ,SAAS,MAAM;AAC5F,gBAAA,OAAO,gBAAgB,IAAI;AAC3B,gBAAA,OAAO,KAAM,QAAQ;AAC3B,cAAI,MAAM,iBAAiB,SAAS,gBAAgB,SAAS,qBAAqB,SAAS,qBAAqB;AACvG,oBAAA,aAAa,OAAO,EAAE,CAAC,QAAQ,aAAa,OAAO,GAAG,EAAE,QAAQ,KAAA,KAAU,EAAE,CAAC,QAAQ,aAAa,OAAO,GAAG,EAAE,OAAO,KAAK,GAAG;AAC7H,oBAAA,aAAa,OAAO,EAAE,CAAC,QAAQ,aAAa,OAAO,GAAG,EAAE,QAAQ,MAAA,KAAW,EAAE,CAAC,QAAQ,aAAa,OAAO,GAAG,EAAE,QAAQ,KAAK,GAAG;AAAA,UAAA;AAAA,QACxI,OACM;AAEN,gBAAM,eAAe,WAAW,KAAK,aAAa,SAAS,CAAC,EAAE;AAC9D,0BAAgB,KAAK,EAAE,SAAS,QAAQ,OAAO,cAAc;AAAA,QAAA;AAE9D,cAAM,iBAAiB,KAAK,cAAc,OAAO,QAAQ,cAAc,eAAe;AAElF,YAAA,OAAO,mBAAmB,WAAW;AACjC,iBAAA;AAAA,QAAA;AAGR,eAAO,EAAE,CAAC,GAAG,GAAG,eAAe;AAAA,MAAA;AAAA,IAChC,CACA;AAAA,EAAA;AAEH;AA9KC,cADY,iBACG,uBAA0B,oBAAA,IAAsC,CAAC,cAAc,oBAAoB,iBAAiB,CAAC,CAAA;AAD9H,IAAM,iBAAN;"}
|
|
1
|
+
{"version":3,"file":"WhereOptimizer.js","sources":["../../../../../../../packages/engine-content-api/src/mapper/select/optimizer/WhereOptimizer.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { ConditionOptimizer } from './ConditionOptimizer'\nimport { acceptFieldVisitor } from '@contember/schema-utils'\nimport { optimizeAnd, optimizeNot, optimizeOr } from './helpers'\nimport { replaceWhere } from './WhereReplacer'\n\ntype ExtendedRelationContext =\n\t& {\n\t\tcontext: Model.AnyRelationContext\n\t\tcanEliminate: boolean\n\t\tisLast: boolean\n\t}\n\nexport interface WhereOptimizationHints {\n\trelationPath?: Model.AnyRelationContext[]\n\tevaluatedPredicates?: Input.OptionalWhere[]\n}\n\ntype OptimizedOperand = Input.OptionalWhere | undefined | boolean\n\nexport type WhereOptimizerOptions = {\n\tdisable?: boolean\n\tmaxCrossOptimizationInput?: number\n}\n\nexport class WhereOptimizer {\n\tprivate static eliminableRelations = new Set<Model.AnyRelationContext['type']>(['oneHasMany', 'oneHasOneInverse', 'oneHasOneOwning'])\n\n\tconstructor(\n\t\tprivate readonly model: Model.Schema,\n\t\tprivate readonly conditionOptimizer: ConditionOptimizer,\n\t\tprivate readonly options?: WhereOptimizerOptions,\n\t) {\n\t}\n\n\tpublic optimize(where: Input.OptionalWhere, entity: Model.Entity, { relationPath = [], evaluatedPredicates = [] }: WhereOptimizationHints = {}): Input.OptionalWhere {\n\t\tif (this.options?.disable) {\n\t\t\treturn where\n\t\t}\n\t\tlet processedRelationPath: ExtendedRelationContext[] = []\n\t\tfor (const i in relationPath) {\n\t\t\tconst el = relationPath[i]\n\t\t\tif (!WhereOptimizer.eliminableRelations.has(el.type)) {\n\t\t\t\tprocessedRelationPath = []\n\t\t\t} else {\n\t\t\t\tprocessedRelationPath.push({ context: el, canEliminate: true, isLast: Number(i) === relationPath.length })\n\t\t\t}\n\t\t}\n\t\tlet result = this.optimizeWhere(where, entity, processedRelationPath)\n\n\t\tif (typeof result === 'boolean') {\n\t\t\treturn { [entity.primary]: { [result ? 'always' : 'never']: true } }\n\t\t}\n\t\tlet changed = false\n\t\tfor (const evaluated of evaluatedPredicates) {\n\t\t\tconst evaluatedPredicate = this.optimize(evaluated, entity)\n\t\t\tconst newResult = replaceWhere(result, evaluatedPredicate, { [entity.primary]: { always: true } })\n\t\t\tif (newResult !== result) {\n\t\t\t\tresult = newResult\n\t\t\t\tchanged = true\n\t\t\t}\n\t\t}\n\t\tif (changed) {\n\t\t\treturn this.optimize(result, entity)\n\t\t}\n\n\t\treturn result\n\t}\n\n\tprivate optimizeWhere(where: Input.OptionalWhere, entity: Model.Entity, relationPath: ExtendedRelationContext[]): Input.OptionalWhere | boolean {\n\t\tconst operands: OptimizedOperand[] = []\n\n\t\tfor (const key in where) {\n\t\t\tconst value = where[key]\n\t\t\tlet operand: OptimizedOperand = undefined\n\t\t\tif (value === undefined || value === null) {\n\t\t\t\tcontinue\n\t\t\t} else if (key === 'and') {\n\t\t\t\tconst innerOperands: (Input.OptionalWhere | boolean)[] = []\n\t\t\t\tfor (const innerValue of value as readonly Input.OptionalWhere[]) {\n\t\t\t\t\tconst innerOperand = this.optimizeWhere(innerValue, entity, relationPath)\n\t\t\t\t\tif (innerOperand === false) {\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\t\t\t\t\tinnerOperands.push(innerOperand)\n\t\t\t\t}\n\t\t\t\toperand = this.optimizeAnd(innerOperands, entity, relationPath)\n\t\t\t} else if (key === 'or') {\n\t\t\t\tconst innerOperands: (Input.OptionalWhere | boolean)[] = []\n\t\t\t\tfor (const innerValue of value as readonly Input.OptionalWhere[]) {\n\t\t\t\t\tconst innerOperand = this.optimizeWhere(innerValue, entity, relationPath)\n\t\t\t\t\tif (innerOperand === true) {\n\t\t\t\t\t\toperand = true\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tinnerOperands.push(innerOperand)\n\t\t\t\t}\n\t\t\t\tif (operand !== true) {\n\t\t\t\t\toperand = this.optimizeOr(innerOperands, entity, relationPath)\n\t\t\t\t}\n\n\t\t\t} else if (key === 'not') {\n\t\t\t\toperand = optimizeNot(this.optimizeWhere(value as Input.OptionalWhere, entity, relationPath))\n\n\t\t\t} else {\n\t\t\t\toperand = this.resolveFieldValue(entity, key, value, relationPath)\n\t\t\t}\n\n\t\t\tif (operand === false) {\n\t\t\t\treturn false\n\n\t\t\t} else if (operand !== undefined) {\n\t\t\t\toperands.push(operand)\n\t\t\t}\n\t\t}\n\t\treturn this.optimizeAnd(operands, entity, relationPath)\n\t}\n\n\tprivate optimizeOr(operands: readonly OptimizedOperand[], entity: Model.Entity, relationPath: ExtendedRelationContext[]): Input.OptionalWhere | boolean {\n\t\tconst optimized = optimizeOr(operands)\n\t\tif (typeof optimized === 'boolean' || !Array.isArray(optimized.or)) {\n\t\t\treturn optimized\n\t\t}\n\t\tconst result = this.crossOptimize(optimized.or, entity, { never: true }, relationPath)\n\t\tif (result === optimized.or) {\n\t\t\treturn optimized\n\t\t}\n\t\treturn optimizeOr(result)\n\t}\n\n\tprivate optimizeAnd(operands: readonly OptimizedOperand[], entity: Model.Entity, relationPath: ExtendedRelationContext[]): Input.OptionalWhere | boolean {\n\t\tconst optimized = optimizeAnd(operands)\n\t\tif (typeof optimized === 'boolean' || !Array.isArray(optimized.and)) {\n\t\t\treturn optimized\n\t\t}\n\t\tconst result = this.crossOptimize(optimized.and, entity, { always: true }, relationPath)\n\t\tif (result === optimized.and) {\n\t\t\treturn optimized\n\t\t}\n\t\treturn optimizeAnd(result)\n\t}\n\n\tprivate crossOptimize(operands: Input.OptionalWhere[], entity: Model.Entity, replacement: Input.Condition, relationPath: ExtendedRelationContext[]): (Input.OptionalWhere | boolean)[] {\n\t\tlet result: (Input.OptionalWhere | boolean)[] = operands\n\t\tlet copied = false\n\t\tconst count = Math.min(result.length, this.options?.maxCrossOptimizationInput ?? 50)\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tfor (let j = 0; j < count; j++) {\n\t\t\t\tconst a = result[j]\n\t\t\t\tconst b = result[i]\n\t\t\t\tif (i !== j && typeof a !== 'boolean' && typeof b !== 'boolean') {\n\t\t\t\t\tconst elResult = replaceWhere(a, b, { [entity.primary]: replacement }, {\n\t\t\t\t\t\treplaceSubOperands: true,\n\t\t\t\t\t})\n\t\t\t\t\tif (elResult !== a) {\n\t\t\t\t\t\tif (!copied) {\n\t\t\t\t\t\t\tresult = [...result]\n\t\t\t\t\t\t\tcopied = true\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult[j] = this.optimizeWhere(elResult, entity, relationPath)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result\n\t}\n\n\tprivate resolveFieldValue(entity: Model.Entity, key: string, value: Input.OptionalWhere[string], relationPath: ExtendedRelationContext[]) {\n\t\treturn acceptFieldVisitor<Input.OptionalWhere | boolean>(this.model, entity, key, {\n\t\t\tvisitColumn: () => {\n\t\t\t\tconst optimizedCondition = this.conditionOptimizer.optimize(value as Input.Condition)\n\n\t\t\t\tif (typeof optimizedCondition === 'boolean') {\n\t\t\t\t\treturn optimizedCondition\n\t\t\t\t}\n\n\t\t\t\treturn { [key]: optimizedCondition }\n\t\t\t},\n\t\t\tvisitRelation: context => {\n\t\t\t\tlet where = value as Input.OptionalWhere\n\t\t\t\tconst newRelationPath: ExtendedRelationContext[] = [...relationPath]\n\t\t\t\tconst length = relationPath.length\n\t\t\t\tif (length > 0 && relationPath[length - 1].context.targetRelation?.name === context.relation.name) {\n\t\t\t\t\tconst item = newRelationPath.pop()\n\t\t\t\t\tconst type = item!.context.type\n\t\t\t\t\tif (item?.canEliminate && (type === 'oneHasMany' || type === 'oneHasOneOwning' || type === 'oneHasOneInverse')) {\n\t\t\t\t\t\twhere = replaceWhere(where, { [context.targetEntity.primary]: { isNull: true } }, { [context.targetEntity.primary]: { never: true } })\n\t\t\t\t\t\twhere = replaceWhere(where, { [context.targetEntity.primary]: { isNull: false } }, { [context.targetEntity.primary]: { always: true } })\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// first level relation - we are sure root exists\n\t\t\t\t\tconst canEliminate = length === 0 || relationPath[length - 1].isLast\n\t\t\t\t\tnewRelationPath.push({ context, isLast: false, canEliminate })\n\t\t\t\t}\n\t\t\t\tconst optimizedWhere = this.optimizeWhere(where, context.targetEntity, newRelationPath)\n\n\t\t\t\tif (typeof optimizedWhere === 'boolean') {\n\t\t\t\t\treturn optimizedWhere\n\t\t\t\t}\n\n\t\t\t\treturn { [key]: optimizedWhere }\n\t\t\t},\n\t\t})\n\t}\n}\n"],"names":["_WhereOptimizer"],"mappings":"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"}
|