xansql 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Types/fields/Array.d.ts +7 -0
- package/Types/fields/Array.js +6 -0
- package/Types/fields/Array.js.map +1 -0
- package/Types/fields/Array.mjs +6 -0
- package/Types/fields/Array.mjs.map +1 -0
- package/Types/fields/Boolean.d.ts +8 -0
- package/Types/fields/Boolean.js +11 -0
- package/Types/fields/Boolean.js.map +1 -0
- package/Types/fields/Boolean.mjs +11 -0
- package/Types/fields/Boolean.mjs.map +1 -0
- package/Types/fields/Date.d.ts +10 -0
- package/Types/fields/Date.js +22 -0
- package/Types/fields/Date.js.map +1 -0
- package/Types/fields/Date.mjs +22 -0
- package/Types/fields/Date.mjs.map +1 -0
- package/Types/fields/Enum.d.ts +8 -0
- package/Types/fields/Enum.js +10 -0
- package/Types/fields/Enum.js.map +1 -0
- package/Types/fields/Enum.mjs +10 -0
- package/Types/fields/Enum.mjs.map +1 -0
- package/Types/fields/File.d.ts +7 -0
- package/Types/fields/File.js +6 -0
- package/Types/fields/File.js.map +1 -0
- package/Types/fields/File.mjs +6 -0
- package/Types/fields/File.mjs.map +1 -0
- package/Types/fields/IDField.d.ts +6 -0
- package/Types/fields/IDField.js +2 -0
- package/Types/fields/IDField.js.map +1 -0
- package/Types/fields/IDField.mjs +2 -0
- package/Types/fields/IDField.mjs.map +1 -0
- package/Types/fields/Number.d.ts +8 -0
- package/Types/fields/Number.js +11 -0
- package/Types/fields/Number.js.map +1 -0
- package/Types/fields/Number.mjs +11 -0
- package/Types/fields/Number.mjs.map +1 -0
- package/Types/fields/Object.d.ts +8 -0
- package/Types/fields/Object.js +11 -0
- package/Types/fields/Object.js.map +1 -0
- package/Types/fields/Object.mjs +11 -0
- package/Types/fields/Object.mjs.map +1 -0
- package/Types/fields/Record.d.ts +8 -0
- package/Types/fields/Record.js +11 -0
- package/Types/fields/Record.js.map +1 -0
- package/Types/fields/Record.mjs +11 -0
- package/Types/fields/Record.mjs.map +1 -0
- package/Types/fields/Schema.d.ts +16 -0
- package/Types/fields/Schema.js +34 -0
- package/Types/fields/Schema.js.map +1 -0
- package/Types/fields/Schema.mjs +34 -0
- package/Types/fields/Schema.mjs.map +1 -0
- package/Types/fields/String.d.ts +10 -0
- package/Types/fields/String.js +20 -0
- package/Types/fields/String.js.map +1 -0
- package/Types/fields/String.mjs +20 -0
- package/Types/fields/String.mjs.map +1 -0
- package/Types/fields/Tuple.d.ts +8 -0
- package/Types/fields/Tuple.js +11 -0
- package/Types/fields/Tuple.js.map +1 -0
- package/Types/fields/Tuple.mjs +11 -0
- package/Types/fields/Tuple.mjs.map +1 -0
- package/Types/fields/Union.d.ts +8 -0
- package/Types/fields/Union.js +11 -0
- package/Types/fields/Union.js.map +1 -0
- package/Types/fields/Union.mjs +11 -0
- package/Types/fields/Union.mjs.map +1 -0
- package/Types/index.d.ts +56 -0
- package/Types/index.js +129 -0
- package/Types/index.js.map +1 -0
- package/Types/index.mjs +129 -0
- package/Types/index.mjs.map +1 -0
- package/Types/types.d.ts +20 -0
- package/core/ExcuteMeta.d.ts +11 -0
- package/core/ExcuteMeta.js +22 -0
- package/core/ExcuteMeta.js.map +1 -0
- package/core/ExcuteMeta.mjs +22 -0
- package/core/ExcuteMeta.mjs.map +1 -0
- package/core/Xansql.d.ts +46 -0
- package/core/Xansql.js +132 -0
- package/core/Xansql.js.map +1 -0
- package/core/Xansql.mjs +132 -0
- package/core/Xansql.mjs.map +1 -0
- package/core/XansqlError.js +11 -0
- package/core/XansqlError.js.map +1 -0
- package/core/XansqlError.mjs +11 -0
- package/core/XansqlError.mjs.map +1 -0
- package/core/XansqlResult.d.ts +12 -0
- package/core/XansqlResult.js +32 -0
- package/core/XansqlResult.js.map +1 -0
- package/core/XansqlResult.mjs +32 -0
- package/core/XansqlResult.mjs.map +1 -0
- package/core/classes/EventManager.d.ts +72 -0
- package/core/classes/EventManager.js +21 -0
- package/core/classes/EventManager.js.map +1 -0
- package/core/classes/EventManager.mjs +21 -0
- package/core/classes/EventManager.mjs.map +1 -0
- package/core/classes/ForeignInfo.js +51 -0
- package/core/classes/ForeignInfo.js.map +1 -0
- package/core/classes/ForeignInfo.mjs +51 -0
- package/core/classes/ForeignInfo.mjs.map +1 -0
- package/core/classes/Migration/ForeingMigration.d.ts +12 -0
- package/core/classes/Migration/ForeingMigration.js +52 -0
- package/core/classes/Migration/ForeingMigration.js.map +1 -0
- package/core/classes/Migration/ForeingMigration.mjs +52 -0
- package/core/classes/Migration/ForeingMigration.mjs.map +1 -0
- package/core/classes/Migration/IndexMigration.d.ts +12 -0
- package/core/classes/Migration/IndexMigration.js +49 -0
- package/core/classes/Migration/IndexMigration.js.map +1 -0
- package/core/classes/Migration/IndexMigration.mjs +49 -0
- package/core/classes/Migration/IndexMigration.mjs.map +1 -0
- package/core/classes/Migration/TableMigration.d.ts +33 -0
- package/core/classes/Migration/TableMigration.js +215 -0
- package/core/classes/Migration/TableMigration.js.map +1 -0
- package/core/classes/Migration/TableMigration.mjs +215 -0
- package/core/classes/Migration/TableMigration.mjs.map +1 -0
- package/core/classes/Migration/index.d.ts +12 -0
- package/core/classes/Migration/index.js +189 -0
- package/core/classes/Migration/index.js.map +1 -0
- package/core/classes/Migration/index.mjs +189 -0
- package/core/classes/Migration/index.mjs.map +1 -0
- package/core/classes/ModelFormatter.js +166 -0
- package/core/classes/ModelFormatter.js.map +1 -0
- package/core/classes/ModelFormatter.mjs +166 -0
- package/core/classes/ModelFormatter.mjs.map +1 -0
- package/core/classes/TypesGenerator.d.ts +13 -0
- package/core/classes/TypesGenerator.js +170 -0
- package/core/classes/TypesGenerator.js.map +1 -0
- package/core/classes/TypesGenerator.mjs +170 -0
- package/core/classes/TypesGenerator.mjs.map +1 -0
- package/core/classes/XansqlConfig.js +33 -0
- package/core/classes/XansqlConfig.js.map +1 -0
- package/core/classes/XansqlConfig.mjs +33 -0
- package/core/classes/XansqlConfig.mjs.map +1 -0
- package/core/classes/XansqlFetch.js +304 -0
- package/core/classes/XansqlFetch.js.map +1 -0
- package/core/classes/XansqlFetch.mjs +304 -0
- package/core/classes/XansqlFetch.mjs.map +1 -0
- package/core/classes/XansqlTransaction.d.ts +13 -0
- package/core/classes/XansqlTransaction.js +46 -0
- package/core/classes/XansqlTransaction.js.map +1 -0
- package/core/classes/XansqlTransaction.mjs +46 -0
- package/core/classes/XansqlTransaction.mjs.map +1 -0
- package/core/type.d.ts +117 -0
- package/index.d.ts +3 -0
- package/index.js +1 -0
- package/index.js.map +1 -0
- package/index.mjs +1 -0
- package/index.mjs.map +1 -0
- package/model/Args/RelationExcuteArgs.js +5 -0
- package/model/Args/RelationExcuteArgs.js.map +1 -0
- package/model/Args/RelationExcuteArgs.mjs +5 -0
- package/model/Args/RelationExcuteArgs.mjs.map +1 -0
- package/model/Args/WhereArgs.js +226 -0
- package/model/Args/WhereArgs.js.map +1 -0
- package/model/Args/WhereArgs.mjs +226 -0
- package/model/Args/WhereArgs.mjs.map +1 -0
- package/model/Base.d.ts +26 -0
- package/model/Base.js +64 -0
- package/model/Base.js.map +1 -0
- package/model/Base.mjs +64 -0
- package/model/Base.mjs.map +1 -0
- package/model/Executer/Aggregate/SelectArgs.js +59 -0
- package/model/Executer/Aggregate/SelectArgs.js.map +1 -0
- package/model/Executer/Aggregate/SelectArgs.mjs +59 -0
- package/model/Executer/Aggregate/SelectArgs.mjs.map +1 -0
- package/model/Executer/Aggregate/index.js +59 -0
- package/model/Executer/Aggregate/index.js.map +1 -0
- package/model/Executer/Aggregate/index.mjs +59 -0
- package/model/Executer/Aggregate/index.mjs.map +1 -0
- package/model/Executer/Create/CreateDataArgs.js +145 -0
- package/model/Executer/Create/CreateDataArgs.js.map +1 -0
- package/model/Executer/Create/CreateDataArgs.mjs +145 -0
- package/model/Executer/Create/CreateDataArgs.mjs.map +1 -0
- package/model/Executer/Create/index.js +101 -0
- package/model/Executer/Create/index.js.map +1 -0
- package/model/Executer/Create/index.mjs +101 -0
- package/model/Executer/Create/index.mjs.map +1 -0
- package/model/Executer/Delete/index.js +112 -0
- package/model/Executer/Delete/index.js.map +1 -0
- package/model/Executer/Delete/index.mjs +112 -0
- package/model/Executer/Delete/index.mjs.map +1 -0
- package/model/Executer/Find/DistinctArgs.js +32 -0
- package/model/Executer/Find/DistinctArgs.js.map +1 -0
- package/model/Executer/Find/DistinctArgs.mjs +32 -0
- package/model/Executer/Find/DistinctArgs.mjs.map +1 -0
- package/model/Executer/Find/LimitArgs.js +31 -0
- package/model/Executer/Find/LimitArgs.js.map +1 -0
- package/model/Executer/Find/LimitArgs.mjs +31 -0
- package/model/Executer/Find/LimitArgs.mjs.map +1 -0
- package/model/Executer/Find/OrderByArgs.js +29 -0
- package/model/Executer/Find/OrderByArgs.js.map +1 -0
- package/model/Executer/Find/OrderByArgs.mjs +29 -0
- package/model/Executer/Find/OrderByArgs.mjs.map +1 -0
- package/model/Executer/Find/SelectArgs.js +119 -0
- package/model/Executer/Find/SelectArgs.js.map +1 -0
- package/model/Executer/Find/SelectArgs.mjs +119 -0
- package/model/Executer/Find/SelectArgs.mjs.map +1 -0
- package/model/Executer/Find/index.js +338 -0
- package/model/Executer/Find/index.js.map +1 -0
- package/model/Executer/Find/index.mjs +338 -0
- package/model/Executer/Find/index.mjs.map +1 -0
- package/model/Executer/Update/UpdateDataArgs.js +124 -0
- package/model/Executer/Update/UpdateDataArgs.js.map +1 -0
- package/model/Executer/Update/UpdateDataArgs.mjs +124 -0
- package/model/Executer/Update/UpdateDataArgs.mjs.map +1 -0
- package/model/Executer/Update/index.js +207 -0
- package/model/Executer/Update/index.js.map +1 -0
- package/model/Executer/Update/index.mjs +207 -0
- package/model/Executer/Update/index.mjs.map +1 -0
- package/model/include/ValueFormatter.js +99 -0
- package/model/include/ValueFormatter.js.map +1 -0
- package/model/include/ValueFormatter.mjs +99 -0
- package/model/include/ValueFormatter.mjs.map +1 -0
- package/model/index.d.ts +29 -0
- package/model/index.js +236 -0
- package/model/index.js.map +1 -0
- package/model/index.mjs +236 -0
- package/model/index.mjs.map +1 -0
- package/model/type.d.ts +106 -0
- package/package.json +32 -0
- package/readme.md +359 -0
- package/utils/chunker.js +53 -0
- package/utils/chunker.js.map +1 -0
- package/utils/chunker.mjs +53 -0
- package/utils/chunker.mjs.map +1 -0
- package/utils/index.js +49 -0
- package/utils/index.js.map +1 -0
- package/utils/index.mjs +49 -0
- package/utils/index.mjs.map +1 -0
- package/utils/sha256.js +66 -0
- package/utils/sha256.js.map +1 -0
- package/utils/sha256.mjs +66 -0
- package/utils/sha256.mjs.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/model/Executer/Find/index.ts"],"sourcesContent":["import Model from \"../..\";\nimport Foreign, { ForeignInfoType } from \"../../../core/classes/ForeignInfo\";\nimport ExecuteMeta from \"../../../core/ExcuteMeta\";\nimport { RowObject } from \"../../../core/type\";\nimport XansqlError from \"../../../core/XansqlError\";\nimport { chunkArray, chunkNumbers } from \"../../../utils/chunker\";\nimport RelationExecuteArgs from \"../../Args/RelationExcuteArgs\";\nimport WhereArgs from \"../../Args/WhereArgs\";\nimport { FindArgsAggregate, FindArgsType } from \"../../type\";\nimport AggregateExecuter from \"../Aggregate\";\nimport DistinctArgs from \"./DistinctArgs\";\nimport LimitArgs from \"./LimitArgs\";\nimport OrderByArgs from \"./OrderByArgs\";\nimport SelectArgs, { SelectArgsRelationInfo } from \"./SelectArgs\";\n\nclass FindExecuter {\n model: Model\n transformer: ((row: RowObject) => Promise<RowObject>) | null = null\n constructor(model: Model, transformer: ((row: RowObject) => Promise<RowObject>) | null = null) {\n this.model = model\n this.transformer = transformer\n }\n\n async execute(args: FindArgsType) {\n const xansql = this.model.xansql\n const model = this.model\n const Select = new SelectArgs(model, args.select || {})\n const Where = new WhereArgs(model, args.where || {})\n const Limit = new LimitArgs(model, args.limit || {})\n const OrderBy = new OrderByArgs(model, args.orderBy || {})\n const Distinct = new DistinctArgs(model, args.distinct || [], Where, args.orderBy)\n const isRelation = args instanceof RelationExecuteArgs\n\n let where_sql = Where.sql\n if (Distinct.sql) {\n where_sql = where_sql ? `${where_sql} AND ${Distinct.sql}` : `WHERE ${Distinct.sql}`\n }\n\n // batch execution with limit and offset\n let results: any[] = []\n\n if (!Limit.sql) {\n let executeId = undefined;\n if (typeof window !== \"undefined\") {\n executeId = ExecuteMeta.set({\n model,\n action: \"SELECT\",\n modelType: isRelation ? \"child\" : \"main\",\n args\n });\n }\n const sql = `SELECT ${Select.sql} FROM ${model.table} ${where_sql}${OrderBy.sql}`.trim()\n const executed = await xansql.execute(sql, executeId)\n if (executed?.results) {\n results = results.concat(executed.results)\n }\n } else {\n for (let { take, skip } of chunkNumbers(Limit.take)) {\n let executeId = undefined;\n if (typeof window !== \"undefined\") {\n executeId = ExecuteMeta.set({\n model,\n action: \"SELECT\",\n modelType: isRelation ? \"child\" : \"main\",\n args\n });\n }\n const batchLimitArgs = new LimitArgs(model, { take, skip: Limit.skip + skip })\n const sql = `SELECT ${Select.sql} FROM ${model.table} ${where_sql}${OrderBy.sql}${batchLimitArgs.sql}`.trim()\n const executed = await xansql.execute(sql, executeId)\n if (executed?.results) {\n results = results.concat(executed.results)\n }\n }\n }\n\n if (results?.length) {\n const is = Select.formatable_columns.length\n || Object.keys(Select.relations).length\n || Object.keys(args.aggregate || {}).length\n\n if (!is) return results\n\n const freses: { [col: string]: any[] } = {}\n let idsList: { [col: string]: number[] } = {}\n\n for (let column in Select.relations) {\n const relation = Select.relations[column]\n const ids: number[] = idsList[column] || []\n const foreign = relation.foreign\n if (!idsList[column]) {\n for (let r of results) {\n let id = r[foreign.relation.target]\n if (typeof id === \"number\" && !ids.includes(id)) {\n ids.push(id)\n }\n }\n idsList[column] = ids\n }\n\n const fres = await this.executeRelation(relation, ids)\n freses[column] = fres\n }\n\n const agg_reses: any = {}\n if (Object.keys(args.aggregate || {}).length) {\n const agg_results = await this.aggregate(model, args.aggregate || {}, results)\n for (let col in agg_results) {\n agg_reses[col] = agg_results[col]\n }\n }\n\n for (let { chunk } of chunkArray(results)) {\n for (let row of chunk) {\n // handle formattable columns\n this.formatFormadableColumns(row, Select.formatable_columns)\n row = this?.transformer ? await this.transformer(row) : row\n\n // handle aggregate\n if (Object.keys(agg_reses).length) {\n for (let col in agg_reses) {\n const aggres = agg_reses[col]\n if (!row.aggregate) {\n row.aggregate = {}\n }\n row.aggregate[col] = aggres.results.find((ar: any) => {\n let is = ar[aggres.foreign.relation.main] === row[aggres.foreign.relation.target]\n if (is) delete ar[aggres.foreign.relation.main]\n return is\n })\n }\n }\n\n // handle relations\n if (Object.keys(freses).length) {\n for (let col in freses) {\n const fres = freses[col]\n const relation = Select.relations[col]\n if (Foreign.isArray(model.schema[col])) {\n row[col] = fres.filter((fr: any) => {\n let is = fr[relation.foreign.relation.main] === row[relation.foreign.relation.target]\n if (is) delete fr[relation.foreign.relation.main]\n return is\n })\n } else {\n row[col] = fres.find((fr: any) => fr[relation.foreign.relation.main] === row[relation.foreign.relation.target]) || null\n }\n }\n }\n }\n }\n }\n return results;\n }\n\n\n private async executeRelation(relation: SelectArgsRelationInfo, ids: number[]) {\n let xansql = this.model.xansql\n let foreign = relation.foreign\n\n const table = foreign.table\n let FModel = xansql.getModel(table)\n const field = FModel.schema[foreign.column]\n let args = relation.args\n\n const chunkedIds = chunkArray(ids, 150)\n\n let fres: any[] = []\n\n for (let { chunk } of chunkedIds) {\n let sql = ''\n const limit = args.limit\n let where_sql = args.where\n let insql = `${foreign.relation.main} IN (${chunk.join(\",\")})`\n where_sql += where_sql ? ` AND ${insql}` : `WHERE ${insql}`\n\n if (!Foreign.isSchema(field)) {\n sql = `SELECT ${args.select.sql} FROM ${table} ${where_sql} ${args.orderBy} ${limit.sql}`.trim()\n } else {\n if (!limit.sql) {\n sql = `SELECT ${args.select.sql} FROM ${table} ${where_sql} ${args.orderBy}`.trim()\n } else {\n sql = `\n SELECT ${args.select.sql} FROM (\n SELECT\n ${args.select.sql},\n ROW_NUMBER() OVER (PARTITION BY ${table}.${foreign.relation.main} ${args.orderBy}) AS ${table}_rank\n FROM ${table}\n ${where_sql}\n ) AS ${table}\n WHERE ${table}_rank > ${limit.skip} AND ${table}_rank <= ${limit.take + limit.skip};\n `\n }\n }\n let executeId = undefined;\n if (typeof window !== \"undefined\") {\n executeId = ExecuteMeta.set({\n model: FModel,\n action: \"SELECT\",\n modelType: \"child\",\n args\n });\n }\n const res = (await xansql.execute(sql, executeId)).results\n if (res) {\n fres = fres.concat(res)\n }\n }\n\n // let insql = `${foreign.relation.main} IN (${ids.join(\",\")})`\n // where_sql += where_sql ? ` AND ${insql}` : `WHERE ${insql}`\n\n // if (!Foreign.isSchema(field)) {\n // sql = `SELECT ${args.select.sql} FROM ${table} ${where_sql} ${args.orderBy} ${limit.sql}`.trim()\n // } else {\n // sql = `\n // SELECT ${args.select.sql} FROM (\n // SELECT\n // ${args.select.sql},\n // ROW_NUMBER() OVER (PARTITION BY ${table}.${foreign.relation.main} ${args.orderBy}) AS ${table}_rank\n // FROM ${table}\n // ${where_sql}\n // ) AS ${table}\n // WHERE ${table}_rank > ${limit.skip} AND ${table}_rank <= ${limit.take + limit.skip};\n // `\n // }\n // const res = (await FModel.execute(sql)).results\n // fres = fres.concat(res)\n\n\n if (fres.length) {\n const is = args.select.formatable_columns.length\n || Object.keys(args.select.relations || {}).length\n || Object.keys(args.aggregate || {}).length\n\n if (!is) return fres\n\n const nested_freses: { [col: string]: any[] } = {}\n const idsList: { [col: string]: number[] } = {}\n // handle nested relations\n for (let col in args.select.relations) {\n const rel = args.select.relations[col]\n const ids: number[] = idsList[col] || []\n const foreign = rel.foreign\n if (!idsList[col]) {\n for (let r of fres) {\n let id = r[foreign.relation.target]\n if (typeof id === \"number\" && !ids.includes(id)) {\n ids.push(id)\n }\n }\n idsList[col] = ids\n }\n const nested_fres = await this.executeRelation(rel, ids)\n nested_freses[col] = nested_fres\n }\n // handle aggregate\n const agg_reses: any = {}\n if (Object.keys(args.aggregate || {}).length) {\n const agg_results = await this.aggregate(FModel, args.aggregate || {}, fres)\n for (let col in agg_results) {\n agg_reses[col] = agg_results[col]\n }\n }\n\n for (let { chunk } of chunkArray(fres)) {\n for (let row of chunk) {\n // handle formattable columns\n this.formatFormadableColumns(row, args.select.formatable_columns)\n row = this?.transformer ? await this.transformer(row) : row\n // handle aggregate\n if (Object.keys(agg_reses).length) {\n for (let col in agg_reses) {\n const aggres = agg_reses[col]\n if (!row.aggregate) {\n row.aggregate = {}\n }\n\n row.aggregate[col] = aggres.results.find((ar: any) => {\n let is = ar[aggres.foreign.relation.target] === row[aggres.foreign.relation.main]\n if (is) delete ar[aggres.foreign.relation.main]\n return is\n })\n }\n }\n\n // handle nested relations\n if (Object.keys(nested_freses).length) {\n for (let col in nested_freses) {\n const nested_fres = nested_freses[col]\n const rel: any = args.select.relations?.[col]\n if (Foreign.isArray(FModel.schema[col])) {\n row[col] = nested_fres.filter((fr: any) => {\n let is = fr[rel.foreign.relation.main] === row[rel.foreign.relation.target]\n if (is) delete fr[rel.foreign.relation.main]\n return is\n })\n } else {\n row[col] = nested_fres.find((fr: any) => fr[rel.foreign.relation.main] === row[rel.foreign.relation.target]) || null\n }\n }\n }\n }\n }\n }\n\n return fres\n }\n\n private formatFormadableColumns(row: any, columns: string[]) {\n for (let col of columns) {\n try {\n row[col] = JSON.parse(row[col])\n } catch (error) {\n row[col] = row[col]\n }\n }\n }\n\n private async aggregate(model: Model, aggregate: FindArgsAggregate, results: any[]) {\n const xansql = model.xansql\n const agg_results: {\n [column: string]: {\n results: any[],\n foreign: ForeignInfoType\n }\n } = {}\n for (let col in aggregate) {\n if (!(col in model.schema)) {\n throw new XansqlError({\n message: `Column ${col} not found in model ${model.table} for aggregate`,\n model: model.table,\n column: col\n })\n }\n const foreign = Foreign.get(model, col)\n if (!foreign) {\n throw new XansqlError({\n message: `Column ${col} is not a foreign column in ${model.table}, cannot aggregate on it.`,\n model: model.table,\n column: col\n })\n }\n if (!Foreign.isArray(model.schema[col])) {\n throw new XansqlError({\n message: `Column ${col} is not a relation column in ${model.table}, cannot aggregate on it.`,\n model: model.table,\n column: col\n })\n }\n\n const FModel = xansql.getModel(foreign.table)\n let ids: number[] = []\n for (let r of results) {\n let id = r[foreign.relation.target]\n if (typeof id === \"number\" && !ids.includes(id)) {\n ids.push(id)\n }\n }\n if (ids.length === 0) continue;\n const AggExecuter = new AggregateExecuter(FModel, false)\n const aggRes = await AggExecuter.execute({\n where: {\n [foreign.relation.main]: {\n in: ids\n }\n },\n groupBy: [foreign.relation.main],\n select: aggregate[col]\n })\n\n agg_results[col] = {\n results: aggRes,\n foreign\n }\n }\n return agg_results;\n }\n\n}\n\nexport default FindExecuter;"],"names":["SelectArgs","WhereArgs","LimitArgs","OrderByArgs","DistinctArgs","RelationExecuteArgs","ExecuteMeta","chunkNumbers","chunkArray","Foreign","XansqlError","AggregateExecuter"],"mappings":"wkBAeA,MAAM,YAAY,CAAA;IAGf,WAAA,CAAY,KAAY,EAAE,WAAA,GAA+D,IAAI,EAAA;QAD7F,IAAA,CAAA,WAAW,GAAoD,IAAI;AAEhE,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW;IACjC;IAEA,MAAM,OAAO,CAAC,IAAkB,EAAA;AAC7B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;AAChC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;AACxB,QAAA,MAAM,MAAM,GAAG,IAAIA,kBAAU,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;AACvD,QAAA,MAAM,KAAK,GAAG,IAAIC,iBAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;AACpD,QAAA,MAAM,KAAK,GAAG,IAAIC,iBAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;AACpD,QAAA,MAAM,OAAO,GAAG,IAAIC,mBAAW,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;AAC1D,QAAA,MAAM,QAAQ,GAAG,IAAIC,oBAAY,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;AAClF,QAAA,MAAM,UAAU,GAAG,IAAI,YAAYC,0BAAmB;AAEtD,QAAA,IAAI,SAAS,GAAG,KAAK,CAAC,GAAG;AACzB,QAAA,IAAI,QAAQ,CAAC,GAAG,EAAE;YACf,SAAS,GAAG,SAAS,GAAG,CAAA,EAAG,SAAS,QAAQ,QAAQ,CAAC,GAAG,CAAA,CAAE,GAAG,CAAA,MAAA,EAAS,QAAQ,CAAC,GAAG,EAAE;QACvF;;QAGA,IAAI,OAAO,GAAU,EAAE;AAEvB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;YACb,IAAI,SAAS,GAAG,SAAS;AACzB,YAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AAChC,gBAAA,SAAS,GAAGC,kBAAW,CAAC,GAAG,CAAC;oBACzB,KAAK;AACL,oBAAA,MAAM,EAAE,QAAQ;oBAChB,SAAS,EAAE,UAAU,GAAG,OAAO,GAAG,MAAM;oBACxC;AACF,iBAAA,CAAC;YACL;YACA,MAAM,GAAG,GAAG,CAAA,OAAA,EAAU,MAAM,CAAC,GAAG,CAAA,MAAA,EAAS,KAAK,CAAC,KAAK,IAAI,SAAS,CAAA,EAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE;YACxF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC;YACrD,IAAI,QAAQ,aAAR,QAAQ,KAAA,MAAA,GAAA,MAAA,GAAR,QAAQ,CAAE,OAAO,EAAE;gBACpB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC7C;QACH;aAAO;AACJ,YAAA,KAAK,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAIC,oBAAY,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;gBAClD,IAAI,SAAS,GAAG,SAAS;AACzB,gBAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AAChC,oBAAA,SAAS,GAAGD,kBAAW,CAAC,GAAG,CAAC;wBACzB,KAAK;AACL,wBAAA,MAAM,EAAE,QAAQ;wBAChB,SAAS,EAAE,UAAU,GAAG,OAAO,GAAG,MAAM;wBACxC;AACF,qBAAA,CAAC;gBACL;AACA,gBAAA,MAAM,cAAc,GAAG,IAAIJ,iBAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC;gBAC9E,MAAM,GAAG,GAAG,CAAA,OAAA,EAAU,MAAM,CAAC,GAAG,CAAA,MAAA,EAAS,KAAK,CAAC,KAAK,CAAA,CAAA,EAAI,SAAS,GAAG,OAAO,CAAC,GAAG,CAAA,EAAG,cAAc,CAAC,GAAG,CAAA,CAAE,CAAC,IAAI,EAAE;gBAC7G,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC;gBACrD,IAAI,QAAQ,aAAR,QAAQ,KAAA,MAAA,GAAA,MAAA,GAAR,QAAQ,CAAE,OAAO,EAAE;oBACpB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC7C;YACH;QACH;QAEA,IAAI,OAAO,aAAP,OAAO,KAAA,MAAA,GAAA,MAAA,GAAP,OAAO,CAAE,MAAM,EAAE;AAClB,YAAA,MAAM,EAAE,GAAG,MAAM,CAAC,kBAAkB,CAAC;mBAC/B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;mBAC9B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM;AAE9C,YAAA,IAAI,CAAC,EAAE;AAAE,gBAAA,OAAO,OAAO;YAEvB,MAAM,MAAM,GAA6B,EAAE;YAC3C,IAAI,OAAO,GAAgC,EAAE;AAE7C,YAAA,KAAK,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,EAAE;gBAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;gBACzC,MAAM,GAAG,GAAa,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;AAC3C,gBAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO;AAChC,gBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACnB,oBAAA,KAAK,IAAI,CAAC,IAAI,OAAO,EAAE;wBACpB,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;AACnC,wBAAA,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;AAC9C,4BAAA,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;wBACf;oBACH;AACA,oBAAA,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG;gBACxB;gBAEA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC;AACtD,gBAAA,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI;YACxB;YAEA,MAAM,SAAS,GAAQ,EAAE;AACzB,YAAA,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;AAC3C,gBAAA,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,OAAO,CAAC;AAC9E,gBAAA,KAAK,IAAI,GAAG,IAAI,WAAW,EAAE;oBAC1B,SAAS,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC;gBACpC;YACH;YAEA,KAAK,IAAI,EAAE,KAAK,EAAE,IAAIM,kBAAU,CAAC,OAAO,CAAC,EAAE;AACxC,gBAAA,KAAK,IAAI,GAAG,IAAI,KAAK,EAAE;;oBAEpB,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,MAAM,CAAC,kBAAkB,CAAC;oBAC5D,GAAG,GAAG,CAAA,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,MAAA,GAAA,MAAA,GAAJ,IAAI,CAAE,WAAW,IAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,GAAG;;oBAG3D,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;AAChC,wBAAA,KAAK,IAAI,GAAG,IAAI,SAAS,EAAE;AACxB,4BAAA,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC;AAC7B,4BAAA,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE;AACjB,gCAAA,GAAG,CAAC,SAAS,GAAG,EAAE;4BACrB;AACA,4BAAA,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAO,KAAI;gCAClD,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;AACjF,gCAAA,IAAI,EAAE;oCAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC/C,gCAAA,OAAO,EAAE;AACZ,4BAAA,CAAC,CAAC;wBACL;oBACH;;oBAGA,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE;AAC7B,wBAAA,KAAK,IAAI,GAAG,IAAI,MAAM,EAAE;AACrB,4BAAA,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC;4BACxB,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;AACtC,4BAAA,IAAIC,mBAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gCACrC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,EAAO,KAAI;oCAChC,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;AACrF,oCAAA,IAAI,EAAE;wCAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;AACjD,oCAAA,OAAO,EAAE;AACZ,gCAAA,CAAC,CAAC;4BACL;iCAAO;AACJ,gCAAA,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAO,KAAK,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI;4BAC1H;wBACH;oBACH;gBACH;YACH;QACH;AACA,QAAA,OAAO,OAAO;IACjB;AAGQ,IAAA,MAAM,eAAe,CAAC,QAAgC,EAAE,GAAa,EAAA;;AAC1E,QAAA,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;AAC9B,QAAA,IAAI,OAAO,GAAG,QAAQ,CAAC,OAAO;AAE9B,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK;QAC3B,IAAI,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;AAC3C,QAAA,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI;QAExB,MAAM,UAAU,GAAGD,kBAAU,CAAC,GAAG,EAAE,GAAG,CAAC;QAEvC,IAAI,IAAI,GAAU,EAAE;AAEpB,QAAA,KAAK,IAAI,EAAE,KAAK,EAAE,IAAI,UAAU,EAAE;YAC/B,IAAI,GAAG,GAAG,EAAE;AACZ,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;AACxB,YAAA,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK;AAC1B,YAAA,IAAI,KAAK,GAAG,CAAA,EAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAA,KAAA,EAAQ,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;AAC9D,YAAA,SAAS,IAAI,SAAS,GAAG,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAE,GAAG,CAAA,MAAA,EAAS,KAAK,EAAE;YAE3D,IAAI,CAACC,mBAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;gBAC3B,GAAG,GAAG,UAAU,IAAI,CAAC,MAAM,CAAC,GAAG,CAAA,MAAA,EAAS,KAAK,CAAA,CAAA,EAAI,SAAS,IAAI,IAAI,CAAC,OAAO,CAAA,CAAA,EAAI,KAAK,CAAC,GAAG,CAAA,CAAE,CAAC,IAAI,EAAE;YACnG;iBAAO;AACJ,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;AACb,oBAAA,GAAG,GAAG,CAAA,OAAA,EAAU,IAAI,CAAC,MAAM,CAAC,GAAG,CAAA,MAAA,EAAS,KAAK,IAAI,SAAS,CAAA,CAAA,EAAI,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE;gBACtF;qBAAO;AACJ,oBAAA,GAAG,GAAG;qBACA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAA;;oBAEhB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAA;kDACe,KAAK,CAAA,CAAA,EAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAA,CAAA,EAAI,IAAI,CAAC,OAAO,CAAA,KAAA,EAAQ,KAAK,CAAA;qBACxF,KAAK;iBACT,SAAS;mBACP,KAAK;AACJ,kBAAA,EAAA,KAAK,CAAA,QAAA,EAAW,KAAK,CAAC,IAAI,CAAA,KAAA,EAAQ,KAAK,CAAA,SAAA,EAAY,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;UACpF;gBACE;YACH;YACA,IAAI,SAAS,GAAG,SAAS;AACzB,YAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AAChC,gBAAA,SAAS,GAAGH,kBAAW,CAAC,GAAG,CAAC;AACzB,oBAAA,KAAK,EAAE,MAAM;AACb,oBAAA,MAAM,EAAE,QAAQ;AAChB,oBAAA,SAAS,EAAE,OAAO;oBAClB;AACF,iBAAA,CAAC;YACL;AACA,YAAA,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,OAAO;YAC1D,IAAI,GAAG,EAAE;AACN,gBAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YAC1B;QACH;;;;;;;;;;;;;;;;;;;AAuBA,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACd,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;AACpC,mBAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;mBACzC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM;AAE9C,YAAA,IAAI,CAAC,EAAE;AAAE,gBAAA,OAAO,IAAI;YAEpB,MAAM,aAAa,GAA6B,EAAE;YAClD,MAAM,OAAO,GAAgC,EAAE;;YAE/C,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;gBACpC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;gBACtC,MAAM,GAAG,GAAa,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE;AACxC,gBAAA,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO;AAC3B,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AAChB,oBAAA,KAAK,IAAI,CAAC,IAAI,IAAI,EAAE;wBACjB,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;AACnC,wBAAA,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;AAC9C,4BAAA,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;wBACf;oBACH;AACA,oBAAA,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG;gBACrB;gBACA,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC;AACxD,gBAAA,aAAa,CAAC,GAAG,CAAC,GAAG,WAAW;YACnC;;YAEA,MAAM,SAAS,GAAQ,EAAE;AACzB,YAAA,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;AAC3C,gBAAA,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,IAAI,CAAC;AAC5E,gBAAA,KAAK,IAAI,GAAG,IAAI,WAAW,EAAE;oBAC1B,SAAS,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC;gBACpC;YACH;YAEA,KAAK,IAAI,EAAE,KAAK,EAAE,IAAIE,kBAAU,CAAC,IAAI,CAAC,EAAE;AACrC,gBAAA,KAAK,IAAI,GAAG,IAAI,KAAK,EAAE;;oBAEpB,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;oBACjE,GAAG,GAAG,CAAA,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,MAAA,GAAA,MAAA,GAAJ,IAAI,CAAE,WAAW,IAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,GAAG;;oBAE3D,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;AAChC,wBAAA,KAAK,IAAI,GAAG,IAAI,SAAS,EAAE;AACxB,4BAAA,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC;AAC7B,4BAAA,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE;AACjB,gCAAA,GAAG,CAAC,SAAS,GAAG,EAAE;4BACrB;AAEA,4BAAA,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAO,KAAI;gCAClD,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;AACjF,gCAAA,IAAI,EAAE;oCAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC/C,gCAAA,OAAO,EAAE;AACZ,4BAAA,CAAC,CAAC;wBACL;oBACH;;oBAGA,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE;AACpC,wBAAA,KAAK,IAAI,GAAG,IAAI,aAAa,EAAE;AAC5B,4BAAA,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC;4BACtC,MAAM,GAAG,GAAQ,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,CAAC,SAAS,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAG,GAAG,CAAC;AAC7C,4BAAA,IAAIC,mBAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gCACtC,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,EAAO,KAAI;oCACvC,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC3E,oCAAA,IAAI,EAAE;wCAAE,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC5C,oCAAA,OAAO,EAAE;AACZ,gCAAA,CAAC,CAAC;4BACL;iCAAO;AACJ,gCAAA,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,EAAO,KAAK,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI;4BACvH;wBACH;oBACH;gBACH;YACH;QACH;AAEA,QAAA,OAAO,IAAI;IACd;IAEQ,uBAAuB,CAAC,GAAQ,EAAE,OAAiB,EAAA;AACxD,QAAA,KAAK,IAAI,GAAG,IAAI,OAAO,EAAE;AACtB,YAAA,IAAI;AACD,gBAAA,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClC;YAAE,OAAO,KAAK,EAAE;gBACb,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;YACtB;QACH;IACH;AAEQ,IAAA,MAAM,SAAS,CAAC,KAAY,EAAE,SAA4B,EAAE,OAAc,EAAA;AAC/E,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;QAC3B,MAAM,WAAW,GAKb,EAAE;AACN,QAAA,KAAK,IAAI,GAAG,IAAI,SAAS,EAAE;YACxB,IAAI,EAAE,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE;gBACzB,MAAM,IAAIC,mBAAW,CAAC;AACnB,oBAAA,OAAO,EAAE,CAAA,OAAA,EAAU,GAAG,uBAAuB,KAAK,CAAC,KAAK,CAAA,cAAA,CAAgB;oBACxE,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,oBAAA,MAAM,EAAE;AACV,iBAAA,CAAC;YACL;YACA,MAAM,OAAO,GAAGD,mBAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;YACvC,IAAI,CAAC,OAAO,EAAE;gBACX,MAAM,IAAIC,mBAAW,CAAC;AACnB,oBAAA,OAAO,EAAE,CAAA,OAAA,EAAU,GAAG,+BAA+B,KAAK,CAAC,KAAK,CAAA,yBAAA,CAA2B;oBAC3F,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,oBAAA,MAAM,EAAE;AACV,iBAAA,CAAC;YACL;AACA,YAAA,IAAI,CAACD,mBAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gBACtC,MAAM,IAAIC,mBAAW,CAAC;AACnB,oBAAA,OAAO,EAAE,CAAA,OAAA,EAAU,GAAG,gCAAgC,KAAK,CAAC,KAAK,CAAA,yBAAA,CAA2B;oBAC5F,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,oBAAA,MAAM,EAAE;AACV,iBAAA,CAAC;YACL;YAEA,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;YAC7C,IAAI,GAAG,GAAa,EAAE;AACtB,YAAA,KAAK,IAAI,CAAC,IAAI,OAAO,EAAE;gBACpB,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;AACnC,gBAAA,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;AAC9C,oBAAA,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACf;YACH;AACA,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE;YACtB,MAAM,WAAW,GAAG,IAAIC,aAAiB,CAAC,MAAM,EAAE,KAAK,CAAC;AACxD,YAAA,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC;AACtC,gBAAA,KAAK,EAAE;AACJ,oBAAA,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,GAAG;AACtB,wBAAA,EAAE,EAAE;AACN;AACH,iBAAA;AACD,gBAAA,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;AAChC,gBAAA,MAAM,EAAE,SAAS,CAAC,GAAG;AACvB,aAAA,CAAC;YAEF,WAAW,CAAC,GAAG,CAAC,GAAG;AAChB,gBAAA,OAAO,EAAE,MAAM;gBACf;aACF;QACJ;AACA,QAAA,OAAO,WAAW;IACrB;AAEF"}
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
import Foreign from'../../../core/classes/ForeignInfo.mjs';import ExecuteMeta from'../../../core/ExcuteMeta.mjs';import XansqlError from'../../../core/XansqlError.mjs';import {chunkNumbers,chunkArray}from'../../../utils/chunker.mjs';import RelationExecuteArgs from'../../Args/RelationExcuteArgs.mjs';import WhereArgs from'../../Args/WhereArgs.mjs';import AggregateExecuter from'../Aggregate/index.mjs';import DistinctArgs from'./DistinctArgs.mjs';import LimitArgs from'./LimitArgs.mjs';import OrderByArgs from'./OrderByArgs.mjs';import SelectArgs from'./SelectArgs.mjs';class FindExecuter {
|
|
2
|
+
constructor(model, transformer = null) {
|
|
3
|
+
this.transformer = null;
|
|
4
|
+
this.model = model;
|
|
5
|
+
this.transformer = transformer;
|
|
6
|
+
}
|
|
7
|
+
async execute(args) {
|
|
8
|
+
const xansql = this.model.xansql;
|
|
9
|
+
const model = this.model;
|
|
10
|
+
const Select = new SelectArgs(model, args.select || {});
|
|
11
|
+
const Where = new WhereArgs(model, args.where || {});
|
|
12
|
+
const Limit = new LimitArgs(model, args.limit || {});
|
|
13
|
+
const OrderBy = new OrderByArgs(model, args.orderBy || {});
|
|
14
|
+
const Distinct = new DistinctArgs(model, args.distinct || [], Where, args.orderBy);
|
|
15
|
+
const isRelation = args instanceof RelationExecuteArgs;
|
|
16
|
+
let where_sql = Where.sql;
|
|
17
|
+
if (Distinct.sql) {
|
|
18
|
+
where_sql = where_sql ? `${where_sql} AND ${Distinct.sql}` : `WHERE ${Distinct.sql}`;
|
|
19
|
+
}
|
|
20
|
+
// batch execution with limit and offset
|
|
21
|
+
let results = [];
|
|
22
|
+
if (!Limit.sql) {
|
|
23
|
+
let executeId = undefined;
|
|
24
|
+
if (typeof window !== "undefined") {
|
|
25
|
+
executeId = ExecuteMeta.set({
|
|
26
|
+
model,
|
|
27
|
+
action: "SELECT",
|
|
28
|
+
modelType: isRelation ? "child" : "main",
|
|
29
|
+
args
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
const sql = `SELECT ${Select.sql} FROM ${model.table} ${where_sql}${OrderBy.sql}`.trim();
|
|
33
|
+
const executed = await xansql.execute(sql, executeId);
|
|
34
|
+
if (executed === null || executed === void 0 ? void 0 : executed.results) {
|
|
35
|
+
results = results.concat(executed.results);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
for (let { take, skip } of chunkNumbers(Limit.take)) {
|
|
40
|
+
let executeId = undefined;
|
|
41
|
+
if (typeof window !== "undefined") {
|
|
42
|
+
executeId = ExecuteMeta.set({
|
|
43
|
+
model,
|
|
44
|
+
action: "SELECT",
|
|
45
|
+
modelType: isRelation ? "child" : "main",
|
|
46
|
+
args
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
const batchLimitArgs = new LimitArgs(model, { take, skip: Limit.skip + skip });
|
|
50
|
+
const sql = `SELECT ${Select.sql} FROM ${model.table} ${where_sql}${OrderBy.sql}${batchLimitArgs.sql}`.trim();
|
|
51
|
+
const executed = await xansql.execute(sql, executeId);
|
|
52
|
+
if (executed === null || executed === void 0 ? void 0 : executed.results) {
|
|
53
|
+
results = results.concat(executed.results);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (results === null || results === void 0 ? void 0 : results.length) {
|
|
58
|
+
const is = Select.formatable_columns.length
|
|
59
|
+
|| Object.keys(Select.relations).length
|
|
60
|
+
|| Object.keys(args.aggregate || {}).length;
|
|
61
|
+
if (!is)
|
|
62
|
+
return results;
|
|
63
|
+
const freses = {};
|
|
64
|
+
let idsList = {};
|
|
65
|
+
for (let column in Select.relations) {
|
|
66
|
+
const relation = Select.relations[column];
|
|
67
|
+
const ids = idsList[column] || [];
|
|
68
|
+
const foreign = relation.foreign;
|
|
69
|
+
if (!idsList[column]) {
|
|
70
|
+
for (let r of results) {
|
|
71
|
+
let id = r[foreign.relation.target];
|
|
72
|
+
if (typeof id === "number" && !ids.includes(id)) {
|
|
73
|
+
ids.push(id);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
idsList[column] = ids;
|
|
77
|
+
}
|
|
78
|
+
const fres = await this.executeRelation(relation, ids);
|
|
79
|
+
freses[column] = fres;
|
|
80
|
+
}
|
|
81
|
+
const agg_reses = {};
|
|
82
|
+
if (Object.keys(args.aggregate || {}).length) {
|
|
83
|
+
const agg_results = await this.aggregate(model, args.aggregate || {}, results);
|
|
84
|
+
for (let col in agg_results) {
|
|
85
|
+
agg_reses[col] = agg_results[col];
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
for (let { chunk } of chunkArray(results)) {
|
|
89
|
+
for (let row of chunk) {
|
|
90
|
+
// handle formattable columns
|
|
91
|
+
this.formatFormadableColumns(row, Select.formatable_columns);
|
|
92
|
+
row = (this === null || this === void 0 ? void 0 : this.transformer) ? await this.transformer(row) : row;
|
|
93
|
+
// handle aggregate
|
|
94
|
+
if (Object.keys(agg_reses).length) {
|
|
95
|
+
for (let col in agg_reses) {
|
|
96
|
+
const aggres = agg_reses[col];
|
|
97
|
+
if (!row.aggregate) {
|
|
98
|
+
row.aggregate = {};
|
|
99
|
+
}
|
|
100
|
+
row.aggregate[col] = aggres.results.find((ar) => {
|
|
101
|
+
let is = ar[aggres.foreign.relation.main] === row[aggres.foreign.relation.target];
|
|
102
|
+
if (is)
|
|
103
|
+
delete ar[aggres.foreign.relation.main];
|
|
104
|
+
return is;
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// handle relations
|
|
109
|
+
if (Object.keys(freses).length) {
|
|
110
|
+
for (let col in freses) {
|
|
111
|
+
const fres = freses[col];
|
|
112
|
+
const relation = Select.relations[col];
|
|
113
|
+
if (Foreign.isArray(model.schema[col])) {
|
|
114
|
+
row[col] = fres.filter((fr) => {
|
|
115
|
+
let is = fr[relation.foreign.relation.main] === row[relation.foreign.relation.target];
|
|
116
|
+
if (is)
|
|
117
|
+
delete fr[relation.foreign.relation.main];
|
|
118
|
+
return is;
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
row[col] = fres.find((fr) => fr[relation.foreign.relation.main] === row[relation.foreign.relation.target]) || null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return results;
|
|
130
|
+
}
|
|
131
|
+
async executeRelation(relation, ids) {
|
|
132
|
+
var _a;
|
|
133
|
+
let xansql = this.model.xansql;
|
|
134
|
+
let foreign = relation.foreign;
|
|
135
|
+
const table = foreign.table;
|
|
136
|
+
let FModel = xansql.getModel(table);
|
|
137
|
+
const field = FModel.schema[foreign.column];
|
|
138
|
+
let args = relation.args;
|
|
139
|
+
const chunkedIds = chunkArray(ids, 150);
|
|
140
|
+
let fres = [];
|
|
141
|
+
for (let { chunk } of chunkedIds) {
|
|
142
|
+
let sql = '';
|
|
143
|
+
const limit = args.limit;
|
|
144
|
+
let where_sql = args.where;
|
|
145
|
+
let insql = `${foreign.relation.main} IN (${chunk.join(",")})`;
|
|
146
|
+
where_sql += where_sql ? ` AND ${insql}` : `WHERE ${insql}`;
|
|
147
|
+
if (!Foreign.isSchema(field)) {
|
|
148
|
+
sql = `SELECT ${args.select.sql} FROM ${table} ${where_sql} ${args.orderBy} ${limit.sql}`.trim();
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
if (!limit.sql) {
|
|
152
|
+
sql = `SELECT ${args.select.sql} FROM ${table} ${where_sql} ${args.orderBy}`.trim();
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
sql = `
|
|
156
|
+
SELECT ${args.select.sql} FROM (
|
|
157
|
+
SELECT
|
|
158
|
+
${args.select.sql},
|
|
159
|
+
ROW_NUMBER() OVER (PARTITION BY ${table}.${foreign.relation.main} ${args.orderBy}) AS ${table}_rank
|
|
160
|
+
FROM ${table}
|
|
161
|
+
${where_sql}
|
|
162
|
+
) AS ${table}
|
|
163
|
+
WHERE ${table}_rank > ${limit.skip} AND ${table}_rank <= ${limit.take + limit.skip};
|
|
164
|
+
`;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
let executeId = undefined;
|
|
168
|
+
if (typeof window !== "undefined") {
|
|
169
|
+
executeId = ExecuteMeta.set({
|
|
170
|
+
model: FModel,
|
|
171
|
+
action: "SELECT",
|
|
172
|
+
modelType: "child",
|
|
173
|
+
args
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
const res = (await xansql.execute(sql, executeId)).results;
|
|
177
|
+
if (res) {
|
|
178
|
+
fres = fres.concat(res);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// let insql = `${foreign.relation.main} IN (${ids.join(",")})`
|
|
182
|
+
// where_sql += where_sql ? ` AND ${insql}` : `WHERE ${insql}`
|
|
183
|
+
// if (!Foreign.isSchema(field)) {
|
|
184
|
+
// sql = `SELECT ${args.select.sql} FROM ${table} ${where_sql} ${args.orderBy} ${limit.sql}`.trim()
|
|
185
|
+
// } else {
|
|
186
|
+
// sql = `
|
|
187
|
+
// SELECT ${args.select.sql} FROM (
|
|
188
|
+
// SELECT
|
|
189
|
+
// ${args.select.sql},
|
|
190
|
+
// ROW_NUMBER() OVER (PARTITION BY ${table}.${foreign.relation.main} ${args.orderBy}) AS ${table}_rank
|
|
191
|
+
// FROM ${table}
|
|
192
|
+
// ${where_sql}
|
|
193
|
+
// ) AS ${table}
|
|
194
|
+
// WHERE ${table}_rank > ${limit.skip} AND ${table}_rank <= ${limit.take + limit.skip};
|
|
195
|
+
// `
|
|
196
|
+
// }
|
|
197
|
+
// const res = (await FModel.execute(sql)).results
|
|
198
|
+
// fres = fres.concat(res)
|
|
199
|
+
if (fres.length) {
|
|
200
|
+
const is = args.select.formatable_columns.length
|
|
201
|
+
|| Object.keys(args.select.relations || {}).length
|
|
202
|
+
|| Object.keys(args.aggregate || {}).length;
|
|
203
|
+
if (!is)
|
|
204
|
+
return fres;
|
|
205
|
+
const nested_freses = {};
|
|
206
|
+
const idsList = {};
|
|
207
|
+
// handle nested relations
|
|
208
|
+
for (let col in args.select.relations) {
|
|
209
|
+
const rel = args.select.relations[col];
|
|
210
|
+
const ids = idsList[col] || [];
|
|
211
|
+
const foreign = rel.foreign;
|
|
212
|
+
if (!idsList[col]) {
|
|
213
|
+
for (let r of fres) {
|
|
214
|
+
let id = r[foreign.relation.target];
|
|
215
|
+
if (typeof id === "number" && !ids.includes(id)) {
|
|
216
|
+
ids.push(id);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
idsList[col] = ids;
|
|
220
|
+
}
|
|
221
|
+
const nested_fres = await this.executeRelation(rel, ids);
|
|
222
|
+
nested_freses[col] = nested_fres;
|
|
223
|
+
}
|
|
224
|
+
// handle aggregate
|
|
225
|
+
const agg_reses = {};
|
|
226
|
+
if (Object.keys(args.aggregate || {}).length) {
|
|
227
|
+
const agg_results = await this.aggregate(FModel, args.aggregate || {}, fres);
|
|
228
|
+
for (let col in agg_results) {
|
|
229
|
+
agg_reses[col] = agg_results[col];
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
for (let { chunk } of chunkArray(fres)) {
|
|
233
|
+
for (let row of chunk) {
|
|
234
|
+
// handle formattable columns
|
|
235
|
+
this.formatFormadableColumns(row, args.select.formatable_columns);
|
|
236
|
+
row = (this === null || this === void 0 ? void 0 : this.transformer) ? await this.transformer(row) : row;
|
|
237
|
+
// handle aggregate
|
|
238
|
+
if (Object.keys(agg_reses).length) {
|
|
239
|
+
for (let col in agg_reses) {
|
|
240
|
+
const aggres = agg_reses[col];
|
|
241
|
+
if (!row.aggregate) {
|
|
242
|
+
row.aggregate = {};
|
|
243
|
+
}
|
|
244
|
+
row.aggregate[col] = aggres.results.find((ar) => {
|
|
245
|
+
let is = ar[aggres.foreign.relation.target] === row[aggres.foreign.relation.main];
|
|
246
|
+
if (is)
|
|
247
|
+
delete ar[aggres.foreign.relation.main];
|
|
248
|
+
return is;
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// handle nested relations
|
|
253
|
+
if (Object.keys(nested_freses).length) {
|
|
254
|
+
for (let col in nested_freses) {
|
|
255
|
+
const nested_fres = nested_freses[col];
|
|
256
|
+
const rel = (_a = args.select.relations) === null || _a === void 0 ? void 0 : _a[col];
|
|
257
|
+
if (Foreign.isArray(FModel.schema[col])) {
|
|
258
|
+
row[col] = nested_fres.filter((fr) => {
|
|
259
|
+
let is = fr[rel.foreign.relation.main] === row[rel.foreign.relation.target];
|
|
260
|
+
if (is)
|
|
261
|
+
delete fr[rel.foreign.relation.main];
|
|
262
|
+
return is;
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
row[col] = nested_fres.find((fr) => fr[rel.foreign.relation.main] === row[rel.foreign.relation.target]) || null;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return fres;
|
|
274
|
+
}
|
|
275
|
+
formatFormadableColumns(row, columns) {
|
|
276
|
+
for (let col of columns) {
|
|
277
|
+
try {
|
|
278
|
+
row[col] = JSON.parse(row[col]);
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
row[col] = row[col];
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
async aggregate(model, aggregate, results) {
|
|
286
|
+
const xansql = model.xansql;
|
|
287
|
+
const agg_results = {};
|
|
288
|
+
for (let col in aggregate) {
|
|
289
|
+
if (!(col in model.schema)) {
|
|
290
|
+
throw new XansqlError({
|
|
291
|
+
message: `Column ${col} not found in model ${model.table} for aggregate`,
|
|
292
|
+
model: model.table,
|
|
293
|
+
column: col
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
const foreign = Foreign.get(model, col);
|
|
297
|
+
if (!foreign) {
|
|
298
|
+
throw new XansqlError({
|
|
299
|
+
message: `Column ${col} is not a foreign column in ${model.table}, cannot aggregate on it.`,
|
|
300
|
+
model: model.table,
|
|
301
|
+
column: col
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
if (!Foreign.isArray(model.schema[col])) {
|
|
305
|
+
throw new XansqlError({
|
|
306
|
+
message: `Column ${col} is not a relation column in ${model.table}, cannot aggregate on it.`,
|
|
307
|
+
model: model.table,
|
|
308
|
+
column: col
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
const FModel = xansql.getModel(foreign.table);
|
|
312
|
+
let ids = [];
|
|
313
|
+
for (let r of results) {
|
|
314
|
+
let id = r[foreign.relation.target];
|
|
315
|
+
if (typeof id === "number" && !ids.includes(id)) {
|
|
316
|
+
ids.push(id);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
if (ids.length === 0)
|
|
320
|
+
continue;
|
|
321
|
+
const AggExecuter = new AggregateExecuter(FModel, false);
|
|
322
|
+
const aggRes = await AggExecuter.execute({
|
|
323
|
+
where: {
|
|
324
|
+
[foreign.relation.main]: {
|
|
325
|
+
in: ids
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
groupBy: [foreign.relation.main],
|
|
329
|
+
select: aggregate[col]
|
|
330
|
+
});
|
|
331
|
+
agg_results[col] = {
|
|
332
|
+
results: aggRes,
|
|
333
|
+
foreign
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
return agg_results;
|
|
337
|
+
}
|
|
338
|
+
}export{FindExecuter as default};//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../src/model/Executer/Find/index.ts"],"sourcesContent":["import Model from \"../..\";\nimport Foreign, { ForeignInfoType } from \"../../../core/classes/ForeignInfo\";\nimport ExecuteMeta from \"../../../core/ExcuteMeta\";\nimport { RowObject } from \"../../../core/type\";\nimport XansqlError from \"../../../core/XansqlError\";\nimport { chunkArray, chunkNumbers } from \"../../../utils/chunker\";\nimport RelationExecuteArgs from \"../../Args/RelationExcuteArgs\";\nimport WhereArgs from \"../../Args/WhereArgs\";\nimport { FindArgsAggregate, FindArgsType } from \"../../type\";\nimport AggregateExecuter from \"../Aggregate\";\nimport DistinctArgs from \"./DistinctArgs\";\nimport LimitArgs from \"./LimitArgs\";\nimport OrderByArgs from \"./OrderByArgs\";\nimport SelectArgs, { SelectArgsRelationInfo } from \"./SelectArgs\";\n\nclass FindExecuter {\n model: Model\n transformer: ((row: RowObject) => Promise<RowObject>) | null = null\n constructor(model: Model, transformer: ((row: RowObject) => Promise<RowObject>) | null = null) {\n this.model = model\n this.transformer = transformer\n }\n\n async execute(args: FindArgsType) {\n const xansql = this.model.xansql\n const model = this.model\n const Select = new SelectArgs(model, args.select || {})\n const Where = new WhereArgs(model, args.where || {})\n const Limit = new LimitArgs(model, args.limit || {})\n const OrderBy = new OrderByArgs(model, args.orderBy || {})\n const Distinct = new DistinctArgs(model, args.distinct || [], Where, args.orderBy)\n const isRelation = args instanceof RelationExecuteArgs\n\n let where_sql = Where.sql\n if (Distinct.sql) {\n where_sql = where_sql ? `${where_sql} AND ${Distinct.sql}` : `WHERE ${Distinct.sql}`\n }\n\n // batch execution with limit and offset\n let results: any[] = []\n\n if (!Limit.sql) {\n let executeId = undefined;\n if (typeof window !== \"undefined\") {\n executeId = ExecuteMeta.set({\n model,\n action: \"SELECT\",\n modelType: isRelation ? \"child\" : \"main\",\n args\n });\n }\n const sql = `SELECT ${Select.sql} FROM ${model.table} ${where_sql}${OrderBy.sql}`.trim()\n const executed = await xansql.execute(sql, executeId)\n if (executed?.results) {\n results = results.concat(executed.results)\n }\n } else {\n for (let { take, skip } of chunkNumbers(Limit.take)) {\n let executeId = undefined;\n if (typeof window !== \"undefined\") {\n executeId = ExecuteMeta.set({\n model,\n action: \"SELECT\",\n modelType: isRelation ? \"child\" : \"main\",\n args\n });\n }\n const batchLimitArgs = new LimitArgs(model, { take, skip: Limit.skip + skip })\n const sql = `SELECT ${Select.sql} FROM ${model.table} ${where_sql}${OrderBy.sql}${batchLimitArgs.sql}`.trim()\n const executed = await xansql.execute(sql, executeId)\n if (executed?.results) {\n results = results.concat(executed.results)\n }\n }\n }\n\n if (results?.length) {\n const is = Select.formatable_columns.length\n || Object.keys(Select.relations).length\n || Object.keys(args.aggregate || {}).length\n\n if (!is) return results\n\n const freses: { [col: string]: any[] } = {}\n let idsList: { [col: string]: number[] } = {}\n\n for (let column in Select.relations) {\n const relation = Select.relations[column]\n const ids: number[] = idsList[column] || []\n const foreign = relation.foreign\n if (!idsList[column]) {\n for (let r of results) {\n let id = r[foreign.relation.target]\n if (typeof id === \"number\" && !ids.includes(id)) {\n ids.push(id)\n }\n }\n idsList[column] = ids\n }\n\n const fres = await this.executeRelation(relation, ids)\n freses[column] = fres\n }\n\n const agg_reses: any = {}\n if (Object.keys(args.aggregate || {}).length) {\n const agg_results = await this.aggregate(model, args.aggregate || {}, results)\n for (let col in agg_results) {\n agg_reses[col] = agg_results[col]\n }\n }\n\n for (let { chunk } of chunkArray(results)) {\n for (let row of chunk) {\n // handle formattable columns\n this.formatFormadableColumns(row, Select.formatable_columns)\n row = this?.transformer ? await this.transformer(row) : row\n\n // handle aggregate\n if (Object.keys(agg_reses).length) {\n for (let col in agg_reses) {\n const aggres = agg_reses[col]\n if (!row.aggregate) {\n row.aggregate = {}\n }\n row.aggregate[col] = aggres.results.find((ar: any) => {\n let is = ar[aggres.foreign.relation.main] === row[aggres.foreign.relation.target]\n if (is) delete ar[aggres.foreign.relation.main]\n return is\n })\n }\n }\n\n // handle relations\n if (Object.keys(freses).length) {\n for (let col in freses) {\n const fres = freses[col]\n const relation = Select.relations[col]\n if (Foreign.isArray(model.schema[col])) {\n row[col] = fres.filter((fr: any) => {\n let is = fr[relation.foreign.relation.main] === row[relation.foreign.relation.target]\n if (is) delete fr[relation.foreign.relation.main]\n return is\n })\n } else {\n row[col] = fres.find((fr: any) => fr[relation.foreign.relation.main] === row[relation.foreign.relation.target]) || null\n }\n }\n }\n }\n }\n }\n return results;\n }\n\n\n private async executeRelation(relation: SelectArgsRelationInfo, ids: number[]) {\n let xansql = this.model.xansql\n let foreign = relation.foreign\n\n const table = foreign.table\n let FModel = xansql.getModel(table)\n const field = FModel.schema[foreign.column]\n let args = relation.args\n\n const chunkedIds = chunkArray(ids, 150)\n\n let fres: any[] = []\n\n for (let { chunk } of chunkedIds) {\n let sql = ''\n const limit = args.limit\n let where_sql = args.where\n let insql = `${foreign.relation.main} IN (${chunk.join(\",\")})`\n where_sql += where_sql ? ` AND ${insql}` : `WHERE ${insql}`\n\n if (!Foreign.isSchema(field)) {\n sql = `SELECT ${args.select.sql} FROM ${table} ${where_sql} ${args.orderBy} ${limit.sql}`.trim()\n } else {\n if (!limit.sql) {\n sql = `SELECT ${args.select.sql} FROM ${table} ${where_sql} ${args.orderBy}`.trim()\n } else {\n sql = `\n SELECT ${args.select.sql} FROM (\n SELECT\n ${args.select.sql},\n ROW_NUMBER() OVER (PARTITION BY ${table}.${foreign.relation.main} ${args.orderBy}) AS ${table}_rank\n FROM ${table}\n ${where_sql}\n ) AS ${table}\n WHERE ${table}_rank > ${limit.skip} AND ${table}_rank <= ${limit.take + limit.skip};\n `\n }\n }\n let executeId = undefined;\n if (typeof window !== \"undefined\") {\n executeId = ExecuteMeta.set({\n model: FModel,\n action: \"SELECT\",\n modelType: \"child\",\n args\n });\n }\n const res = (await xansql.execute(sql, executeId)).results\n if (res) {\n fres = fres.concat(res)\n }\n }\n\n // let insql = `${foreign.relation.main} IN (${ids.join(\",\")})`\n // where_sql += where_sql ? ` AND ${insql}` : `WHERE ${insql}`\n\n // if (!Foreign.isSchema(field)) {\n // sql = `SELECT ${args.select.sql} FROM ${table} ${where_sql} ${args.orderBy} ${limit.sql}`.trim()\n // } else {\n // sql = `\n // SELECT ${args.select.sql} FROM (\n // SELECT\n // ${args.select.sql},\n // ROW_NUMBER() OVER (PARTITION BY ${table}.${foreign.relation.main} ${args.orderBy}) AS ${table}_rank\n // FROM ${table}\n // ${where_sql}\n // ) AS ${table}\n // WHERE ${table}_rank > ${limit.skip} AND ${table}_rank <= ${limit.take + limit.skip};\n // `\n // }\n // const res = (await FModel.execute(sql)).results\n // fres = fres.concat(res)\n\n\n if (fres.length) {\n const is = args.select.formatable_columns.length\n || Object.keys(args.select.relations || {}).length\n || Object.keys(args.aggregate || {}).length\n\n if (!is) return fres\n\n const nested_freses: { [col: string]: any[] } = {}\n const idsList: { [col: string]: number[] } = {}\n // handle nested relations\n for (let col in args.select.relations) {\n const rel = args.select.relations[col]\n const ids: number[] = idsList[col] || []\n const foreign = rel.foreign\n if (!idsList[col]) {\n for (let r of fres) {\n let id = r[foreign.relation.target]\n if (typeof id === \"number\" && !ids.includes(id)) {\n ids.push(id)\n }\n }\n idsList[col] = ids\n }\n const nested_fres = await this.executeRelation(rel, ids)\n nested_freses[col] = nested_fres\n }\n // handle aggregate\n const agg_reses: any = {}\n if (Object.keys(args.aggregate || {}).length) {\n const agg_results = await this.aggregate(FModel, args.aggregate || {}, fres)\n for (let col in agg_results) {\n agg_reses[col] = agg_results[col]\n }\n }\n\n for (let { chunk } of chunkArray(fres)) {\n for (let row of chunk) {\n // handle formattable columns\n this.formatFormadableColumns(row, args.select.formatable_columns)\n row = this?.transformer ? await this.transformer(row) : row\n // handle aggregate\n if (Object.keys(agg_reses).length) {\n for (let col in agg_reses) {\n const aggres = agg_reses[col]\n if (!row.aggregate) {\n row.aggregate = {}\n }\n\n row.aggregate[col] = aggres.results.find((ar: any) => {\n let is = ar[aggres.foreign.relation.target] === row[aggres.foreign.relation.main]\n if (is) delete ar[aggres.foreign.relation.main]\n return is\n })\n }\n }\n\n // handle nested relations\n if (Object.keys(nested_freses).length) {\n for (let col in nested_freses) {\n const nested_fres = nested_freses[col]\n const rel: any = args.select.relations?.[col]\n if (Foreign.isArray(FModel.schema[col])) {\n row[col] = nested_fres.filter((fr: any) => {\n let is = fr[rel.foreign.relation.main] === row[rel.foreign.relation.target]\n if (is) delete fr[rel.foreign.relation.main]\n return is\n })\n } else {\n row[col] = nested_fres.find((fr: any) => fr[rel.foreign.relation.main] === row[rel.foreign.relation.target]) || null\n }\n }\n }\n }\n }\n }\n\n return fres\n }\n\n private formatFormadableColumns(row: any, columns: string[]) {\n for (let col of columns) {\n try {\n row[col] = JSON.parse(row[col])\n } catch (error) {\n row[col] = row[col]\n }\n }\n }\n\n private async aggregate(model: Model, aggregate: FindArgsAggregate, results: any[]) {\n const xansql = model.xansql\n const agg_results: {\n [column: string]: {\n results: any[],\n foreign: ForeignInfoType\n }\n } = {}\n for (let col in aggregate) {\n if (!(col in model.schema)) {\n throw new XansqlError({\n message: `Column ${col} not found in model ${model.table} for aggregate`,\n model: model.table,\n column: col\n })\n }\n const foreign = Foreign.get(model, col)\n if (!foreign) {\n throw new XansqlError({\n message: `Column ${col} is not a foreign column in ${model.table}, cannot aggregate on it.`,\n model: model.table,\n column: col\n })\n }\n if (!Foreign.isArray(model.schema[col])) {\n throw new XansqlError({\n message: `Column ${col} is not a relation column in ${model.table}, cannot aggregate on it.`,\n model: model.table,\n column: col\n })\n }\n\n const FModel = xansql.getModel(foreign.table)\n let ids: number[] = []\n for (let r of results) {\n let id = r[foreign.relation.target]\n if (typeof id === \"number\" && !ids.includes(id)) {\n ids.push(id)\n }\n }\n if (ids.length === 0) continue;\n const AggExecuter = new AggregateExecuter(FModel, false)\n const aggRes = await AggExecuter.execute({\n where: {\n [foreign.relation.main]: {\n in: ids\n }\n },\n groupBy: [foreign.relation.main],\n select: aggregate[col]\n })\n\n agg_results[col] = {\n results: aggRes,\n foreign\n }\n }\n return agg_results;\n }\n\n}\n\nexport default FindExecuter;"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var ForeignInfo=require('../../../core/classes/ForeignInfo.js'),XansqlError=require('../../../core/XansqlError.js'),Date$1=require('../../../Types/fields/Date.js'),index=require('../../../utils/index.js'),ValueFormatter=require('../../include/ValueFormatter.js');class UpdateDataArgs {
|
|
2
|
+
constructor(model, data) {
|
|
3
|
+
/**
|
|
4
|
+
* Generate SQL for data
|
|
5
|
+
* For create mode: (col1, col2, col3) VALUES (val1, val2, val3)
|
|
6
|
+
* For update mode: col1 = val1, col2 = val2, col3 = val3
|
|
7
|
+
*/
|
|
8
|
+
this.data = {};
|
|
9
|
+
this.files = {};
|
|
10
|
+
/**
|
|
11
|
+
* Get data object
|
|
12
|
+
* format: { col1: val1, col2: val2, col3: val3 }
|
|
13
|
+
*/
|
|
14
|
+
this.relations = {};
|
|
15
|
+
this.errors = [];
|
|
16
|
+
for (let column in data) {
|
|
17
|
+
const field = model.schema[column];
|
|
18
|
+
let value = data[column];
|
|
19
|
+
try {
|
|
20
|
+
if (ForeignInfo.default.is(field)) {
|
|
21
|
+
if (ForeignInfo.default.isSchema(field)) {
|
|
22
|
+
if (index.isNumber(value)) {
|
|
23
|
+
this.data[column] = value;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
throw new XansqlError.default({
|
|
27
|
+
message: `Invalid value for foreign key column ${model.table}.${column}. Expected number (ID), got ${typeof value}`,
|
|
28
|
+
model: model.table,
|
|
29
|
+
column: column
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// relation operation
|
|
35
|
+
if (!index.isObject(value)) {
|
|
36
|
+
throw new XansqlError.default({
|
|
37
|
+
message: `Invalid value for relation column ${model.table}.${column}. Expected object for relation operations, got ${typeof value}`,
|
|
38
|
+
model: model.table,
|
|
39
|
+
column: column
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
if (value.delete && !index.isObject(value.delete.where)) {
|
|
43
|
+
throw new XansqlError.default({
|
|
44
|
+
message: `Invalid value for relation delete operation in column ${model.table}.${column}. 'where' field is required and must be an object.`,
|
|
45
|
+
model: model.table,
|
|
46
|
+
column: column
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (value.update && (!index.isObject(value.update.where) || !index.isObject(value.update.data))) {
|
|
50
|
+
throw new XansqlError.default({
|
|
51
|
+
message: `Invalid value for relation update operation in column ${model.table}.${column}. 'where' and 'data' fields are required and must be objects.`,
|
|
52
|
+
model: model.table,
|
|
53
|
+
column: column
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
if (value.create && (!index.isObject(value.create.data) && !index.isArray(value.create.data))) {
|
|
57
|
+
throw new XansqlError.default({
|
|
58
|
+
message: `Invalid value for relation create operation in column ${model.table}.${column}. 'data' field is required and must be an object or array.`,
|
|
59
|
+
model: model.table,
|
|
60
|
+
column: column
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
if (value.upsert && (!index.isObject(value.upsert.where) || !index.isObject(value.upsert.create) || !index.isObject(value.upsert.update))) {
|
|
64
|
+
throw new XansqlError.default({
|
|
65
|
+
message: `Invalid value for relation upsert operation in column ${model.table}.${column}. 'where', 'create', and 'update' fields are required and must be objects.`,
|
|
66
|
+
model: model.table,
|
|
67
|
+
column: column
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
const foreign = ForeignInfo.default.get(model, column);
|
|
71
|
+
this.relations[column] = {
|
|
72
|
+
args: value,
|
|
73
|
+
foreign
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
// check is the field is IDField or created_at or updated_at
|
|
79
|
+
if (model.IDColumn === column || field instanceof Date$1.default && (field.meta.update || field.meta.create)) {
|
|
80
|
+
throw new XansqlError.default({
|
|
81
|
+
message: `Cannot set value for ${model.table}.${column}. It is automatically managed.`,
|
|
82
|
+
model: model.table,
|
|
83
|
+
column: column
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (value instanceof File) {
|
|
87
|
+
this.files[column] = value;
|
|
88
|
+
this.data[column] = "";
|
|
89
|
+
ValueFormatter.default.toSql(model, column, value); // for validation
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
this.data[column] = ValueFormatter.default.toSql(model, column, value);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
if (error instanceof XansqlError.default) {
|
|
98
|
+
this.errors.push(error);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (this.errors.length > 0) {
|
|
106
|
+
throw this.errors;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Auto add missing columns with null value for create mode
|
|
110
|
+
* Auto add updated_at column with current timestamp for update mode
|
|
111
|
+
* Skip foreign key columns which are not optional or nullable in create mode
|
|
112
|
+
* Skip ID column in create mode
|
|
113
|
+
* Skip created_at column in update mode
|
|
114
|
+
* Skip updated_at column in create mode
|
|
115
|
+
* Skip columns which are already set in data
|
|
116
|
+
*/
|
|
117
|
+
for (let column in model.schema) {
|
|
118
|
+
const field = model.schema[column];
|
|
119
|
+
if (field instanceof Date$1.default && field.meta.update) {
|
|
120
|
+
this.data[column] = ValueFormatter.default.toSql(model, column, new Date());
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}exports.default=UpdateDataArgs;//# sourceMappingURL=UpdateDataArgs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UpdateDataArgs.js","sources":["../../../../src/model/Executer/Update/UpdateDataArgs.ts"],"sourcesContent":["import Model from \"../..\"\nimport Foreign, { ForeignInfoType } from \"../../../core/classes/ForeignInfo\"\nimport XansqlError from \"../../../core/XansqlError\"\nimport XqlDate from \"../../../Types/fields/Date\"\nimport { isArray, isNumber, isObject } from \"../../../utils\"\nimport ValueFormatter from \"../../include/ValueFormatter\"\nimport { DataArgsType, UpdateDataRelationArgs } from \"../../type\"\n\n\ntype DataObject = { [column: string]: any }\ntype RelationObject = {\n [column: string]: {\n args: UpdateDataRelationArgs\n foreign: ForeignInfoType;\n relations?: RelationObject\n }\n}\n\ntype Files = {\n [column: string]: File\n}\n\n\nclass UpdateDataArgs {\n\n /**\n * Generate SQL for data\n * For create mode: (col1, col2, col3) VALUES (val1, val2, val3)\n * For update mode: col1 = val1, col2 = val2, col3 = val3\n */\n readonly data: DataObject = {}\n\n readonly files: Files = {}\n /**\n * Get data object\n * format: { col1: val1, col2: val2, col3: val3 }\n */\n readonly relations: RelationObject = {}\n\n private errors: XansqlError[] = []\n\n constructor(model: Model, data: DataArgsType) {\n\n for (let column in data) {\n const field = model.schema[column]\n let value: any = data[column]\n try {\n\n if (Foreign.is(field)) {\n if (Foreign.isSchema(field)) {\n if (isNumber(value)) {\n this.data[column] = value\n } else {\n throw new XansqlError({\n message: `Invalid value for foreign key column ${model.table}.${column}. Expected number (ID), got ${typeof value}`,\n model: model.table,\n column: column\n });\n }\n } else {\n // relation operation\n if (!isObject(value)) {\n throw new XansqlError({\n message: `Invalid value for relation column ${model.table}.${column}. Expected object for relation operations, got ${typeof value}`,\n model: model.table,\n column: column\n });\n }\n\n if (value.delete && !isObject(value.delete.where)) {\n throw new XansqlError({\n message: `Invalid value for relation delete operation in column ${model.table}.${column}. 'where' field is required and must be an object.`,\n model: model.table,\n column: column\n });\n }\n\n if (value.update && (!isObject(value.update.where) || !isObject(value.update.data))) {\n throw new XansqlError({\n message: `Invalid value for relation update operation in column ${model.table}.${column}. 'where' and 'data' fields are required and must be objects.`,\n model: model.table,\n column: column\n });\n }\n\n if (value.create && (!isObject(value.create.data) && !isArray(value.create.data))) {\n throw new XansqlError({\n message: `Invalid value for relation create operation in column ${model.table}.${column}. 'data' field is required and must be an object or array.`,\n model: model.table,\n column: column\n });\n }\n\n if (value.upsert && (!isObject(value.upsert.where) || !isObject(value.upsert.create) || !isObject(value.upsert.update))) {\n throw new XansqlError({\n message: `Invalid value for relation upsert operation in column ${model.table}.${column}. 'where', 'create', and 'update' fields are required and must be objects.`,\n model: model.table,\n column: column\n });\n }\n\n const foreign = Foreign.get(model, column)\n this.relations[column] = {\n args: value,\n foreign\n }\n }\n } else {\n // check is the field is IDField or created_at or updated_at\n if (model.IDColumn === column || field instanceof XqlDate && (field.meta.update || field.meta.create)) {\n throw new XansqlError({\n message: `Cannot set value for ${model.table}.${column}. It is automatically managed.`,\n model: model.table,\n column: column\n });\n }\n\n if (value instanceof File) {\n this.files[column] = value\n this.data[column] = \"\"\n ValueFormatter.toSql(model, column, value) // for validation\n } else {\n this.data[column] = ValueFormatter.toSql(model, column, value)\n }\n }\n } catch (error) {\n if (error instanceof XansqlError) {\n this.errors.push(error);\n } else {\n throw error\n }\n }\n }\n\n if (this.errors.length > 0) {\n throw this.errors\n }\n\n /**\n * Auto add missing columns with null value for create mode\n * Auto add updated_at column with current timestamp for update mode\n * Skip foreign key columns which are not optional or nullable in create mode\n * Skip ID column in create mode\n * Skip created_at column in update mode\n * Skip updated_at column in create mode\n * Skip columns which are already set in data\n */\n for (let column in model.schema) {\n const field = model.schema[column]\n if (field instanceof XqlDate && field.meta.update) {\n this.data[column] = ValueFormatter.toSql(model, column, new Date())\n }\n }\n\n }\n\n}\n\nexport default UpdateDataArgs"],"names":["Foreign","isNumber","XansqlError","isObject","isArray","XqlDate","ValueFormatter"],"mappings":"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"}
|