@contember/engine-content-api 2.0.0-beta.1 → 2.0.0-beta.3

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.
@@ -43,7 +43,8 @@ class Mapper {
43
43
  const columnName = schemaUtils.getColumnName(this.schema, entity, fieldName);
44
44
  const qb = Database.SelectBuilder.create().from(entity.tableName, "root_").select(["root_", columnName]);
45
45
  const expandedWhere = this.uniqueWhereExpander.expand(entity, where);
46
- const builtQb = this.whereBuilder.build(qb, entity, this.pathFactory.create([]), expandedWhere);
46
+ const withPredicates = this.predicatesInjector.inject(entity, expandedWhere);
47
+ const builtQb = this.whereBuilder.build(qb, entity, this.pathFactory.create([]), withPredicates);
47
48
  const result = await builtQb.getResult(this.db);
48
49
  return result[0] !== void 0 ? result[0][columnName] : void 0;
49
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Mapper.cjs","sources":["../../../../../packages/engine-content-api/src/mapper/Mapper.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { acceptFieldVisitor, getColumnName } from '@contember/schema-utils'\nimport {\n\tOrderByHelper,\n\tPathFactory,\n\tSelectBuilderFactory,\n\tSelectGroupedObjects,\n\tSelectHydrator,\n\tSelectIndexedResultObjects,\n\tSelectResultObject,\n\tWhereBuilder,\n} from './select'\nimport { Client, Connection, ConstraintHelper, DatabaseMetadata, SelectBuilder } from '@contember/database'\nimport { PredicatesInjector } from '../acl'\nimport { JunctionTableManager } from './JunctionTableManager'\nimport { DeletedEntitiesStorage, DeleteExecutor } from './delete'\nimport { MutationEntryNotFoundError, MutationResultList } from './Result'\nimport { UpdateBuilder, Updater } from './update'\nimport { InsertBuilder, Inserter } from './insert'\nimport { tryMutation } from './ErrorUtils'\nimport { ObjectNode, UniqueWhereExpander } from '../inputProcessing'\nimport { Mutex } from '../utils'\nimport { CheckedPrimary } from './CheckedPrimary'\nimport { ImplementationException } from '../exception'\nimport { EventManager } from './EventManager'\nimport { MapperInput } from './types'\n\nexport class Mapper<ConnectionType extends Connection.ConnectionLike = Connection.ConnectionLike> {\n\tprivate systemVariablesSetupDone: Promise<void> | undefined\n\tpublic readonly deletedEntities = new DeletedEntitiesStorage()\n\tpublic readonly mutex = new Mutex()\n\tpublic readonly constraintHelper: ConstraintHelper\n\n\tpublic readonly eventManager: EventManager\n\n\tconstructor(\n\t\tpublic readonly db: Client<ConnectionType>,\n\t\tpublic readonly identityId: string,\n\t\tpublic readonly transactionId: string,\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly schemaDatabaseMetadata: DatabaseMetadata,\n\t\tprivate readonly predicatesInjector: PredicatesInjector,\n\t\tprivate readonly selectBuilderFactory: SelectBuilderFactory,\n\t\tprivate readonly uniqueWhereExpander: UniqueWhereExpander,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly junctionTableManager: JunctionTableManager,\n\t\tprivate readonly deleteExecutor: DeleteExecutor,\n\t\tprivate readonly updater: Updater,\n\t\tprivate readonly inserter: Inserter,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {\n\t\tthis.constraintHelper = new ConstraintHelper(db, this.schemaDatabaseMetadata)\n\t\tthis.eventManager = new EventManager(this)\n\t}\n\n\tpublic async selectField(entity: Model.Entity, where: Input.UniqueWhere | CheckedPrimary, fieldName: string) {\n\t\tconst columnName = getColumnName(this.schema, entity, fieldName)\n\n\t\tconst qb = SelectBuilder.create() //\n\t\t\t.from(entity.tableName, 'root_')\n\t\t\t.select(['root_', columnName])\n\t\tconst expandedWhere = this.uniqueWhereExpander.expand(entity, where)\n\t\tconst builtQb = this.whereBuilder.build(qb, entity, this.pathFactory.create([]), expandedWhere)\n\t\tconst result = await builtQb.getResult(this.db)\n\n\t\treturn result[0] !== undefined ? result[0][columnName] : undefined\n\t}\n\n\tpublic async selectAssoc(\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t\tindexBy: string,\n\t): Promise<SelectIndexedResultObjects> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst path = this.pathFactory.create([])\n\t\tconst indexByAlias: string = path.for(indexBy).alias\n\t\tconst qb: SelectBuilder = SelectBuilder.create()\n\t\t\t.select([path.alias, getColumnName(this.schema, entity, indexBy)], indexByAlias)\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath)\n\t\treturn await hydrator.hydrateAll(rows, indexByAlias)\n\t}\n\n\tpublic async select(entity: Model.Entity, input: ObjectNode<Input.ListQueryInput>, relationPath: Model.AnyRelationContext[]): Promise<SelectResultObject[]> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst qb: SelectBuilder<SelectBuilder.Result> = SelectBuilder.create()\n\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath)\n\n\t\treturn await hydrator.hydrateAll(rows)\n\t}\n\n\tpublic async selectUnique(\n\t\tentity: Model.Entity,\n\t\tquery: ObjectNode<Input.UniqueQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<SelectResultObject | null> {\n\t\tconst uniqueWhere = this.uniqueWhereExpander.expand(entity, query.args.by)\n\t\tconst where = query.args.filter ? { and: [uniqueWhere, query.args.filter] } : uniqueWhere\n\t\tconst queryExpanded = query.withArg<Input.ListQueryInput>('filter', where)\n\n\t\tconst rows = await this.select(entity, queryExpanded, relationPath)\n\n\t\treturn rows[0] ?? null\n\t}\n\n\tpublic async selectGrouped(\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelation: Model.JoiningColumnRelation & Model.AnyRelation,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<SelectGroupedObjects> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst path = this.pathFactory.create([])\n\t\tconst groupingKey = '__grouping_key'\n\t\tconst qb: SelectBuilder = SelectBuilder.create()\n\t\t\t.select([path.alias, relation.joiningColumn.columnName], groupingKey)\n\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath, relation.name)\n\n\t\treturn await hydrator.hydrateGroups(rows, groupingKey)\n\t}\n\n\tprivate async selectRows(\n\t\thydrator: SelectHydrator,\n\t\tqb: SelectBuilder<SelectBuilder.Result>,\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t\tgroupBy?: string,\n\t) {\n\t\tconst inputWithOrder = OrderByHelper.appendDefaultOrderBy(entity, input, undefined)\n\t\tconst path = this.pathFactory.create([])\n\t\tconst augmentedBuilder = qb.from(entity.tableName, path.alias).meta('path', [...input.path, input.alias])\n\n\t\tconst selector = this.selectBuilderFactory.create(augmentedBuilder, hydrator, relationPath)\n\t\tconst filterWithPredicates = this.predicatesInjector.inject(entity, inputWithOrder.args.filter || {}, relationPath[relationPath.length - 1])\n\t\tconst inputWithPredicates = inputWithOrder.withArg('filter', filterWithPredicates)\n\t\tselector.select(this, entity, inputWithPredicates, path, groupBy)\n\t\treturn await selector.execute(this.db)\n\t}\n\n\tpublic async count(entity: Model.Entity, filter: Input.OptionalWhere) {\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select(expr => expr.raw('count(*)'), 'row_count')\n\t\tconst withPredicates = this.predicatesInjector.inject(entity, filter)\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates)\n\t\tconst result = await qbWithWhere.getResult(this.db)\n\t\treturn result[0].row_count\n\t}\n\n\tpublic async countGrouped(\n\t\tentity: Model.Entity,\n\t\tfilter: Input.OptionalWhere,\n\t\trelation: Model.JoiningColumnRelation & Model.Relation,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<Record<string, number>> {\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select(expr => expr.raw('count(*)'), 'row_count')\n\t\t\t.select([path.alias, relation.joiningColumn.columnName])\n\t\t\t.groupBy([path.alias, relation.joiningColumn.columnName])\n\t\tconst withPredicates = this.predicatesInjector.inject(entity, filter, relationPath[relationPath.length - 1])\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates, { relationPath })\n\t\tconst rows = await qbWithWhere.getResult(this.db)\n\t\tconst result = new Map<string, number>()\n\t\tfor (const row of rows) {\n\t\t\tresult.set(String(row[relation.joiningColumn.columnName]), Number(row.row_count))\n\t\t}\n\t\treturn Object.fromEntries(result)\n\t}\n\n\tpublic async insert(\n\t\tentity: Model.Entity,\n\t\tdata: MapperInput.CreateDataInput,\n\t\tbuilderCb: (builder: InsertBuilder) => void = () => {},\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, () =>\n\t\t\tthis.insertInternal(entity, data, builderCb),\n\t\t)\n\t}\n\n\tpublic async update(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tdata: MapperInput.UpdateDataInput,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue, err] = await this.getPrimaryValue(entity, by)\n\t\t\tif (err) return [err]\n\n\t\t\treturn await this.updater.update(this, entity, primaryValue, data, filter)\n\t\t})\n\t}\n\n\tpublic async updateInternal(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tbuilderCb: (builder: UpdateBuilder) => void,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue, err] = await this.getPrimaryValue(entity, by)\n\t\t\tif (err) return [err]\n\n\t\t\treturn await this.updater.updateCb(this, entity, primaryValue, builderCb)\n\t\t})\n\t}\n\tpublic async upsert(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tupdate: MapperInput.UpdateDataInput,\n\t\tcreate: MapperInput.CreateDataInput,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue] = await this.getPrimaryValue(entity, by)\n\t\t\tif (primaryValue === undefined) {\n\t\t\t\treturn await this.insertInternal(entity, create)\n\t\t\t}\n\t\t\treturn await this.updater.update(this, entity, primaryValue, update, filter)\n\t\t})\n\t}\n\n\tprivate insertInternal(entity: Model.Entity, data: MapperInput.CreateDataInput, builderCb: (builder: InsertBuilder) => void = () => {}) {\n\t\treturn this.inserter.insert(this, entity, data, id => {\n\t\t}, builderCb)\n\t}\n\n\tpublic async delete(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, () => {\n\t\t\treturn this.deleteExecutor.execute(this, entity, by, filter)\n\t\t})\n\t}\n\n\tpublic async connectJunction(\n\t\tentity: Model.Entity,\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation,\n\t\tthisPrimary: Input.PrimaryValue,\n\t\totherPrimary: Input.PrimaryValue,\n\t): Promise<MutationResultList> {\n\t\tawait this.setupSystemVariables()\n\t\tconst err = () => {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\treturn await acceptFieldVisitor(this.schema, entity, relation, {\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\treturn this.junctionTableManager.connectJunction(this, entity, relation, thisPrimary, otherPrimary)\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ targetEntity, targetRelation }) => {\n\t\t\t\treturn this.junctionTableManager.connectJunction(this, targetEntity, targetRelation, otherPrimary, thisPrimary)\n\t\t\t},\n\t\t\tvisitColumn: err,\n\t\t\tvisitOneHasMany: err,\n\t\t\tvisitOneHasOneInverse: err,\n\t\t\tvisitOneHasOneOwning: err,\n\t\t\tvisitManyHasOne: err,\n\t\t})\n\t}\n\n\tpublic async disconnectJunction(\n\t\tentity: Model.Entity,\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation,\n\t\tthisPrimary: Input.PrimaryValue,\n\t\totherPrimary: Input.PrimaryValue,\n\t): Promise<MutationResultList> {\n\t\tawait this.setupSystemVariables()\n\t\tconst err = () => {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\treturn await acceptFieldVisitor(this.schema, entity, relation, {\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\treturn this.junctionTableManager.disconnectJunction(this, entity, relation, thisPrimary, otherPrimary)\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ targetEntity, targetRelation }) => {\n\t\t\t\treturn this.junctionTableManager.disconnectJunction(this, targetEntity, targetRelation, otherPrimary, thisPrimary)\n\t\t\t},\n\t\t\tvisitColumn: err,\n\t\t\tvisitOneHasMany: err,\n\t\t\tvisitOneHasOneInverse: err,\n\t\t\tvisitOneHasOneOwning: err,\n\t\t\tvisitManyHasOne: err,\n\t\t})\n\t}\n\n\tpublic async getPrimaryValue(\n\t\tentity: Model.Entity,\n\t\twhere: Input.UniqueWhere | CheckedPrimary,\n\t): Promise<[Input.PrimaryValue, undefined] | [undefined, MutationEntryNotFoundError]> {\n\t\tif (where instanceof CheckedPrimary) {\n\t\t\treturn [where.primaryValue, undefined]\n\t\t}\n\t\tconst result = await this.selectField(entity, where, entity.primary)\n\t\treturn result ? [result, undefined] : [undefined, new MutationEntryNotFoundError([], where)]\n\t}\n\n\tprivate async setupSystemVariables() {\n\t\tthis.systemVariablesSetupDone ??= (async () => {\n\t\t\tawait this.db.query('SELECT set_config(?, ?, false)', ['tenant.identity_id', this.identityId]) // todo rename to system.identity_id\n\t\t\tawait this.db.query('SELECT set_config(?, ?, false)', ['system.transaction_id', this.transactionId])\n\t\t})()\n\t\tawait this.systemVariablesSetupDone\n\t}\n}\n"],"names":["DeletedEntitiesStorage","Mutex","ConstraintHelper","EventManager","getColumnName","SelectBuilder","SelectHydrator","OrderByHelper","ImplementationException","tryMutation","acceptFieldVisitor","entity","relation","CheckedPrimary","MutationEntryNotFoundError"],"mappings":";;;;;;;;;;;;;;;;;AA2BO,MAAM,OAAqF;AAAA,EAQjG,YACiB,IACA,YACA,eACC,QACA,wBACA,oBACA,sBACA,qBACA,cACA,sBACA,gBACA,SACA,UACA,aAChB;AAde,SAAA,KAAA;AACA,SAAA,aAAA;AACA,SAAA,gBAAA;AACC,SAAA,SAAA;AACA,SAAA,yBAAA;AACA,SAAA,qBAAA;AACA,SAAA,uBAAA;AACA,SAAA,sBAAA;AACA,SAAA,eAAA;AACA,SAAA,uBAAA;AACA,SAAA,iBAAA;AACA,SAAA,UAAA;AACA,SAAA,WAAA;AACA,SAAA,cAAA;AArBV,kBAAA,MAAA,0BAAA;AACQ,kBAAA,MAAA,mBAAkB,IAAIA,uBAAuB,uBAAA,CAAA;AAC7C,kBAAA,MAAA,SAAQ,IAAIC,MAAM,MAAA,CAAA;AAClB,kBAAA,MAAA,kBAAA;AAEA,kBAAA,MAAA,cAAA;AAkBf,SAAK,mBAAmB,IAAIC,SAAAA,iBAAiB,IAAI,KAAK,sBAAsB;AACvE,SAAA,eAAe,IAAIC,aAAA,aAAa,IAAI;AAAA,EAAA;AAAA,EAG1C,MAAa,YAAY,QAAsB,OAA2C,WAAmB;AAC5G,UAAM,aAAaC,YAAAA,cAAc,KAAK,QAAQ,QAAQ,SAAS;AAE/D,UAAM,KAAKC,SAAA,cAAc,OAAO,EAC9B,KAAK,OAAO,WAAW,OAAO,EAC9B,OAAO,CAAC,SAAS,UAAU,CAAC;AAC9B,UAAM,gBAAgB,KAAK,oBAAoB,OAAO,QAAQ,KAAK;AACnE,UAAM,UAAU,KAAK,aAAa,MAAM,IAAI,QAAQ,KAAK,YAAY,OAAO,CAAE,CAAA,GAAG,aAAa;AAC9F,UAAM,SAAS,MAAM,QAAQ,UAAU,KAAK,EAAE;AAEvC,WAAA,OAAO,CAAC,MAAM,SAAY,OAAO,CAAC,EAAE,UAAU,IAAI;AAAA,EAAA;AAAA,EAG1D,MAAa,YACZ,QACA,OACA,cACA,SACsC;AAChC,UAAA,WAAW,IAAIC,8BAAe;AACpC,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,eAAuB,KAAK,IAAI,OAAO,EAAE;AAC/C,UAAM,KAAoBD,SAAAA,cAAc,OAAO,EAC7C,OAAO,CAAC,KAAK,OAAOD,YAAAA,cAAc,KAAK,QAAQ,QAAQ,OAAO,CAAC,GAAG,YAAY;AAC1E,UAAA,OAAO,MAAM,KAAK,WAAW,UAAU,IAAI,QAAQ,OAAO,YAAY;AAC5E,WAAO,MAAM,SAAS,WAAW,MAAM,YAAY;AAAA,EAAA;AAAA,EAGpD,MAAa,OAAO,QAAsB,OAAyC,cAAyE;AACrJ,UAAA,WAAW,IAAIE,8BAAe;AAC9B,UAAA,KAA0CD,uBAAc,OAAO;AAE/D,UAAA,OAAO,MAAM,KAAK,WAAW,UAAU,IAAI,QAAQ,OAAO,YAAY;AAErE,WAAA,MAAM,SAAS,WAAW,IAAI;AAAA,EAAA;AAAA,EAGtC,MAAa,aACZ,QACA,OACA,cACqC;AACrC,UAAM,cAAc,KAAK,oBAAoB,OAAO,QAAQ,MAAM,KAAK,EAAE;AACzE,UAAM,QAAQ,MAAM,KAAK,SAAS,EAAE,KAAK,CAAC,aAAa,MAAM,KAAK,MAAM,EAAM,IAAA;AAC9E,UAAM,gBAAgB,MAAM,QAA8B,UAAU,KAAK;AAEzE,UAAM,OAAO,MAAM,KAAK,OAAO,QAAQ,eAAe,YAAY;AAE3D,WAAA,KAAK,CAAC,KAAK;AAAA,EAAA;AAAA,EAGnB,MAAa,cACZ,QACA,OACA,UACA,cACgC;AAC1B,UAAA,WAAW,IAAIC,8BAAe;AACpC,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,cAAc;AACpB,UAAM,KAAoBD,SAAAA,cAAc,OAAO,EAC7C,OAAO,CAAC,KAAK,OAAO,SAAS,cAAc,UAAU,GAAG,WAAW;AAE/D,UAAA,OAAO,MAAM,KAAK,WAAW,UAAU,IAAI,QAAQ,OAAO,cAAc,SAAS,IAAI;AAE3F,WAAO,MAAM,SAAS,cAAc,MAAM,WAAW;AAAA,EAAA;AAAA,EAGtD,MAAc,WACb,UACA,IACA,QACA,OACA,cACA,SACC;AACD,UAAM,iBAAiBE,cAAAA,cAAc,qBAAqB,QAAQ,OAAO,MAAS;AAClF,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,mBAAmB,GAAG,KAAK,OAAO,WAAW,KAAK,KAAK,EAAE,KAAK,QAAQ,CAAC,GAAG,MAAM,MAAM,MAAM,KAAK,CAAC;AAExG,UAAM,WAAW,KAAK,qBAAqB,OAAO,kBAAkB,UAAU,YAAY;AAC1F,UAAM,uBAAuB,KAAK,mBAAmB,OAAO,QAAQ,eAAe,KAAK,UAAU,CAAI,GAAA,aAAa,aAAa,SAAS,CAAC,CAAC;AAC3I,UAAM,sBAAsB,eAAe,QAAQ,UAAU,oBAAoB;AACjF,aAAS,OAAO,MAAM,QAAQ,qBAAqB,MAAM,OAAO;AAChE,WAAO,MAAM,SAAS,QAAQ,KAAK,EAAE;AAAA,EAAA;AAAA,EAGtC,MAAa,MAAM,QAAsB,QAA6B;AACrE,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,KAAKF,SAAAA,cAAc,OAAA,EACvB,KAAK,OAAO,WAAW,KAAK,KAAK,EACjC,OAAO,CAAQ,SAAA,KAAK,IAAI,UAAU,GAAG,WAAW;AAClD,UAAM,iBAAiB,KAAK,mBAAmB,OAAO,QAAQ,MAAM;AACpE,UAAM,cAAc,KAAK,aAAa,MAAM,IAAI,QAAQ,MAAM,cAAc;AAC5E,UAAM,SAAS,MAAM,YAAY,UAAU,KAAK,EAAE;AAC3C,WAAA,OAAO,CAAC,EAAE;AAAA,EAAA;AAAA,EAGlB,MAAa,aACZ,QACA,QACA,UACA,cACkC;AAClC,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,KAAKA,SAAAA,cAAc,OAAO,EAC9B,KAAK,OAAO,WAAW,KAAK,KAAK,EACjC,OAAO,CAAA,SAAQ,KAAK,IAAI,UAAU,GAAG,WAAW,EAChD,OAAO,CAAC,KAAK,OAAO,SAAS,cAAc,UAAU,CAAC,EACtD,QAAQ,CAAC,KAAK,OAAO,SAAS,cAAc,UAAU,CAAC;AACnD,UAAA,iBAAiB,KAAK,mBAAmB,OAAO,QAAQ,QAAQ,aAAa,aAAa,SAAS,CAAC,CAAC;AACrG,UAAA,cAAc,KAAK,aAAa,MAAM,IAAI,QAAQ,MAAM,gBAAgB,EAAE,cAAc;AAC9F,UAAM,OAAO,MAAM,YAAY,UAAU,KAAK,EAAE;AAC1C,UAAA,6BAAa,IAAoB;AACvC,eAAW,OAAO,MAAM;AAChB,aAAA,IAAI,OAAO,IAAI,SAAS,cAAc,UAAU,CAAC,GAAG,OAAO,IAAI,SAAS,CAAC;AAAA,IAAA;AAE1E,WAAA,OAAO,YAAY,MAAM;AAAA,EAAA;AAAA,EAGjC,MAAa,OACZ,QACA,MACA,YAA8C,MAAM;AAAA,EAAA,GACtB;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAIG,UAAAA,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AACzB,WAAAC,WAAA;AAAA,MAAY,KAAK;AAAA,MAAQ,KAAK;AAAA,MAAwB,MAC5D,KAAK,eAAe,QAAQ,MAAM,SAAS;AAAA,IAC5C;AAAA,EAAA;AAAA,EAGD,MAAa,OACZ,QACA,IACA,MACA,QAC8B;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAID,UAAAA,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AAChC,WAAOC,WAAY,YAAA,KAAK,QAAQ,KAAK,wBAAwB,YAAY;AAClE,YAAA,CAAC,cAAc,GAAG,IAAI,MAAM,KAAK,gBAAgB,QAAQ,EAAE;AAC7D,UAAA,IAAY,QAAA,CAAC,GAAG;AAEb,aAAA,MAAM,KAAK,QAAQ,OAAO,MAAM,QAAQ,cAAc,MAAM,MAAM;AAAA,IAAA,CACzE;AAAA,EAAA;AAAA,EAGF,MAAa,eACZ,QACA,IACA,WAC8B;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAID,UAAAA,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AAChC,WAAOC,WAAY,YAAA,KAAK,QAAQ,KAAK,wBAAwB,YAAY;AAClE,YAAA,CAAC,cAAc,GAAG,IAAI,MAAM,KAAK,gBAAgB,QAAQ,EAAE;AAC7D,UAAA,IAAY,QAAA,CAAC,GAAG;AAEpB,aAAO,MAAM,KAAK,QAAQ,SAAS,MAAM,QAAQ,cAAc,SAAS;AAAA,IAAA,CACxE;AAAA,EAAA;AAAA,EAEF,MAAa,OACZ,QACA,IACA,QACA,QACA,QAC8B;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAID,UAAAA,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AAChC,WAAOC,WAAY,YAAA,KAAK,QAAQ,KAAK,wBAAwB,YAAY;AACxE,YAAM,CAAC,YAAY,IAAI,MAAM,KAAK,gBAAgB,QAAQ,EAAE;AAC5D,UAAI,iBAAiB,QAAW;AAC/B,eAAO,MAAM,KAAK,eAAe,QAAQ,MAAM;AAAA,MAAA;AAEzC,aAAA,MAAM,KAAK,QAAQ,OAAO,MAAM,QAAQ,cAAc,QAAQ,MAAM;AAAA,IAAA,CAC3E;AAAA,EAAA;AAAA,EAGM,eAAe,QAAsB,MAAmC,YAA8C,MAAM;AAAA,EAAA,GAAI;AACvI,WAAO,KAAK,SAAS,OAAO,MAAM,QAAQ,MAAM,CAAM,OAAA;AAAA,OACnD,SAAS;AAAA,EAAA;AAAA,EAGb,MAAa,OACZ,QACA,IACA,QAC8B;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAID,UAAAA,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AAChC,WAAOC,WAAY,YAAA,KAAK,QAAQ,KAAK,wBAAwB,MAAM;AAClE,aAAO,KAAK,eAAe,QAAQ,MAAM,QAAQ,IAAI,MAAM;AAAA,IAAA,CAC3D;AAAA,EAAA;AAAA,EAGF,MAAa,gBACZ,QACA,UACA,aACA,cAC8B;AAC9B,UAAM,KAAK,qBAAqB;AAChC,UAAM,MAAM,MAAM;AACjB,YAAM,IAAID,UAAAA,wBAAwB;AAAA,IACnC;AACA,WAAO,MAAME,YAAAA,mBAAmB,KAAK,QAAQ,QAAQ,UAAU;AAAA,MAC9D,wBAAwB,CAAC,EAAE,QAAAC,SAAQ,UAAAC,gBAAe;AACjD,eAAO,KAAK,qBAAqB,gBAAgB,MAAMD,SAAQC,WAAU,aAAa,YAAY;AAAA,MACnG;AAAA,MACA,yBAAyB,CAAC,EAAE,cAAc,qBAAqB;AAC9D,eAAO,KAAK,qBAAqB,gBAAgB,MAAM,cAAc,gBAAgB,cAAc,WAAW;AAAA,MAC/G;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,uBAAuB;AAAA,MACvB,sBAAsB;AAAA,MACtB,iBAAiB;AAAA,IAAA,CACjB;AAAA,EAAA;AAAA,EAGF,MAAa,mBACZ,QACA,UACA,aACA,cAC8B;AAC9B,UAAM,KAAK,qBAAqB;AAChC,UAAM,MAAM,MAAM;AACjB,YAAM,IAAIJ,UAAAA,wBAAwB;AAAA,IACnC;AACA,WAAO,MAAME,YAAAA,mBAAmB,KAAK,QAAQ,QAAQ,UAAU;AAAA,MAC9D,wBAAwB,CAAC,EAAE,QAAAC,SAAQ,UAAAC,gBAAe;AACjD,eAAO,KAAK,qBAAqB,mBAAmB,MAAMD,SAAQC,WAAU,aAAa,YAAY;AAAA,MACtG;AAAA,MACA,yBAAyB,CAAC,EAAE,cAAc,qBAAqB;AAC9D,eAAO,KAAK,qBAAqB,mBAAmB,MAAM,cAAc,gBAAgB,cAAc,WAAW;AAAA,MAClH;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,uBAAuB;AAAA,MACvB,sBAAsB;AAAA,MACtB,iBAAiB;AAAA,IAAA,CACjB;AAAA,EAAA;AAAA,EAGF,MAAa,gBACZ,QACA,OACqF;AACrF,QAAI,iBAAiBC,eAAAA,gBAAgB;AAC7B,aAAA,CAAC,MAAM,cAAc,MAAS;AAAA,IAAA;AAEtC,UAAM,SAAS,MAAM,KAAK,YAAY,QAAQ,OAAO,OAAO,OAAO;AACnE,WAAO,SAAS,CAAC,QAAQ,MAAS,IAAI,CAAC,QAAW,IAAIC,OAAAA,2BAA2B,CAAI,GAAA,KAAK,CAAC;AAAA,EAAA;AAAA,EAG5F,MAAc,uBAAuB;AAC/B,SAAA,6BAAL,KAAK,4BAA8B,YAAY;AACxC,YAAA,KAAK,GAAG,MAAM,kCAAkC,CAAC,sBAAsB,KAAK,UAAU,CAAC;AACvF,YAAA,KAAK,GAAG,MAAM,kCAAkC,CAAC,yBAAyB,KAAK,aAAa,CAAC;AAAA,IAAA;AAEpG,UAAM,KAAK;AAAA,EAAA;AAEb;;"}
1
+ {"version":3,"file":"Mapper.cjs","sources":["../../../../../packages/engine-content-api/src/mapper/Mapper.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { acceptFieldVisitor, getColumnName } from '@contember/schema-utils'\nimport {\n\tOrderByHelper,\n\tPathFactory,\n\tSelectBuilderFactory,\n\tSelectGroupedObjects,\n\tSelectHydrator,\n\tSelectIndexedResultObjects,\n\tSelectResultObject,\n\tWhereBuilder,\n} from './select'\nimport { Client, Connection, ConstraintHelper, DatabaseMetadata, SelectBuilder } from '@contember/database'\nimport { PredicatesInjector } from '../acl'\nimport { JunctionTableManager } from './JunctionTableManager'\nimport { DeletedEntitiesStorage, DeleteExecutor } from './delete'\nimport { MutationEntryNotFoundError, MutationResultList } from './Result'\nimport { UpdateBuilder, Updater } from './update'\nimport { InsertBuilder, Inserter } from './insert'\nimport { tryMutation } from './ErrorUtils'\nimport { ObjectNode, UniqueWhereExpander } from '../inputProcessing'\nimport { Mutex } from '../utils'\nimport { CheckedPrimary } from './CheckedPrimary'\nimport { ImplementationException } from '../exception'\nimport { EventManager } from './EventManager'\nimport { MapperInput } from './types'\n\nexport class Mapper<ConnectionType extends Connection.ConnectionLike = Connection.ConnectionLike> {\n\tprivate systemVariablesSetupDone: Promise<void> | undefined\n\tpublic readonly deletedEntities = new DeletedEntitiesStorage()\n\tpublic readonly mutex = new Mutex()\n\tpublic readonly constraintHelper: ConstraintHelper\n\n\tpublic readonly eventManager: EventManager\n\n\tconstructor(\n\t\tpublic readonly db: Client<ConnectionType>,\n\t\tpublic readonly identityId: string,\n\t\tpublic readonly transactionId: string,\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly schemaDatabaseMetadata: DatabaseMetadata,\n\t\tprivate readonly predicatesInjector: PredicatesInjector,\n\t\tprivate readonly selectBuilderFactory: SelectBuilderFactory,\n\t\tprivate readonly uniqueWhereExpander: UniqueWhereExpander,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly junctionTableManager: JunctionTableManager,\n\t\tprivate readonly deleteExecutor: DeleteExecutor,\n\t\tprivate readonly updater: Updater,\n\t\tprivate readonly inserter: Inserter,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {\n\t\tthis.constraintHelper = new ConstraintHelper(db, this.schemaDatabaseMetadata)\n\t\tthis.eventManager = new EventManager(this)\n\t}\n\n\tpublic async selectField(entity: Model.Entity, where: Input.UniqueWhere | CheckedPrimary, fieldName: string) {\n\t\tconst columnName = getColumnName(this.schema, entity, fieldName)\n\n\t\tconst qb = SelectBuilder.create() //\n\t\t\t.from(entity.tableName, 'root_')\n\t\t\t.select(['root_', columnName])\n\t\tconst expandedWhere = this.uniqueWhereExpander.expand(entity, where)\n\t\tconst withPredicates = this.predicatesInjector.inject(entity, expandedWhere)\n\t\tconst builtQb = this.whereBuilder.build(qb, entity, this.pathFactory.create([]), withPredicates)\n\t\tconst result = await builtQb.getResult(this.db)\n\n\t\treturn result[0] !== undefined ? result[0][columnName] : undefined\n\t}\n\n\tpublic async selectAssoc(\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t\tindexBy: string,\n\t): Promise<SelectIndexedResultObjects> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst path = this.pathFactory.create([])\n\t\tconst indexByAlias: string = path.for(indexBy).alias\n\t\tconst qb: SelectBuilder = SelectBuilder.create()\n\t\t\t.select([path.alias, getColumnName(this.schema, entity, indexBy)], indexByAlias)\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath)\n\t\treturn await hydrator.hydrateAll(rows, indexByAlias)\n\t}\n\n\tpublic async select(entity: Model.Entity, input: ObjectNode<Input.ListQueryInput>, relationPath: Model.AnyRelationContext[]): Promise<SelectResultObject[]> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst qb: SelectBuilder<SelectBuilder.Result> = SelectBuilder.create()\n\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath)\n\n\t\treturn await hydrator.hydrateAll(rows)\n\t}\n\n\tpublic async selectUnique(\n\t\tentity: Model.Entity,\n\t\tquery: ObjectNode<Input.UniqueQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<SelectResultObject | null> {\n\t\tconst uniqueWhere = this.uniqueWhereExpander.expand(entity, query.args.by)\n\t\tconst where = query.args.filter ? { and: [uniqueWhere, query.args.filter] } : uniqueWhere\n\t\tconst queryExpanded = query.withArg<Input.ListQueryInput>('filter', where)\n\n\t\tconst rows = await this.select(entity, queryExpanded, relationPath)\n\n\t\treturn rows[0] ?? null\n\t}\n\n\tpublic async selectGrouped(\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelation: Model.JoiningColumnRelation & Model.AnyRelation,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<SelectGroupedObjects> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst path = this.pathFactory.create([])\n\t\tconst groupingKey = '__grouping_key'\n\t\tconst qb: SelectBuilder = SelectBuilder.create()\n\t\t\t.select([path.alias, relation.joiningColumn.columnName], groupingKey)\n\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath, relation.name)\n\n\t\treturn await hydrator.hydrateGroups(rows, groupingKey)\n\t}\n\n\tprivate async selectRows(\n\t\thydrator: SelectHydrator,\n\t\tqb: SelectBuilder<SelectBuilder.Result>,\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t\tgroupBy?: string,\n\t) {\n\t\tconst inputWithOrder = OrderByHelper.appendDefaultOrderBy(entity, input, undefined)\n\t\tconst path = this.pathFactory.create([])\n\t\tconst augmentedBuilder = qb.from(entity.tableName, path.alias).meta('path', [...input.path, input.alias])\n\n\t\tconst selector = this.selectBuilderFactory.create(augmentedBuilder, hydrator, relationPath)\n\t\tconst filterWithPredicates = this.predicatesInjector.inject(entity, inputWithOrder.args.filter || {}, relationPath[relationPath.length - 1])\n\t\tconst inputWithPredicates = inputWithOrder.withArg('filter', filterWithPredicates)\n\t\tselector.select(this, entity, inputWithPredicates, path, groupBy)\n\t\treturn await selector.execute(this.db)\n\t}\n\n\tpublic async count(entity: Model.Entity, filter: Input.OptionalWhere) {\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select(expr => expr.raw('count(*)'), 'row_count')\n\t\tconst withPredicates = this.predicatesInjector.inject(entity, filter)\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates)\n\t\tconst result = await qbWithWhere.getResult(this.db)\n\t\treturn result[0].row_count\n\t}\n\n\tpublic async countGrouped(\n\t\tentity: Model.Entity,\n\t\tfilter: Input.OptionalWhere,\n\t\trelation: Model.JoiningColumnRelation & Model.Relation,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<Record<string, number>> {\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select(expr => expr.raw('count(*)'), 'row_count')\n\t\t\t.select([path.alias, relation.joiningColumn.columnName])\n\t\t\t.groupBy([path.alias, relation.joiningColumn.columnName])\n\t\tconst withPredicates = this.predicatesInjector.inject(entity, filter, relationPath[relationPath.length - 1])\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates, { relationPath })\n\t\tconst rows = await qbWithWhere.getResult(this.db)\n\t\tconst result = new Map<string, number>()\n\t\tfor (const row of rows) {\n\t\t\tresult.set(String(row[relation.joiningColumn.columnName]), Number(row.row_count))\n\t\t}\n\t\treturn Object.fromEntries(result)\n\t}\n\n\tpublic async insert(\n\t\tentity: Model.Entity,\n\t\tdata: MapperInput.CreateDataInput,\n\t\tbuilderCb: (builder: InsertBuilder) => void = () => {},\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, () =>\n\t\t\tthis.insertInternal(entity, data, builderCb),\n\t\t)\n\t}\n\n\tpublic async update(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tdata: MapperInput.UpdateDataInput,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue, err] = await this.getPrimaryValue(entity, by)\n\t\t\tif (err) return [err]\n\n\t\t\treturn await this.updater.update(this, entity, primaryValue, data, filter)\n\t\t})\n\t}\n\n\tpublic async updateInternal(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tbuilderCb: (builder: UpdateBuilder) => void,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue, err] = await this.getPrimaryValue(entity, by)\n\t\t\tif (err) return [err]\n\n\t\t\treturn await this.updater.updateCb(this, entity, primaryValue, builderCb)\n\t\t})\n\t}\n\tpublic async upsert(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tupdate: MapperInput.UpdateDataInput,\n\t\tcreate: MapperInput.CreateDataInput,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue] = await this.getPrimaryValue(entity, by)\n\t\t\tif (primaryValue === undefined) {\n\t\t\t\treturn await this.insertInternal(entity, create)\n\t\t\t}\n\t\t\treturn await this.updater.update(this, entity, primaryValue, update, filter)\n\t\t})\n\t}\n\n\tprivate insertInternal(entity: Model.Entity, data: MapperInput.CreateDataInput, builderCb: (builder: InsertBuilder) => void = () => {}) {\n\t\treturn this.inserter.insert(this, entity, data, id => {\n\t\t}, builderCb)\n\t}\n\n\tpublic async delete(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, () => {\n\t\t\treturn this.deleteExecutor.execute(this, entity, by, filter)\n\t\t})\n\t}\n\n\tpublic async connectJunction(\n\t\tentity: Model.Entity,\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation,\n\t\tthisPrimary: Input.PrimaryValue,\n\t\totherPrimary: Input.PrimaryValue,\n\t): Promise<MutationResultList> {\n\t\tawait this.setupSystemVariables()\n\t\tconst err = () => {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\treturn await acceptFieldVisitor(this.schema, entity, relation, {\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\treturn this.junctionTableManager.connectJunction(this, entity, relation, thisPrimary, otherPrimary)\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ targetEntity, targetRelation }) => {\n\t\t\t\treturn this.junctionTableManager.connectJunction(this, targetEntity, targetRelation, otherPrimary, thisPrimary)\n\t\t\t},\n\t\t\tvisitColumn: err,\n\t\t\tvisitOneHasMany: err,\n\t\t\tvisitOneHasOneInverse: err,\n\t\t\tvisitOneHasOneOwning: err,\n\t\t\tvisitManyHasOne: err,\n\t\t})\n\t}\n\n\tpublic async disconnectJunction(\n\t\tentity: Model.Entity,\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation,\n\t\tthisPrimary: Input.PrimaryValue,\n\t\totherPrimary: Input.PrimaryValue,\n\t): Promise<MutationResultList> {\n\t\tawait this.setupSystemVariables()\n\t\tconst err = () => {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\treturn await acceptFieldVisitor(this.schema, entity, relation, {\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\treturn this.junctionTableManager.disconnectJunction(this, entity, relation, thisPrimary, otherPrimary)\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ targetEntity, targetRelation }) => {\n\t\t\t\treturn this.junctionTableManager.disconnectJunction(this, targetEntity, targetRelation, otherPrimary, thisPrimary)\n\t\t\t},\n\t\t\tvisitColumn: err,\n\t\t\tvisitOneHasMany: err,\n\t\t\tvisitOneHasOneInverse: err,\n\t\t\tvisitOneHasOneOwning: err,\n\t\t\tvisitManyHasOne: err,\n\t\t})\n\t}\n\n\tpublic async getPrimaryValue(\n\t\tentity: Model.Entity,\n\t\twhere: Input.UniqueWhere | CheckedPrimary,\n\t): Promise<[Input.PrimaryValue, undefined] | [undefined, MutationEntryNotFoundError]> {\n\t\tif (where instanceof CheckedPrimary) {\n\t\t\treturn [where.primaryValue, undefined]\n\t\t}\n\t\tconst result = await this.selectField(entity, where, entity.primary)\n\t\treturn result ? [result, undefined] : [undefined, new MutationEntryNotFoundError([], where)]\n\t}\n\n\tprivate async setupSystemVariables() {\n\t\tthis.systemVariablesSetupDone ??= (async () => {\n\t\t\tawait this.db.query('SELECT set_config(?, ?, false)', ['tenant.identity_id', this.identityId]) // todo rename to system.identity_id\n\t\t\tawait this.db.query('SELECT set_config(?, ?, false)', ['system.transaction_id', this.transactionId])\n\t\t})()\n\t\tawait this.systemVariablesSetupDone\n\t}\n}\n"],"names":["DeletedEntitiesStorage","Mutex","ConstraintHelper","EventManager","getColumnName","SelectBuilder","SelectHydrator","OrderByHelper","ImplementationException","tryMutation","acceptFieldVisitor","entity","relation","CheckedPrimary","MutationEntryNotFoundError"],"mappings":";;;;;;;;;;;;;;;;;AA2BO,MAAM,OAAqF;AAAA,EAQjG,YACiB,IACA,YACA,eACC,QACA,wBACA,oBACA,sBACA,qBACA,cACA,sBACA,gBACA,SACA,UACA,aAChB;AAde,SAAA,KAAA;AACA,SAAA,aAAA;AACA,SAAA,gBAAA;AACC,SAAA,SAAA;AACA,SAAA,yBAAA;AACA,SAAA,qBAAA;AACA,SAAA,uBAAA;AACA,SAAA,sBAAA;AACA,SAAA,eAAA;AACA,SAAA,uBAAA;AACA,SAAA,iBAAA;AACA,SAAA,UAAA;AACA,SAAA,WAAA;AACA,SAAA,cAAA;AArBV,kBAAA,MAAA,0BAAA;AACQ,kBAAA,MAAA,mBAAkB,IAAIA,uBAAuB,uBAAA,CAAA;AAC7C,kBAAA,MAAA,SAAQ,IAAIC,MAAM,MAAA,CAAA;AAClB,kBAAA,MAAA,kBAAA;AAEA,kBAAA,MAAA,cAAA;AAkBf,SAAK,mBAAmB,IAAIC,SAAAA,iBAAiB,IAAI,KAAK,sBAAsB;AACvE,SAAA,eAAe,IAAIC,aAAA,aAAa,IAAI;AAAA,EAAA;AAAA,EAG1C,MAAa,YAAY,QAAsB,OAA2C,WAAmB;AAC5G,UAAM,aAAaC,YAAAA,cAAc,KAAK,QAAQ,QAAQ,SAAS;AAE/D,UAAM,KAAKC,SAAA,cAAc,OAAO,EAC9B,KAAK,OAAO,WAAW,OAAO,EAC9B,OAAO,CAAC,SAAS,UAAU,CAAC;AAC9B,UAAM,gBAAgB,KAAK,oBAAoB,OAAO,QAAQ,KAAK;AACnE,UAAM,iBAAiB,KAAK,mBAAmB,OAAO,QAAQ,aAAa;AAC3E,UAAM,UAAU,KAAK,aAAa,MAAM,IAAI,QAAQ,KAAK,YAAY,OAAO,CAAE,CAAA,GAAG,cAAc;AAC/F,UAAM,SAAS,MAAM,QAAQ,UAAU,KAAK,EAAE;AAEvC,WAAA,OAAO,CAAC,MAAM,SAAY,OAAO,CAAC,EAAE,UAAU,IAAI;AAAA,EAAA;AAAA,EAG1D,MAAa,YACZ,QACA,OACA,cACA,SACsC;AAChC,UAAA,WAAW,IAAIC,8BAAe;AACpC,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,eAAuB,KAAK,IAAI,OAAO,EAAE;AAC/C,UAAM,KAAoBD,SAAAA,cAAc,OAAO,EAC7C,OAAO,CAAC,KAAK,OAAOD,YAAAA,cAAc,KAAK,QAAQ,QAAQ,OAAO,CAAC,GAAG,YAAY;AAC1E,UAAA,OAAO,MAAM,KAAK,WAAW,UAAU,IAAI,QAAQ,OAAO,YAAY;AAC5E,WAAO,MAAM,SAAS,WAAW,MAAM,YAAY;AAAA,EAAA;AAAA,EAGpD,MAAa,OAAO,QAAsB,OAAyC,cAAyE;AACrJ,UAAA,WAAW,IAAIE,8BAAe;AAC9B,UAAA,KAA0CD,uBAAc,OAAO;AAE/D,UAAA,OAAO,MAAM,KAAK,WAAW,UAAU,IAAI,QAAQ,OAAO,YAAY;AAErE,WAAA,MAAM,SAAS,WAAW,IAAI;AAAA,EAAA;AAAA,EAGtC,MAAa,aACZ,QACA,OACA,cACqC;AACrC,UAAM,cAAc,KAAK,oBAAoB,OAAO,QAAQ,MAAM,KAAK,EAAE;AACzE,UAAM,QAAQ,MAAM,KAAK,SAAS,EAAE,KAAK,CAAC,aAAa,MAAM,KAAK,MAAM,EAAM,IAAA;AAC9E,UAAM,gBAAgB,MAAM,QAA8B,UAAU,KAAK;AAEzE,UAAM,OAAO,MAAM,KAAK,OAAO,QAAQ,eAAe,YAAY;AAE3D,WAAA,KAAK,CAAC,KAAK;AAAA,EAAA;AAAA,EAGnB,MAAa,cACZ,QACA,OACA,UACA,cACgC;AAC1B,UAAA,WAAW,IAAIC,8BAAe;AACpC,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,cAAc;AACpB,UAAM,KAAoBD,SAAAA,cAAc,OAAO,EAC7C,OAAO,CAAC,KAAK,OAAO,SAAS,cAAc,UAAU,GAAG,WAAW;AAE/D,UAAA,OAAO,MAAM,KAAK,WAAW,UAAU,IAAI,QAAQ,OAAO,cAAc,SAAS,IAAI;AAE3F,WAAO,MAAM,SAAS,cAAc,MAAM,WAAW;AAAA,EAAA;AAAA,EAGtD,MAAc,WACb,UACA,IACA,QACA,OACA,cACA,SACC;AACD,UAAM,iBAAiBE,cAAAA,cAAc,qBAAqB,QAAQ,OAAO,MAAS;AAClF,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,mBAAmB,GAAG,KAAK,OAAO,WAAW,KAAK,KAAK,EAAE,KAAK,QAAQ,CAAC,GAAG,MAAM,MAAM,MAAM,KAAK,CAAC;AAExG,UAAM,WAAW,KAAK,qBAAqB,OAAO,kBAAkB,UAAU,YAAY;AAC1F,UAAM,uBAAuB,KAAK,mBAAmB,OAAO,QAAQ,eAAe,KAAK,UAAU,CAAI,GAAA,aAAa,aAAa,SAAS,CAAC,CAAC;AAC3I,UAAM,sBAAsB,eAAe,QAAQ,UAAU,oBAAoB;AACjF,aAAS,OAAO,MAAM,QAAQ,qBAAqB,MAAM,OAAO;AAChE,WAAO,MAAM,SAAS,QAAQ,KAAK,EAAE;AAAA,EAAA;AAAA,EAGtC,MAAa,MAAM,QAAsB,QAA6B;AACrE,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,KAAKF,SAAAA,cAAc,OAAA,EACvB,KAAK,OAAO,WAAW,KAAK,KAAK,EACjC,OAAO,CAAQ,SAAA,KAAK,IAAI,UAAU,GAAG,WAAW;AAClD,UAAM,iBAAiB,KAAK,mBAAmB,OAAO,QAAQ,MAAM;AACpE,UAAM,cAAc,KAAK,aAAa,MAAM,IAAI,QAAQ,MAAM,cAAc;AAC5E,UAAM,SAAS,MAAM,YAAY,UAAU,KAAK,EAAE;AAC3C,WAAA,OAAO,CAAC,EAAE;AAAA,EAAA;AAAA,EAGlB,MAAa,aACZ,QACA,QACA,UACA,cACkC;AAClC,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,KAAKA,SAAAA,cAAc,OAAO,EAC9B,KAAK,OAAO,WAAW,KAAK,KAAK,EACjC,OAAO,CAAA,SAAQ,KAAK,IAAI,UAAU,GAAG,WAAW,EAChD,OAAO,CAAC,KAAK,OAAO,SAAS,cAAc,UAAU,CAAC,EACtD,QAAQ,CAAC,KAAK,OAAO,SAAS,cAAc,UAAU,CAAC;AACnD,UAAA,iBAAiB,KAAK,mBAAmB,OAAO,QAAQ,QAAQ,aAAa,aAAa,SAAS,CAAC,CAAC;AACrG,UAAA,cAAc,KAAK,aAAa,MAAM,IAAI,QAAQ,MAAM,gBAAgB,EAAE,cAAc;AAC9F,UAAM,OAAO,MAAM,YAAY,UAAU,KAAK,EAAE;AAC1C,UAAA,6BAAa,IAAoB;AACvC,eAAW,OAAO,MAAM;AAChB,aAAA,IAAI,OAAO,IAAI,SAAS,cAAc,UAAU,CAAC,GAAG,OAAO,IAAI,SAAS,CAAC;AAAA,IAAA;AAE1E,WAAA,OAAO,YAAY,MAAM;AAAA,EAAA;AAAA,EAGjC,MAAa,OACZ,QACA,MACA,YAA8C,MAAM;AAAA,EAAA,GACtB;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAIG,UAAAA,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AACzB,WAAAC,WAAA;AAAA,MAAY,KAAK;AAAA,MAAQ,KAAK;AAAA,MAAwB,MAC5D,KAAK,eAAe,QAAQ,MAAM,SAAS;AAAA,IAC5C;AAAA,EAAA;AAAA,EAGD,MAAa,OACZ,QACA,IACA,MACA,QAC8B;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAID,UAAAA,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AAChC,WAAOC,WAAY,YAAA,KAAK,QAAQ,KAAK,wBAAwB,YAAY;AAClE,YAAA,CAAC,cAAc,GAAG,IAAI,MAAM,KAAK,gBAAgB,QAAQ,EAAE;AAC7D,UAAA,IAAY,QAAA,CAAC,GAAG;AAEb,aAAA,MAAM,KAAK,QAAQ,OAAO,MAAM,QAAQ,cAAc,MAAM,MAAM;AAAA,IAAA,CACzE;AAAA,EAAA;AAAA,EAGF,MAAa,eACZ,QACA,IACA,WAC8B;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAID,UAAAA,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AAChC,WAAOC,WAAY,YAAA,KAAK,QAAQ,KAAK,wBAAwB,YAAY;AAClE,YAAA,CAAC,cAAc,GAAG,IAAI,MAAM,KAAK,gBAAgB,QAAQ,EAAE;AAC7D,UAAA,IAAY,QAAA,CAAC,GAAG;AAEpB,aAAO,MAAM,KAAK,QAAQ,SAAS,MAAM,QAAQ,cAAc,SAAS;AAAA,IAAA,CACxE;AAAA,EAAA;AAAA,EAEF,MAAa,OACZ,QACA,IACA,QACA,QACA,QAC8B;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAID,UAAAA,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AAChC,WAAOC,WAAY,YAAA,KAAK,QAAQ,KAAK,wBAAwB,YAAY;AACxE,YAAM,CAAC,YAAY,IAAI,MAAM,KAAK,gBAAgB,QAAQ,EAAE;AAC5D,UAAI,iBAAiB,QAAW;AAC/B,eAAO,MAAM,KAAK,eAAe,QAAQ,MAAM;AAAA,MAAA;AAEzC,aAAA,MAAM,KAAK,QAAQ,OAAO,MAAM,QAAQ,cAAc,QAAQ,MAAM;AAAA,IAAA,CAC3E;AAAA,EAAA;AAAA,EAGM,eAAe,QAAsB,MAAmC,YAA8C,MAAM;AAAA,EAAA,GAAI;AACvI,WAAO,KAAK,SAAS,OAAO,MAAM,QAAQ,MAAM,CAAM,OAAA;AAAA,OACnD,SAAS;AAAA,EAAA;AAAA,EAGb,MAAa,OACZ,QACA,IACA,QAC8B;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAID,UAAAA,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AAChC,WAAOC,WAAY,YAAA,KAAK,QAAQ,KAAK,wBAAwB,MAAM;AAClE,aAAO,KAAK,eAAe,QAAQ,MAAM,QAAQ,IAAI,MAAM;AAAA,IAAA,CAC3D;AAAA,EAAA;AAAA,EAGF,MAAa,gBACZ,QACA,UACA,aACA,cAC8B;AAC9B,UAAM,KAAK,qBAAqB;AAChC,UAAM,MAAM,MAAM;AACjB,YAAM,IAAID,UAAAA,wBAAwB;AAAA,IACnC;AACA,WAAO,MAAME,YAAAA,mBAAmB,KAAK,QAAQ,QAAQ,UAAU;AAAA,MAC9D,wBAAwB,CAAC,EAAE,QAAAC,SAAQ,UAAAC,gBAAe;AACjD,eAAO,KAAK,qBAAqB,gBAAgB,MAAMD,SAAQC,WAAU,aAAa,YAAY;AAAA,MACnG;AAAA,MACA,yBAAyB,CAAC,EAAE,cAAc,qBAAqB;AAC9D,eAAO,KAAK,qBAAqB,gBAAgB,MAAM,cAAc,gBAAgB,cAAc,WAAW;AAAA,MAC/G;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,uBAAuB;AAAA,MACvB,sBAAsB;AAAA,MACtB,iBAAiB;AAAA,IAAA,CACjB;AAAA,EAAA;AAAA,EAGF,MAAa,mBACZ,QACA,UACA,aACA,cAC8B;AAC9B,UAAM,KAAK,qBAAqB;AAChC,UAAM,MAAM,MAAM;AACjB,YAAM,IAAIJ,UAAAA,wBAAwB;AAAA,IACnC;AACA,WAAO,MAAME,YAAAA,mBAAmB,KAAK,QAAQ,QAAQ,UAAU;AAAA,MAC9D,wBAAwB,CAAC,EAAE,QAAAC,SAAQ,UAAAC,gBAAe;AACjD,eAAO,KAAK,qBAAqB,mBAAmB,MAAMD,SAAQC,WAAU,aAAa,YAAY;AAAA,MACtG;AAAA,MACA,yBAAyB,CAAC,EAAE,cAAc,qBAAqB;AAC9D,eAAO,KAAK,qBAAqB,mBAAmB,MAAM,cAAc,gBAAgB,cAAc,WAAW;AAAA,MAClH;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,uBAAuB;AAAA,MACvB,sBAAsB;AAAA,MACtB,iBAAiB;AAAA,IAAA,CACjB;AAAA,EAAA;AAAA,EAGF,MAAa,gBACZ,QACA,OACqF;AACrF,QAAI,iBAAiBC,eAAAA,gBAAgB;AAC7B,aAAA,CAAC,MAAM,cAAc,MAAS;AAAA,IAAA;AAEtC,UAAM,SAAS,MAAM,KAAK,YAAY,QAAQ,OAAO,OAAO,OAAO;AACnE,WAAO,SAAS,CAAC,QAAQ,MAAS,IAAI,CAAC,QAAW,IAAIC,OAAAA,2BAA2B,CAAI,GAAA,KAAK,CAAC;AAAA,EAAA;AAAA,EAG5F,MAAc,uBAAuB;AAC/B,SAAA,6BAAL,KAAK,4BAA8B,YAAY;AACxC,YAAA,KAAK,GAAG,MAAM,kCAAkC,CAAC,sBAAsB,KAAK,UAAU,CAAC;AACvF,YAAA,KAAK,GAAG,MAAM,kCAAkC,CAAC,yBAAyB,KAAK,aAAa,CAAC;AAAA,IAAA;AAEpG,UAAM,KAAK;AAAA,EAAA;AAEb;;"}
@@ -41,7 +41,8 @@ class Mapper {
41
41
  const columnName = getColumnName(this.schema, entity, fieldName);
42
42
  const qb = SelectBuilder.create().from(entity.tableName, "root_").select(["root_", columnName]);
43
43
  const expandedWhere = this.uniqueWhereExpander.expand(entity, where);
44
- const builtQb = this.whereBuilder.build(qb, entity, this.pathFactory.create([]), expandedWhere);
44
+ const withPredicates = this.predicatesInjector.inject(entity, expandedWhere);
45
+ const builtQb = this.whereBuilder.build(qb, entity, this.pathFactory.create([]), withPredicates);
45
46
  const result = await builtQb.getResult(this.db);
46
47
  return result[0] !== void 0 ? result[0][columnName] : void 0;
47
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Mapper.js","sources":["../../../../../packages/engine-content-api/src/mapper/Mapper.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { acceptFieldVisitor, getColumnName } from '@contember/schema-utils'\nimport {\n\tOrderByHelper,\n\tPathFactory,\n\tSelectBuilderFactory,\n\tSelectGroupedObjects,\n\tSelectHydrator,\n\tSelectIndexedResultObjects,\n\tSelectResultObject,\n\tWhereBuilder,\n} from './select'\nimport { Client, Connection, ConstraintHelper, DatabaseMetadata, SelectBuilder } from '@contember/database'\nimport { PredicatesInjector } from '../acl'\nimport { JunctionTableManager } from './JunctionTableManager'\nimport { DeletedEntitiesStorage, DeleteExecutor } from './delete'\nimport { MutationEntryNotFoundError, MutationResultList } from './Result'\nimport { UpdateBuilder, Updater } from './update'\nimport { InsertBuilder, Inserter } from './insert'\nimport { tryMutation } from './ErrorUtils'\nimport { ObjectNode, UniqueWhereExpander } from '../inputProcessing'\nimport { Mutex } from '../utils'\nimport { CheckedPrimary } from './CheckedPrimary'\nimport { ImplementationException } from '../exception'\nimport { EventManager } from './EventManager'\nimport { MapperInput } from './types'\n\nexport class Mapper<ConnectionType extends Connection.ConnectionLike = Connection.ConnectionLike> {\n\tprivate systemVariablesSetupDone: Promise<void> | undefined\n\tpublic readonly deletedEntities = new DeletedEntitiesStorage()\n\tpublic readonly mutex = new Mutex()\n\tpublic readonly constraintHelper: ConstraintHelper\n\n\tpublic readonly eventManager: EventManager\n\n\tconstructor(\n\t\tpublic readonly db: Client<ConnectionType>,\n\t\tpublic readonly identityId: string,\n\t\tpublic readonly transactionId: string,\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly schemaDatabaseMetadata: DatabaseMetadata,\n\t\tprivate readonly predicatesInjector: PredicatesInjector,\n\t\tprivate readonly selectBuilderFactory: SelectBuilderFactory,\n\t\tprivate readonly uniqueWhereExpander: UniqueWhereExpander,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly junctionTableManager: JunctionTableManager,\n\t\tprivate readonly deleteExecutor: DeleteExecutor,\n\t\tprivate readonly updater: Updater,\n\t\tprivate readonly inserter: Inserter,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {\n\t\tthis.constraintHelper = new ConstraintHelper(db, this.schemaDatabaseMetadata)\n\t\tthis.eventManager = new EventManager(this)\n\t}\n\n\tpublic async selectField(entity: Model.Entity, where: Input.UniqueWhere | CheckedPrimary, fieldName: string) {\n\t\tconst columnName = getColumnName(this.schema, entity, fieldName)\n\n\t\tconst qb = SelectBuilder.create() //\n\t\t\t.from(entity.tableName, 'root_')\n\t\t\t.select(['root_', columnName])\n\t\tconst expandedWhere = this.uniqueWhereExpander.expand(entity, where)\n\t\tconst builtQb = this.whereBuilder.build(qb, entity, this.pathFactory.create([]), expandedWhere)\n\t\tconst result = await builtQb.getResult(this.db)\n\n\t\treturn result[0] !== undefined ? result[0][columnName] : undefined\n\t}\n\n\tpublic async selectAssoc(\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t\tindexBy: string,\n\t): Promise<SelectIndexedResultObjects> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst path = this.pathFactory.create([])\n\t\tconst indexByAlias: string = path.for(indexBy).alias\n\t\tconst qb: SelectBuilder = SelectBuilder.create()\n\t\t\t.select([path.alias, getColumnName(this.schema, entity, indexBy)], indexByAlias)\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath)\n\t\treturn await hydrator.hydrateAll(rows, indexByAlias)\n\t}\n\n\tpublic async select(entity: Model.Entity, input: ObjectNode<Input.ListQueryInput>, relationPath: Model.AnyRelationContext[]): Promise<SelectResultObject[]> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst qb: SelectBuilder<SelectBuilder.Result> = SelectBuilder.create()\n\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath)\n\n\t\treturn await hydrator.hydrateAll(rows)\n\t}\n\n\tpublic async selectUnique(\n\t\tentity: Model.Entity,\n\t\tquery: ObjectNode<Input.UniqueQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<SelectResultObject | null> {\n\t\tconst uniqueWhere = this.uniqueWhereExpander.expand(entity, query.args.by)\n\t\tconst where = query.args.filter ? { and: [uniqueWhere, query.args.filter] } : uniqueWhere\n\t\tconst queryExpanded = query.withArg<Input.ListQueryInput>('filter', where)\n\n\t\tconst rows = await this.select(entity, queryExpanded, relationPath)\n\n\t\treturn rows[0] ?? null\n\t}\n\n\tpublic async selectGrouped(\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelation: Model.JoiningColumnRelation & Model.AnyRelation,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<SelectGroupedObjects> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst path = this.pathFactory.create([])\n\t\tconst groupingKey = '__grouping_key'\n\t\tconst qb: SelectBuilder = SelectBuilder.create()\n\t\t\t.select([path.alias, relation.joiningColumn.columnName], groupingKey)\n\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath, relation.name)\n\n\t\treturn await hydrator.hydrateGroups(rows, groupingKey)\n\t}\n\n\tprivate async selectRows(\n\t\thydrator: SelectHydrator,\n\t\tqb: SelectBuilder<SelectBuilder.Result>,\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t\tgroupBy?: string,\n\t) {\n\t\tconst inputWithOrder = OrderByHelper.appendDefaultOrderBy(entity, input, undefined)\n\t\tconst path = this.pathFactory.create([])\n\t\tconst augmentedBuilder = qb.from(entity.tableName, path.alias).meta('path', [...input.path, input.alias])\n\n\t\tconst selector = this.selectBuilderFactory.create(augmentedBuilder, hydrator, relationPath)\n\t\tconst filterWithPredicates = this.predicatesInjector.inject(entity, inputWithOrder.args.filter || {}, relationPath[relationPath.length - 1])\n\t\tconst inputWithPredicates = inputWithOrder.withArg('filter', filterWithPredicates)\n\t\tselector.select(this, entity, inputWithPredicates, path, groupBy)\n\t\treturn await selector.execute(this.db)\n\t}\n\n\tpublic async count(entity: Model.Entity, filter: Input.OptionalWhere) {\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select(expr => expr.raw('count(*)'), 'row_count')\n\t\tconst withPredicates = this.predicatesInjector.inject(entity, filter)\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates)\n\t\tconst result = await qbWithWhere.getResult(this.db)\n\t\treturn result[0].row_count\n\t}\n\n\tpublic async countGrouped(\n\t\tentity: Model.Entity,\n\t\tfilter: Input.OptionalWhere,\n\t\trelation: Model.JoiningColumnRelation & Model.Relation,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<Record<string, number>> {\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select(expr => expr.raw('count(*)'), 'row_count')\n\t\t\t.select([path.alias, relation.joiningColumn.columnName])\n\t\t\t.groupBy([path.alias, relation.joiningColumn.columnName])\n\t\tconst withPredicates = this.predicatesInjector.inject(entity, filter, relationPath[relationPath.length - 1])\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates, { relationPath })\n\t\tconst rows = await qbWithWhere.getResult(this.db)\n\t\tconst result = new Map<string, number>()\n\t\tfor (const row of rows) {\n\t\t\tresult.set(String(row[relation.joiningColumn.columnName]), Number(row.row_count))\n\t\t}\n\t\treturn Object.fromEntries(result)\n\t}\n\n\tpublic async insert(\n\t\tentity: Model.Entity,\n\t\tdata: MapperInput.CreateDataInput,\n\t\tbuilderCb: (builder: InsertBuilder) => void = () => {},\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, () =>\n\t\t\tthis.insertInternal(entity, data, builderCb),\n\t\t)\n\t}\n\n\tpublic async update(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tdata: MapperInput.UpdateDataInput,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue, err] = await this.getPrimaryValue(entity, by)\n\t\t\tif (err) return [err]\n\n\t\t\treturn await this.updater.update(this, entity, primaryValue, data, filter)\n\t\t})\n\t}\n\n\tpublic async updateInternal(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tbuilderCb: (builder: UpdateBuilder) => void,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue, err] = await this.getPrimaryValue(entity, by)\n\t\t\tif (err) return [err]\n\n\t\t\treturn await this.updater.updateCb(this, entity, primaryValue, builderCb)\n\t\t})\n\t}\n\tpublic async upsert(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tupdate: MapperInput.UpdateDataInput,\n\t\tcreate: MapperInput.CreateDataInput,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue] = await this.getPrimaryValue(entity, by)\n\t\t\tif (primaryValue === undefined) {\n\t\t\t\treturn await this.insertInternal(entity, create)\n\t\t\t}\n\t\t\treturn await this.updater.update(this, entity, primaryValue, update, filter)\n\t\t})\n\t}\n\n\tprivate insertInternal(entity: Model.Entity, data: MapperInput.CreateDataInput, builderCb: (builder: InsertBuilder) => void = () => {}) {\n\t\treturn this.inserter.insert(this, entity, data, id => {\n\t\t}, builderCb)\n\t}\n\n\tpublic async delete(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, () => {\n\t\t\treturn this.deleteExecutor.execute(this, entity, by, filter)\n\t\t})\n\t}\n\n\tpublic async connectJunction(\n\t\tentity: Model.Entity,\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation,\n\t\tthisPrimary: Input.PrimaryValue,\n\t\totherPrimary: Input.PrimaryValue,\n\t): Promise<MutationResultList> {\n\t\tawait this.setupSystemVariables()\n\t\tconst err = () => {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\treturn await acceptFieldVisitor(this.schema, entity, relation, {\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\treturn this.junctionTableManager.connectJunction(this, entity, relation, thisPrimary, otherPrimary)\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ targetEntity, targetRelation }) => {\n\t\t\t\treturn this.junctionTableManager.connectJunction(this, targetEntity, targetRelation, otherPrimary, thisPrimary)\n\t\t\t},\n\t\t\tvisitColumn: err,\n\t\t\tvisitOneHasMany: err,\n\t\t\tvisitOneHasOneInverse: err,\n\t\t\tvisitOneHasOneOwning: err,\n\t\t\tvisitManyHasOne: err,\n\t\t})\n\t}\n\n\tpublic async disconnectJunction(\n\t\tentity: Model.Entity,\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation,\n\t\tthisPrimary: Input.PrimaryValue,\n\t\totherPrimary: Input.PrimaryValue,\n\t): Promise<MutationResultList> {\n\t\tawait this.setupSystemVariables()\n\t\tconst err = () => {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\treturn await acceptFieldVisitor(this.schema, entity, relation, {\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\treturn this.junctionTableManager.disconnectJunction(this, entity, relation, thisPrimary, otherPrimary)\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ targetEntity, targetRelation }) => {\n\t\t\t\treturn this.junctionTableManager.disconnectJunction(this, targetEntity, targetRelation, otherPrimary, thisPrimary)\n\t\t\t},\n\t\t\tvisitColumn: err,\n\t\t\tvisitOneHasMany: err,\n\t\t\tvisitOneHasOneInverse: err,\n\t\t\tvisitOneHasOneOwning: err,\n\t\t\tvisitManyHasOne: err,\n\t\t})\n\t}\n\n\tpublic async getPrimaryValue(\n\t\tentity: Model.Entity,\n\t\twhere: Input.UniqueWhere | CheckedPrimary,\n\t): Promise<[Input.PrimaryValue, undefined] | [undefined, MutationEntryNotFoundError]> {\n\t\tif (where instanceof CheckedPrimary) {\n\t\t\treturn [where.primaryValue, undefined]\n\t\t}\n\t\tconst result = await this.selectField(entity, where, entity.primary)\n\t\treturn result ? [result, undefined] : [undefined, new MutationEntryNotFoundError([], where)]\n\t}\n\n\tprivate async setupSystemVariables() {\n\t\tthis.systemVariablesSetupDone ??= (async () => {\n\t\t\tawait this.db.query('SELECT set_config(?, ?, false)', ['tenant.identity_id', this.identityId]) // todo rename to system.identity_id\n\t\t\tawait this.db.query('SELECT set_config(?, ?, false)', ['system.transaction_id', this.transactionId])\n\t\t})()\n\t\tawait this.systemVariablesSetupDone\n\t}\n}\n"],"names":["entity","relation"],"mappings":"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"}
1
+ {"version":3,"file":"Mapper.js","sources":["../../../../../packages/engine-content-api/src/mapper/Mapper.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { acceptFieldVisitor, getColumnName } from '@contember/schema-utils'\nimport {\n\tOrderByHelper,\n\tPathFactory,\n\tSelectBuilderFactory,\n\tSelectGroupedObjects,\n\tSelectHydrator,\n\tSelectIndexedResultObjects,\n\tSelectResultObject,\n\tWhereBuilder,\n} from './select'\nimport { Client, Connection, ConstraintHelper, DatabaseMetadata, SelectBuilder } from '@contember/database'\nimport { PredicatesInjector } from '../acl'\nimport { JunctionTableManager } from './JunctionTableManager'\nimport { DeletedEntitiesStorage, DeleteExecutor } from './delete'\nimport { MutationEntryNotFoundError, MutationResultList } from './Result'\nimport { UpdateBuilder, Updater } from './update'\nimport { InsertBuilder, Inserter } from './insert'\nimport { tryMutation } from './ErrorUtils'\nimport { ObjectNode, UniqueWhereExpander } from '../inputProcessing'\nimport { Mutex } from '../utils'\nimport { CheckedPrimary } from './CheckedPrimary'\nimport { ImplementationException } from '../exception'\nimport { EventManager } from './EventManager'\nimport { MapperInput } from './types'\n\nexport class Mapper<ConnectionType extends Connection.ConnectionLike = Connection.ConnectionLike> {\n\tprivate systemVariablesSetupDone: Promise<void> | undefined\n\tpublic readonly deletedEntities = new DeletedEntitiesStorage()\n\tpublic readonly mutex = new Mutex()\n\tpublic readonly constraintHelper: ConstraintHelper\n\n\tpublic readonly eventManager: EventManager\n\n\tconstructor(\n\t\tpublic readonly db: Client<ConnectionType>,\n\t\tpublic readonly identityId: string,\n\t\tpublic readonly transactionId: string,\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly schemaDatabaseMetadata: DatabaseMetadata,\n\t\tprivate readonly predicatesInjector: PredicatesInjector,\n\t\tprivate readonly selectBuilderFactory: SelectBuilderFactory,\n\t\tprivate readonly uniqueWhereExpander: UniqueWhereExpander,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly junctionTableManager: JunctionTableManager,\n\t\tprivate readonly deleteExecutor: DeleteExecutor,\n\t\tprivate readonly updater: Updater,\n\t\tprivate readonly inserter: Inserter,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {\n\t\tthis.constraintHelper = new ConstraintHelper(db, this.schemaDatabaseMetadata)\n\t\tthis.eventManager = new EventManager(this)\n\t}\n\n\tpublic async selectField(entity: Model.Entity, where: Input.UniqueWhere | CheckedPrimary, fieldName: string) {\n\t\tconst columnName = getColumnName(this.schema, entity, fieldName)\n\n\t\tconst qb = SelectBuilder.create() //\n\t\t\t.from(entity.tableName, 'root_')\n\t\t\t.select(['root_', columnName])\n\t\tconst expandedWhere = this.uniqueWhereExpander.expand(entity, where)\n\t\tconst withPredicates = this.predicatesInjector.inject(entity, expandedWhere)\n\t\tconst builtQb = this.whereBuilder.build(qb, entity, this.pathFactory.create([]), withPredicates)\n\t\tconst result = await builtQb.getResult(this.db)\n\n\t\treturn result[0] !== undefined ? result[0][columnName] : undefined\n\t}\n\n\tpublic async selectAssoc(\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t\tindexBy: string,\n\t): Promise<SelectIndexedResultObjects> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst path = this.pathFactory.create([])\n\t\tconst indexByAlias: string = path.for(indexBy).alias\n\t\tconst qb: SelectBuilder = SelectBuilder.create()\n\t\t\t.select([path.alias, getColumnName(this.schema, entity, indexBy)], indexByAlias)\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath)\n\t\treturn await hydrator.hydrateAll(rows, indexByAlias)\n\t}\n\n\tpublic async select(entity: Model.Entity, input: ObjectNode<Input.ListQueryInput>, relationPath: Model.AnyRelationContext[]): Promise<SelectResultObject[]> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst qb: SelectBuilder<SelectBuilder.Result> = SelectBuilder.create()\n\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath)\n\n\t\treturn await hydrator.hydrateAll(rows)\n\t}\n\n\tpublic async selectUnique(\n\t\tentity: Model.Entity,\n\t\tquery: ObjectNode<Input.UniqueQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<SelectResultObject | null> {\n\t\tconst uniqueWhere = this.uniqueWhereExpander.expand(entity, query.args.by)\n\t\tconst where = query.args.filter ? { and: [uniqueWhere, query.args.filter] } : uniqueWhere\n\t\tconst queryExpanded = query.withArg<Input.ListQueryInput>('filter', where)\n\n\t\tconst rows = await this.select(entity, queryExpanded, relationPath)\n\n\t\treturn rows[0] ?? null\n\t}\n\n\tpublic async selectGrouped(\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelation: Model.JoiningColumnRelation & Model.AnyRelation,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<SelectGroupedObjects> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst path = this.pathFactory.create([])\n\t\tconst groupingKey = '__grouping_key'\n\t\tconst qb: SelectBuilder = SelectBuilder.create()\n\t\t\t.select([path.alias, relation.joiningColumn.columnName], groupingKey)\n\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath, relation.name)\n\n\t\treturn await hydrator.hydrateGroups(rows, groupingKey)\n\t}\n\n\tprivate async selectRows(\n\t\thydrator: SelectHydrator,\n\t\tqb: SelectBuilder<SelectBuilder.Result>,\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t\tgroupBy?: string,\n\t) {\n\t\tconst inputWithOrder = OrderByHelper.appendDefaultOrderBy(entity, input, undefined)\n\t\tconst path = this.pathFactory.create([])\n\t\tconst augmentedBuilder = qb.from(entity.tableName, path.alias).meta('path', [...input.path, input.alias])\n\n\t\tconst selector = this.selectBuilderFactory.create(augmentedBuilder, hydrator, relationPath)\n\t\tconst filterWithPredicates = this.predicatesInjector.inject(entity, inputWithOrder.args.filter || {}, relationPath[relationPath.length - 1])\n\t\tconst inputWithPredicates = inputWithOrder.withArg('filter', filterWithPredicates)\n\t\tselector.select(this, entity, inputWithPredicates, path, groupBy)\n\t\treturn await selector.execute(this.db)\n\t}\n\n\tpublic async count(entity: Model.Entity, filter: Input.OptionalWhere) {\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select(expr => expr.raw('count(*)'), 'row_count')\n\t\tconst withPredicates = this.predicatesInjector.inject(entity, filter)\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates)\n\t\tconst result = await qbWithWhere.getResult(this.db)\n\t\treturn result[0].row_count\n\t}\n\n\tpublic async countGrouped(\n\t\tentity: Model.Entity,\n\t\tfilter: Input.OptionalWhere,\n\t\trelation: Model.JoiningColumnRelation & Model.Relation,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<Record<string, number>> {\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select(expr => expr.raw('count(*)'), 'row_count')\n\t\t\t.select([path.alias, relation.joiningColumn.columnName])\n\t\t\t.groupBy([path.alias, relation.joiningColumn.columnName])\n\t\tconst withPredicates = this.predicatesInjector.inject(entity, filter, relationPath[relationPath.length - 1])\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates, { relationPath })\n\t\tconst rows = await qbWithWhere.getResult(this.db)\n\t\tconst result = new Map<string, number>()\n\t\tfor (const row of rows) {\n\t\t\tresult.set(String(row[relation.joiningColumn.columnName]), Number(row.row_count))\n\t\t}\n\t\treturn Object.fromEntries(result)\n\t}\n\n\tpublic async insert(\n\t\tentity: Model.Entity,\n\t\tdata: MapperInput.CreateDataInput,\n\t\tbuilderCb: (builder: InsertBuilder) => void = () => {},\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, () =>\n\t\t\tthis.insertInternal(entity, data, builderCb),\n\t\t)\n\t}\n\n\tpublic async update(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tdata: MapperInput.UpdateDataInput,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue, err] = await this.getPrimaryValue(entity, by)\n\t\t\tif (err) return [err]\n\n\t\t\treturn await this.updater.update(this, entity, primaryValue, data, filter)\n\t\t})\n\t}\n\n\tpublic async updateInternal(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tbuilderCb: (builder: UpdateBuilder) => void,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue, err] = await this.getPrimaryValue(entity, by)\n\t\t\tif (err) return [err]\n\n\t\t\treturn await this.updater.updateCb(this, entity, primaryValue, builderCb)\n\t\t})\n\t}\n\tpublic async upsert(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tupdate: MapperInput.UpdateDataInput,\n\t\tcreate: MapperInput.CreateDataInput,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue] = await this.getPrimaryValue(entity, by)\n\t\t\tif (primaryValue === undefined) {\n\t\t\t\treturn await this.insertInternal(entity, create)\n\t\t\t}\n\t\t\treturn await this.updater.update(this, entity, primaryValue, update, filter)\n\t\t})\n\t}\n\n\tprivate insertInternal(entity: Model.Entity, data: MapperInput.CreateDataInput, builderCb: (builder: InsertBuilder) => void = () => {}) {\n\t\treturn this.inserter.insert(this, entity, data, id => {\n\t\t}, builderCb)\n\t}\n\n\tpublic async delete(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, () => {\n\t\t\treturn this.deleteExecutor.execute(this, entity, by, filter)\n\t\t})\n\t}\n\n\tpublic async connectJunction(\n\t\tentity: Model.Entity,\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation,\n\t\tthisPrimary: Input.PrimaryValue,\n\t\totherPrimary: Input.PrimaryValue,\n\t): Promise<MutationResultList> {\n\t\tawait this.setupSystemVariables()\n\t\tconst err = () => {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\treturn await acceptFieldVisitor(this.schema, entity, relation, {\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\treturn this.junctionTableManager.connectJunction(this, entity, relation, thisPrimary, otherPrimary)\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ targetEntity, targetRelation }) => {\n\t\t\t\treturn this.junctionTableManager.connectJunction(this, targetEntity, targetRelation, otherPrimary, thisPrimary)\n\t\t\t},\n\t\t\tvisitColumn: err,\n\t\t\tvisitOneHasMany: err,\n\t\t\tvisitOneHasOneInverse: err,\n\t\t\tvisitOneHasOneOwning: err,\n\t\t\tvisitManyHasOne: err,\n\t\t})\n\t}\n\n\tpublic async disconnectJunction(\n\t\tentity: Model.Entity,\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation,\n\t\tthisPrimary: Input.PrimaryValue,\n\t\totherPrimary: Input.PrimaryValue,\n\t): Promise<MutationResultList> {\n\t\tawait this.setupSystemVariables()\n\t\tconst err = () => {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\treturn await acceptFieldVisitor(this.schema, entity, relation, {\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\treturn this.junctionTableManager.disconnectJunction(this, entity, relation, thisPrimary, otherPrimary)\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ targetEntity, targetRelation }) => {\n\t\t\t\treturn this.junctionTableManager.disconnectJunction(this, targetEntity, targetRelation, otherPrimary, thisPrimary)\n\t\t\t},\n\t\t\tvisitColumn: err,\n\t\t\tvisitOneHasMany: err,\n\t\t\tvisitOneHasOneInverse: err,\n\t\t\tvisitOneHasOneOwning: err,\n\t\t\tvisitManyHasOne: err,\n\t\t})\n\t}\n\n\tpublic async getPrimaryValue(\n\t\tentity: Model.Entity,\n\t\twhere: Input.UniqueWhere | CheckedPrimary,\n\t): Promise<[Input.PrimaryValue, undefined] | [undefined, MutationEntryNotFoundError]> {\n\t\tif (where instanceof CheckedPrimary) {\n\t\t\treturn [where.primaryValue, undefined]\n\t\t}\n\t\tconst result = await this.selectField(entity, where, entity.primary)\n\t\treturn result ? [result, undefined] : [undefined, new MutationEntryNotFoundError([], where)]\n\t}\n\n\tprivate async setupSystemVariables() {\n\t\tthis.systemVariablesSetupDone ??= (async () => {\n\t\t\tawait this.db.query('SELECT set_config(?, ?, false)', ['tenant.identity_id', this.identityId]) // todo rename to system.identity_id\n\t\t\tawait this.db.query('SELECT set_config(?, ?, false)', ['system.transaction_id', this.transactionId])\n\t\t})()\n\t\tawait this.systemVariablesSetupDone\n\t}\n}\n"],"names":["entity","relation"],"mappings":";;;;;;;;;;;;;;;AA2BO,MAAM,OAAqF;AAAA,EAQjG,YACiB,IACA,YACA,eACC,QACA,wBACA,oBACA,sBACA,qBACA,cACA,sBACA,gBACA,SACA,UACA,aAChB;AAde,SAAA,KAAA;AACA,SAAA,aAAA;AACA,SAAA,gBAAA;AACC,SAAA,SAAA;AACA,SAAA,yBAAA;AACA,SAAA,qBAAA;AACA,SAAA,uBAAA;AACA,SAAA,sBAAA;AACA,SAAA,eAAA;AACA,SAAA,uBAAA;AACA,SAAA,iBAAA;AACA,SAAA,UAAA;AACA,SAAA,WAAA;AACA,SAAA,cAAA;AArBV,kBAAA,MAAA,0BAAA;AACQ,kBAAA,MAAA,mBAAkB,IAAI,uBAAuB,CAAA;AAC7C,kBAAA,MAAA,SAAQ,IAAI,MAAM,CAAA;AAClB,kBAAA,MAAA,kBAAA;AAEA,kBAAA,MAAA,cAAA;AAkBf,SAAK,mBAAmB,IAAI,iBAAiB,IAAI,KAAK,sBAAsB;AACvE,SAAA,eAAe,IAAI,aAAa,IAAI;AAAA,EAAA;AAAA,EAG1C,MAAa,YAAY,QAAsB,OAA2C,WAAmB;AAC5G,UAAM,aAAa,cAAc,KAAK,QAAQ,QAAQ,SAAS;AAE/D,UAAM,KAAK,cAAc,OAAO,EAC9B,KAAK,OAAO,WAAW,OAAO,EAC9B,OAAO,CAAC,SAAS,UAAU,CAAC;AAC9B,UAAM,gBAAgB,KAAK,oBAAoB,OAAO,QAAQ,KAAK;AACnE,UAAM,iBAAiB,KAAK,mBAAmB,OAAO,QAAQ,aAAa;AAC3E,UAAM,UAAU,KAAK,aAAa,MAAM,IAAI,QAAQ,KAAK,YAAY,OAAO,CAAE,CAAA,GAAG,cAAc;AAC/F,UAAM,SAAS,MAAM,QAAQ,UAAU,KAAK,EAAE;AAEvC,WAAA,OAAO,CAAC,MAAM,SAAY,OAAO,CAAC,EAAE,UAAU,IAAI;AAAA,EAAA;AAAA,EAG1D,MAAa,YACZ,QACA,OACA,cACA,SACsC;AAChC,UAAA,WAAW,IAAI,eAAe;AACpC,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,eAAuB,KAAK,IAAI,OAAO,EAAE;AAC/C,UAAM,KAAoB,cAAc,OAAO,EAC7C,OAAO,CAAC,KAAK,OAAO,cAAc,KAAK,QAAQ,QAAQ,OAAO,CAAC,GAAG,YAAY;AAC1E,UAAA,OAAO,MAAM,KAAK,WAAW,UAAU,IAAI,QAAQ,OAAO,YAAY;AAC5E,WAAO,MAAM,SAAS,WAAW,MAAM,YAAY;AAAA,EAAA;AAAA,EAGpD,MAAa,OAAO,QAAsB,OAAyC,cAAyE;AACrJ,UAAA,WAAW,IAAI,eAAe;AAC9B,UAAA,KAA0C,cAAc,OAAO;AAE/D,UAAA,OAAO,MAAM,KAAK,WAAW,UAAU,IAAI,QAAQ,OAAO,YAAY;AAErE,WAAA,MAAM,SAAS,WAAW,IAAI;AAAA,EAAA;AAAA,EAGtC,MAAa,aACZ,QACA,OACA,cACqC;AACrC,UAAM,cAAc,KAAK,oBAAoB,OAAO,QAAQ,MAAM,KAAK,EAAE;AACzE,UAAM,QAAQ,MAAM,KAAK,SAAS,EAAE,KAAK,CAAC,aAAa,MAAM,KAAK,MAAM,EAAM,IAAA;AAC9E,UAAM,gBAAgB,MAAM,QAA8B,UAAU,KAAK;AAEzE,UAAM,OAAO,MAAM,KAAK,OAAO,QAAQ,eAAe,YAAY;AAE3D,WAAA,KAAK,CAAC,KAAK;AAAA,EAAA;AAAA,EAGnB,MAAa,cACZ,QACA,OACA,UACA,cACgC;AAC1B,UAAA,WAAW,IAAI,eAAe;AACpC,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,cAAc;AACpB,UAAM,KAAoB,cAAc,OAAO,EAC7C,OAAO,CAAC,KAAK,OAAO,SAAS,cAAc,UAAU,GAAG,WAAW;AAE/D,UAAA,OAAO,MAAM,KAAK,WAAW,UAAU,IAAI,QAAQ,OAAO,cAAc,SAAS,IAAI;AAE3F,WAAO,MAAM,SAAS,cAAc,MAAM,WAAW;AAAA,EAAA;AAAA,EAGtD,MAAc,WACb,UACA,IACA,QACA,OACA,cACA,SACC;AACD,UAAM,iBAAiB,cAAc,qBAAqB,QAAQ,OAAO,MAAS;AAClF,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,mBAAmB,GAAG,KAAK,OAAO,WAAW,KAAK,KAAK,EAAE,KAAK,QAAQ,CAAC,GAAG,MAAM,MAAM,MAAM,KAAK,CAAC;AAExG,UAAM,WAAW,KAAK,qBAAqB,OAAO,kBAAkB,UAAU,YAAY;AAC1F,UAAM,uBAAuB,KAAK,mBAAmB,OAAO,QAAQ,eAAe,KAAK,UAAU,CAAI,GAAA,aAAa,aAAa,SAAS,CAAC,CAAC;AAC3I,UAAM,sBAAsB,eAAe,QAAQ,UAAU,oBAAoB;AACjF,aAAS,OAAO,MAAM,QAAQ,qBAAqB,MAAM,OAAO;AAChE,WAAO,MAAM,SAAS,QAAQ,KAAK,EAAE;AAAA,EAAA;AAAA,EAGtC,MAAa,MAAM,QAAsB,QAA6B;AACrE,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,KAAK,cAAc,OAAA,EACvB,KAAK,OAAO,WAAW,KAAK,KAAK,EACjC,OAAO,CAAQ,SAAA,KAAK,IAAI,UAAU,GAAG,WAAW;AAClD,UAAM,iBAAiB,KAAK,mBAAmB,OAAO,QAAQ,MAAM;AACpE,UAAM,cAAc,KAAK,aAAa,MAAM,IAAI,QAAQ,MAAM,cAAc;AAC5E,UAAM,SAAS,MAAM,YAAY,UAAU,KAAK,EAAE;AAC3C,WAAA,OAAO,CAAC,EAAE;AAAA,EAAA;AAAA,EAGlB,MAAa,aACZ,QACA,QACA,UACA,cACkC;AAClC,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,KAAK,cAAc,OAAO,EAC9B,KAAK,OAAO,WAAW,KAAK,KAAK,EACjC,OAAO,CAAA,SAAQ,KAAK,IAAI,UAAU,GAAG,WAAW,EAChD,OAAO,CAAC,KAAK,OAAO,SAAS,cAAc,UAAU,CAAC,EACtD,QAAQ,CAAC,KAAK,OAAO,SAAS,cAAc,UAAU,CAAC;AACnD,UAAA,iBAAiB,KAAK,mBAAmB,OAAO,QAAQ,QAAQ,aAAa,aAAa,SAAS,CAAC,CAAC;AACrG,UAAA,cAAc,KAAK,aAAa,MAAM,IAAI,QAAQ,MAAM,gBAAgB,EAAE,cAAc;AAC9F,UAAM,OAAO,MAAM,YAAY,UAAU,KAAK,EAAE;AAC1C,UAAA,6BAAa,IAAoB;AACvC,eAAW,OAAO,MAAM;AAChB,aAAA,IAAI,OAAO,IAAI,SAAS,cAAc,UAAU,CAAC,GAAG,OAAO,IAAI,SAAS,CAAC;AAAA,IAAA;AAE1E,WAAA,OAAO,YAAY,MAAM;AAAA,EAAA;AAAA,EAGjC,MAAa,OACZ,QACA,MACA,YAA8C,MAAM;AAAA,EAAA,GACtB;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAI,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AACzB,WAAA;AAAA,MAAY,KAAK;AAAA,MAAQ,KAAK;AAAA,MAAwB,MAC5D,KAAK,eAAe,QAAQ,MAAM,SAAS;AAAA,IAC5C;AAAA,EAAA;AAAA,EAGD,MAAa,OACZ,QACA,IACA,MACA,QAC8B;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAI,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AAChC,WAAO,YAAY,KAAK,QAAQ,KAAK,wBAAwB,YAAY;AAClE,YAAA,CAAC,cAAc,GAAG,IAAI,MAAM,KAAK,gBAAgB,QAAQ,EAAE;AAC7D,UAAA,IAAY,QAAA,CAAC,GAAG;AAEb,aAAA,MAAM,KAAK,QAAQ,OAAO,MAAM,QAAQ,cAAc,MAAM,MAAM;AAAA,IAAA,CACzE;AAAA,EAAA;AAAA,EAGF,MAAa,eACZ,QACA,IACA,WAC8B;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAI,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AAChC,WAAO,YAAY,KAAK,QAAQ,KAAK,wBAAwB,YAAY;AAClE,YAAA,CAAC,cAAc,GAAG,IAAI,MAAM,KAAK,gBAAgB,QAAQ,EAAE;AAC7D,UAAA,IAAY,QAAA,CAAC,GAAG;AAEpB,aAAO,MAAM,KAAK,QAAQ,SAAS,MAAM,QAAQ,cAAc,SAAS;AAAA,IAAA,CACxE;AAAA,EAAA;AAAA,EAEF,MAAa,OACZ,QACA,IACA,QACA,QACA,QAC8B;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAI,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AAChC,WAAO,YAAY,KAAK,QAAQ,KAAK,wBAAwB,YAAY;AACxE,YAAM,CAAC,YAAY,IAAI,MAAM,KAAK,gBAAgB,QAAQ,EAAE;AAC5D,UAAI,iBAAiB,QAAW;AAC/B,eAAO,MAAM,KAAK,eAAe,QAAQ,MAAM;AAAA,MAAA;AAEzC,aAAA,MAAM,KAAK,QAAQ,OAAO,MAAM,QAAQ,cAAc,QAAQ,MAAM;AAAA,IAAA,CAC3E;AAAA,EAAA;AAAA,EAGM,eAAe,QAAsB,MAAmC,YAA8C,MAAM;AAAA,EAAA,GAAI;AACvI,WAAO,KAAK,SAAS,OAAO,MAAM,QAAQ,MAAM,CAAM,OAAA;AAAA,OACnD,SAAS;AAAA,EAAA;AAAA,EAGb,MAAa,OACZ,QACA,IACA,QAC8B;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAI,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AAChC,WAAO,YAAY,KAAK,QAAQ,KAAK,wBAAwB,MAAM;AAClE,aAAO,KAAK,eAAe,QAAQ,MAAM,QAAQ,IAAI,MAAM;AAAA,IAAA,CAC3D;AAAA,EAAA;AAAA,EAGF,MAAa,gBACZ,QACA,UACA,aACA,cAC8B;AAC9B,UAAM,KAAK,qBAAqB;AAChC,UAAM,MAAM,MAAM;AACjB,YAAM,IAAI,wBAAwB;AAAA,IACnC;AACA,WAAO,MAAM,mBAAmB,KAAK,QAAQ,QAAQ,UAAU;AAAA,MAC9D,wBAAwB,CAAC,EAAE,QAAAA,SAAQ,UAAAC,gBAAe;AACjD,eAAO,KAAK,qBAAqB,gBAAgB,MAAMD,SAAQC,WAAU,aAAa,YAAY;AAAA,MACnG;AAAA,MACA,yBAAyB,CAAC,EAAE,cAAc,qBAAqB;AAC9D,eAAO,KAAK,qBAAqB,gBAAgB,MAAM,cAAc,gBAAgB,cAAc,WAAW;AAAA,MAC/G;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,uBAAuB;AAAA,MACvB,sBAAsB;AAAA,MACtB,iBAAiB;AAAA,IAAA,CACjB;AAAA,EAAA;AAAA,EAGF,MAAa,mBACZ,QACA,UACA,aACA,cAC8B;AAC9B,UAAM,KAAK,qBAAqB;AAChC,UAAM,MAAM,MAAM;AACjB,YAAM,IAAI,wBAAwB;AAAA,IACnC;AACA,WAAO,MAAM,mBAAmB,KAAK,QAAQ,QAAQ,UAAU;AAAA,MAC9D,wBAAwB,CAAC,EAAE,QAAAD,SAAQ,UAAAC,gBAAe;AACjD,eAAO,KAAK,qBAAqB,mBAAmB,MAAMD,SAAQC,WAAU,aAAa,YAAY;AAAA,MACtG;AAAA,MACA,yBAAyB,CAAC,EAAE,cAAc,qBAAqB;AAC9D,eAAO,KAAK,qBAAqB,mBAAmB,MAAM,cAAc,gBAAgB,cAAc,WAAW;AAAA,MAClH;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,uBAAuB;AAAA,MACvB,sBAAsB;AAAA,MACtB,iBAAiB;AAAA,IAAA,CACjB;AAAA,EAAA;AAAA,EAGF,MAAa,gBACZ,QACA,OACqF;AACrF,QAAI,iBAAiB,gBAAgB;AAC7B,aAAA,CAAC,MAAM,cAAc,MAAS;AAAA,IAAA;AAEtC,UAAM,SAAS,MAAM,KAAK,YAAY,QAAQ,OAAO,OAAO,OAAO;AACnE,WAAO,SAAS,CAAC,QAAQ,MAAS,IAAI,CAAC,QAAW,IAAI,2BAA2B,CAAI,GAAA,KAAK,CAAC;AAAA,EAAA;AAAA,EAG5F,MAAc,uBAAuB;AAC/B,SAAA,6BAAL,KAAK,4BAA8B,YAAY;AACxC,YAAA,KAAK,GAAG,MAAM,kCAAkC,CAAC,sBAAsB,KAAK,UAAU,CAAC;AACvF,YAAA,KAAK,GAAG,MAAM,kCAAkC,CAAC,yBAAyB,KAAK,aAAa,CAAC;AAAA,IAAA;AAEpG,UAAM,KAAK;AAAA,EAAA;AAEb;"}
@@ -43,7 +43,8 @@ class Mapper {
43
43
  const columnName = schemaUtils.getColumnName(this.schema, entity, fieldName);
44
44
  const qb = Database.SelectBuilder.create().from(entity.tableName, "root_").select(["root_", columnName]);
45
45
  const expandedWhere = this.uniqueWhereExpander.expand(entity, where);
46
- const builtQb = this.whereBuilder.build(qb, entity, this.pathFactory.create([]), expandedWhere);
46
+ const withPredicates = this.predicatesInjector.inject(entity, expandedWhere);
47
+ const builtQb = this.whereBuilder.build(qb, entity, this.pathFactory.create([]), withPredicates);
47
48
  const result = await builtQb.getResult(this.db);
48
49
  return result[0] !== void 0 ? result[0][columnName] : void 0;
49
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Mapper.cjs","sources":["../../../../../packages/engine-content-api/src/mapper/Mapper.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { acceptFieldVisitor, getColumnName } from '@contember/schema-utils'\nimport {\n\tOrderByHelper,\n\tPathFactory,\n\tSelectBuilderFactory,\n\tSelectGroupedObjects,\n\tSelectHydrator,\n\tSelectIndexedResultObjects,\n\tSelectResultObject,\n\tWhereBuilder,\n} from './select'\nimport { Client, Connection, ConstraintHelper, DatabaseMetadata, SelectBuilder } from '@contember/database'\nimport { PredicatesInjector } from '../acl'\nimport { JunctionTableManager } from './JunctionTableManager'\nimport { DeletedEntitiesStorage, DeleteExecutor } from './delete'\nimport { MutationEntryNotFoundError, MutationResultList } from './Result'\nimport { UpdateBuilder, Updater } from './update'\nimport { InsertBuilder, Inserter } from './insert'\nimport { tryMutation } from './ErrorUtils'\nimport { ObjectNode, UniqueWhereExpander } from '../inputProcessing'\nimport { Mutex } from '../utils'\nimport { CheckedPrimary } from './CheckedPrimary'\nimport { ImplementationException } from '../exception'\nimport { EventManager } from './EventManager'\nimport { MapperInput } from './types'\n\nexport class Mapper<ConnectionType extends Connection.ConnectionLike = Connection.ConnectionLike> {\n\tprivate systemVariablesSetupDone: Promise<void> | undefined\n\tpublic readonly deletedEntities = new DeletedEntitiesStorage()\n\tpublic readonly mutex = new Mutex()\n\tpublic readonly constraintHelper: ConstraintHelper\n\n\tpublic readonly eventManager: EventManager\n\n\tconstructor(\n\t\tpublic readonly db: Client<ConnectionType>,\n\t\tpublic readonly identityId: string,\n\t\tpublic readonly transactionId: string,\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly schemaDatabaseMetadata: DatabaseMetadata,\n\t\tprivate readonly predicatesInjector: PredicatesInjector,\n\t\tprivate readonly selectBuilderFactory: SelectBuilderFactory,\n\t\tprivate readonly uniqueWhereExpander: UniqueWhereExpander,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly junctionTableManager: JunctionTableManager,\n\t\tprivate readonly deleteExecutor: DeleteExecutor,\n\t\tprivate readonly updater: Updater,\n\t\tprivate readonly inserter: Inserter,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {\n\t\tthis.constraintHelper = new ConstraintHelper(db, this.schemaDatabaseMetadata)\n\t\tthis.eventManager = new EventManager(this)\n\t}\n\n\tpublic async selectField(entity: Model.Entity, where: Input.UniqueWhere | CheckedPrimary, fieldName: string) {\n\t\tconst columnName = getColumnName(this.schema, entity, fieldName)\n\n\t\tconst qb = SelectBuilder.create() //\n\t\t\t.from(entity.tableName, 'root_')\n\t\t\t.select(['root_', columnName])\n\t\tconst expandedWhere = this.uniqueWhereExpander.expand(entity, where)\n\t\tconst builtQb = this.whereBuilder.build(qb, entity, this.pathFactory.create([]), expandedWhere)\n\t\tconst result = await builtQb.getResult(this.db)\n\n\t\treturn result[0] !== undefined ? result[0][columnName] : undefined\n\t}\n\n\tpublic async selectAssoc(\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t\tindexBy: string,\n\t): Promise<SelectIndexedResultObjects> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst path = this.pathFactory.create([])\n\t\tconst indexByAlias: string = path.for(indexBy).alias\n\t\tconst qb: SelectBuilder = SelectBuilder.create()\n\t\t\t.select([path.alias, getColumnName(this.schema, entity, indexBy)], indexByAlias)\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath)\n\t\treturn await hydrator.hydrateAll(rows, indexByAlias)\n\t}\n\n\tpublic async select(entity: Model.Entity, input: ObjectNode<Input.ListQueryInput>, relationPath: Model.AnyRelationContext[]): Promise<SelectResultObject[]> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst qb: SelectBuilder<SelectBuilder.Result> = SelectBuilder.create()\n\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath)\n\n\t\treturn await hydrator.hydrateAll(rows)\n\t}\n\n\tpublic async selectUnique(\n\t\tentity: Model.Entity,\n\t\tquery: ObjectNode<Input.UniqueQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<SelectResultObject | null> {\n\t\tconst uniqueWhere = this.uniqueWhereExpander.expand(entity, query.args.by)\n\t\tconst where = query.args.filter ? { and: [uniqueWhere, query.args.filter] } : uniqueWhere\n\t\tconst queryExpanded = query.withArg<Input.ListQueryInput>('filter', where)\n\n\t\tconst rows = await this.select(entity, queryExpanded, relationPath)\n\n\t\treturn rows[0] ?? null\n\t}\n\n\tpublic async selectGrouped(\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelation: Model.JoiningColumnRelation & Model.AnyRelation,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<SelectGroupedObjects> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst path = this.pathFactory.create([])\n\t\tconst groupingKey = '__grouping_key'\n\t\tconst qb: SelectBuilder = SelectBuilder.create()\n\t\t\t.select([path.alias, relation.joiningColumn.columnName], groupingKey)\n\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath, relation.name)\n\n\t\treturn await hydrator.hydrateGroups(rows, groupingKey)\n\t}\n\n\tprivate async selectRows(\n\t\thydrator: SelectHydrator,\n\t\tqb: SelectBuilder<SelectBuilder.Result>,\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t\tgroupBy?: string,\n\t) {\n\t\tconst inputWithOrder = OrderByHelper.appendDefaultOrderBy(entity, input, undefined)\n\t\tconst path = this.pathFactory.create([])\n\t\tconst augmentedBuilder = qb.from(entity.tableName, path.alias).meta('path', [...input.path, input.alias])\n\n\t\tconst selector = this.selectBuilderFactory.create(augmentedBuilder, hydrator, relationPath)\n\t\tconst filterWithPredicates = this.predicatesInjector.inject(entity, inputWithOrder.args.filter || {}, relationPath[relationPath.length - 1])\n\t\tconst inputWithPredicates = inputWithOrder.withArg('filter', filterWithPredicates)\n\t\tselector.select(this, entity, inputWithPredicates, path, groupBy)\n\t\treturn await selector.execute(this.db)\n\t}\n\n\tpublic async count(entity: Model.Entity, filter: Input.OptionalWhere) {\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select(expr => expr.raw('count(*)'), 'row_count')\n\t\tconst withPredicates = this.predicatesInjector.inject(entity, filter)\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates)\n\t\tconst result = await qbWithWhere.getResult(this.db)\n\t\treturn result[0].row_count\n\t}\n\n\tpublic async countGrouped(\n\t\tentity: Model.Entity,\n\t\tfilter: Input.OptionalWhere,\n\t\trelation: Model.JoiningColumnRelation & Model.Relation,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<Record<string, number>> {\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select(expr => expr.raw('count(*)'), 'row_count')\n\t\t\t.select([path.alias, relation.joiningColumn.columnName])\n\t\t\t.groupBy([path.alias, relation.joiningColumn.columnName])\n\t\tconst withPredicates = this.predicatesInjector.inject(entity, filter, relationPath[relationPath.length - 1])\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates, { relationPath })\n\t\tconst rows = await qbWithWhere.getResult(this.db)\n\t\tconst result = new Map<string, number>()\n\t\tfor (const row of rows) {\n\t\t\tresult.set(String(row[relation.joiningColumn.columnName]), Number(row.row_count))\n\t\t}\n\t\treturn Object.fromEntries(result)\n\t}\n\n\tpublic async insert(\n\t\tentity: Model.Entity,\n\t\tdata: MapperInput.CreateDataInput,\n\t\tbuilderCb: (builder: InsertBuilder) => void = () => {},\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, () =>\n\t\t\tthis.insertInternal(entity, data, builderCb),\n\t\t)\n\t}\n\n\tpublic async update(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tdata: MapperInput.UpdateDataInput,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue, err] = await this.getPrimaryValue(entity, by)\n\t\t\tif (err) return [err]\n\n\t\t\treturn await this.updater.update(this, entity, primaryValue, data, filter)\n\t\t})\n\t}\n\n\tpublic async updateInternal(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tbuilderCb: (builder: UpdateBuilder) => void,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue, err] = await this.getPrimaryValue(entity, by)\n\t\t\tif (err) return [err]\n\n\t\t\treturn await this.updater.updateCb(this, entity, primaryValue, builderCb)\n\t\t})\n\t}\n\tpublic async upsert(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tupdate: MapperInput.UpdateDataInput,\n\t\tcreate: MapperInput.CreateDataInput,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue] = await this.getPrimaryValue(entity, by)\n\t\t\tif (primaryValue === undefined) {\n\t\t\t\treturn await this.insertInternal(entity, create)\n\t\t\t}\n\t\t\treturn await this.updater.update(this, entity, primaryValue, update, filter)\n\t\t})\n\t}\n\n\tprivate insertInternal(entity: Model.Entity, data: MapperInput.CreateDataInput, builderCb: (builder: InsertBuilder) => void = () => {}) {\n\t\treturn this.inserter.insert(this, entity, data, id => {\n\t\t}, builderCb)\n\t}\n\n\tpublic async delete(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, () => {\n\t\t\treturn this.deleteExecutor.execute(this, entity, by, filter)\n\t\t})\n\t}\n\n\tpublic async connectJunction(\n\t\tentity: Model.Entity,\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation,\n\t\tthisPrimary: Input.PrimaryValue,\n\t\totherPrimary: Input.PrimaryValue,\n\t): Promise<MutationResultList> {\n\t\tawait this.setupSystemVariables()\n\t\tconst err = () => {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\treturn await acceptFieldVisitor(this.schema, entity, relation, {\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\treturn this.junctionTableManager.connectJunction(this, entity, relation, thisPrimary, otherPrimary)\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ targetEntity, targetRelation }) => {\n\t\t\t\treturn this.junctionTableManager.connectJunction(this, targetEntity, targetRelation, otherPrimary, thisPrimary)\n\t\t\t},\n\t\t\tvisitColumn: err,\n\t\t\tvisitOneHasMany: err,\n\t\t\tvisitOneHasOneInverse: err,\n\t\t\tvisitOneHasOneOwning: err,\n\t\t\tvisitManyHasOne: err,\n\t\t})\n\t}\n\n\tpublic async disconnectJunction(\n\t\tentity: Model.Entity,\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation,\n\t\tthisPrimary: Input.PrimaryValue,\n\t\totherPrimary: Input.PrimaryValue,\n\t): Promise<MutationResultList> {\n\t\tawait this.setupSystemVariables()\n\t\tconst err = () => {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\treturn await acceptFieldVisitor(this.schema, entity, relation, {\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\treturn this.junctionTableManager.disconnectJunction(this, entity, relation, thisPrimary, otherPrimary)\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ targetEntity, targetRelation }) => {\n\t\t\t\treturn this.junctionTableManager.disconnectJunction(this, targetEntity, targetRelation, otherPrimary, thisPrimary)\n\t\t\t},\n\t\t\tvisitColumn: err,\n\t\t\tvisitOneHasMany: err,\n\t\t\tvisitOneHasOneInverse: err,\n\t\t\tvisitOneHasOneOwning: err,\n\t\t\tvisitManyHasOne: err,\n\t\t})\n\t}\n\n\tpublic async getPrimaryValue(\n\t\tentity: Model.Entity,\n\t\twhere: Input.UniqueWhere | CheckedPrimary,\n\t): Promise<[Input.PrimaryValue, undefined] | [undefined, MutationEntryNotFoundError]> {\n\t\tif (where instanceof CheckedPrimary) {\n\t\t\treturn [where.primaryValue, undefined]\n\t\t}\n\t\tconst result = await this.selectField(entity, where, entity.primary)\n\t\treturn result ? [result, undefined] : [undefined, new MutationEntryNotFoundError([], where)]\n\t}\n\n\tprivate async setupSystemVariables() {\n\t\tthis.systemVariablesSetupDone ??= (async () => {\n\t\t\tawait this.db.query('SELECT set_config(?, ?, false)', ['tenant.identity_id', this.identityId]) // todo rename to system.identity_id\n\t\t\tawait this.db.query('SELECT set_config(?, ?, false)', ['system.transaction_id', this.transactionId])\n\t\t})()\n\t\tawait this.systemVariablesSetupDone\n\t}\n}\n"],"names":["DeletedEntitiesStorage","Mutex","ConstraintHelper","EventManager","getColumnName","SelectBuilder","SelectHydrator","OrderByHelper","ImplementationException","tryMutation","acceptFieldVisitor","entity","relation","CheckedPrimary","MutationEntryNotFoundError"],"mappings":"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"}
1
+ {"version":3,"file":"Mapper.cjs","sources":["../../../../../packages/engine-content-api/src/mapper/Mapper.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { acceptFieldVisitor, getColumnName } from '@contember/schema-utils'\nimport {\n\tOrderByHelper,\n\tPathFactory,\n\tSelectBuilderFactory,\n\tSelectGroupedObjects,\n\tSelectHydrator,\n\tSelectIndexedResultObjects,\n\tSelectResultObject,\n\tWhereBuilder,\n} from './select'\nimport { Client, Connection, ConstraintHelper, DatabaseMetadata, SelectBuilder } from '@contember/database'\nimport { PredicatesInjector } from '../acl'\nimport { JunctionTableManager } from './JunctionTableManager'\nimport { DeletedEntitiesStorage, DeleteExecutor } from './delete'\nimport { MutationEntryNotFoundError, MutationResultList } from './Result'\nimport { UpdateBuilder, Updater } from './update'\nimport { InsertBuilder, Inserter } from './insert'\nimport { tryMutation } from './ErrorUtils'\nimport { ObjectNode, UniqueWhereExpander } from '../inputProcessing'\nimport { Mutex } from '../utils'\nimport { CheckedPrimary } from './CheckedPrimary'\nimport { ImplementationException } from '../exception'\nimport { EventManager } from './EventManager'\nimport { MapperInput } from './types'\n\nexport class Mapper<ConnectionType extends Connection.ConnectionLike = Connection.ConnectionLike> {\n\tprivate systemVariablesSetupDone: Promise<void> | undefined\n\tpublic readonly deletedEntities = new DeletedEntitiesStorage()\n\tpublic readonly mutex = new Mutex()\n\tpublic readonly constraintHelper: ConstraintHelper\n\n\tpublic readonly eventManager: EventManager\n\n\tconstructor(\n\t\tpublic readonly db: Client<ConnectionType>,\n\t\tpublic readonly identityId: string,\n\t\tpublic readonly transactionId: string,\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly schemaDatabaseMetadata: DatabaseMetadata,\n\t\tprivate readonly predicatesInjector: PredicatesInjector,\n\t\tprivate readonly selectBuilderFactory: SelectBuilderFactory,\n\t\tprivate readonly uniqueWhereExpander: UniqueWhereExpander,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly junctionTableManager: JunctionTableManager,\n\t\tprivate readonly deleteExecutor: DeleteExecutor,\n\t\tprivate readonly updater: Updater,\n\t\tprivate readonly inserter: Inserter,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {\n\t\tthis.constraintHelper = new ConstraintHelper(db, this.schemaDatabaseMetadata)\n\t\tthis.eventManager = new EventManager(this)\n\t}\n\n\tpublic async selectField(entity: Model.Entity, where: Input.UniqueWhere | CheckedPrimary, fieldName: string) {\n\t\tconst columnName = getColumnName(this.schema, entity, fieldName)\n\n\t\tconst qb = SelectBuilder.create() //\n\t\t\t.from(entity.tableName, 'root_')\n\t\t\t.select(['root_', columnName])\n\t\tconst expandedWhere = this.uniqueWhereExpander.expand(entity, where)\n\t\tconst withPredicates = this.predicatesInjector.inject(entity, expandedWhere)\n\t\tconst builtQb = this.whereBuilder.build(qb, entity, this.pathFactory.create([]), withPredicates)\n\t\tconst result = await builtQb.getResult(this.db)\n\n\t\treturn result[0] !== undefined ? result[0][columnName] : undefined\n\t}\n\n\tpublic async selectAssoc(\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t\tindexBy: string,\n\t): Promise<SelectIndexedResultObjects> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst path = this.pathFactory.create([])\n\t\tconst indexByAlias: string = path.for(indexBy).alias\n\t\tconst qb: SelectBuilder = SelectBuilder.create()\n\t\t\t.select([path.alias, getColumnName(this.schema, entity, indexBy)], indexByAlias)\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath)\n\t\treturn await hydrator.hydrateAll(rows, indexByAlias)\n\t}\n\n\tpublic async select(entity: Model.Entity, input: ObjectNode<Input.ListQueryInput>, relationPath: Model.AnyRelationContext[]): Promise<SelectResultObject[]> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst qb: SelectBuilder<SelectBuilder.Result> = SelectBuilder.create()\n\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath)\n\n\t\treturn await hydrator.hydrateAll(rows)\n\t}\n\n\tpublic async selectUnique(\n\t\tentity: Model.Entity,\n\t\tquery: ObjectNode<Input.UniqueQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<SelectResultObject | null> {\n\t\tconst uniqueWhere = this.uniqueWhereExpander.expand(entity, query.args.by)\n\t\tconst where = query.args.filter ? { and: [uniqueWhere, query.args.filter] } : uniqueWhere\n\t\tconst queryExpanded = query.withArg<Input.ListQueryInput>('filter', where)\n\n\t\tconst rows = await this.select(entity, queryExpanded, relationPath)\n\n\t\treturn rows[0] ?? null\n\t}\n\n\tpublic async selectGrouped(\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelation: Model.JoiningColumnRelation & Model.AnyRelation,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<SelectGroupedObjects> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst path = this.pathFactory.create([])\n\t\tconst groupingKey = '__grouping_key'\n\t\tconst qb: SelectBuilder = SelectBuilder.create()\n\t\t\t.select([path.alias, relation.joiningColumn.columnName], groupingKey)\n\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath, relation.name)\n\n\t\treturn await hydrator.hydrateGroups(rows, groupingKey)\n\t}\n\n\tprivate async selectRows(\n\t\thydrator: SelectHydrator,\n\t\tqb: SelectBuilder<SelectBuilder.Result>,\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t\tgroupBy?: string,\n\t) {\n\t\tconst inputWithOrder = OrderByHelper.appendDefaultOrderBy(entity, input, undefined)\n\t\tconst path = this.pathFactory.create([])\n\t\tconst augmentedBuilder = qb.from(entity.tableName, path.alias).meta('path', [...input.path, input.alias])\n\n\t\tconst selector = this.selectBuilderFactory.create(augmentedBuilder, hydrator, relationPath)\n\t\tconst filterWithPredicates = this.predicatesInjector.inject(entity, inputWithOrder.args.filter || {}, relationPath[relationPath.length - 1])\n\t\tconst inputWithPredicates = inputWithOrder.withArg('filter', filterWithPredicates)\n\t\tselector.select(this, entity, inputWithPredicates, path, groupBy)\n\t\treturn await selector.execute(this.db)\n\t}\n\n\tpublic async count(entity: Model.Entity, filter: Input.OptionalWhere) {\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select(expr => expr.raw('count(*)'), 'row_count')\n\t\tconst withPredicates = this.predicatesInjector.inject(entity, filter)\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates)\n\t\tconst result = await qbWithWhere.getResult(this.db)\n\t\treturn result[0].row_count\n\t}\n\n\tpublic async countGrouped(\n\t\tentity: Model.Entity,\n\t\tfilter: Input.OptionalWhere,\n\t\trelation: Model.JoiningColumnRelation & Model.Relation,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<Record<string, number>> {\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select(expr => expr.raw('count(*)'), 'row_count')\n\t\t\t.select([path.alias, relation.joiningColumn.columnName])\n\t\t\t.groupBy([path.alias, relation.joiningColumn.columnName])\n\t\tconst withPredicates = this.predicatesInjector.inject(entity, filter, relationPath[relationPath.length - 1])\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates, { relationPath })\n\t\tconst rows = await qbWithWhere.getResult(this.db)\n\t\tconst result = new Map<string, number>()\n\t\tfor (const row of rows) {\n\t\t\tresult.set(String(row[relation.joiningColumn.columnName]), Number(row.row_count))\n\t\t}\n\t\treturn Object.fromEntries(result)\n\t}\n\n\tpublic async insert(\n\t\tentity: Model.Entity,\n\t\tdata: MapperInput.CreateDataInput,\n\t\tbuilderCb: (builder: InsertBuilder) => void = () => {},\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, () =>\n\t\t\tthis.insertInternal(entity, data, builderCb),\n\t\t)\n\t}\n\n\tpublic async update(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tdata: MapperInput.UpdateDataInput,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue, err] = await this.getPrimaryValue(entity, by)\n\t\t\tif (err) return [err]\n\n\t\t\treturn await this.updater.update(this, entity, primaryValue, data, filter)\n\t\t})\n\t}\n\n\tpublic async updateInternal(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tbuilderCb: (builder: UpdateBuilder) => void,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue, err] = await this.getPrimaryValue(entity, by)\n\t\t\tif (err) return [err]\n\n\t\t\treturn await this.updater.updateCb(this, entity, primaryValue, builderCb)\n\t\t})\n\t}\n\tpublic async upsert(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tupdate: MapperInput.UpdateDataInput,\n\t\tcreate: MapperInput.CreateDataInput,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue] = await this.getPrimaryValue(entity, by)\n\t\t\tif (primaryValue === undefined) {\n\t\t\t\treturn await this.insertInternal(entity, create)\n\t\t\t}\n\t\t\treturn await this.updater.update(this, entity, primaryValue, update, filter)\n\t\t})\n\t}\n\n\tprivate insertInternal(entity: Model.Entity, data: MapperInput.CreateDataInput, builderCb: (builder: InsertBuilder) => void = () => {}) {\n\t\treturn this.inserter.insert(this, entity, data, id => {\n\t\t}, builderCb)\n\t}\n\n\tpublic async delete(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, () => {\n\t\t\treturn this.deleteExecutor.execute(this, entity, by, filter)\n\t\t})\n\t}\n\n\tpublic async connectJunction(\n\t\tentity: Model.Entity,\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation,\n\t\tthisPrimary: Input.PrimaryValue,\n\t\totherPrimary: Input.PrimaryValue,\n\t): Promise<MutationResultList> {\n\t\tawait this.setupSystemVariables()\n\t\tconst err = () => {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\treturn await acceptFieldVisitor(this.schema, entity, relation, {\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\treturn this.junctionTableManager.connectJunction(this, entity, relation, thisPrimary, otherPrimary)\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ targetEntity, targetRelation }) => {\n\t\t\t\treturn this.junctionTableManager.connectJunction(this, targetEntity, targetRelation, otherPrimary, thisPrimary)\n\t\t\t},\n\t\t\tvisitColumn: err,\n\t\t\tvisitOneHasMany: err,\n\t\t\tvisitOneHasOneInverse: err,\n\t\t\tvisitOneHasOneOwning: err,\n\t\t\tvisitManyHasOne: err,\n\t\t})\n\t}\n\n\tpublic async disconnectJunction(\n\t\tentity: Model.Entity,\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation,\n\t\tthisPrimary: Input.PrimaryValue,\n\t\totherPrimary: Input.PrimaryValue,\n\t): Promise<MutationResultList> {\n\t\tawait this.setupSystemVariables()\n\t\tconst err = () => {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\treturn await acceptFieldVisitor(this.schema, entity, relation, {\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\treturn this.junctionTableManager.disconnectJunction(this, entity, relation, thisPrimary, otherPrimary)\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ targetEntity, targetRelation }) => {\n\t\t\t\treturn this.junctionTableManager.disconnectJunction(this, targetEntity, targetRelation, otherPrimary, thisPrimary)\n\t\t\t},\n\t\t\tvisitColumn: err,\n\t\t\tvisitOneHasMany: err,\n\t\t\tvisitOneHasOneInverse: err,\n\t\t\tvisitOneHasOneOwning: err,\n\t\t\tvisitManyHasOne: err,\n\t\t})\n\t}\n\n\tpublic async getPrimaryValue(\n\t\tentity: Model.Entity,\n\t\twhere: Input.UniqueWhere | CheckedPrimary,\n\t): Promise<[Input.PrimaryValue, undefined] | [undefined, MutationEntryNotFoundError]> {\n\t\tif (where instanceof CheckedPrimary) {\n\t\t\treturn [where.primaryValue, undefined]\n\t\t}\n\t\tconst result = await this.selectField(entity, where, entity.primary)\n\t\treturn result ? [result, undefined] : [undefined, new MutationEntryNotFoundError([], where)]\n\t}\n\n\tprivate async setupSystemVariables() {\n\t\tthis.systemVariablesSetupDone ??= (async () => {\n\t\t\tawait this.db.query('SELECT set_config(?, ?, false)', ['tenant.identity_id', this.identityId]) // todo rename to system.identity_id\n\t\t\tawait this.db.query('SELECT set_config(?, ?, false)', ['system.transaction_id', this.transactionId])\n\t\t})()\n\t\tawait this.systemVariablesSetupDone\n\t}\n}\n"],"names":["DeletedEntitiesStorage","Mutex","ConstraintHelper","EventManager","getColumnName","SelectBuilder","SelectHydrator","OrderByHelper","ImplementationException","tryMutation","acceptFieldVisitor","entity","relation","CheckedPrimary","MutationEntryNotFoundError"],"mappings":";;;;;;;;;;;;;;;;;AA2BO,MAAM,OAAqF;AAAA,EAQjG,YACiB,IACA,YACA,eACC,QACA,wBACA,oBACA,sBACA,qBACA,cACA,sBACA,gBACA,SACA,UACA,aAChB;AAde,SAAA,KAAA;AACA,SAAA,aAAA;AACA,SAAA,gBAAA;AACC,SAAA,SAAA;AACA,SAAA,yBAAA;AACA,SAAA,qBAAA;AACA,SAAA,uBAAA;AACA,SAAA,sBAAA;AACA,SAAA,eAAA;AACA,SAAA,uBAAA;AACA,SAAA,iBAAA;AACA,SAAA,UAAA;AACA,SAAA,WAAA;AACA,SAAA,cAAA;AArBV,kBAAA,MAAA,0BAAA;AACQ,kBAAA,MAAA,mBAAkB,IAAIA,uBAAuB,uBAAA,CAAA;AAC7C,kBAAA,MAAA,SAAQ,IAAIC,MAAM,MAAA,CAAA;AAClB,kBAAA,MAAA,kBAAA;AAEA,kBAAA,MAAA,cAAA;AAkBf,SAAK,mBAAmB,IAAIC,SAAAA,iBAAiB,IAAI,KAAK,sBAAsB;AACvE,SAAA,eAAe,IAAIC,aAAA,aAAa,IAAI;AAAA,EAAA;AAAA,EAG1C,MAAa,YAAY,QAAsB,OAA2C,WAAmB;AAC5G,UAAM,aAAaC,YAAAA,cAAc,KAAK,QAAQ,QAAQ,SAAS;AAE/D,UAAM,KAAKC,SAAA,cAAc,OAAO,EAC9B,KAAK,OAAO,WAAW,OAAO,EAC9B,OAAO,CAAC,SAAS,UAAU,CAAC;AAC9B,UAAM,gBAAgB,KAAK,oBAAoB,OAAO,QAAQ,KAAK;AACnE,UAAM,iBAAiB,KAAK,mBAAmB,OAAO,QAAQ,aAAa;AAC3E,UAAM,UAAU,KAAK,aAAa,MAAM,IAAI,QAAQ,KAAK,YAAY,OAAO,CAAE,CAAA,GAAG,cAAc;AAC/F,UAAM,SAAS,MAAM,QAAQ,UAAU,KAAK,EAAE;AAEvC,WAAA,OAAO,CAAC,MAAM,SAAY,OAAO,CAAC,EAAE,UAAU,IAAI;AAAA,EAAA;AAAA,EAG1D,MAAa,YACZ,QACA,OACA,cACA,SACsC;AAChC,UAAA,WAAW,IAAIC,8BAAe;AACpC,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,eAAuB,KAAK,IAAI,OAAO,EAAE;AAC/C,UAAM,KAAoBD,SAAAA,cAAc,OAAO,EAC7C,OAAO,CAAC,KAAK,OAAOD,YAAAA,cAAc,KAAK,QAAQ,QAAQ,OAAO,CAAC,GAAG,YAAY;AAC1E,UAAA,OAAO,MAAM,KAAK,WAAW,UAAU,IAAI,QAAQ,OAAO,YAAY;AAC5E,WAAO,MAAM,SAAS,WAAW,MAAM,YAAY;AAAA,EAAA;AAAA,EAGpD,MAAa,OAAO,QAAsB,OAAyC,cAAyE;AACrJ,UAAA,WAAW,IAAIE,8BAAe;AAC9B,UAAA,KAA0CD,uBAAc,OAAO;AAE/D,UAAA,OAAO,MAAM,KAAK,WAAW,UAAU,IAAI,QAAQ,OAAO,YAAY;AAErE,WAAA,MAAM,SAAS,WAAW,IAAI;AAAA,EAAA;AAAA,EAGtC,MAAa,aACZ,QACA,OACA,cACqC;AACrC,UAAM,cAAc,KAAK,oBAAoB,OAAO,QAAQ,MAAM,KAAK,EAAE;AACzE,UAAM,QAAQ,MAAM,KAAK,SAAS,EAAE,KAAK,CAAC,aAAa,MAAM,KAAK,MAAM,EAAM,IAAA;AAC9E,UAAM,gBAAgB,MAAM,QAA8B,UAAU,KAAK;AAEzE,UAAM,OAAO,MAAM,KAAK,OAAO,QAAQ,eAAe,YAAY;AAE3D,WAAA,KAAK,CAAC,KAAK;AAAA,EAAA;AAAA,EAGnB,MAAa,cACZ,QACA,OACA,UACA,cACgC;AAC1B,UAAA,WAAW,IAAIC,8BAAe;AACpC,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,cAAc;AACpB,UAAM,KAAoBD,SAAAA,cAAc,OAAO,EAC7C,OAAO,CAAC,KAAK,OAAO,SAAS,cAAc,UAAU,GAAG,WAAW;AAE/D,UAAA,OAAO,MAAM,KAAK,WAAW,UAAU,IAAI,QAAQ,OAAO,cAAc,SAAS,IAAI;AAE3F,WAAO,MAAM,SAAS,cAAc,MAAM,WAAW;AAAA,EAAA;AAAA,EAGtD,MAAc,WACb,UACA,IACA,QACA,OACA,cACA,SACC;AACD,UAAM,iBAAiBE,cAAAA,cAAc,qBAAqB,QAAQ,OAAO,MAAS;AAClF,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,mBAAmB,GAAG,KAAK,OAAO,WAAW,KAAK,KAAK,EAAE,KAAK,QAAQ,CAAC,GAAG,MAAM,MAAM,MAAM,KAAK,CAAC;AAExG,UAAM,WAAW,KAAK,qBAAqB,OAAO,kBAAkB,UAAU,YAAY;AAC1F,UAAM,uBAAuB,KAAK,mBAAmB,OAAO,QAAQ,eAAe,KAAK,UAAU,CAAI,GAAA,aAAa,aAAa,SAAS,CAAC,CAAC;AAC3I,UAAM,sBAAsB,eAAe,QAAQ,UAAU,oBAAoB;AACjF,aAAS,OAAO,MAAM,QAAQ,qBAAqB,MAAM,OAAO;AAChE,WAAO,MAAM,SAAS,QAAQ,KAAK,EAAE;AAAA,EAAA;AAAA,EAGtC,MAAa,MAAM,QAAsB,QAA6B;AACrE,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,KAAKF,SAAAA,cAAc,OAAA,EACvB,KAAK,OAAO,WAAW,KAAK,KAAK,EACjC,OAAO,CAAQ,SAAA,KAAK,IAAI,UAAU,GAAG,WAAW;AAClD,UAAM,iBAAiB,KAAK,mBAAmB,OAAO,QAAQ,MAAM;AACpE,UAAM,cAAc,KAAK,aAAa,MAAM,IAAI,QAAQ,MAAM,cAAc;AAC5E,UAAM,SAAS,MAAM,YAAY,UAAU,KAAK,EAAE;AAC3C,WAAA,OAAO,CAAC,EAAE;AAAA,EAAA;AAAA,EAGlB,MAAa,aACZ,QACA,QACA,UACA,cACkC;AAClC,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,KAAKA,SAAAA,cAAc,OAAO,EAC9B,KAAK,OAAO,WAAW,KAAK,KAAK,EACjC,OAAO,CAAA,SAAQ,KAAK,IAAI,UAAU,GAAG,WAAW,EAChD,OAAO,CAAC,KAAK,OAAO,SAAS,cAAc,UAAU,CAAC,EACtD,QAAQ,CAAC,KAAK,OAAO,SAAS,cAAc,UAAU,CAAC;AACnD,UAAA,iBAAiB,KAAK,mBAAmB,OAAO,QAAQ,QAAQ,aAAa,aAAa,SAAS,CAAC,CAAC;AACrG,UAAA,cAAc,KAAK,aAAa,MAAM,IAAI,QAAQ,MAAM,gBAAgB,EAAE,cAAc;AAC9F,UAAM,OAAO,MAAM,YAAY,UAAU,KAAK,EAAE;AAC1C,UAAA,6BAAa,IAAoB;AACvC,eAAW,OAAO,MAAM;AAChB,aAAA,IAAI,OAAO,IAAI,SAAS,cAAc,UAAU,CAAC,GAAG,OAAO,IAAI,SAAS,CAAC;AAAA,IAAA;AAE1E,WAAA,OAAO,YAAY,MAAM;AAAA,EAAA;AAAA,EAGjC,MAAa,OACZ,QACA,MACA,YAA8C,MAAM;AAAA,EAAA,GACtB;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAIG,UAAAA,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AACzB,WAAAC,WAAA;AAAA,MAAY,KAAK;AAAA,MAAQ,KAAK;AAAA,MAAwB,MAC5D,KAAK,eAAe,QAAQ,MAAM,SAAS;AAAA,IAC5C;AAAA,EAAA;AAAA,EAGD,MAAa,OACZ,QACA,IACA,MACA,QAC8B;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAID,UAAAA,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AAChC,WAAOC,WAAY,YAAA,KAAK,QAAQ,KAAK,wBAAwB,YAAY;AAClE,YAAA,CAAC,cAAc,GAAG,IAAI,MAAM,KAAK,gBAAgB,QAAQ,EAAE;AAC7D,UAAA,IAAY,QAAA,CAAC,GAAG;AAEb,aAAA,MAAM,KAAK,QAAQ,OAAO,MAAM,QAAQ,cAAc,MAAM,MAAM;AAAA,IAAA,CACzE;AAAA,EAAA;AAAA,EAGF,MAAa,eACZ,QACA,IACA,WAC8B;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAID,UAAAA,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AAChC,WAAOC,WAAY,YAAA,KAAK,QAAQ,KAAK,wBAAwB,YAAY;AAClE,YAAA,CAAC,cAAc,GAAG,IAAI,MAAM,KAAK,gBAAgB,QAAQ,EAAE;AAC7D,UAAA,IAAY,QAAA,CAAC,GAAG;AAEpB,aAAO,MAAM,KAAK,QAAQ,SAAS,MAAM,QAAQ,cAAc,SAAS;AAAA,IAAA,CACxE;AAAA,EAAA;AAAA,EAEF,MAAa,OACZ,QACA,IACA,QACA,QACA,QAC8B;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAID,UAAAA,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AAChC,WAAOC,WAAY,YAAA,KAAK,QAAQ,KAAK,wBAAwB,YAAY;AACxE,YAAM,CAAC,YAAY,IAAI,MAAM,KAAK,gBAAgB,QAAQ,EAAE;AAC5D,UAAI,iBAAiB,QAAW;AAC/B,eAAO,MAAM,KAAK,eAAe,QAAQ,MAAM;AAAA,MAAA;AAEzC,aAAA,MAAM,KAAK,QAAQ,OAAO,MAAM,QAAQ,cAAc,QAAQ,MAAM;AAAA,IAAA,CAC3E;AAAA,EAAA;AAAA,EAGM,eAAe,QAAsB,MAAmC,YAA8C,MAAM;AAAA,EAAA,GAAI;AACvI,WAAO,KAAK,SAAS,OAAO,MAAM,QAAQ,MAAM,CAAM,OAAA;AAAA,OACnD,SAAS;AAAA,EAAA;AAAA,EAGb,MAAa,OACZ,QACA,IACA,QAC8B;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAID,UAAAA,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AAChC,WAAOC,WAAY,YAAA,KAAK,QAAQ,KAAK,wBAAwB,MAAM;AAClE,aAAO,KAAK,eAAe,QAAQ,MAAM,QAAQ,IAAI,MAAM;AAAA,IAAA,CAC3D;AAAA,EAAA;AAAA,EAGF,MAAa,gBACZ,QACA,UACA,aACA,cAC8B;AAC9B,UAAM,KAAK,qBAAqB;AAChC,UAAM,MAAM,MAAM;AACjB,YAAM,IAAID,UAAAA,wBAAwB;AAAA,IACnC;AACA,WAAO,MAAME,YAAAA,mBAAmB,KAAK,QAAQ,QAAQ,UAAU;AAAA,MAC9D,wBAAwB,CAAC,EAAE,QAAAC,SAAQ,UAAAC,gBAAe;AACjD,eAAO,KAAK,qBAAqB,gBAAgB,MAAMD,SAAQC,WAAU,aAAa,YAAY;AAAA,MACnG;AAAA,MACA,yBAAyB,CAAC,EAAE,cAAc,qBAAqB;AAC9D,eAAO,KAAK,qBAAqB,gBAAgB,MAAM,cAAc,gBAAgB,cAAc,WAAW;AAAA,MAC/G;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,uBAAuB;AAAA,MACvB,sBAAsB;AAAA,MACtB,iBAAiB;AAAA,IAAA,CACjB;AAAA,EAAA;AAAA,EAGF,MAAa,mBACZ,QACA,UACA,aACA,cAC8B;AAC9B,UAAM,KAAK,qBAAqB;AAChC,UAAM,MAAM,MAAM;AACjB,YAAM,IAAIJ,UAAAA,wBAAwB;AAAA,IACnC;AACA,WAAO,MAAME,YAAAA,mBAAmB,KAAK,QAAQ,QAAQ,UAAU;AAAA,MAC9D,wBAAwB,CAAC,EAAE,QAAAC,SAAQ,UAAAC,gBAAe;AACjD,eAAO,KAAK,qBAAqB,mBAAmB,MAAMD,SAAQC,WAAU,aAAa,YAAY;AAAA,MACtG;AAAA,MACA,yBAAyB,CAAC,EAAE,cAAc,qBAAqB;AAC9D,eAAO,KAAK,qBAAqB,mBAAmB,MAAM,cAAc,gBAAgB,cAAc,WAAW;AAAA,MAClH;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,uBAAuB;AAAA,MACvB,sBAAsB;AAAA,MACtB,iBAAiB;AAAA,IAAA,CACjB;AAAA,EAAA;AAAA,EAGF,MAAa,gBACZ,QACA,OACqF;AACrF,QAAI,iBAAiBC,eAAAA,gBAAgB;AAC7B,aAAA,CAAC,MAAM,cAAc,MAAS;AAAA,IAAA;AAEtC,UAAM,SAAS,MAAM,KAAK,YAAY,QAAQ,OAAO,OAAO,OAAO;AACnE,WAAO,SAAS,CAAC,QAAQ,MAAS,IAAI,CAAC,QAAW,IAAIC,OAAAA,2BAA2B,CAAI,GAAA,KAAK,CAAC;AAAA,EAAA;AAAA,EAG5F,MAAc,uBAAuB;AAC/B,SAAA,6BAAL,KAAK,4BAA8B,YAAY;AACxC,YAAA,KAAK,GAAG,MAAM,kCAAkC,CAAC,sBAAsB,KAAK,UAAU,CAAC;AACvF,YAAA,KAAK,GAAG,MAAM,kCAAkC,CAAC,yBAAyB,KAAK,aAAa,CAAC;AAAA,IAAA;AAEpG,UAAM,KAAK;AAAA,EAAA;AAEb;;"}
@@ -41,7 +41,8 @@ class Mapper {
41
41
  const columnName = getColumnName(this.schema, entity, fieldName);
42
42
  const qb = SelectBuilder.create().from(entity.tableName, "root_").select(["root_", columnName]);
43
43
  const expandedWhere = this.uniqueWhereExpander.expand(entity, where);
44
- const builtQb = this.whereBuilder.build(qb, entity, this.pathFactory.create([]), expandedWhere);
44
+ const withPredicates = this.predicatesInjector.inject(entity, expandedWhere);
45
+ const builtQb = this.whereBuilder.build(qb, entity, this.pathFactory.create([]), withPredicates);
45
46
  const result = await builtQb.getResult(this.db);
46
47
  return result[0] !== void 0 ? result[0][columnName] : void 0;
47
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Mapper.js","sources":["../../../../../packages/engine-content-api/src/mapper/Mapper.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { acceptFieldVisitor, getColumnName } from '@contember/schema-utils'\nimport {\n\tOrderByHelper,\n\tPathFactory,\n\tSelectBuilderFactory,\n\tSelectGroupedObjects,\n\tSelectHydrator,\n\tSelectIndexedResultObjects,\n\tSelectResultObject,\n\tWhereBuilder,\n} from './select'\nimport { Client, Connection, ConstraintHelper, DatabaseMetadata, SelectBuilder } from '@contember/database'\nimport { PredicatesInjector } from '../acl'\nimport { JunctionTableManager } from './JunctionTableManager'\nimport { DeletedEntitiesStorage, DeleteExecutor } from './delete'\nimport { MutationEntryNotFoundError, MutationResultList } from './Result'\nimport { UpdateBuilder, Updater } from './update'\nimport { InsertBuilder, Inserter } from './insert'\nimport { tryMutation } from './ErrorUtils'\nimport { ObjectNode, UniqueWhereExpander } from '../inputProcessing'\nimport { Mutex } from '../utils'\nimport { CheckedPrimary } from './CheckedPrimary'\nimport { ImplementationException } from '../exception'\nimport { EventManager } from './EventManager'\nimport { MapperInput } from './types'\n\nexport class Mapper<ConnectionType extends Connection.ConnectionLike = Connection.ConnectionLike> {\n\tprivate systemVariablesSetupDone: Promise<void> | undefined\n\tpublic readonly deletedEntities = new DeletedEntitiesStorage()\n\tpublic readonly mutex = new Mutex()\n\tpublic readonly constraintHelper: ConstraintHelper\n\n\tpublic readonly eventManager: EventManager\n\n\tconstructor(\n\t\tpublic readonly db: Client<ConnectionType>,\n\t\tpublic readonly identityId: string,\n\t\tpublic readonly transactionId: string,\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly schemaDatabaseMetadata: DatabaseMetadata,\n\t\tprivate readonly predicatesInjector: PredicatesInjector,\n\t\tprivate readonly selectBuilderFactory: SelectBuilderFactory,\n\t\tprivate readonly uniqueWhereExpander: UniqueWhereExpander,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly junctionTableManager: JunctionTableManager,\n\t\tprivate readonly deleteExecutor: DeleteExecutor,\n\t\tprivate readonly updater: Updater,\n\t\tprivate readonly inserter: Inserter,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {\n\t\tthis.constraintHelper = new ConstraintHelper(db, this.schemaDatabaseMetadata)\n\t\tthis.eventManager = new EventManager(this)\n\t}\n\n\tpublic async selectField(entity: Model.Entity, where: Input.UniqueWhere | CheckedPrimary, fieldName: string) {\n\t\tconst columnName = getColumnName(this.schema, entity, fieldName)\n\n\t\tconst qb = SelectBuilder.create() //\n\t\t\t.from(entity.tableName, 'root_')\n\t\t\t.select(['root_', columnName])\n\t\tconst expandedWhere = this.uniqueWhereExpander.expand(entity, where)\n\t\tconst builtQb = this.whereBuilder.build(qb, entity, this.pathFactory.create([]), expandedWhere)\n\t\tconst result = await builtQb.getResult(this.db)\n\n\t\treturn result[0] !== undefined ? result[0][columnName] : undefined\n\t}\n\n\tpublic async selectAssoc(\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t\tindexBy: string,\n\t): Promise<SelectIndexedResultObjects> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst path = this.pathFactory.create([])\n\t\tconst indexByAlias: string = path.for(indexBy).alias\n\t\tconst qb: SelectBuilder = SelectBuilder.create()\n\t\t\t.select([path.alias, getColumnName(this.schema, entity, indexBy)], indexByAlias)\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath)\n\t\treturn await hydrator.hydrateAll(rows, indexByAlias)\n\t}\n\n\tpublic async select(entity: Model.Entity, input: ObjectNode<Input.ListQueryInput>, relationPath: Model.AnyRelationContext[]): Promise<SelectResultObject[]> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst qb: SelectBuilder<SelectBuilder.Result> = SelectBuilder.create()\n\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath)\n\n\t\treturn await hydrator.hydrateAll(rows)\n\t}\n\n\tpublic async selectUnique(\n\t\tentity: Model.Entity,\n\t\tquery: ObjectNode<Input.UniqueQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<SelectResultObject | null> {\n\t\tconst uniqueWhere = this.uniqueWhereExpander.expand(entity, query.args.by)\n\t\tconst where = query.args.filter ? { and: [uniqueWhere, query.args.filter] } : uniqueWhere\n\t\tconst queryExpanded = query.withArg<Input.ListQueryInput>('filter', where)\n\n\t\tconst rows = await this.select(entity, queryExpanded, relationPath)\n\n\t\treturn rows[0] ?? null\n\t}\n\n\tpublic async selectGrouped(\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelation: Model.JoiningColumnRelation & Model.AnyRelation,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<SelectGroupedObjects> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst path = this.pathFactory.create([])\n\t\tconst groupingKey = '__grouping_key'\n\t\tconst qb: SelectBuilder = SelectBuilder.create()\n\t\t\t.select([path.alias, relation.joiningColumn.columnName], groupingKey)\n\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath, relation.name)\n\n\t\treturn await hydrator.hydrateGroups(rows, groupingKey)\n\t}\n\n\tprivate async selectRows(\n\t\thydrator: SelectHydrator,\n\t\tqb: SelectBuilder<SelectBuilder.Result>,\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t\tgroupBy?: string,\n\t) {\n\t\tconst inputWithOrder = OrderByHelper.appendDefaultOrderBy(entity, input, undefined)\n\t\tconst path = this.pathFactory.create([])\n\t\tconst augmentedBuilder = qb.from(entity.tableName, path.alias).meta('path', [...input.path, input.alias])\n\n\t\tconst selector = this.selectBuilderFactory.create(augmentedBuilder, hydrator, relationPath)\n\t\tconst filterWithPredicates = this.predicatesInjector.inject(entity, inputWithOrder.args.filter || {}, relationPath[relationPath.length - 1])\n\t\tconst inputWithPredicates = inputWithOrder.withArg('filter', filterWithPredicates)\n\t\tselector.select(this, entity, inputWithPredicates, path, groupBy)\n\t\treturn await selector.execute(this.db)\n\t}\n\n\tpublic async count(entity: Model.Entity, filter: Input.OptionalWhere) {\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select(expr => expr.raw('count(*)'), 'row_count')\n\t\tconst withPredicates = this.predicatesInjector.inject(entity, filter)\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates)\n\t\tconst result = await qbWithWhere.getResult(this.db)\n\t\treturn result[0].row_count\n\t}\n\n\tpublic async countGrouped(\n\t\tentity: Model.Entity,\n\t\tfilter: Input.OptionalWhere,\n\t\trelation: Model.JoiningColumnRelation & Model.Relation,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<Record<string, number>> {\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select(expr => expr.raw('count(*)'), 'row_count')\n\t\t\t.select([path.alias, relation.joiningColumn.columnName])\n\t\t\t.groupBy([path.alias, relation.joiningColumn.columnName])\n\t\tconst withPredicates = this.predicatesInjector.inject(entity, filter, relationPath[relationPath.length - 1])\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates, { relationPath })\n\t\tconst rows = await qbWithWhere.getResult(this.db)\n\t\tconst result = new Map<string, number>()\n\t\tfor (const row of rows) {\n\t\t\tresult.set(String(row[relation.joiningColumn.columnName]), Number(row.row_count))\n\t\t}\n\t\treturn Object.fromEntries(result)\n\t}\n\n\tpublic async insert(\n\t\tentity: Model.Entity,\n\t\tdata: MapperInput.CreateDataInput,\n\t\tbuilderCb: (builder: InsertBuilder) => void = () => {},\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, () =>\n\t\t\tthis.insertInternal(entity, data, builderCb),\n\t\t)\n\t}\n\n\tpublic async update(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tdata: MapperInput.UpdateDataInput,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue, err] = await this.getPrimaryValue(entity, by)\n\t\t\tif (err) return [err]\n\n\t\t\treturn await this.updater.update(this, entity, primaryValue, data, filter)\n\t\t})\n\t}\n\n\tpublic async updateInternal(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tbuilderCb: (builder: UpdateBuilder) => void,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue, err] = await this.getPrimaryValue(entity, by)\n\t\t\tif (err) return [err]\n\n\t\t\treturn await this.updater.updateCb(this, entity, primaryValue, builderCb)\n\t\t})\n\t}\n\tpublic async upsert(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tupdate: MapperInput.UpdateDataInput,\n\t\tcreate: MapperInput.CreateDataInput,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue] = await this.getPrimaryValue(entity, by)\n\t\t\tif (primaryValue === undefined) {\n\t\t\t\treturn await this.insertInternal(entity, create)\n\t\t\t}\n\t\t\treturn await this.updater.update(this, entity, primaryValue, update, filter)\n\t\t})\n\t}\n\n\tprivate insertInternal(entity: Model.Entity, data: MapperInput.CreateDataInput, builderCb: (builder: InsertBuilder) => void = () => {}) {\n\t\treturn this.inserter.insert(this, entity, data, id => {\n\t\t}, builderCb)\n\t}\n\n\tpublic async delete(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, () => {\n\t\t\treturn this.deleteExecutor.execute(this, entity, by, filter)\n\t\t})\n\t}\n\n\tpublic async connectJunction(\n\t\tentity: Model.Entity,\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation,\n\t\tthisPrimary: Input.PrimaryValue,\n\t\totherPrimary: Input.PrimaryValue,\n\t): Promise<MutationResultList> {\n\t\tawait this.setupSystemVariables()\n\t\tconst err = () => {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\treturn await acceptFieldVisitor(this.schema, entity, relation, {\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\treturn this.junctionTableManager.connectJunction(this, entity, relation, thisPrimary, otherPrimary)\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ targetEntity, targetRelation }) => {\n\t\t\t\treturn this.junctionTableManager.connectJunction(this, targetEntity, targetRelation, otherPrimary, thisPrimary)\n\t\t\t},\n\t\t\tvisitColumn: err,\n\t\t\tvisitOneHasMany: err,\n\t\t\tvisitOneHasOneInverse: err,\n\t\t\tvisitOneHasOneOwning: err,\n\t\t\tvisitManyHasOne: err,\n\t\t})\n\t}\n\n\tpublic async disconnectJunction(\n\t\tentity: Model.Entity,\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation,\n\t\tthisPrimary: Input.PrimaryValue,\n\t\totherPrimary: Input.PrimaryValue,\n\t): Promise<MutationResultList> {\n\t\tawait this.setupSystemVariables()\n\t\tconst err = () => {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\treturn await acceptFieldVisitor(this.schema, entity, relation, {\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\treturn this.junctionTableManager.disconnectJunction(this, entity, relation, thisPrimary, otherPrimary)\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ targetEntity, targetRelation }) => {\n\t\t\t\treturn this.junctionTableManager.disconnectJunction(this, targetEntity, targetRelation, otherPrimary, thisPrimary)\n\t\t\t},\n\t\t\tvisitColumn: err,\n\t\t\tvisitOneHasMany: err,\n\t\t\tvisitOneHasOneInverse: err,\n\t\t\tvisitOneHasOneOwning: err,\n\t\t\tvisitManyHasOne: err,\n\t\t})\n\t}\n\n\tpublic async getPrimaryValue(\n\t\tentity: Model.Entity,\n\t\twhere: Input.UniqueWhere | CheckedPrimary,\n\t): Promise<[Input.PrimaryValue, undefined] | [undefined, MutationEntryNotFoundError]> {\n\t\tif (where instanceof CheckedPrimary) {\n\t\t\treturn [where.primaryValue, undefined]\n\t\t}\n\t\tconst result = await this.selectField(entity, where, entity.primary)\n\t\treturn result ? [result, undefined] : [undefined, new MutationEntryNotFoundError([], where)]\n\t}\n\n\tprivate async setupSystemVariables() {\n\t\tthis.systemVariablesSetupDone ??= (async () => {\n\t\t\tawait this.db.query('SELECT set_config(?, ?, false)', ['tenant.identity_id', this.identityId]) // todo rename to system.identity_id\n\t\t\tawait this.db.query('SELECT set_config(?, ?, false)', ['system.transaction_id', this.transactionId])\n\t\t})()\n\t\tawait this.systemVariablesSetupDone\n\t}\n}\n"],"names":["entity","relation"],"mappings":"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"}
1
+ {"version":3,"file":"Mapper.js","sources":["../../../../../packages/engine-content-api/src/mapper/Mapper.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { acceptFieldVisitor, getColumnName } from '@contember/schema-utils'\nimport {\n\tOrderByHelper,\n\tPathFactory,\n\tSelectBuilderFactory,\n\tSelectGroupedObjects,\n\tSelectHydrator,\n\tSelectIndexedResultObjects,\n\tSelectResultObject,\n\tWhereBuilder,\n} from './select'\nimport { Client, Connection, ConstraintHelper, DatabaseMetadata, SelectBuilder } from '@contember/database'\nimport { PredicatesInjector } from '../acl'\nimport { JunctionTableManager } from './JunctionTableManager'\nimport { DeletedEntitiesStorage, DeleteExecutor } from './delete'\nimport { MutationEntryNotFoundError, MutationResultList } from './Result'\nimport { UpdateBuilder, Updater } from './update'\nimport { InsertBuilder, Inserter } from './insert'\nimport { tryMutation } from './ErrorUtils'\nimport { ObjectNode, UniqueWhereExpander } from '../inputProcessing'\nimport { Mutex } from '../utils'\nimport { CheckedPrimary } from './CheckedPrimary'\nimport { ImplementationException } from '../exception'\nimport { EventManager } from './EventManager'\nimport { MapperInput } from './types'\n\nexport class Mapper<ConnectionType extends Connection.ConnectionLike = Connection.ConnectionLike> {\n\tprivate systemVariablesSetupDone: Promise<void> | undefined\n\tpublic readonly deletedEntities = new DeletedEntitiesStorage()\n\tpublic readonly mutex = new Mutex()\n\tpublic readonly constraintHelper: ConstraintHelper\n\n\tpublic readonly eventManager: EventManager\n\n\tconstructor(\n\t\tpublic readonly db: Client<ConnectionType>,\n\t\tpublic readonly identityId: string,\n\t\tpublic readonly transactionId: string,\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly schemaDatabaseMetadata: DatabaseMetadata,\n\t\tprivate readonly predicatesInjector: PredicatesInjector,\n\t\tprivate readonly selectBuilderFactory: SelectBuilderFactory,\n\t\tprivate readonly uniqueWhereExpander: UniqueWhereExpander,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly junctionTableManager: JunctionTableManager,\n\t\tprivate readonly deleteExecutor: DeleteExecutor,\n\t\tprivate readonly updater: Updater,\n\t\tprivate readonly inserter: Inserter,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {\n\t\tthis.constraintHelper = new ConstraintHelper(db, this.schemaDatabaseMetadata)\n\t\tthis.eventManager = new EventManager(this)\n\t}\n\n\tpublic async selectField(entity: Model.Entity, where: Input.UniqueWhere | CheckedPrimary, fieldName: string) {\n\t\tconst columnName = getColumnName(this.schema, entity, fieldName)\n\n\t\tconst qb = SelectBuilder.create() //\n\t\t\t.from(entity.tableName, 'root_')\n\t\t\t.select(['root_', columnName])\n\t\tconst expandedWhere = this.uniqueWhereExpander.expand(entity, where)\n\t\tconst withPredicates = this.predicatesInjector.inject(entity, expandedWhere)\n\t\tconst builtQb = this.whereBuilder.build(qb, entity, this.pathFactory.create([]), withPredicates)\n\t\tconst result = await builtQb.getResult(this.db)\n\n\t\treturn result[0] !== undefined ? result[0][columnName] : undefined\n\t}\n\n\tpublic async selectAssoc(\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t\tindexBy: string,\n\t): Promise<SelectIndexedResultObjects> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst path = this.pathFactory.create([])\n\t\tconst indexByAlias: string = path.for(indexBy).alias\n\t\tconst qb: SelectBuilder = SelectBuilder.create()\n\t\t\t.select([path.alias, getColumnName(this.schema, entity, indexBy)], indexByAlias)\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath)\n\t\treturn await hydrator.hydrateAll(rows, indexByAlias)\n\t}\n\n\tpublic async select(entity: Model.Entity, input: ObjectNode<Input.ListQueryInput>, relationPath: Model.AnyRelationContext[]): Promise<SelectResultObject[]> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst qb: SelectBuilder<SelectBuilder.Result> = SelectBuilder.create()\n\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath)\n\n\t\treturn await hydrator.hydrateAll(rows)\n\t}\n\n\tpublic async selectUnique(\n\t\tentity: Model.Entity,\n\t\tquery: ObjectNode<Input.UniqueQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<SelectResultObject | null> {\n\t\tconst uniqueWhere = this.uniqueWhereExpander.expand(entity, query.args.by)\n\t\tconst where = query.args.filter ? { and: [uniqueWhere, query.args.filter] } : uniqueWhere\n\t\tconst queryExpanded = query.withArg<Input.ListQueryInput>('filter', where)\n\n\t\tconst rows = await this.select(entity, queryExpanded, relationPath)\n\n\t\treturn rows[0] ?? null\n\t}\n\n\tpublic async selectGrouped(\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelation: Model.JoiningColumnRelation & Model.AnyRelation,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<SelectGroupedObjects> {\n\t\tconst hydrator = new SelectHydrator()\n\t\tconst path = this.pathFactory.create([])\n\t\tconst groupingKey = '__grouping_key'\n\t\tconst qb: SelectBuilder = SelectBuilder.create()\n\t\t\t.select([path.alias, relation.joiningColumn.columnName], groupingKey)\n\n\t\tconst rows = await this.selectRows(hydrator, qb, entity, input, relationPath, relation.name)\n\n\t\treturn await hydrator.hydrateGroups(rows, groupingKey)\n\t}\n\n\tprivate async selectRows(\n\t\thydrator: SelectHydrator,\n\t\tqb: SelectBuilder<SelectBuilder.Result>,\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t\tgroupBy?: string,\n\t) {\n\t\tconst inputWithOrder = OrderByHelper.appendDefaultOrderBy(entity, input, undefined)\n\t\tconst path = this.pathFactory.create([])\n\t\tconst augmentedBuilder = qb.from(entity.tableName, path.alias).meta('path', [...input.path, input.alias])\n\n\t\tconst selector = this.selectBuilderFactory.create(augmentedBuilder, hydrator, relationPath)\n\t\tconst filterWithPredicates = this.predicatesInjector.inject(entity, inputWithOrder.args.filter || {}, relationPath[relationPath.length - 1])\n\t\tconst inputWithPredicates = inputWithOrder.withArg('filter', filterWithPredicates)\n\t\tselector.select(this, entity, inputWithPredicates, path, groupBy)\n\t\treturn await selector.execute(this.db)\n\t}\n\n\tpublic async count(entity: Model.Entity, filter: Input.OptionalWhere) {\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select(expr => expr.raw('count(*)'), 'row_count')\n\t\tconst withPredicates = this.predicatesInjector.inject(entity, filter)\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates)\n\t\tconst result = await qbWithWhere.getResult(this.db)\n\t\treturn result[0].row_count\n\t}\n\n\tpublic async countGrouped(\n\t\tentity: Model.Entity,\n\t\tfilter: Input.OptionalWhere,\n\t\trelation: Model.JoiningColumnRelation & Model.Relation,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<Record<string, number>> {\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select(expr => expr.raw('count(*)'), 'row_count')\n\t\t\t.select([path.alias, relation.joiningColumn.columnName])\n\t\t\t.groupBy([path.alias, relation.joiningColumn.columnName])\n\t\tconst withPredicates = this.predicatesInjector.inject(entity, filter, relationPath[relationPath.length - 1])\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates, { relationPath })\n\t\tconst rows = await qbWithWhere.getResult(this.db)\n\t\tconst result = new Map<string, number>()\n\t\tfor (const row of rows) {\n\t\t\tresult.set(String(row[relation.joiningColumn.columnName]), Number(row.row_count))\n\t\t}\n\t\treturn Object.fromEntries(result)\n\t}\n\n\tpublic async insert(\n\t\tentity: Model.Entity,\n\t\tdata: MapperInput.CreateDataInput,\n\t\tbuilderCb: (builder: InsertBuilder) => void = () => {},\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, () =>\n\t\t\tthis.insertInternal(entity, data, builderCb),\n\t\t)\n\t}\n\n\tpublic async update(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tdata: MapperInput.UpdateDataInput,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue, err] = await this.getPrimaryValue(entity, by)\n\t\t\tif (err) return [err]\n\n\t\t\treturn await this.updater.update(this, entity, primaryValue, data, filter)\n\t\t})\n\t}\n\n\tpublic async updateInternal(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tbuilderCb: (builder: UpdateBuilder) => void,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue, err] = await this.getPrimaryValue(entity, by)\n\t\t\tif (err) return [err]\n\n\t\t\treturn await this.updater.updateCb(this, entity, primaryValue, builderCb)\n\t\t})\n\t}\n\tpublic async upsert(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tupdate: MapperInput.UpdateDataInput,\n\t\tcreate: MapperInput.CreateDataInput,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, async () => {\n\t\t\tconst [primaryValue] = await this.getPrimaryValue(entity, by)\n\t\t\tif (primaryValue === undefined) {\n\t\t\t\treturn await this.insertInternal(entity, create)\n\t\t\t}\n\t\t\treturn await this.updater.update(this, entity, primaryValue, update, filter)\n\t\t})\n\t}\n\n\tprivate insertInternal(entity: Model.Entity, data: MapperInput.CreateDataInput, builderCb: (builder: InsertBuilder) => void = () => {}) {\n\t\treturn this.inserter.insert(this, entity, data, id => {\n\t\t}, builderCb)\n\t}\n\n\tpublic async delete(\n\t\tentity: Model.Entity,\n\t\tby: Input.UniqueWhere | CheckedPrimary,\n\t\tfilter?: Input.OptionalWhere,\n\t): Promise<MutationResultList> {\n\t\tif (entity.view) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\tawait this.setupSystemVariables()\n\t\treturn tryMutation(this.schema, this.schemaDatabaseMetadata, () => {\n\t\t\treturn this.deleteExecutor.execute(this, entity, by, filter)\n\t\t})\n\t}\n\n\tpublic async connectJunction(\n\t\tentity: Model.Entity,\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation,\n\t\tthisPrimary: Input.PrimaryValue,\n\t\totherPrimary: Input.PrimaryValue,\n\t): Promise<MutationResultList> {\n\t\tawait this.setupSystemVariables()\n\t\tconst err = () => {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\treturn await acceptFieldVisitor(this.schema, entity, relation, {\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\treturn this.junctionTableManager.connectJunction(this, entity, relation, thisPrimary, otherPrimary)\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ targetEntity, targetRelation }) => {\n\t\t\t\treturn this.junctionTableManager.connectJunction(this, targetEntity, targetRelation, otherPrimary, thisPrimary)\n\t\t\t},\n\t\t\tvisitColumn: err,\n\t\t\tvisitOneHasMany: err,\n\t\t\tvisitOneHasOneInverse: err,\n\t\t\tvisitOneHasOneOwning: err,\n\t\t\tvisitManyHasOne: err,\n\t\t})\n\t}\n\n\tpublic async disconnectJunction(\n\t\tentity: Model.Entity,\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation,\n\t\tthisPrimary: Input.PrimaryValue,\n\t\totherPrimary: Input.PrimaryValue,\n\t): Promise<MutationResultList> {\n\t\tawait this.setupSystemVariables()\n\t\tconst err = () => {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\treturn await acceptFieldVisitor(this.schema, entity, relation, {\n\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\treturn this.junctionTableManager.disconnectJunction(this, entity, relation, thisPrimary, otherPrimary)\n\t\t\t},\n\t\t\tvisitManyHasManyInverse: ({ targetEntity, targetRelation }) => {\n\t\t\t\treturn this.junctionTableManager.disconnectJunction(this, targetEntity, targetRelation, otherPrimary, thisPrimary)\n\t\t\t},\n\t\t\tvisitColumn: err,\n\t\t\tvisitOneHasMany: err,\n\t\t\tvisitOneHasOneInverse: err,\n\t\t\tvisitOneHasOneOwning: err,\n\t\t\tvisitManyHasOne: err,\n\t\t})\n\t}\n\n\tpublic async getPrimaryValue(\n\t\tentity: Model.Entity,\n\t\twhere: Input.UniqueWhere | CheckedPrimary,\n\t): Promise<[Input.PrimaryValue, undefined] | [undefined, MutationEntryNotFoundError]> {\n\t\tif (where instanceof CheckedPrimary) {\n\t\t\treturn [where.primaryValue, undefined]\n\t\t}\n\t\tconst result = await this.selectField(entity, where, entity.primary)\n\t\treturn result ? [result, undefined] : [undefined, new MutationEntryNotFoundError([], where)]\n\t}\n\n\tprivate async setupSystemVariables() {\n\t\tthis.systemVariablesSetupDone ??= (async () => {\n\t\t\tawait this.db.query('SELECT set_config(?, ?, false)', ['tenant.identity_id', this.identityId]) // todo rename to system.identity_id\n\t\t\tawait this.db.query('SELECT set_config(?, ?, false)', ['system.transaction_id', this.transactionId])\n\t\t})()\n\t\tawait this.systemVariablesSetupDone\n\t}\n}\n"],"names":["entity","relation"],"mappings":";;;;;;;;;;;;;;;AA2BO,MAAM,OAAqF;AAAA,EAQjG,YACiB,IACA,YACA,eACC,QACA,wBACA,oBACA,sBACA,qBACA,cACA,sBACA,gBACA,SACA,UACA,aAChB;AAde,SAAA,KAAA;AACA,SAAA,aAAA;AACA,SAAA,gBAAA;AACC,SAAA,SAAA;AACA,SAAA,yBAAA;AACA,SAAA,qBAAA;AACA,SAAA,uBAAA;AACA,SAAA,sBAAA;AACA,SAAA,eAAA;AACA,SAAA,uBAAA;AACA,SAAA,iBAAA;AACA,SAAA,UAAA;AACA,SAAA,WAAA;AACA,SAAA,cAAA;AArBV,kBAAA,MAAA,0BAAA;AACQ,kBAAA,MAAA,mBAAkB,IAAI,uBAAuB,CAAA;AAC7C,kBAAA,MAAA,SAAQ,IAAI,MAAM,CAAA;AAClB,kBAAA,MAAA,kBAAA;AAEA,kBAAA,MAAA,cAAA;AAkBf,SAAK,mBAAmB,IAAI,iBAAiB,IAAI,KAAK,sBAAsB;AACvE,SAAA,eAAe,IAAI,aAAa,IAAI;AAAA,EAAA;AAAA,EAG1C,MAAa,YAAY,QAAsB,OAA2C,WAAmB;AAC5G,UAAM,aAAa,cAAc,KAAK,QAAQ,QAAQ,SAAS;AAE/D,UAAM,KAAK,cAAc,OAAO,EAC9B,KAAK,OAAO,WAAW,OAAO,EAC9B,OAAO,CAAC,SAAS,UAAU,CAAC;AAC9B,UAAM,gBAAgB,KAAK,oBAAoB,OAAO,QAAQ,KAAK;AACnE,UAAM,iBAAiB,KAAK,mBAAmB,OAAO,QAAQ,aAAa;AAC3E,UAAM,UAAU,KAAK,aAAa,MAAM,IAAI,QAAQ,KAAK,YAAY,OAAO,CAAE,CAAA,GAAG,cAAc;AAC/F,UAAM,SAAS,MAAM,QAAQ,UAAU,KAAK,EAAE;AAEvC,WAAA,OAAO,CAAC,MAAM,SAAY,OAAO,CAAC,EAAE,UAAU,IAAI;AAAA,EAAA;AAAA,EAG1D,MAAa,YACZ,QACA,OACA,cACA,SACsC;AAChC,UAAA,WAAW,IAAI,eAAe;AACpC,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,eAAuB,KAAK,IAAI,OAAO,EAAE;AAC/C,UAAM,KAAoB,cAAc,OAAO,EAC7C,OAAO,CAAC,KAAK,OAAO,cAAc,KAAK,QAAQ,QAAQ,OAAO,CAAC,GAAG,YAAY;AAC1E,UAAA,OAAO,MAAM,KAAK,WAAW,UAAU,IAAI,QAAQ,OAAO,YAAY;AAC5E,WAAO,MAAM,SAAS,WAAW,MAAM,YAAY;AAAA,EAAA;AAAA,EAGpD,MAAa,OAAO,QAAsB,OAAyC,cAAyE;AACrJ,UAAA,WAAW,IAAI,eAAe;AAC9B,UAAA,KAA0C,cAAc,OAAO;AAE/D,UAAA,OAAO,MAAM,KAAK,WAAW,UAAU,IAAI,QAAQ,OAAO,YAAY;AAErE,WAAA,MAAM,SAAS,WAAW,IAAI;AAAA,EAAA;AAAA,EAGtC,MAAa,aACZ,QACA,OACA,cACqC;AACrC,UAAM,cAAc,KAAK,oBAAoB,OAAO,QAAQ,MAAM,KAAK,EAAE;AACzE,UAAM,QAAQ,MAAM,KAAK,SAAS,EAAE,KAAK,CAAC,aAAa,MAAM,KAAK,MAAM,EAAM,IAAA;AAC9E,UAAM,gBAAgB,MAAM,QAA8B,UAAU,KAAK;AAEzE,UAAM,OAAO,MAAM,KAAK,OAAO,QAAQ,eAAe,YAAY;AAE3D,WAAA,KAAK,CAAC,KAAK;AAAA,EAAA;AAAA,EAGnB,MAAa,cACZ,QACA,OACA,UACA,cACgC;AAC1B,UAAA,WAAW,IAAI,eAAe;AACpC,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,cAAc;AACpB,UAAM,KAAoB,cAAc,OAAO,EAC7C,OAAO,CAAC,KAAK,OAAO,SAAS,cAAc,UAAU,GAAG,WAAW;AAE/D,UAAA,OAAO,MAAM,KAAK,WAAW,UAAU,IAAI,QAAQ,OAAO,cAAc,SAAS,IAAI;AAE3F,WAAO,MAAM,SAAS,cAAc,MAAM,WAAW;AAAA,EAAA;AAAA,EAGtD,MAAc,WACb,UACA,IACA,QACA,OACA,cACA,SACC;AACD,UAAM,iBAAiB,cAAc,qBAAqB,QAAQ,OAAO,MAAS;AAClF,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,mBAAmB,GAAG,KAAK,OAAO,WAAW,KAAK,KAAK,EAAE,KAAK,QAAQ,CAAC,GAAG,MAAM,MAAM,MAAM,KAAK,CAAC;AAExG,UAAM,WAAW,KAAK,qBAAqB,OAAO,kBAAkB,UAAU,YAAY;AAC1F,UAAM,uBAAuB,KAAK,mBAAmB,OAAO,QAAQ,eAAe,KAAK,UAAU,CAAI,GAAA,aAAa,aAAa,SAAS,CAAC,CAAC;AAC3I,UAAM,sBAAsB,eAAe,QAAQ,UAAU,oBAAoB;AACjF,aAAS,OAAO,MAAM,QAAQ,qBAAqB,MAAM,OAAO;AAChE,WAAO,MAAM,SAAS,QAAQ,KAAK,EAAE;AAAA,EAAA;AAAA,EAGtC,MAAa,MAAM,QAAsB,QAA6B;AACrE,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,KAAK,cAAc,OAAA,EACvB,KAAK,OAAO,WAAW,KAAK,KAAK,EACjC,OAAO,CAAQ,SAAA,KAAK,IAAI,UAAU,GAAG,WAAW;AAClD,UAAM,iBAAiB,KAAK,mBAAmB,OAAO,QAAQ,MAAM;AACpE,UAAM,cAAc,KAAK,aAAa,MAAM,IAAI,QAAQ,MAAM,cAAc;AAC5E,UAAM,SAAS,MAAM,YAAY,UAAU,KAAK,EAAE;AAC3C,WAAA,OAAO,CAAC,EAAE;AAAA,EAAA;AAAA,EAGlB,MAAa,aACZ,QACA,QACA,UACA,cACkC;AAClC,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,KAAK,cAAc,OAAO,EAC9B,KAAK,OAAO,WAAW,KAAK,KAAK,EACjC,OAAO,CAAA,SAAQ,KAAK,IAAI,UAAU,GAAG,WAAW,EAChD,OAAO,CAAC,KAAK,OAAO,SAAS,cAAc,UAAU,CAAC,EACtD,QAAQ,CAAC,KAAK,OAAO,SAAS,cAAc,UAAU,CAAC;AACnD,UAAA,iBAAiB,KAAK,mBAAmB,OAAO,QAAQ,QAAQ,aAAa,aAAa,SAAS,CAAC,CAAC;AACrG,UAAA,cAAc,KAAK,aAAa,MAAM,IAAI,QAAQ,MAAM,gBAAgB,EAAE,cAAc;AAC9F,UAAM,OAAO,MAAM,YAAY,UAAU,KAAK,EAAE;AAC1C,UAAA,6BAAa,IAAoB;AACvC,eAAW,OAAO,MAAM;AAChB,aAAA,IAAI,OAAO,IAAI,SAAS,cAAc,UAAU,CAAC,GAAG,OAAO,IAAI,SAAS,CAAC;AAAA,IAAA;AAE1E,WAAA,OAAO,YAAY,MAAM;AAAA,EAAA;AAAA,EAGjC,MAAa,OACZ,QACA,MACA,YAA8C,MAAM;AAAA,EAAA,GACtB;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAI,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AACzB,WAAA;AAAA,MAAY,KAAK;AAAA,MAAQ,KAAK;AAAA,MAAwB,MAC5D,KAAK,eAAe,QAAQ,MAAM,SAAS;AAAA,IAC5C;AAAA,EAAA;AAAA,EAGD,MAAa,OACZ,QACA,IACA,MACA,QAC8B;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAI,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AAChC,WAAO,YAAY,KAAK,QAAQ,KAAK,wBAAwB,YAAY;AAClE,YAAA,CAAC,cAAc,GAAG,IAAI,MAAM,KAAK,gBAAgB,QAAQ,EAAE;AAC7D,UAAA,IAAY,QAAA,CAAC,GAAG;AAEb,aAAA,MAAM,KAAK,QAAQ,OAAO,MAAM,QAAQ,cAAc,MAAM,MAAM;AAAA,IAAA,CACzE;AAAA,EAAA;AAAA,EAGF,MAAa,eACZ,QACA,IACA,WAC8B;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAI,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AAChC,WAAO,YAAY,KAAK,QAAQ,KAAK,wBAAwB,YAAY;AAClE,YAAA,CAAC,cAAc,GAAG,IAAI,MAAM,KAAK,gBAAgB,QAAQ,EAAE;AAC7D,UAAA,IAAY,QAAA,CAAC,GAAG;AAEpB,aAAO,MAAM,KAAK,QAAQ,SAAS,MAAM,QAAQ,cAAc,SAAS;AAAA,IAAA,CACxE;AAAA,EAAA;AAAA,EAEF,MAAa,OACZ,QACA,IACA,QACA,QACA,QAC8B;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAI,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AAChC,WAAO,YAAY,KAAK,QAAQ,KAAK,wBAAwB,YAAY;AACxE,YAAM,CAAC,YAAY,IAAI,MAAM,KAAK,gBAAgB,QAAQ,EAAE;AAC5D,UAAI,iBAAiB,QAAW;AAC/B,eAAO,MAAM,KAAK,eAAe,QAAQ,MAAM;AAAA,MAAA;AAEzC,aAAA,MAAM,KAAK,QAAQ,OAAO,MAAM,QAAQ,cAAc,QAAQ,MAAM;AAAA,IAAA,CAC3E;AAAA,EAAA;AAAA,EAGM,eAAe,QAAsB,MAAmC,YAA8C,MAAM;AAAA,EAAA,GAAI;AACvI,WAAO,KAAK,SAAS,OAAO,MAAM,QAAQ,MAAM,CAAM,OAAA;AAAA,OACnD,SAAS;AAAA,EAAA;AAAA,EAGb,MAAa,OACZ,QACA,IACA,QAC8B;AAC9B,QAAI,OAAO,MAAM;AAChB,YAAM,IAAI,wBAAwB;AAAA,IAAA;AAEnC,UAAM,KAAK,qBAAqB;AAChC,WAAO,YAAY,KAAK,QAAQ,KAAK,wBAAwB,MAAM;AAClE,aAAO,KAAK,eAAe,QAAQ,MAAM,QAAQ,IAAI,MAAM;AAAA,IAAA,CAC3D;AAAA,EAAA;AAAA,EAGF,MAAa,gBACZ,QACA,UACA,aACA,cAC8B;AAC9B,UAAM,KAAK,qBAAqB;AAChC,UAAM,MAAM,MAAM;AACjB,YAAM,IAAI,wBAAwB;AAAA,IACnC;AACA,WAAO,MAAM,mBAAmB,KAAK,QAAQ,QAAQ,UAAU;AAAA,MAC9D,wBAAwB,CAAC,EAAE,QAAAA,SAAQ,UAAAC,gBAAe;AACjD,eAAO,KAAK,qBAAqB,gBAAgB,MAAMD,SAAQC,WAAU,aAAa,YAAY;AAAA,MACnG;AAAA,MACA,yBAAyB,CAAC,EAAE,cAAc,qBAAqB;AAC9D,eAAO,KAAK,qBAAqB,gBAAgB,MAAM,cAAc,gBAAgB,cAAc,WAAW;AAAA,MAC/G;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,uBAAuB;AAAA,MACvB,sBAAsB;AAAA,MACtB,iBAAiB;AAAA,IAAA,CACjB;AAAA,EAAA;AAAA,EAGF,MAAa,mBACZ,QACA,UACA,aACA,cAC8B;AAC9B,UAAM,KAAK,qBAAqB;AAChC,UAAM,MAAM,MAAM;AACjB,YAAM,IAAI,wBAAwB;AAAA,IACnC;AACA,WAAO,MAAM,mBAAmB,KAAK,QAAQ,QAAQ,UAAU;AAAA,MAC9D,wBAAwB,CAAC,EAAE,QAAAD,SAAQ,UAAAC,gBAAe;AACjD,eAAO,KAAK,qBAAqB,mBAAmB,MAAMD,SAAQC,WAAU,aAAa,YAAY;AAAA,MACtG;AAAA,MACA,yBAAyB,CAAC,EAAE,cAAc,qBAAqB;AAC9D,eAAO,KAAK,qBAAqB,mBAAmB,MAAM,cAAc,gBAAgB,cAAc,WAAW;AAAA,MAClH;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,uBAAuB;AAAA,MACvB,sBAAsB;AAAA,MACtB,iBAAiB;AAAA,IAAA,CACjB;AAAA,EAAA;AAAA,EAGF,MAAa,gBACZ,QACA,OACqF;AACrF,QAAI,iBAAiB,gBAAgB;AAC7B,aAAA,CAAC,MAAM,cAAc,MAAS;AAAA,IAAA;AAEtC,UAAM,SAAS,MAAM,KAAK,YAAY,QAAQ,OAAO,OAAO,OAAO;AACnE,WAAO,SAAS,CAAC,QAAQ,MAAS,IAAI,CAAC,QAAW,IAAI,2BAA2B,CAAI,GAAA,KAAK,CAAC;AAAA,EAAA;AAAA,EAG5F,MAAc,uBAAuB;AAC/B,SAAA,6BAAL,KAAK,4BAA8B,YAAY;AACxC,YAAA,KAAK,GAAG,MAAM,kCAAkC,CAAC,sBAAsB,KAAK,UAAU,CAAC;AACvF,YAAA,KAAK,GAAG,MAAM,kCAAkC,CAAC,yBAAyB,KAAK,aAAa,CAAC;AAAA,IAAA;AAEpG,UAAM,KAAK;AAAA,EAAA;AAEb;"}