xansql 1.0.8 → 1.0.9
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/core/Xansql.cjs +7 -8
- package/core/Xansql.cjs.map +1 -1
- package/core/Xansql.d.ts +2 -3
- package/core/Xansql.mjs +7 -8
- package/core/Xansql.mjs.map +1 -1
- package/core/classes/ForeignInfo.cjs +3 -2
- package/core/classes/ForeignInfo.cjs.map +1 -1
- package/core/classes/ForeignInfo.d.ts +1 -2
- package/core/classes/ForeignInfo.mjs +3 -2
- package/core/classes/ForeignInfo.mjs.map +1 -1
- package/core/classes/Migration/TableMigration.cjs +24 -15
- package/core/classes/Migration/TableMigration.cjs.map +1 -1
- package/core/classes/Migration/TableMigration.mjs +25 -16
- package/core/classes/Migration/TableMigration.mjs.map +1 -1
- package/core/classes/Migration/index.cjs +13 -10
- package/core/classes/Migration/index.cjs.map +1 -1
- package/core/classes/Migration/index.mjs +14 -11
- package/core/classes/Migration/index.mjs.map +1 -1
- package/core/classes/{ModelFormatter.cjs → ModelFactory.cjs} +82 -56
- package/core/classes/ModelFactory.cjs.map +1 -0
- package/core/classes/{ModelFormatter.d.ts → ModelFactory.d.ts} +7 -2
- package/core/classes/{ModelFormatter.mjs → ModelFactory.mjs} +82 -56
- package/core/classes/ModelFactory.mjs.map +1 -0
- package/core/types.d.ts +1 -1
- package/dialect/MysqlDialect.cjs +7 -4
- package/dialect/MysqlDialect.cjs.map +1 -1
- package/dialect/MysqlDialect.d.ts +7 -4
- package/dialect/MysqlDialect.mjs +7 -4
- package/dialect/MysqlDialect.mjs.map +1 -1
- package/dialect/PostgresDialect.cjs +5 -2
- package/dialect/PostgresDialect.cjs.map +1 -1
- package/dialect/PostgresDialect.d.ts +5 -2
- package/dialect/PostgresDialect.mjs +5 -2
- package/dialect/PostgresDialect.mjs.map +1 -1
- package/dialect/SqliteDialect.cjs +3 -2
- package/dialect/SqliteDialect.cjs.map +1 -1
- package/dialect/SqliteDialect.d.ts +3 -2
- package/dialect/SqliteDialect.mjs +3 -2
- package/dialect/SqliteDialect.mjs.map +1 -1
- package/dialect/XansqlBridge/XansqlBridgeServer.cjs.map +1 -1
- package/dialect/XansqlBridge/XansqlBridgeServer.mjs.map +1 -1
- package/dialect/XansqlBridge/base.cjs +10 -5
- package/dialect/XansqlBridge/base.cjs.map +1 -1
- package/dialect/XansqlBridge/base.mjs +10 -5
- package/dialect/XansqlBridge/base.mjs.map +1 -1
- package/model/Args/WhereArgs.cjs +5 -8
- package/model/Args/WhereArgs.cjs.map +1 -1
- package/model/Args/WhereArgs.mjs +6 -9
- package/model/Args/WhereArgs.mjs.map +1 -1
- package/model/Base.cjs +2 -1
- package/model/Base.cjs.map +1 -1
- package/model/Base.mjs +2 -1
- package/model/Base.mjs.map +1 -1
- package/model/Executer/Aggregate/SelectArgs.cjs +2 -1
- package/model/Executer/Aggregate/SelectArgs.cjs.map +1 -1
- package/model/Executer/Aggregate/SelectArgs.mjs +2 -1
- package/model/Executer/Aggregate/SelectArgs.mjs.map +1 -1
- package/model/Executer/Aggregate/index.cjs +4 -4
- package/model/Executer/Aggregate/index.cjs.map +1 -1
- package/model/Executer/Aggregate/index.mjs +4 -4
- package/model/Executer/Aggregate/index.mjs.map +1 -1
- package/model/Executer/Create/CreateDataArgs.cjs +9 -5
- package/model/Executer/Create/CreateDataArgs.cjs.map +1 -1
- package/model/Executer/Create/CreateDataArgs.mjs +10 -6
- package/model/Executer/Create/CreateDataArgs.mjs.map +1 -1
- package/model/Executer/Create/index.cjs +1 -1
- package/model/Executer/Create/index.cjs.map +1 -1
- package/model/Executer/Create/index.mjs +1 -1
- package/model/Executer/Create/index.mjs.map +1 -1
- package/model/Executer/Delete/index.cjs +2 -1
- package/model/Executer/Delete/index.cjs.map +1 -1
- package/model/Executer/Delete/index.mjs +2 -1
- package/model/Executer/Delete/index.mjs.map +1 -1
- package/model/Executer/Find/SelectArgs.cjs +3 -3
- package/model/Executer/Find/SelectArgs.cjs.map +1 -1
- package/model/Executer/Find/SelectArgs.mjs +3 -3
- package/model/Executer/Find/SelectArgs.mjs.map +1 -1
- package/model/Executer/Update/UpdateDataArgs.cjs +4 -4
- package/model/Executer/Update/UpdateDataArgs.cjs.map +1 -1
- package/model/Executer/Update/UpdateDataArgs.mjs +5 -5
- package/model/Executer/Update/UpdateDataArgs.mjs.map +1 -1
- package/model/Executer/Update/index.cjs +1 -1
- package/model/Executer/Update/index.cjs.map +1 -1
- package/model/Executer/Update/index.mjs +1 -1
- package/model/Executer/Update/index.mjs.map +1 -1
- package/model/include/ValueFormatter.cjs +72 -17
- package/model/include/ValueFormatter.cjs.map +1 -1
- package/model/include/ValueFormatter.d.ts +1 -1
- package/model/include/ValueFormatter.mjs +72 -17
- package/model/include/ValueFormatter.mjs.map +1 -1
- package/model/index.cjs +8 -7
- package/model/index.cjs.map +1 -1
- package/model/index.mjs +8 -7
- package/model/index.mjs.map +1 -1
- package/package.json +12 -7
- package/utils/index.cjs +5 -2
- package/utils/index.cjs.map +1 -1
- package/utils/index.d.ts +2 -1
- package/utils/index.mjs +5 -3
- package/utils/index.mjs.map +1 -1
- package/xt/additional/IP.cjs +22 -0
- package/xt/additional/IP.cjs.map +1 -0
- package/xt/additional/IP.d.ts +6 -0
- package/xt/additional/IP.mjs +20 -0
- package/xt/additional/IP.mjs.map +1 -0
- package/xt/additional/Name.cjs +21 -0
- package/xt/additional/Name.cjs.map +1 -0
- package/xt/additional/Name.d.ts +6 -0
- package/xt/additional/Name.mjs +19 -0
- package/xt/additional/Name.mjs.map +1 -0
- package/xt/additional/Password.cjs +25 -0
- package/xt/additional/Password.cjs.map +1 -0
- package/xt/additional/Password.d.ts +6 -0
- package/xt/additional/Password.mjs +23 -0
- package/xt/additional/Password.mjs.map +1 -0
- package/xt/additional/Phone.cjs +21 -0
- package/xt/additional/Phone.cjs.map +1 -0
- package/xt/additional/Phone.d.ts +6 -0
- package/xt/additional/Phone.mjs +19 -0
- package/xt/additional/Phone.mjs.map +1 -0
- package/xt/additional/Photo.cjs +21 -0
- package/xt/additional/Photo.cjs.map +1 -0
- package/xt/additional/Photo.d.ts +6 -0
- package/xt/additional/Photo.mjs +19 -0
- package/xt/additional/Photo.mjs.map +1 -0
- package/xt/additional/Slug.cjs +21 -0
- package/xt/additional/Slug.cjs.map +1 -0
- package/xt/additional/Slug.d.ts +6 -0
- package/xt/additional/Slug.mjs +19 -0
- package/xt/additional/Slug.mjs.map +1 -0
- package/xt/additional/Url.cjs +26 -0
- package/xt/additional/Url.cjs.map +1 -0
- package/xt/additional/Url.d.ts +6 -0
- package/xt/additional/Url.mjs +24 -0
- package/xt/additional/Url.mjs.map +1 -0
- package/xt/additional/Username.cjs +21 -0
- package/xt/additional/Username.cjs.map +1 -0
- package/xt/additional/Username.d.ts +6 -0
- package/xt/additional/Username.mjs +19 -0
- package/xt/additional/Username.mjs.map +1 -0
- package/xt/fields/Array.cjs +9 -2
- package/xt/fields/Array.cjs.map +1 -1
- package/xt/fields/Array.d.ts +2 -0
- package/xt/fields/Array.mjs +9 -2
- package/xt/fields/Array.mjs.map +1 -1
- package/xt/fields/Boolean.cjs +10 -5
- package/xt/fields/Boolean.cjs.map +1 -1
- package/xt/fields/Boolean.d.ts +2 -0
- package/xt/fields/Boolean.mjs +10 -5
- package/xt/fields/Boolean.mjs.map +1 -1
- package/xt/fields/Date.cjs +12 -12
- package/xt/fields/Date.cjs.map +1 -1
- package/xt/fields/Date.d.ts +2 -0
- package/xt/fields/Date.mjs +12 -12
- package/xt/fields/Date.mjs.map +1 -1
- package/xt/fields/Enum.cjs +10 -4
- package/xt/fields/Enum.cjs.map +1 -1
- package/xt/fields/Enum.d.ts +2 -0
- package/xt/fields/Enum.mjs +10 -4
- package/xt/fields/Enum.mjs.map +1 -1
- package/xt/fields/File.cjs +9 -2
- package/xt/fields/File.cjs.map +1 -1
- package/xt/fields/File.d.ts +2 -0
- package/xt/fields/File.mjs +9 -2
- package/xt/fields/File.mjs.map +1 -1
- package/xt/fields/IDField.cjs +8 -0
- package/xt/fields/IDField.cjs.map +1 -1
- package/xt/fields/IDField.d.ts +2 -0
- package/xt/fields/IDField.mjs +8 -0
- package/xt/fields/IDField.mjs.map +1 -1
- package/xt/fields/Number.cjs +10 -5
- package/xt/fields/Number.cjs.map +1 -1
- package/xt/fields/Number.d.ts +2 -0
- package/xt/fields/Number.mjs +10 -5
- package/xt/fields/Number.mjs.map +1 -1
- package/xt/fields/Object.cjs +10 -5
- package/xt/fields/Object.cjs.map +1 -1
- package/xt/fields/Object.d.ts +2 -0
- package/xt/fields/Object.mjs +10 -5
- package/xt/fields/Object.mjs.map +1 -1
- package/xt/fields/Record.cjs +10 -5
- package/xt/fields/Record.cjs.map +1 -1
- package/xt/fields/Record.d.ts +2 -0
- package/xt/fields/Record.mjs +10 -5
- package/xt/fields/Record.mjs.map +1 -1
- package/xt/fields/Schema.cjs +12 -1
- package/xt/fields/Schema.cjs.map +1 -1
- package/xt/fields/Schema.d.ts +4 -1
- package/xt/fields/Schema.mjs +12 -1
- package/xt/fields/Schema.mjs.map +1 -1
- package/xt/fields/String.cjs +12 -9
- package/xt/fields/String.cjs.map +1 -1
- package/xt/fields/String.d.ts +2 -0
- package/xt/fields/String.mjs +12 -9
- package/xt/fields/String.mjs.map +1 -1
- package/xt/fields/Tuple.cjs +10 -5
- package/xt/fields/Tuple.cjs.map +1 -1
- package/xt/fields/Tuple.d.ts +2 -0
- package/xt/fields/Tuple.mjs +10 -5
- package/xt/fields/Tuple.mjs.map +1 -1
- package/xt/fields/Union.cjs +10 -5
- package/xt/fields/Union.cjs.map +1 -1
- package/xt/fields/Union.d.ts +2 -0
- package/xt/fields/Union.mjs +10 -5
- package/xt/fields/Union.mjs.map +1 -1
- package/xt/index.cjs +16 -100
- package/xt/index.cjs.map +1 -1
- package/xt/index.d.ts +16 -9
- package/xt/index.mjs +16 -100
- package/xt/index.mjs.map +1 -1
- package/core/classes/ModelFormatter.cjs.map +0 -1
- package/core/classes/ModelFormatter.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WhereArgs.cjs","sources":["../../../src/model/Args/WhereArgs.ts"],"sourcesContent":["import Model from \"..\";\nimport Foreign from \"../../core/classes/ForeignInfo\";\nimport XansqlError from \"../../core/XansqlError\";\nimport XqlArray from \"../../xt/fields/Array\";\nimport XqlObject from \"../../xt/fields/Object\";\nimport XqlRecord from \"../../xt/fields/Record\";\nimport XqlTuple from \"../../xt/fields/Tuple\";\nimport { escapeSqlValue, isArray, isObject } from \"../../utils\";\nimport ValueFormatter from \"../include/ValueFormatter\";\nimport { WhereArgsType, WhereSubCondition } from \"../types\";\n\ntype Meta = {\n parentTable: string\n}\n\nclass WhereArgs {\n private model: Model\n // private where: WhereArgsType\n // private meta: Meta | undefined\n readonly wheres: string[]\n readonly sql: string = ''\n private condition_keys = [\"equals\", \"not\", \"lt\", \"lte\", \"gt\", \"gte\", \"in\", \"notIn\", \"between\", \"notBetween\", \"contains\", \"notContains\", \"startsWith\", \"endsWith\", \"isNull\", \"isNotNull\", \"isEmpty\", \"isNotEmpty\", \"isTrue\", \"isFalse\"]\n\n constructor(model: Model, where: WhereArgsType | WhereArgsType[], meta?: Meta) {\n this.model = model\n\n let schema = model.schema\n let wheres: string[] = []\n\n if (Array.isArray(where)) {\n let _ors = []\n for (let w of where) {\n const whereArgs = new WhereArgs(model, w, meta)\n if (whereArgs.sql) {\n if (whereArgs.wheres.length > 1) {\n _ors.push(`(${whereArgs.wheres.join(\" AND \")})`)\n } else {\n _ors.push(`${whereArgs.wheres.join(\" AND \")}`)\n }\n }\n }\n\n if (_ors.length) {\n wheres.push(`(${_ors.join(\" OR \")})`)\n }\n } else {\n for (let column in where) {\n this.checkIsAllowed(column)\n const value: any = where[column]\n const field = schema[column]\n\n if (Foreign.is(field)) {\n if (!isArray(value) && !isObject(value)) {\n throw new XansqlError({\n message: `${column} must be an object or array in the WHERE clause, but received ${typeof value} in table ${model.table}`,\n model: model.table,\n column\n });\n } else if (isObject(value) && Object.keys(value).length === 0 || isArray(value) && value.length === 0) {\n // skip empty object\n continue;\n }\n\n if (Foreign.isSchema(field) && isObject(value) && Object.keys(value).some(k => this.condition_keys.includes(k))) {\n const v = this.condition(column, value as WhereSubCondition)\n wheres.push(v)\n continue\n }\n\n let foreign = Foreign.get(model, column)\n let FModel = model.xansql.getModel(foreign.table)\n if (meta && meta.parentTable === foreign.table) {\n throw new XansqlError({\n message: `Circular reference detected in WHERE clause for table ${model.table} on column ${column}`,\n model: model.table,\n column\n });\n }\n let _sql = ''\n if (Array.isArray(value) || isObject(value)) {\n const where = new WhereArgs(FModel, value, { parentTable: model.table })\n if (where.sql) {\n _sql = where.wheres.join(\" AND \")\n }\n } else {\n throw new XansqlError({\n message: `Invalid value for foreign key ${column} in WHERE clause of table ${model.table}`,\n model: model.table,\n column\n });\n }\n\n wheres.push(`EXISTS (SELECT 1 FROM ${foreign.table} WHERE ${foreign.sql} ${_sql ? ` AND ${_sql}` : \"\"})`)\n } else {\n let v = ''\n if (Array.isArray(value)) {\n const sub = value.map((_v: any) => {\n return isObject(_v)\n ? this.condition(column, _v)\n : `${model.table}.${column} = ${ValueFormatter.toSql(model, column, _v)}`\n })\n if (sub.length > 1) {\n v = `(${sub.join(\" OR \")})`\n } else {\n v = sub.join(\" OR \")\n }\n } else if (isObject(value)) {\n v = this.condition(column, value)\n } else {\n v = `${model.table}.${column} = ${ValueFormatter.toSql(model, column, value)}`\n }\n wheres.push(v)\n }\n }\n }\n\n this.wheres = wheres\n this.sql = this.wheres.length ? `WHERE ${this.wheres.join(\" AND \")} ` : \"\"\n }\n\n private condition(column: string, conditions: WhereSubCondition) {\n const model = this.model\n const generate = Object.keys(conditions).map((subKey) => {\n let value = (conditions as any)[subKey];\n if (isObject(value)) {\n throw new XansqlError({\n message: `Invalid value for where condition ${subKey} on column ${column} in table ${model.table}`,\n model: model.table,\n column\n });\n }\n let val: string = value;\n if (Array.isArray(val)) {\n if (['in', 'notIn'].includes(subKey)) {\n val = val.map((item) => ValueFormatter.toSql(model, column, item)).join(\", \");\n } else if (['between', 'notBetween'].includes(subKey)) {\n if (val.length !== 2) {\n throw new XansqlError({\n message: `The 'between' and 'notBetween' operators require an array of exactly two values for column ${column} in table ${model.table}.`,\n model: model.table,\n column\n });\n }\n val = val.map((item) => ValueFormatter.toSql(model, column, item)).join(\" AND \");\n } else {\n throw new XansqlError({\n message: `Array value is not supported for operator ${subKey} on column ${column} in table ${model.table}.`,\n model: model.table,\n column\n });\n }\n } else if (typeof val === 'boolean') {\n val = val ? \"1\" : \"0\";\n } else {\n val = ValueFormatter.toSql(model, column, val);\n }\n\n let col = model.table + \".\" + column;\n switch (subKey) {\n case 'equals':\n if (val === \"NULL\") return `${col} IS NULL`;\n return `${col} = ${val}`;\n case 'not':\n if (val === \"NULL\") return `${col} IS NOT NULL`;\n return `${col} != ${val}`;\n case 'lt':\n return `${col} < ${val}`;\n case 'lte':\n return `${col} <= ${val}`;\n case 'gt':\n return `${col} > ${val}`;\n case 'gte':\n return `${col} >= ${val}`;\n case 'in':\n if (val?.length === 0) {\n return `1 = 0`;\n } else if (!val.includes(\",\")) {\n return `${col} = ${val}`;\n }\n return `${col} IN (${val})`;\n case 'notIn':\n // handle empty array and val is a single value\n if (val.length === 0) {\n return `1 = 1`;\n } else if (!val.includes(\",\")) {\n return `${col} != ${val}`;\n }\n return `${col} NOT IN (${val})`;\n case 'between':\n return `${col} BETWEEN (${val})`;\n case 'notBetween':\n return `${col} NOT BETWEEN (${val})`;\n case 'contains':\n return `${col} LIKE '%${escapeSqlValue(value)}%'`;\n case 'notContains':\n return `${col} NOT LIKE '%${escapeSqlValue(value)}%'`;\n case 'startsWith':\n return `${col} LIKE '${escapeSqlValue(value)}%'`;\n case 'endsWith':\n return `${col} LIKE '%${escapeSqlValue(value)}'`;\n case 'isNull':\n return `${col} IS NULL`;\n case 'isNotNull':\n return `${col} IS NOT NULL`;\n case 'isEmpty':\n return `(${col} IS NULL OR LENGTH(${col}) = 0)`;\n case 'isNotEmpty':\n return `(WHERE ${col} IS NOT NULL AND LENGTH(${col}) > 0)`;\n case 'isTrue':\n return `${col} = TRUE`;\n case 'isFalse':\n return `${col} = FALSE`;\n default:\n throw new XansqlError({\n message: `Unknown where condition ${subKey} on column ${column} in table ${model.table}`,\n model: model.table,\n column\n });\n }\n });\n\n return `${generate.join(' AND ')}`;\n }\n\n private checkIsAllowed(column: string) {\n const xanv = this.model.schema[column]\n if (Foreign.isArray(xanv)) return true\n const isNotAllowed = xanv instanceof XqlArray\n || xanv instanceof XqlObject\n || xanv instanceof XqlRecord\n || xanv instanceof XqlTuple\n // || xanv instanceof XqlFile\n\n if (isNotAllowed) {\n throw new XansqlError({\n message: `Field ${column} of type ${xanv.constructor.name} is not allowed in WHERE clause in table ${this.model.table}`,\n model: this.model.table,\n column\n });\n }\n }\n}\n\nexport default WhereArgs;"],"names":["Foreign","isArray","isObject","XansqlError","ValueFormatter","escapeSqlValue","XqlArray","XqlObject","XqlRecord","XqlTuple"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WhereArgs.cjs","sources":["../../../src/model/Args/WhereArgs.ts"],"sourcesContent":["import Model from \"..\";\nimport Foreign from \"../../core/classes/ForeignInfo\";\nimport XansqlError from \"../../core/XansqlError\";\nimport XqlArray from \"../../xt/fields/Array\";\nimport XqlObject from \"../../xt/fields/Object\";\nimport XqlRecord from \"../../xt/fields/Record\";\nimport XqlTuple from \"../../xt/fields/Tuple\";\nimport { escapeSqlValue, iof, isArray, isObject } from \"../../utils\";\nimport ValueFormatter from \"../include/ValueFormatter\";\nimport { WhereArgsType, WhereSubCondition } from \"../types\";\nimport XqlFile from \"../../xt/fields/File\";\n\ntype Meta = {\n parentTable: string\n}\n\nclass WhereArgs {\n private model: Model\n // private where: WhereArgsType\n // private meta: Meta | undefined\n readonly wheres: string[]\n readonly sql: string = ''\n private condition_keys = [\"equals\", \"not\", \"lt\", \"lte\", \"gt\", \"gte\", \"in\", \"notIn\", \"between\", \"notBetween\", \"contains\", \"notContains\", \"startsWith\", \"endsWith\", \"isNull\", \"isNotNull\", \"isEmpty\", \"isNotEmpty\", \"isTrue\", \"isFalse\"]\n\n constructor(model: Model, where: WhereArgsType | WhereArgsType[], meta?: Meta) {\n this.model = model\n\n let schema = model.schema\n let wheres: string[] = []\n\n if (Array.isArray(where)) {\n let _ors = []\n for (let w of where) {\n const whereArgs = new WhereArgs(model, w, meta)\n if (whereArgs.sql) {\n if (whereArgs.wheres.length > 1) {\n _ors.push(`(${whereArgs.wheres.join(\" AND \")})`)\n } else {\n _ors.push(`${whereArgs.wheres.join(\" AND \")}`)\n }\n }\n }\n\n if (_ors.length) {\n wheres.push(`(${_ors.join(\" OR \")})`)\n }\n } else {\n for (let column in where) {\n this.checkIsAllowed(column)\n const value: any = where[column]\n const field = schema[column]\n\n if (Foreign.is(field)) {\n if (!isArray(value) && !isObject(value)) {\n throw new XansqlError({\n message: `${column} must be an object or array in the WHERE clause, but received ${typeof value} in table ${model.table}`,\n model: model.table,\n column\n });\n } else if (isObject(value) && Object.keys(value).length === 0 || isArray(value) && value.length === 0) {\n // skip empty object\n continue;\n }\n\n if (Foreign.isSchema(field) && isObject(value) && Object.keys(value).some(k => this.condition_keys.includes(k))) {\n const v = this.condition(column, value as WhereSubCondition)\n wheres.push(v)\n continue\n }\n\n let foreign = Foreign.get(model, column)\n let FModel = model.xansql.getModel(foreign.table)\n if (meta && meta.parentTable === foreign.table) {\n throw new XansqlError({\n message: `Circular reference detected in WHERE clause for table ${model.table} on column ${column}`,\n model: model.table,\n column\n });\n }\n let _sql = ''\n if (Array.isArray(value) || isObject(value)) {\n const where = new WhereArgs(FModel, value, { parentTable: model.table })\n if (where.sql) {\n _sql = where.wheres.join(\" AND \")\n }\n } else {\n throw new XansqlError({\n message: `Invalid value for foreign key ${column} in WHERE clause of table ${model.table}`,\n model: model.table,\n column\n });\n }\n\n wheres.push(`EXISTS (SELECT 1 FROM ${foreign.table} WHERE ${foreign.sql} ${_sql ? ` AND ${_sql}` : \"\"})`)\n } else {\n let v = ''\n if (Array.isArray(value)) {\n const sub = value.map((_v: any) => {\n return isObject(_v)\n ? this.condition(column, _v)\n : `${model.table}.${column} = ${ValueFormatter.toSql(model, column, _v)}`\n })\n if (sub.length > 1) {\n v = `(${sub.join(\" OR \")})`\n } else {\n v = sub.join(\" OR \")\n }\n } else if (isObject(value)) {\n v = this.condition(column, value)\n } else {\n v = `${model.table}.${column} = ${ValueFormatter.toSql(model, column, value)}`\n }\n wheres.push(v)\n }\n }\n }\n\n this.wheres = wheres\n this.sql = this.wheres.length ? `WHERE ${this.wheres.join(\" AND \")} ` : \"\"\n }\n\n private condition(column: string, conditions: WhereSubCondition) {\n const model = this.model\n const generate = Object.keys(conditions).map((subKey) => {\n let value = (conditions as any)[subKey];\n if (isObject(value)) {\n throw new XansqlError({\n message: `Invalid value for where condition ${subKey} on column ${column} in table ${model.table}`,\n model: model.table,\n column\n });\n }\n let val: string = value;\n if (Array.isArray(val)) {\n if (['in', 'notIn'].includes(subKey)) {\n val = val.map((item) => ValueFormatter.toSql(model, column, item)).join(\", \");\n } else if (['between', 'notBetween'].includes(subKey)) {\n if (val.length !== 2) {\n throw new XansqlError({\n message: `The 'between' and 'notBetween' operators require an array of exactly two values for column ${column} in table ${model.table}.`,\n model: model.table,\n column\n });\n }\n val = val.map((item) => ValueFormatter.toSql(model, column, item)).join(\" AND \");\n } else {\n throw new XansqlError({\n message: `Array value is not supported for operator ${subKey} on column ${column} in table ${model.table}.`,\n model: model.table,\n column\n });\n }\n } else if (typeof val === 'boolean') {\n val = val ? \"1\" : \"0\";\n } else {\n val = ValueFormatter.toSql(model, column, val);\n }\n\n let col = model.table + \".\" + column;\n switch (subKey) {\n case 'equals':\n if (val === \"NULL\") return `${col} IS NULL`;\n return `${col} = ${val}`;\n case 'not':\n if (val === \"NULL\") return `${col} IS NOT NULL`;\n return `${col} != ${val}`;\n case 'lt':\n return `${col} < ${val}`;\n case 'lte':\n return `${col} <= ${val}`;\n case 'gt':\n return `${col} > ${val}`;\n case 'gte':\n return `${col} >= ${val}`;\n case 'in':\n if (val?.length === 0) {\n return `1 = 0`;\n } else if (!val.includes(\",\")) {\n return `${col} = ${val}`;\n }\n return `${col} IN (${val})`;\n case 'notIn':\n // handle empty array and val is a single value\n if (val.length === 0) {\n return `1 = 1`;\n } else if (!val.includes(\",\")) {\n return `${col} != ${val}`;\n }\n return `${col} NOT IN (${val})`;\n case 'between':\n return `${col} BETWEEN (${val})`;\n case 'notBetween':\n return `${col} NOT BETWEEN (${val})`;\n case 'contains':\n return `${col} LIKE '%${escapeSqlValue(value)}%'`;\n case 'notContains':\n return `${col} NOT LIKE '%${escapeSqlValue(value)}%'`;\n case 'startsWith':\n return `${col} LIKE '${escapeSqlValue(value)}%'`;\n case 'endsWith':\n return `${col} LIKE '%${escapeSqlValue(value)}'`;\n case 'isNull':\n return `${col} IS NULL`;\n case 'isNotNull':\n return `${col} IS NOT NULL`;\n case 'isEmpty':\n return `(${col} IS NULL OR LENGTH(${col}) = 0)`;\n case 'isNotEmpty':\n return `(WHERE ${col} IS NOT NULL AND LENGTH(${col}) > 0)`;\n case 'isTrue':\n return `${col} = TRUE`;\n case 'isFalse':\n return `${col} = FALSE`;\n default:\n throw new XansqlError({\n message: `Unknown where condition ${subKey} on column ${column} in table ${model.table}`,\n model: model.table,\n column\n });\n }\n });\n\n return `${generate.join(' AND ')}`;\n }\n\n private checkIsAllowed(column: string) {\n const field = this.model.schema[column]\n if (Foreign.isArray(field)) return true\n const isNotAllowed = iof(field, XqlArray, XqlObject, XqlRecord, XqlTuple, XqlFile)\n\n if (isNotAllowed) {\n throw new XansqlError({\n message: `Field ${column} of type ${field.constructor.name} is not allowed in WHERE clause in table ${this.model.table}`,\n model: this.model.table,\n column\n });\n }\n }\n}\n\nexport default WhereArgs;"],"names":["Foreign","isArray","isObject","XansqlError","ValueFormatter","escapeSqlValue","iof","XqlArray","XqlObject","XqlRecord","XqlTuple","XqlFile"],"mappings":";;;;;;;;;;;;AAgBA,MAAM,SAAS,CAAA;AAQZ,IAAA,WAAA,CAAY,KAAY,EAAE,KAAsC,EAAE,IAAW,EAAA;QAHpE,IAAA,CAAA,GAAG,GAAW,EAAE;AACjB,QAAA,IAAA,CAAA,cAAc,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,CAAC;AAGnO,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAElB,QAAA,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM;QACzB,IAAI,MAAM,GAAa,EAAE;AAEzB,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACvB,IAAI,IAAI,GAAG,EAAE;AACb,YAAA,KAAK,IAAI,CAAC,IAAI,KAAK,EAAE;gBAClB,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC;AAC/C,gBAAA,IAAI,SAAS,CAAC,GAAG,EAAE;oBAChB,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9B,wBAAA,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA,CAAA,CAAG,CAAC;oBACnD;yBAAO;AACJ,wBAAA,IAAI,CAAC,IAAI,CAAC,CAAA,EAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA,CAAE,CAAC;oBACjD;gBACH;YACH;AAEA,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACd,gBAAA,MAAM,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA,CAAA,CAAG,CAAC;YACxC;QACH;aAAO;AACJ,YAAA,KAAK,IAAI,MAAM,IAAI,KAAK,EAAE;AACvB,gBAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;AAC3B,gBAAA,MAAM,KAAK,GAAQ,KAAK,CAAC,MAAM,CAAC;AAChC,gBAAA,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;AAE5B,gBAAA,IAAIA,wBAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE;AACpB,oBAAA,IAAI,CAACC,mBAAO,CAAC,KAAK,CAAC,IAAI,CAACC,oBAAQ,CAAC,KAAK,CAAC,EAAE;wBACtC,MAAM,IAAIC,gBAAW,CAAC;4BACnB,OAAO,EAAE,CAAA,EAAG,MAAM,CAAA,8DAAA,EAAiE,OAAO,KAAK,CAAA,UAAA,EAAa,KAAK,CAAC,KAAK,CAAA,CAAE;4BACzH,KAAK,EAAE,KAAK,CAAC,KAAK;4BAClB;AACF,yBAAA,CAAC;oBACL;yBAAO,IAAID,oBAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,IAAID,mBAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;;wBAEpG;oBACH;AAEA,oBAAA,IAAID,wBAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAIE,oBAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;wBAC9G,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAA0B,CAAC;AAC5D,wBAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;wBACd;oBACH;oBAEA,IAAI,OAAO,GAAGF,wBAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;AACxC,oBAAA,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;oBACjD,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO,CAAC,KAAK,EAAE;wBAC7C,MAAM,IAAIG,gBAAW,CAAC;AACnB,4BAAA,OAAO,EAAE,CAAA,sDAAA,EAAyD,KAAK,CAAC,KAAK,CAAA,WAAA,EAAc,MAAM,CAAA,CAAE;4BACnG,KAAK,EAAE,KAAK,CAAC,KAAK;4BAClB;AACF,yBAAA,CAAC;oBACL;oBACA,IAAI,IAAI,GAAG,EAAE;AACb,oBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAID,oBAAQ,CAAC,KAAK,CAAC,EAAE;AAC1C,wBAAA,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;AACxE,wBAAA,IAAI,KAAK,CAAC,GAAG,EAAE;4BACZ,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;wBACpC;oBACH;yBAAO;wBACJ,MAAM,IAAIC,gBAAW,CAAC;AACnB,4BAAA,OAAO,EAAE,CAAA,8BAAA,EAAiC,MAAM,6BAA6B,KAAK,CAAC,KAAK,CAAA,CAAE;4BAC1F,KAAK,EAAE,KAAK,CAAC,KAAK;4BAClB;AACF,yBAAA,CAAC;oBACL;oBAEA,MAAM,CAAC,IAAI,CAAC,CAAA,sBAAA,EAAyB,OAAO,CAAC,KAAK,CAAA,OAAA,EAAU,OAAO,CAAC,GAAG,CAAA,CAAA,EAAI,IAAI,GAAG,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE,GAAG,EAAE,CAAA,CAAA,CAAG,CAAC;gBAC5G;qBAAO;oBACJ,IAAI,CAAC,GAAG,EAAE;AACV,oBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;wBACvB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAO,KAAI;4BAC/B,OAAOD,oBAAQ,CAAC,EAAE;kCACb,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE;AAC3B,kCAAE,CAAA,EAAG,KAAK,CAAC,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,GAAA,EAAME,4BAAc,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE;AAC/E,wBAAA,CAAC,CAAC;AACF,wBAAA,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;4BACjB,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA,CAAA,CAAG;wBAC9B;6BAAO;AACJ,4BAAA,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;wBACvB;oBACH;AAAO,yBAAA,IAAIF,oBAAQ,CAAC,KAAK,CAAC,EAAE;wBACzB,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC;oBACpC;yBAAO;AACJ,wBAAA,CAAC,GAAG,CAAA,EAAG,KAAK,CAAC,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,GAAA,EAAME,4BAAc,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE;oBACjF;AACA,oBAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBACjB;YACH;QACH;AAEA,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;QACpB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAA,MAAA,EAAS,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA,CAAA,CAAG,GAAG,EAAE;IAC7E;IAEQ,SAAS,CAAC,MAAc,EAAE,UAA6B,EAAA;AAC5D,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;AACxB,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,KAAI;AACrD,YAAA,IAAI,KAAK,GAAI,UAAkB,CAAC,MAAM,CAAC;AACvC,YAAA,IAAIF,oBAAQ,CAAC,KAAK,CAAC,EAAE;gBAClB,MAAM,IAAIC,gBAAW,CAAC;oBACnB,OAAO,EAAE,qCAAqC,MAAM,CAAA,WAAA,EAAc,MAAM,CAAA,UAAA,EAAa,KAAK,CAAC,KAAK,CAAA,CAAE;oBAClG,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB;AACF,iBAAA,CAAC;YACL;YACA,IAAI,GAAG,GAAW,KAAK;AACvB,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBACrB,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;oBACnC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,KAAKC,4BAAc,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChF;qBAAO,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACpD,oBAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;wBACnB,MAAM,IAAID,gBAAW,CAAC;AACnB,4BAAA,OAAO,EAAE,CAAA,2FAAA,EAA8F,MAAM,aAAa,KAAK,CAAC,KAAK,CAAA,CAAA,CAAG;4BACxI,KAAK,EAAE,KAAK,CAAC,KAAK;4BAClB;AACF,yBAAA,CAAC;oBACL;oBACA,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,KAAKC,4BAAc,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;gBACnF;qBAAO;oBACJ,MAAM,IAAID,gBAAW,CAAC;wBACnB,OAAO,EAAE,6CAA6C,MAAM,CAAA,WAAA,EAAc,MAAM,CAAA,UAAA,EAAa,KAAK,CAAC,KAAK,CAAA,CAAA,CAAG;wBAC3G,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB;AACF,qBAAA,CAAC;gBACL;YACH;AAAO,iBAAA,IAAI,OAAO,GAAG,KAAK,SAAS,EAAE;gBAClC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;YACxB;iBAAO;gBACJ,GAAG,GAAGC,4BAAc,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC;YACjD;YAEA,IAAI,GAAG,GAAG,KAAK,CAAC,KAAK,GAAG,GAAG,GAAG,MAAM;YACpC,QAAQ,MAAM;AACX,gBAAA,KAAK,QAAQ;oBACV,IAAI,GAAG,KAAK,MAAM;wBAAE,OAAO,CAAA,EAAG,GAAG,CAAA,QAAA,CAAU;AAC3C,oBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,GAAA,EAAM,GAAG,EAAE;AAC3B,gBAAA,KAAK,KAAK;oBACP,IAAI,GAAG,KAAK,MAAM;wBAAE,OAAO,CAAA,EAAG,GAAG,CAAA,YAAA,CAAc;AAC/C,oBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,IAAA,EAAO,GAAG,EAAE;AAC5B,gBAAA,KAAK,IAAI;AACN,oBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,GAAA,EAAM,GAAG,EAAE;AAC3B,gBAAA,KAAK,KAAK;AACP,oBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,IAAA,EAAO,GAAG,EAAE;AAC5B,gBAAA,KAAK,IAAI;AACN,oBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,GAAA,EAAM,GAAG,EAAE;AAC3B,gBAAA,KAAK,KAAK;AACP,oBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,IAAA,EAAO,GAAG,EAAE;AAC5B,gBAAA,KAAK,IAAI;oBACN,IAAI,CAAA,GAAG,KAAA,IAAA,IAAH,GAAG,KAAA,MAAA,GAAA,MAAA,GAAH,GAAG,CAAE,MAAM,MAAK,CAAC,EAAE;AACpB,wBAAA,OAAO,OAAO;oBACjB;yBAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC5B,wBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,GAAA,EAAM,GAAG,EAAE;oBAC3B;AACA,oBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,KAAA,EAAQ,GAAG,GAAG;AAC9B,gBAAA,KAAK,OAAO;;AAET,oBAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;AACnB,wBAAA,OAAO,OAAO;oBACjB;yBAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC5B,wBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,IAAA,EAAO,GAAG,EAAE;oBAC5B;AACA,oBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,SAAA,EAAY,GAAG,GAAG;AAClC,gBAAA,KAAK,SAAS;AACX,oBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,UAAA,EAAa,GAAG,GAAG;AACnC,gBAAA,KAAK,YAAY;AACd,oBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,cAAA,EAAiB,GAAG,GAAG;AACvC,gBAAA,KAAK,UAAU;oBACZ,OAAO,CAAA,EAAG,GAAG,CAAA,QAAA,EAAWC,0BAAc,CAAC,KAAK,CAAC,IAAI;AACpD,gBAAA,KAAK,aAAa;oBACf,OAAO,CAAA,EAAG,GAAG,CAAA,YAAA,EAAeA,0BAAc,CAAC,KAAK,CAAC,IAAI;AACxD,gBAAA,KAAK,YAAY;oBACd,OAAO,CAAA,EAAG,GAAG,CAAA,OAAA,EAAUA,0BAAc,CAAC,KAAK,CAAC,IAAI;AACnD,gBAAA,KAAK,UAAU;oBACZ,OAAO,CAAA,EAAG,GAAG,CAAA,QAAA,EAAWA,0BAAc,CAAC,KAAK,CAAC,GAAG;AACnD,gBAAA,KAAK,QAAQ;oBACV,OAAO,CAAA,EAAG,GAAG,CAAA,QAAA,CAAU;AAC1B,gBAAA,KAAK,WAAW;oBACb,OAAO,CAAA,EAAG,GAAG,CAAA,YAAA,CAAc;AAC9B,gBAAA,KAAK,SAAS;AACX,oBAAA,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,mBAAA,EAAsB,GAAG,QAAQ;AAClD,gBAAA,KAAK,YAAY;AACd,oBAAA,OAAO,CAAA,OAAA,EAAU,GAAG,CAAA,wBAAA,EAA2B,GAAG,QAAQ;AAC7D,gBAAA,KAAK,QAAQ;oBACV,OAAO,CAAA,EAAG,GAAG,CAAA,OAAA,CAAS;AACzB,gBAAA,KAAK,SAAS;oBACX,OAAO,CAAA,EAAG,GAAG,CAAA,QAAA,CAAU;AAC1B,gBAAA;oBACG,MAAM,IAAIF,gBAAW,CAAC;wBACnB,OAAO,EAAE,2BAA2B,MAAM,CAAA,WAAA,EAAc,MAAM,CAAA,UAAA,EAAa,KAAK,CAAC,KAAK,CAAA,CAAE;wBACxF,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB;AACF,qBAAA,CAAC;;AAEX,QAAA,CAAC,CAAC;QAEF,OAAO,CAAA,EAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;IACrC;AAEQ,IAAA,cAAc,CAAC,MAAc,EAAA;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;AACvC,QAAA,IAAIH,wBAAO,CAAC,OAAO,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;AACvC,QAAA,MAAM,YAAY,GAAGM,eAAG,CAAC,KAAK,EAAEC,eAAQ,EAAEC,gBAAS,EAAEC,gBAAS,EAAEC,eAAQ,EAAEC,cAAO,CAAC;QAElF,IAAI,YAAY,EAAE;YACf,MAAM,IAAIR,gBAAW,CAAC;AACnB,gBAAA,OAAO,EAAE,CAAA,MAAA,EAAS,MAAM,CAAA,SAAA,EAAY,KAAK,CAAC,WAAW,CAAC,IAAI,4CAA4C,IAAI,CAAC,KAAK,CAAC,KAAK,CAAA,CAAE;AACxH,gBAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;gBACvB;AACF,aAAA,CAAC;QACL;IACH;AACF;;;;"}
|
package/model/Args/WhereArgs.mjs
CHANGED
|
@@ -4,8 +4,9 @@ import XqlArray from '../../xt/fields/Array.mjs';
|
|
|
4
4
|
import XqlObject from '../../xt/fields/Object.mjs';
|
|
5
5
|
import XqlRecord from '../../xt/fields/Record.mjs';
|
|
6
6
|
import XqlTuple from '../../xt/fields/Tuple.mjs';
|
|
7
|
-
import { isArray, isObject, escapeSqlValue } from '../../utils/index.mjs';
|
|
7
|
+
import { isArray, isObject, escapeSqlValue, iof } from '../../utils/index.mjs';
|
|
8
8
|
import ValueFormatter from '../include/ValueFormatter.mjs';
|
|
9
|
+
import XqlFile from '../../xt/fields/File.mjs';
|
|
9
10
|
|
|
10
11
|
class WhereArgs {
|
|
11
12
|
constructor(model, where, meta) {
|
|
@@ -216,17 +217,13 @@ class WhereArgs {
|
|
|
216
217
|
return `${generate.join(' AND ')}`;
|
|
217
218
|
}
|
|
218
219
|
checkIsAllowed(column) {
|
|
219
|
-
const
|
|
220
|
-
if (Foreign.isArray(
|
|
220
|
+
const field = this.model.schema[column];
|
|
221
|
+
if (Foreign.isArray(field))
|
|
221
222
|
return true;
|
|
222
|
-
const isNotAllowed =
|
|
223
|
-
|| xanv instanceof XqlObject
|
|
224
|
-
|| xanv instanceof XqlRecord
|
|
225
|
-
|| xanv instanceof XqlTuple;
|
|
226
|
-
// || xanv instanceof XqlFile
|
|
223
|
+
const isNotAllowed = iof(field, XqlArray, XqlObject, XqlRecord, XqlTuple, XqlFile);
|
|
227
224
|
if (isNotAllowed) {
|
|
228
225
|
throw new XansqlError({
|
|
229
|
-
message: `Field ${column} of type ${
|
|
226
|
+
message: `Field ${column} of type ${field.constructor.name} is not allowed in WHERE clause in table ${this.model.table}`,
|
|
230
227
|
model: this.model.table,
|
|
231
228
|
column
|
|
232
229
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WhereArgs.mjs","sources":["../../../src/model/Args/WhereArgs.ts"],"sourcesContent":["import Model from \"..\";\nimport Foreign from \"../../core/classes/ForeignInfo\";\nimport XansqlError from \"../../core/XansqlError\";\nimport XqlArray from \"../../xt/fields/Array\";\nimport XqlObject from \"../../xt/fields/Object\";\nimport XqlRecord from \"../../xt/fields/Record\";\nimport XqlTuple from \"../../xt/fields/Tuple\";\nimport { escapeSqlValue, isArray, isObject } from \"../../utils\";\nimport ValueFormatter from \"../include/ValueFormatter\";\nimport { WhereArgsType, WhereSubCondition } from \"../types\";\n\ntype Meta = {\n parentTable: string\n}\n\nclass WhereArgs {\n private model: Model\n // private where: WhereArgsType\n // private meta: Meta | undefined\n readonly wheres: string[]\n readonly sql: string = ''\n private condition_keys = [\"equals\", \"not\", \"lt\", \"lte\", \"gt\", \"gte\", \"in\", \"notIn\", \"between\", \"notBetween\", \"contains\", \"notContains\", \"startsWith\", \"endsWith\", \"isNull\", \"isNotNull\", \"isEmpty\", \"isNotEmpty\", \"isTrue\", \"isFalse\"]\n\n constructor(model: Model, where: WhereArgsType | WhereArgsType[], meta?: Meta) {\n this.model = model\n\n let schema = model.schema\n let wheres: string[] = []\n\n if (Array.isArray(where)) {\n let _ors = []\n for (let w of where) {\n const whereArgs = new WhereArgs(model, w, meta)\n if (whereArgs.sql) {\n if (whereArgs.wheres.length > 1) {\n _ors.push(`(${whereArgs.wheres.join(\" AND \")})`)\n } else {\n _ors.push(`${whereArgs.wheres.join(\" AND \")}`)\n }\n }\n }\n\n if (_ors.length) {\n wheres.push(`(${_ors.join(\" OR \")})`)\n }\n } else {\n for (let column in where) {\n this.checkIsAllowed(column)\n const value: any = where[column]\n const field = schema[column]\n\n if (Foreign.is(field)) {\n if (!isArray(value) && !isObject(value)) {\n throw new XansqlError({\n message: `${column} must be an object or array in the WHERE clause, but received ${typeof value} in table ${model.table}`,\n model: model.table,\n column\n });\n } else if (isObject(value) && Object.keys(value).length === 0 || isArray(value) && value.length === 0) {\n // skip empty object\n continue;\n }\n\n if (Foreign.isSchema(field) && isObject(value) && Object.keys(value).some(k => this.condition_keys.includes(k))) {\n const v = this.condition(column, value as WhereSubCondition)\n wheres.push(v)\n continue\n }\n\n let foreign = Foreign.get(model, column)\n let FModel = model.xansql.getModel(foreign.table)\n if (meta && meta.parentTable === foreign.table) {\n throw new XansqlError({\n message: `Circular reference detected in WHERE clause for table ${model.table} on column ${column}`,\n model: model.table,\n column\n });\n }\n let _sql = ''\n if (Array.isArray(value) || isObject(value)) {\n const where = new WhereArgs(FModel, value, { parentTable: model.table })\n if (where.sql) {\n _sql = where.wheres.join(\" AND \")\n }\n } else {\n throw new XansqlError({\n message: `Invalid value for foreign key ${column} in WHERE clause of table ${model.table}`,\n model: model.table,\n column\n });\n }\n\n wheres.push(`EXISTS (SELECT 1 FROM ${foreign.table} WHERE ${foreign.sql} ${_sql ? ` AND ${_sql}` : \"\"})`)\n } else {\n let v = ''\n if (Array.isArray(value)) {\n const sub = value.map((_v: any) => {\n return isObject(_v)\n ? this.condition(column, _v)\n : `${model.table}.${column} = ${ValueFormatter.toSql(model, column, _v)}`\n })\n if (sub.length > 1) {\n v = `(${sub.join(\" OR \")})`\n } else {\n v = sub.join(\" OR \")\n }\n } else if (isObject(value)) {\n v = this.condition(column, value)\n } else {\n v = `${model.table}.${column} = ${ValueFormatter.toSql(model, column, value)}`\n }\n wheres.push(v)\n }\n }\n }\n\n this.wheres = wheres\n this.sql = this.wheres.length ? `WHERE ${this.wheres.join(\" AND \")} ` : \"\"\n }\n\n private condition(column: string, conditions: WhereSubCondition) {\n const model = this.model\n const generate = Object.keys(conditions).map((subKey) => {\n let value = (conditions as any)[subKey];\n if (isObject(value)) {\n throw new XansqlError({\n message: `Invalid value for where condition ${subKey} on column ${column} in table ${model.table}`,\n model: model.table,\n column\n });\n }\n let val: string = value;\n if (Array.isArray(val)) {\n if (['in', 'notIn'].includes(subKey)) {\n val = val.map((item) => ValueFormatter.toSql(model, column, item)).join(\", \");\n } else if (['between', 'notBetween'].includes(subKey)) {\n if (val.length !== 2) {\n throw new XansqlError({\n message: `The 'between' and 'notBetween' operators require an array of exactly two values for column ${column} in table ${model.table}.`,\n model: model.table,\n column\n });\n }\n val = val.map((item) => ValueFormatter.toSql(model, column, item)).join(\" AND \");\n } else {\n throw new XansqlError({\n message: `Array value is not supported for operator ${subKey} on column ${column} in table ${model.table}.`,\n model: model.table,\n column\n });\n }\n } else if (typeof val === 'boolean') {\n val = val ? \"1\" : \"0\";\n } else {\n val = ValueFormatter.toSql(model, column, val);\n }\n\n let col = model.table + \".\" + column;\n switch (subKey) {\n case 'equals':\n if (val === \"NULL\") return `${col} IS NULL`;\n return `${col} = ${val}`;\n case 'not':\n if (val === \"NULL\") return `${col} IS NOT NULL`;\n return `${col} != ${val}`;\n case 'lt':\n return `${col} < ${val}`;\n case 'lte':\n return `${col} <= ${val}`;\n case 'gt':\n return `${col} > ${val}`;\n case 'gte':\n return `${col} >= ${val}`;\n case 'in':\n if (val?.length === 0) {\n return `1 = 0`;\n } else if (!val.includes(\",\")) {\n return `${col} = ${val}`;\n }\n return `${col} IN (${val})`;\n case 'notIn':\n // handle empty array and val is a single value\n if (val.length === 0) {\n return `1 = 1`;\n } else if (!val.includes(\",\")) {\n return `${col} != ${val}`;\n }\n return `${col} NOT IN (${val})`;\n case 'between':\n return `${col} BETWEEN (${val})`;\n case 'notBetween':\n return `${col} NOT BETWEEN (${val})`;\n case 'contains':\n return `${col} LIKE '%${escapeSqlValue(value)}%'`;\n case 'notContains':\n return `${col} NOT LIKE '%${escapeSqlValue(value)}%'`;\n case 'startsWith':\n return `${col} LIKE '${escapeSqlValue(value)}%'`;\n case 'endsWith':\n return `${col} LIKE '%${escapeSqlValue(value)}'`;\n case 'isNull':\n return `${col} IS NULL`;\n case 'isNotNull':\n return `${col} IS NOT NULL`;\n case 'isEmpty':\n return `(${col} IS NULL OR LENGTH(${col}) = 0)`;\n case 'isNotEmpty':\n return `(WHERE ${col} IS NOT NULL AND LENGTH(${col}) > 0)`;\n case 'isTrue':\n return `${col} = TRUE`;\n case 'isFalse':\n return `${col} = FALSE`;\n default:\n throw new XansqlError({\n message: `Unknown where condition ${subKey} on column ${column} in table ${model.table}`,\n model: model.table,\n column\n });\n }\n });\n\n return `${generate.join(' AND ')}`;\n }\n\n private checkIsAllowed(column: string) {\n const xanv = this.model.schema[column]\n if (Foreign.isArray(xanv)) return true\n const isNotAllowed = xanv instanceof XqlArray\n || xanv instanceof XqlObject\n || xanv instanceof XqlRecord\n || xanv instanceof XqlTuple\n // || xanv instanceof XqlFile\n\n if (isNotAllowed) {\n throw new XansqlError({\n message: `Field ${column} of type ${xanv.constructor.name} is not allowed in WHERE clause in table ${this.model.table}`,\n model: this.model.table,\n column\n });\n }\n }\n}\n\nexport default WhereArgs;"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WhereArgs.mjs","sources":["../../../src/model/Args/WhereArgs.ts"],"sourcesContent":["import Model from \"..\";\nimport Foreign from \"../../core/classes/ForeignInfo\";\nimport XansqlError from \"../../core/XansqlError\";\nimport XqlArray from \"../../xt/fields/Array\";\nimport XqlObject from \"../../xt/fields/Object\";\nimport XqlRecord from \"../../xt/fields/Record\";\nimport XqlTuple from \"../../xt/fields/Tuple\";\nimport { escapeSqlValue, iof, isArray, isObject } from \"../../utils\";\nimport ValueFormatter from \"../include/ValueFormatter\";\nimport { WhereArgsType, WhereSubCondition } from \"../types\";\nimport XqlFile from \"../../xt/fields/File\";\n\ntype Meta = {\n parentTable: string\n}\n\nclass WhereArgs {\n private model: Model\n // private where: WhereArgsType\n // private meta: Meta | undefined\n readonly wheres: string[]\n readonly sql: string = ''\n private condition_keys = [\"equals\", \"not\", \"lt\", \"lte\", \"gt\", \"gte\", \"in\", \"notIn\", \"between\", \"notBetween\", \"contains\", \"notContains\", \"startsWith\", \"endsWith\", \"isNull\", \"isNotNull\", \"isEmpty\", \"isNotEmpty\", \"isTrue\", \"isFalse\"]\n\n constructor(model: Model, where: WhereArgsType | WhereArgsType[], meta?: Meta) {\n this.model = model\n\n let schema = model.schema\n let wheres: string[] = []\n\n if (Array.isArray(where)) {\n let _ors = []\n for (let w of where) {\n const whereArgs = new WhereArgs(model, w, meta)\n if (whereArgs.sql) {\n if (whereArgs.wheres.length > 1) {\n _ors.push(`(${whereArgs.wheres.join(\" AND \")})`)\n } else {\n _ors.push(`${whereArgs.wheres.join(\" AND \")}`)\n }\n }\n }\n\n if (_ors.length) {\n wheres.push(`(${_ors.join(\" OR \")})`)\n }\n } else {\n for (let column in where) {\n this.checkIsAllowed(column)\n const value: any = where[column]\n const field = schema[column]\n\n if (Foreign.is(field)) {\n if (!isArray(value) && !isObject(value)) {\n throw new XansqlError({\n message: `${column} must be an object or array in the WHERE clause, but received ${typeof value} in table ${model.table}`,\n model: model.table,\n column\n });\n } else if (isObject(value) && Object.keys(value).length === 0 || isArray(value) && value.length === 0) {\n // skip empty object\n continue;\n }\n\n if (Foreign.isSchema(field) && isObject(value) && Object.keys(value).some(k => this.condition_keys.includes(k))) {\n const v = this.condition(column, value as WhereSubCondition)\n wheres.push(v)\n continue\n }\n\n let foreign = Foreign.get(model, column)\n let FModel = model.xansql.getModel(foreign.table)\n if (meta && meta.parentTable === foreign.table) {\n throw new XansqlError({\n message: `Circular reference detected in WHERE clause for table ${model.table} on column ${column}`,\n model: model.table,\n column\n });\n }\n let _sql = ''\n if (Array.isArray(value) || isObject(value)) {\n const where = new WhereArgs(FModel, value, { parentTable: model.table })\n if (where.sql) {\n _sql = where.wheres.join(\" AND \")\n }\n } else {\n throw new XansqlError({\n message: `Invalid value for foreign key ${column} in WHERE clause of table ${model.table}`,\n model: model.table,\n column\n });\n }\n\n wheres.push(`EXISTS (SELECT 1 FROM ${foreign.table} WHERE ${foreign.sql} ${_sql ? ` AND ${_sql}` : \"\"})`)\n } else {\n let v = ''\n if (Array.isArray(value)) {\n const sub = value.map((_v: any) => {\n return isObject(_v)\n ? this.condition(column, _v)\n : `${model.table}.${column} = ${ValueFormatter.toSql(model, column, _v)}`\n })\n if (sub.length > 1) {\n v = `(${sub.join(\" OR \")})`\n } else {\n v = sub.join(\" OR \")\n }\n } else if (isObject(value)) {\n v = this.condition(column, value)\n } else {\n v = `${model.table}.${column} = ${ValueFormatter.toSql(model, column, value)}`\n }\n wheres.push(v)\n }\n }\n }\n\n this.wheres = wheres\n this.sql = this.wheres.length ? `WHERE ${this.wheres.join(\" AND \")} ` : \"\"\n }\n\n private condition(column: string, conditions: WhereSubCondition) {\n const model = this.model\n const generate = Object.keys(conditions).map((subKey) => {\n let value = (conditions as any)[subKey];\n if (isObject(value)) {\n throw new XansqlError({\n message: `Invalid value for where condition ${subKey} on column ${column} in table ${model.table}`,\n model: model.table,\n column\n });\n }\n let val: string = value;\n if (Array.isArray(val)) {\n if (['in', 'notIn'].includes(subKey)) {\n val = val.map((item) => ValueFormatter.toSql(model, column, item)).join(\", \");\n } else if (['between', 'notBetween'].includes(subKey)) {\n if (val.length !== 2) {\n throw new XansqlError({\n message: `The 'between' and 'notBetween' operators require an array of exactly two values for column ${column} in table ${model.table}.`,\n model: model.table,\n column\n });\n }\n val = val.map((item) => ValueFormatter.toSql(model, column, item)).join(\" AND \");\n } else {\n throw new XansqlError({\n message: `Array value is not supported for operator ${subKey} on column ${column} in table ${model.table}.`,\n model: model.table,\n column\n });\n }\n } else if (typeof val === 'boolean') {\n val = val ? \"1\" : \"0\";\n } else {\n val = ValueFormatter.toSql(model, column, val);\n }\n\n let col = model.table + \".\" + column;\n switch (subKey) {\n case 'equals':\n if (val === \"NULL\") return `${col} IS NULL`;\n return `${col} = ${val}`;\n case 'not':\n if (val === \"NULL\") return `${col} IS NOT NULL`;\n return `${col} != ${val}`;\n case 'lt':\n return `${col} < ${val}`;\n case 'lte':\n return `${col} <= ${val}`;\n case 'gt':\n return `${col} > ${val}`;\n case 'gte':\n return `${col} >= ${val}`;\n case 'in':\n if (val?.length === 0) {\n return `1 = 0`;\n } else if (!val.includes(\",\")) {\n return `${col} = ${val}`;\n }\n return `${col} IN (${val})`;\n case 'notIn':\n // handle empty array and val is a single value\n if (val.length === 0) {\n return `1 = 1`;\n } else if (!val.includes(\",\")) {\n return `${col} != ${val}`;\n }\n return `${col} NOT IN (${val})`;\n case 'between':\n return `${col} BETWEEN (${val})`;\n case 'notBetween':\n return `${col} NOT BETWEEN (${val})`;\n case 'contains':\n return `${col} LIKE '%${escapeSqlValue(value)}%'`;\n case 'notContains':\n return `${col} NOT LIKE '%${escapeSqlValue(value)}%'`;\n case 'startsWith':\n return `${col} LIKE '${escapeSqlValue(value)}%'`;\n case 'endsWith':\n return `${col} LIKE '%${escapeSqlValue(value)}'`;\n case 'isNull':\n return `${col} IS NULL`;\n case 'isNotNull':\n return `${col} IS NOT NULL`;\n case 'isEmpty':\n return `(${col} IS NULL OR LENGTH(${col}) = 0)`;\n case 'isNotEmpty':\n return `(WHERE ${col} IS NOT NULL AND LENGTH(${col}) > 0)`;\n case 'isTrue':\n return `${col} = TRUE`;\n case 'isFalse':\n return `${col} = FALSE`;\n default:\n throw new XansqlError({\n message: `Unknown where condition ${subKey} on column ${column} in table ${model.table}`,\n model: model.table,\n column\n });\n }\n });\n\n return `${generate.join(' AND ')}`;\n }\n\n private checkIsAllowed(column: string) {\n const field = this.model.schema[column]\n if (Foreign.isArray(field)) return true\n const isNotAllowed = iof(field, XqlArray, XqlObject, XqlRecord, XqlTuple, XqlFile)\n\n if (isNotAllowed) {\n throw new XansqlError({\n message: `Field ${column} of type ${field.constructor.name} is not allowed in WHERE clause in table ${this.model.table}`,\n model: this.model.table,\n column\n });\n }\n }\n}\n\nexport default WhereArgs;"],"names":[],"mappings":";;;;;;;;;;AAgBA,MAAM,SAAS,CAAA;AAQZ,IAAA,WAAA,CAAY,KAAY,EAAE,KAAsC,EAAE,IAAW,EAAA;QAHpE,IAAA,CAAA,GAAG,GAAW,EAAE;AACjB,QAAA,IAAA,CAAA,cAAc,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,CAAC;AAGnO,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAElB,QAAA,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM;QACzB,IAAI,MAAM,GAAa,EAAE;AAEzB,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACvB,IAAI,IAAI,GAAG,EAAE;AACb,YAAA,KAAK,IAAI,CAAC,IAAI,KAAK,EAAE;gBAClB,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC;AAC/C,gBAAA,IAAI,SAAS,CAAC,GAAG,EAAE;oBAChB,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9B,wBAAA,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA,CAAA,CAAG,CAAC;oBACnD;yBAAO;AACJ,wBAAA,IAAI,CAAC,IAAI,CAAC,CAAA,EAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA,CAAE,CAAC;oBACjD;gBACH;YACH;AAEA,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACd,gBAAA,MAAM,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA,CAAA,CAAG,CAAC;YACxC;QACH;aAAO;AACJ,YAAA,KAAK,IAAI,MAAM,IAAI,KAAK,EAAE;AACvB,gBAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;AAC3B,gBAAA,MAAM,KAAK,GAAQ,KAAK,CAAC,MAAM,CAAC;AAChC,gBAAA,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;AAE5B,gBAAA,IAAI,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE;AACpB,oBAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;wBACtC,MAAM,IAAI,WAAW,CAAC;4BACnB,OAAO,EAAE,CAAA,EAAG,MAAM,CAAA,8DAAA,EAAiE,OAAO,KAAK,CAAA,UAAA,EAAa,KAAK,CAAC,KAAK,CAAA,CAAE;4BACzH,KAAK,EAAE,KAAK,CAAC,KAAK;4BAClB;AACF,yBAAA,CAAC;oBACL;yBAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;;wBAEpG;oBACH;AAEA,oBAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;wBAC9G,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAA0B,CAAC;AAC5D,wBAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;wBACd;oBACH;oBAEA,IAAI,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;AACxC,oBAAA,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;oBACjD,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO,CAAC,KAAK,EAAE;wBAC7C,MAAM,IAAI,WAAW,CAAC;AACnB,4BAAA,OAAO,EAAE,CAAA,sDAAA,EAAyD,KAAK,CAAC,KAAK,CAAA,WAAA,EAAc,MAAM,CAAA,CAAE;4BACnG,KAAK,EAAE,KAAK,CAAC,KAAK;4BAClB;AACF,yBAAA,CAAC;oBACL;oBACA,IAAI,IAAI,GAAG,EAAE;AACb,oBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;AAC1C,wBAAA,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;AACxE,wBAAA,IAAI,KAAK,CAAC,GAAG,EAAE;4BACZ,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;wBACpC;oBACH;yBAAO;wBACJ,MAAM,IAAI,WAAW,CAAC;AACnB,4BAAA,OAAO,EAAE,CAAA,8BAAA,EAAiC,MAAM,6BAA6B,KAAK,CAAC,KAAK,CAAA,CAAE;4BAC1F,KAAK,EAAE,KAAK,CAAC,KAAK;4BAClB;AACF,yBAAA,CAAC;oBACL;oBAEA,MAAM,CAAC,IAAI,CAAC,CAAA,sBAAA,EAAyB,OAAO,CAAC,KAAK,CAAA,OAAA,EAAU,OAAO,CAAC,GAAG,CAAA,CAAA,EAAI,IAAI,GAAG,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE,GAAG,EAAE,CAAA,CAAA,CAAG,CAAC;gBAC5G;qBAAO;oBACJ,IAAI,CAAC,GAAG,EAAE;AACV,oBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;wBACvB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAO,KAAI;4BAC/B,OAAO,QAAQ,CAAC,EAAE;kCACb,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE;AAC3B,kCAAE,CAAA,EAAG,KAAK,CAAC,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,GAAA,EAAM,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE;AAC/E,wBAAA,CAAC,CAAC;AACF,wBAAA,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;4BACjB,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA,CAAA,CAAG;wBAC9B;6BAAO;AACJ,4BAAA,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;wBACvB;oBACH;AAAO,yBAAA,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;wBACzB,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC;oBACpC;yBAAO;AACJ,wBAAA,CAAC,GAAG,CAAA,EAAG,KAAK,CAAC,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,GAAA,EAAM,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE;oBACjF;AACA,oBAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBACjB;YACH;QACH;AAEA,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;QACpB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAA,MAAA,EAAS,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA,CAAA,CAAG,GAAG,EAAE;IAC7E;IAEQ,SAAS,CAAC,MAAc,EAAE,UAA6B,EAAA;AAC5D,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;AACxB,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,KAAI;AACrD,YAAA,IAAI,KAAK,GAAI,UAAkB,CAAC,MAAM,CAAC;AACvC,YAAA,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;gBAClB,MAAM,IAAI,WAAW,CAAC;oBACnB,OAAO,EAAE,qCAAqC,MAAM,CAAA,WAAA,EAAc,MAAM,CAAA,UAAA,EAAa,KAAK,CAAC,KAAK,CAAA,CAAE;oBAClG,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB;AACF,iBAAA,CAAC;YACL;YACA,IAAI,GAAG,GAAW,KAAK;AACvB,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBACrB,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;oBACnC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChF;qBAAO,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACpD,oBAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;wBACnB,MAAM,IAAI,WAAW,CAAC;AACnB,4BAAA,OAAO,EAAE,CAAA,2FAAA,EAA8F,MAAM,aAAa,KAAK,CAAC,KAAK,CAAA,CAAA,CAAG;4BACxI,KAAK,EAAE,KAAK,CAAC,KAAK;4BAClB;AACF,yBAAA,CAAC;oBACL;oBACA,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;gBACnF;qBAAO;oBACJ,MAAM,IAAI,WAAW,CAAC;wBACnB,OAAO,EAAE,6CAA6C,MAAM,CAAA,WAAA,EAAc,MAAM,CAAA,UAAA,EAAa,KAAK,CAAC,KAAK,CAAA,CAAA,CAAG;wBAC3G,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB;AACF,qBAAA,CAAC;gBACL;YACH;AAAO,iBAAA,IAAI,OAAO,GAAG,KAAK,SAAS,EAAE;gBAClC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;YACxB;iBAAO;gBACJ,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC;YACjD;YAEA,IAAI,GAAG,GAAG,KAAK,CAAC,KAAK,GAAG,GAAG,GAAG,MAAM;YACpC,QAAQ,MAAM;AACX,gBAAA,KAAK,QAAQ;oBACV,IAAI,GAAG,KAAK,MAAM;wBAAE,OAAO,CAAA,EAAG,GAAG,CAAA,QAAA,CAAU;AAC3C,oBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,GAAA,EAAM,GAAG,EAAE;AAC3B,gBAAA,KAAK,KAAK;oBACP,IAAI,GAAG,KAAK,MAAM;wBAAE,OAAO,CAAA,EAAG,GAAG,CAAA,YAAA,CAAc;AAC/C,oBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,IAAA,EAAO,GAAG,EAAE;AAC5B,gBAAA,KAAK,IAAI;AACN,oBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,GAAA,EAAM,GAAG,EAAE;AAC3B,gBAAA,KAAK,KAAK;AACP,oBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,IAAA,EAAO,GAAG,EAAE;AAC5B,gBAAA,KAAK,IAAI;AACN,oBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,GAAA,EAAM,GAAG,EAAE;AAC3B,gBAAA,KAAK,KAAK;AACP,oBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,IAAA,EAAO,GAAG,EAAE;AAC5B,gBAAA,KAAK,IAAI;oBACN,IAAI,CAAA,GAAG,KAAA,IAAA,IAAH,GAAG,KAAA,MAAA,GAAA,MAAA,GAAH,GAAG,CAAE,MAAM,MAAK,CAAC,EAAE;AACpB,wBAAA,OAAO,OAAO;oBACjB;yBAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC5B,wBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,GAAA,EAAM,GAAG,EAAE;oBAC3B;AACA,oBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,KAAA,EAAQ,GAAG,GAAG;AAC9B,gBAAA,KAAK,OAAO;;AAET,oBAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;AACnB,wBAAA,OAAO,OAAO;oBACjB;yBAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC5B,wBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,IAAA,EAAO,GAAG,EAAE;oBAC5B;AACA,oBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,SAAA,EAAY,GAAG,GAAG;AAClC,gBAAA,KAAK,SAAS;AACX,oBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,UAAA,EAAa,GAAG,GAAG;AACnC,gBAAA,KAAK,YAAY;AACd,oBAAA,OAAO,CAAA,EAAG,GAAG,CAAA,cAAA,EAAiB,GAAG,GAAG;AACvC,gBAAA,KAAK,UAAU;oBACZ,OAAO,CAAA,EAAG,GAAG,CAAA,QAAA,EAAW,cAAc,CAAC,KAAK,CAAC,IAAI;AACpD,gBAAA,KAAK,aAAa;oBACf,OAAO,CAAA,EAAG,GAAG,CAAA,YAAA,EAAe,cAAc,CAAC,KAAK,CAAC,IAAI;AACxD,gBAAA,KAAK,YAAY;oBACd,OAAO,CAAA,EAAG,GAAG,CAAA,OAAA,EAAU,cAAc,CAAC,KAAK,CAAC,IAAI;AACnD,gBAAA,KAAK,UAAU;oBACZ,OAAO,CAAA,EAAG,GAAG,CAAA,QAAA,EAAW,cAAc,CAAC,KAAK,CAAC,GAAG;AACnD,gBAAA,KAAK,QAAQ;oBACV,OAAO,CAAA,EAAG,GAAG,CAAA,QAAA,CAAU;AAC1B,gBAAA,KAAK,WAAW;oBACb,OAAO,CAAA,EAAG,GAAG,CAAA,YAAA,CAAc;AAC9B,gBAAA,KAAK,SAAS;AACX,oBAAA,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,mBAAA,EAAsB,GAAG,QAAQ;AAClD,gBAAA,KAAK,YAAY;AACd,oBAAA,OAAO,CAAA,OAAA,EAAU,GAAG,CAAA,wBAAA,EAA2B,GAAG,QAAQ;AAC7D,gBAAA,KAAK,QAAQ;oBACV,OAAO,CAAA,EAAG,GAAG,CAAA,OAAA,CAAS;AACzB,gBAAA,KAAK,SAAS;oBACX,OAAO,CAAA,EAAG,GAAG,CAAA,QAAA,CAAU;AAC1B,gBAAA;oBACG,MAAM,IAAI,WAAW,CAAC;wBACnB,OAAO,EAAE,2BAA2B,MAAM,CAAA,WAAA,EAAc,MAAM,CAAA,UAAA,EAAa,KAAK,CAAC,KAAK,CAAA,CAAE;wBACxF,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB;AACF,qBAAA,CAAC;;AAEX,QAAA,CAAC,CAAC;QAEF,OAAO,CAAA,EAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;IACrC;AAEQ,IAAA,cAAc,CAAC,MAAc,EAAA;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;AACvC,QAAA,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;AACvC,QAAA,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC;QAElF,IAAI,YAAY,EAAE;YACf,MAAM,IAAI,WAAW,CAAC;AACnB,gBAAA,OAAO,EAAE,CAAA,MAAA,EAAS,MAAM,CAAA,SAAA,EAAY,KAAK,CAAC,WAAW,CAAC,IAAI,4CAA4C,IAAI,CAAC,KAAK,CAAC,KAAK,CAAA,CAAE;AACxH,gBAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;gBACvB;AACF,aAAA,CAAC;QACL;IACH;AACF;;;;"}
|
package/model/Base.cjs
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
var tslib = require('tslib');
|
|
4
4
|
var core_classes_ForeignInfo = require('../core/classes/ForeignInfo.cjs');
|
|
5
5
|
var core_XansqlError = require('../core/XansqlError.cjs');
|
|
6
|
+
var utils_index = require('../utils/index.cjs');
|
|
6
7
|
var xt_fields_IDField = require('../xt/fields/IDField.cjs');
|
|
7
8
|
|
|
8
9
|
class ModelBase {
|
|
@@ -17,7 +18,7 @@ class ModelBase {
|
|
|
17
18
|
this.schema = schema;
|
|
18
19
|
for (let column in schema) {
|
|
19
20
|
const field = schema[column];
|
|
20
|
-
if (field
|
|
21
|
+
if (utils_index.iof(field, xt_fields_IDField)) {
|
|
21
22
|
if (this.IDColumn) {
|
|
22
23
|
throw new core_XansqlError({
|
|
23
24
|
message: `Model ${this.table} has multiple ID columns (${this.IDColumn} and ${column})`,
|
package/model/Base.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Base.cjs","sources":["../../src/model/Base.ts"],"sourcesContent":["import { EventHandler, EventPayloads } from \"../core/classes/EventManager\";\nimport Foreign from \"../core/classes/ForeignInfo\";\nimport Xansql from \"../core/Xansql\";\nimport XansqlError from \"../core/XansqlError\";\nimport XqlIDField from \"../xt/fields/IDField\";\nimport { XansqlSchemaObject } from \"../xt/types\";\nimport { XansqlModelHookNames, XansqlModelHooks } from \"./types\";\n\ntype Relation = {\n type: \"array\" | \"schema\",\n column: string,\n}\n\nabstract class ModelBase {\n readonly schema: XansqlSchemaObject;\n readonly table: string;\n readonly IDColumn: string = '';\n readonly columns: string[] = [];\n readonly relations: Relation[] = [];\n hooks: XansqlModelHooks = {};\n xansql: Xansql = null as any;\n alias: string = '';\n\n constructor(table: string, schema: XansqlSchemaObject) {\n this.table = table;\n this.schema = schema;\n for (let column in schema) {\n const field = schema[column];\n if (field
|
|
1
|
+
{"version":3,"file":"Base.cjs","sources":["../../src/model/Base.ts"],"sourcesContent":["import { EventHandler, EventPayloads } from \"../core/classes/EventManager\";\nimport Foreign from \"../core/classes/ForeignInfo\";\nimport Xansql from \"../core/Xansql\";\nimport XansqlError from \"../core/XansqlError\";\nimport { iof } from \"../utils\";\nimport XqlIDField from \"../xt/fields/IDField\";\nimport { XansqlSchemaObject } from \"../xt/types\";\nimport { XansqlModelHookNames, XansqlModelHooks } from \"./types\";\n\ntype Relation = {\n type: \"array\" | \"schema\",\n column: string,\n}\n\nabstract class ModelBase {\n readonly schema: XansqlSchemaObject;\n readonly table: string;\n readonly IDColumn: string = '';\n readonly columns: string[] = [];\n readonly relations: Relation[] = [];\n hooks: XansqlModelHooks = {};\n xansql: Xansql = null as any;\n alias: string = '';\n\n constructor(table: string, schema: XansqlSchemaObject) {\n this.table = table;\n this.schema = schema;\n for (let column in schema) {\n const field = schema[column];\n if (iof(field, XqlIDField)) {\n if (this.IDColumn) {\n throw new XansqlError({\n message: `Model ${this.table} has multiple ID columns (${this.IDColumn} and ${column})`,\n model: this.table,\n });\n }\n this.IDColumn = column;\n }\n\n if (Foreign.isArray(field)) {\n this.relations.push({ type: \"array\", column });\n } else {\n if (Foreign.isSchema(field)) {\n this.relations.push({ type: \"schema\", column });\n }\n this.columns.push(column);\n }\n }\n if (!this.IDColumn) {\n throw new XansqlError({\n message: `Schema ${this.table} must have an id column`,\n model: this.table,\n });\n }\n }\n\n async execute(sql: string) {\n const xansql = this.xansql;\n return await xansql.execute(sql) as any\n }\n\n isIDColumn(column: string): boolean {\n return column === this.IDColumn;\n }\n\n protected async callHook(hook: XansqlModelHookNames, ...args: any): Promise<any> {\n const xansql = this.xansql;\n const config = xansql.config;\n\n const modelHooks: any = this.hooks || {}\n const configHooks: any = config.hooks || {}\n let returnValue = null;\n\n if (hook in modelHooks!) {\n returnValue = await modelHooks[hook].apply(this, args);\n }\n\n if (hook in configHooks!) {\n returnValue = await configHooks[hook].apply(null, [this, ...args]);\n }\n\n return returnValue;\n }\n\n on<K extends keyof EventPayloads>(event: K, handler: EventHandler<K>) {\n this.xansql.EventManager.on(event, ({ model, ...rest }: any) => {\n handler.apply(this, rest as any);\n });\n }\n\n}\n\nexport default ModelBase;"],"names":["iof","XqlIDField","XansqlError","Foreign","__rest"],"mappings":"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"}
|
package/model/Base.mjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { __rest } from 'tslib';
|
|
2
2
|
import Foreign from '../core/classes/ForeignInfo.mjs';
|
|
3
3
|
import XansqlError from '../core/XansqlError.mjs';
|
|
4
|
+
import { iof } from '../utils/index.mjs';
|
|
4
5
|
import XqlIDField from '../xt/fields/IDField.mjs';
|
|
5
6
|
|
|
6
7
|
class ModelBase {
|
|
@@ -15,7 +16,7 @@ class ModelBase {
|
|
|
15
16
|
this.schema = schema;
|
|
16
17
|
for (let column in schema) {
|
|
17
18
|
const field = schema[column];
|
|
18
|
-
if (field
|
|
19
|
+
if (iof(field, XqlIDField)) {
|
|
19
20
|
if (this.IDColumn) {
|
|
20
21
|
throw new XansqlError({
|
|
21
22
|
message: `Model ${this.table} has multiple ID columns (${this.IDColumn} and ${column})`,
|
package/model/Base.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Base.mjs","sources":["../../src/model/Base.ts"],"sourcesContent":["import { EventHandler, EventPayloads } from \"../core/classes/EventManager\";\nimport Foreign from \"../core/classes/ForeignInfo\";\nimport Xansql from \"../core/Xansql\";\nimport XansqlError from \"../core/XansqlError\";\nimport XqlIDField from \"../xt/fields/IDField\";\nimport { XansqlSchemaObject } from \"../xt/types\";\nimport { XansqlModelHookNames, XansqlModelHooks } from \"./types\";\n\ntype Relation = {\n type: \"array\" | \"schema\",\n column: string,\n}\n\nabstract class ModelBase {\n readonly schema: XansqlSchemaObject;\n readonly table: string;\n readonly IDColumn: string = '';\n readonly columns: string[] = [];\n readonly relations: Relation[] = [];\n hooks: XansqlModelHooks = {};\n xansql: Xansql = null as any;\n alias: string = '';\n\n constructor(table: string, schema: XansqlSchemaObject) {\n this.table = table;\n this.schema = schema;\n for (let column in schema) {\n const field = schema[column];\n if (field
|
|
1
|
+
{"version":3,"file":"Base.mjs","sources":["../../src/model/Base.ts"],"sourcesContent":["import { EventHandler, EventPayloads } from \"../core/classes/EventManager\";\nimport Foreign from \"../core/classes/ForeignInfo\";\nimport Xansql from \"../core/Xansql\";\nimport XansqlError from \"../core/XansqlError\";\nimport { iof } from \"../utils\";\nimport XqlIDField from \"../xt/fields/IDField\";\nimport { XansqlSchemaObject } from \"../xt/types\";\nimport { XansqlModelHookNames, XansqlModelHooks } from \"./types\";\n\ntype Relation = {\n type: \"array\" | \"schema\",\n column: string,\n}\n\nabstract class ModelBase {\n readonly schema: XansqlSchemaObject;\n readonly table: string;\n readonly IDColumn: string = '';\n readonly columns: string[] = [];\n readonly relations: Relation[] = [];\n hooks: XansqlModelHooks = {};\n xansql: Xansql = null as any;\n alias: string = '';\n\n constructor(table: string, schema: XansqlSchemaObject) {\n this.table = table;\n this.schema = schema;\n for (let column in schema) {\n const field = schema[column];\n if (iof(field, XqlIDField)) {\n if (this.IDColumn) {\n throw new XansqlError({\n message: `Model ${this.table} has multiple ID columns (${this.IDColumn} and ${column})`,\n model: this.table,\n });\n }\n this.IDColumn = column;\n }\n\n if (Foreign.isArray(field)) {\n this.relations.push({ type: \"array\", column });\n } else {\n if (Foreign.isSchema(field)) {\n this.relations.push({ type: \"schema\", column });\n }\n this.columns.push(column);\n }\n }\n if (!this.IDColumn) {\n throw new XansqlError({\n message: `Schema ${this.table} must have an id column`,\n model: this.table,\n });\n }\n }\n\n async execute(sql: string) {\n const xansql = this.xansql;\n return await xansql.execute(sql) as any\n }\n\n isIDColumn(column: string): boolean {\n return column === this.IDColumn;\n }\n\n protected async callHook(hook: XansqlModelHookNames, ...args: any): Promise<any> {\n const xansql = this.xansql;\n const config = xansql.config;\n\n const modelHooks: any = this.hooks || {}\n const configHooks: any = config.hooks || {}\n let returnValue = null;\n\n if (hook in modelHooks!) {\n returnValue = await modelHooks[hook].apply(this, args);\n }\n\n if (hook in configHooks!) {\n returnValue = await configHooks[hook].apply(null, [this, ...args]);\n }\n\n return returnValue;\n }\n\n on<K extends keyof EventPayloads>(event: K, handler: EventHandler<K>) {\n this.xansql.EventManager.on(event, ({ model, ...rest }: any) => {\n handler.apply(this, rest as any);\n });\n }\n\n}\n\nexport default ModelBase;"],"names":[],"mappings":";;;;;;AAcA,MAAe,SAAS,CAAA;IAUrB,WAAA,CAAY,KAAa,EAAE,MAA0B,EAAA;QAP5C,IAAA,CAAA,QAAQ,GAAW,EAAE;QACrB,IAAA,CAAA,OAAO,GAAa,EAAE;QACtB,IAAA,CAAA,SAAS,GAAe,EAAE;QACnC,IAAA,CAAA,KAAK,GAAqB,EAAE;QAC5B,IAAA,CAAA,MAAM,GAAW,IAAW;QAC5B,IAAA,CAAA,KAAK,GAAW,EAAE;AAGf,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,KAAK,IAAI,MAAM,IAAI,MAAM,EAAE;AACxB,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;AAC5B,YAAA,IAAI,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE;AACzB,gBAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;oBAChB,MAAM,IAAI,WAAW,CAAC;wBACnB,OAAO,EAAE,CAAA,MAAA,EAAS,IAAI,CAAC,KAAK,CAAA,0BAAA,EAA6B,IAAI,CAAC,QAAQ,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAA,CAAG;wBACvF,KAAK,EAAE,IAAI,CAAC,KAAK;AACnB,qBAAA,CAAC;gBACL;AACA,gBAAA,IAAI,CAAC,QAAQ,GAAG,MAAM;YACzB;AAEA,YAAA,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACzB,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YACjD;iBAAO;AACJ,gBAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AAC1B,oBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;gBAClD;AACA,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YAC5B;QACH;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YACjB,MAAM,IAAI,WAAW,CAAC;AACnB,gBAAA,OAAO,EAAE,CAAA,OAAA,EAAU,IAAI,CAAC,KAAK,CAAA,uBAAA,CAAyB;gBACtD,KAAK,EAAE,IAAI,CAAC,KAAK;AACnB,aAAA,CAAC;QACL;IACH;IAEA,MAAM,OAAO,CAAC,GAAW,EAAA;AACtB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAC1B,QAAA,OAAO,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAQ;IAC1C;AAEA,IAAA,UAAU,CAAC,MAAc,EAAA;AACtB,QAAA,OAAO,MAAM,KAAK,IAAI,CAAC,QAAQ;IAClC;AAEU,IAAA,MAAM,QAAQ,CAAC,IAA0B,EAAE,GAAG,IAAS,EAAA;AAC9D,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAC1B,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM;AAE5B,QAAA,MAAM,UAAU,GAAQ,IAAI,CAAC,KAAK,IAAI,EAAE;AACxC,QAAA,MAAM,WAAW,GAAQ,MAAM,CAAC,KAAK,IAAI,EAAE;QAC3C,IAAI,WAAW,GAAG,IAAI;AAEtB,QAAA,IAAI,IAAI,IAAI,UAAW,EAAE;AACtB,YAAA,WAAW,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;QACzD;AAEA,QAAA,IAAI,IAAI,IAAI,WAAY,EAAE;AACvB,YAAA,WAAW,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;QACrE;AAEA,QAAA,OAAO,WAAW;IACrB;IAEA,EAAE,CAAgC,KAAQ,EAAE,OAAwB,EAAA;AACjE,QAAA,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAuB,KAAI;AAA3B,YAAA,IAAA,EAAE,KAAK,EAAA,GAAA,EAAgB,EAAX,IAAI,GAAA,MAAA,CAAA,EAAA,EAAhB,SAAkB,CAAF;AACjD,YAAA,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAW,CAAC;AACnC,QAAA,CAAC,CAAC;IACL;AAEF;;;;"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var core_classes_ForeignInfo = require('../../../core/classes/ForeignInfo.cjs');
|
|
4
4
|
var core_XansqlError = require('../../../core/XansqlError.cjs');
|
|
5
|
+
var utils_index = require('../../../utils/index.cjs');
|
|
5
6
|
var xt_fields_IDField = require('../../../xt/fields/IDField.cjs');
|
|
6
7
|
var xt_fields_Number = require('../../../xt/fields/Number.cjs');
|
|
7
8
|
|
|
@@ -35,7 +36,7 @@ class SelectArgs {
|
|
|
35
36
|
columnFormat(column, columnArg) {
|
|
36
37
|
let model = this.model;
|
|
37
38
|
const field = model.schema[column];
|
|
38
|
-
const isNumber = field
|
|
39
|
+
const isNumber = utils_index.iof(field, xt_fields_Number, xt_fields_IDField);
|
|
39
40
|
let sql = [];
|
|
40
41
|
for (let func in columnArg) {
|
|
41
42
|
const funcArg = columnArg[func];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectArgs.cjs","sources":["../../../../src/model/Executer/Aggregate/SelectArgs.ts"],"sourcesContent":["import Model from \"../..\";\nimport Foreign from \"../../../core/classes/ForeignInfo\";\nimport XansqlError from \"../../../core/XansqlError\";\nimport XqlIDField from \"../../../xt/fields/IDField\";\nimport XqlNumber from \"../../../xt/fields/Number\";\nimport { AggregateSelectArgsColumnType, AggregateSelectArgsType } from \"../../types\";\n\nclass SelectArgs {\n model: Model\n\n readonly sql: string;\n\n constructor(model: Model, args: AggregateSelectArgsType) {\n this.model = model\n const sqls = []\n\n for (let column in args) {\n const field = model.schema[column];\n if (!field) {\n throw new XansqlError({\n message: `Column ${column} not found in model ${model.table} for aggregate select`,\n model: model.table,\n column: column\n });\n }\n if (Foreign.is(field)) {\n throw new XansqlError({\n message: `Cannot perform aggregate functions on foreign key column ${column} in model ${model.table}`,\n model: model.table,\n column: column\n });\n } else {\n const columnArg = args[column] as AggregateSelectArgsColumnType\n sqls.push(this.columnFormat(column, columnArg))\n }\n }\n\n this.sql = sqls.join(\", \")\n }\n\n columnFormat(column: string, columnArg: AggregateSelectArgsColumnType) {\n let model = this.model\n const field = model.schema[column];\n const isNumber = field
|
|
1
|
+
{"version":3,"file":"SelectArgs.cjs","sources":["../../../../src/model/Executer/Aggregate/SelectArgs.ts"],"sourcesContent":["import Model from \"../..\";\nimport Foreign from \"../../../core/classes/ForeignInfo\";\nimport XansqlError from \"../../../core/XansqlError\";\nimport { iof } from \"../../../utils\";\nimport XqlIDField from \"../../../xt/fields/IDField\";\nimport XqlNumber from \"../../../xt/fields/Number\";\nimport { AggregateSelectArgsColumnType, AggregateSelectArgsType } from \"../../types\";\n\nclass SelectArgs {\n model: Model\n\n readonly sql: string;\n\n constructor(model: Model, args: AggregateSelectArgsType) {\n this.model = model\n const sqls = []\n\n for (let column in args) {\n const field = model.schema[column];\n if (!field) {\n throw new XansqlError({\n message: `Column ${column} not found in model ${model.table} for aggregate select`,\n model: model.table,\n column: column\n });\n }\n if (Foreign.is(field)) {\n throw new XansqlError({\n message: `Cannot perform aggregate functions on foreign key column ${column} in model ${model.table}`,\n model: model.table,\n column: column\n });\n } else {\n const columnArg = args[column] as AggregateSelectArgsColumnType\n sqls.push(this.columnFormat(column, columnArg))\n }\n }\n\n this.sql = sqls.join(\", \")\n }\n\n columnFormat(column: string, columnArg: AggregateSelectArgsColumnType) {\n let model = this.model\n const field = model.schema[column];\n const isNumber = iof(field, XqlNumber, XqlIDField)\n let sql = []\n for (let func in columnArg) {\n const funcArg = columnArg[func as keyof AggregateSelectArgsColumnType]\n const isObject = funcArg && typeof funcArg === \"object\"\n // apply distinct\n let col = column\n if (isObject && funcArg.distinct === true) {\n col = `DISTINCT ${col}`\n }\n\n let _sql = `${func.toUpperCase()}(${col})`\n\n // make to integer for all as REAL\n if (!isNumber) {\n _sql = `CAST(${_sql} AS REAL)`\n }\n\n if (isObject && funcArg?.round !== undefined) {\n _sql = `ROUND(${_sql}, ${funcArg.round})`\n }\n\n if (isObject && funcArg.alias) {\n _sql += ` AS ${funcArg.alias}`\n } else {\n _sql += ` AS ${func}_${column}`\n }\n\n sql.push(_sql)\n }\n return sql.join(\", \")\n }\n\n}\n\nexport default SelectArgs;"],"names":["XansqlError","Foreign","iof","XqlNumber","XqlIDField"],"mappings":";;;;;;;;AAQA,MAAM,UAAU,CAAA;IAKb,WAAA,CAAY,KAAY,EAAE,IAA6B,EAAA;AACpD,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;QAClB,MAAM,IAAI,GAAG,EAAE;AAEf,QAAA,KAAK,IAAI,MAAM,IAAI,IAAI,EAAE;YACtB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;YAClC,IAAI,CAAC,KAAK,EAAE;gBACT,MAAM,IAAIA,gBAAW,CAAC;AACnB,oBAAA,OAAO,EAAE,CAAA,OAAA,EAAU,MAAM,uBAAuB,KAAK,CAAC,KAAK,CAAA,qBAAA,CAAuB;oBAClF,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,oBAAA,MAAM,EAAE;AACV,iBAAA,CAAC;YACL;AACA,YAAA,IAAIC,wBAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE;gBACpB,MAAM,IAAID,gBAAW,CAAC;AACnB,oBAAA,OAAO,EAAE,CAAA,yDAAA,EAA4D,MAAM,aAAa,KAAK,CAAC,KAAK,CAAA,CAAE;oBACrG,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,oBAAA,MAAM,EAAE;AACV,iBAAA,CAAC;YACL;iBAAO;AACJ,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAkC;AAC/D,gBAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAClD;QACH;QAEA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IAC7B;IAEA,YAAY,CAAC,MAAc,EAAE,SAAwC,EAAA;AAClE,QAAA,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK;QACtB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;QAClC,MAAM,QAAQ,GAAGE,eAAG,CAAC,KAAK,EAAEC,gBAAS,EAAEC,iBAAU,CAAC;QAClD,IAAI,GAAG,GAAG,EAAE;AACZ,QAAA,KAAK,IAAI,IAAI,IAAI,SAAS,EAAE;AACzB,YAAA,MAAM,OAAO,GAAG,SAAS,CAAC,IAA2C,CAAC;YACtE,MAAM,QAAQ,GAAG,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;;YAEvD,IAAI,GAAG,GAAG,MAAM;YAChB,IAAI,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE;AACxC,gBAAA,GAAG,GAAG,CAAA,SAAA,EAAY,GAAG,CAAA,CAAE;YAC1B;YAEA,IAAI,IAAI,GAAG,CAAA,EAAG,IAAI,CAAC,WAAW,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAG;;YAG1C,IAAI,CAAC,QAAQ,EAAE;AACZ,gBAAA,IAAI,GAAG,CAAA,KAAA,EAAQ,IAAI,CAAA,SAAA,CAAW;YACjC;AAEA,YAAA,IAAI,QAAQ,IAAI,CAAA,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,MAAA,GAAA,MAAA,GAAP,OAAO,CAAE,KAAK,MAAK,SAAS,EAAE;gBAC3C,IAAI,GAAG,SAAS,IAAI,CAAA,EAAA,EAAK,OAAO,CAAC,KAAK,GAAG;YAC5C;AAEA,YAAA,IAAI,QAAQ,IAAI,OAAO,CAAC,KAAK,EAAE;AAC5B,gBAAA,IAAI,IAAI,CAAA,IAAA,EAAO,OAAO,CAAC,KAAK,EAAE;YACjC;iBAAO;AACJ,gBAAA,IAAI,IAAI,CAAA,IAAA,EAAO,IAAI,CAAA,CAAA,EAAI,MAAM,EAAE;YAClC;AAEA,YAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QACjB;AACA,QAAA,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;IACxB;AAEF;;;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import Foreign from '../../../core/classes/ForeignInfo.mjs';
|
|
2
2
|
import XansqlError from '../../../core/XansqlError.mjs';
|
|
3
|
+
import { iof } from '../../../utils/index.mjs';
|
|
3
4
|
import XqlIDField from '../../../xt/fields/IDField.mjs';
|
|
4
5
|
import XqlNumber from '../../../xt/fields/Number.mjs';
|
|
5
6
|
|
|
@@ -33,7 +34,7 @@ class SelectArgs {
|
|
|
33
34
|
columnFormat(column, columnArg) {
|
|
34
35
|
let model = this.model;
|
|
35
36
|
const field = model.schema[column];
|
|
36
|
-
const isNumber = field
|
|
37
|
+
const isNumber = iof(field, XqlNumber, XqlIDField);
|
|
37
38
|
let sql = [];
|
|
38
39
|
for (let func in columnArg) {
|
|
39
40
|
const funcArg = columnArg[func];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectArgs.mjs","sources":["../../../../src/model/Executer/Aggregate/SelectArgs.ts"],"sourcesContent":["import Model from \"../..\";\nimport Foreign from \"../../../core/classes/ForeignInfo\";\nimport XansqlError from \"../../../core/XansqlError\";\nimport XqlIDField from \"../../../xt/fields/IDField\";\nimport XqlNumber from \"../../../xt/fields/Number\";\nimport { AggregateSelectArgsColumnType, AggregateSelectArgsType } from \"../../types\";\n\nclass SelectArgs {\n model: Model\n\n readonly sql: string;\n\n constructor(model: Model, args: AggregateSelectArgsType) {\n this.model = model\n const sqls = []\n\n for (let column in args) {\n const field = model.schema[column];\n if (!field) {\n throw new XansqlError({\n message: `Column ${column} not found in model ${model.table} for aggregate select`,\n model: model.table,\n column: column\n });\n }\n if (Foreign.is(field)) {\n throw new XansqlError({\n message: `Cannot perform aggregate functions on foreign key column ${column} in model ${model.table}`,\n model: model.table,\n column: column\n });\n } else {\n const columnArg = args[column] as AggregateSelectArgsColumnType\n sqls.push(this.columnFormat(column, columnArg))\n }\n }\n\n this.sql = sqls.join(\", \")\n }\n\n columnFormat(column: string, columnArg: AggregateSelectArgsColumnType) {\n let model = this.model\n const field = model.schema[column];\n const isNumber = field
|
|
1
|
+
{"version":3,"file":"SelectArgs.mjs","sources":["../../../../src/model/Executer/Aggregate/SelectArgs.ts"],"sourcesContent":["import Model from \"../..\";\nimport Foreign from \"../../../core/classes/ForeignInfo\";\nimport XansqlError from \"../../../core/XansqlError\";\nimport { iof } from \"../../../utils\";\nimport XqlIDField from \"../../../xt/fields/IDField\";\nimport XqlNumber from \"../../../xt/fields/Number\";\nimport { AggregateSelectArgsColumnType, AggregateSelectArgsType } from \"../../types\";\n\nclass SelectArgs {\n model: Model\n\n readonly sql: string;\n\n constructor(model: Model, args: AggregateSelectArgsType) {\n this.model = model\n const sqls = []\n\n for (let column in args) {\n const field = model.schema[column];\n if (!field) {\n throw new XansqlError({\n message: `Column ${column} not found in model ${model.table} for aggregate select`,\n model: model.table,\n column: column\n });\n }\n if (Foreign.is(field)) {\n throw new XansqlError({\n message: `Cannot perform aggregate functions on foreign key column ${column} in model ${model.table}`,\n model: model.table,\n column: column\n });\n } else {\n const columnArg = args[column] as AggregateSelectArgsColumnType\n sqls.push(this.columnFormat(column, columnArg))\n }\n }\n\n this.sql = sqls.join(\", \")\n }\n\n columnFormat(column: string, columnArg: AggregateSelectArgsColumnType) {\n let model = this.model\n const field = model.schema[column];\n const isNumber = iof(field, XqlNumber, XqlIDField)\n let sql = []\n for (let func in columnArg) {\n const funcArg = columnArg[func as keyof AggregateSelectArgsColumnType]\n const isObject = funcArg && typeof funcArg === \"object\"\n // apply distinct\n let col = column\n if (isObject && funcArg.distinct === true) {\n col = `DISTINCT ${col}`\n }\n\n let _sql = `${func.toUpperCase()}(${col})`\n\n // make to integer for all as REAL\n if (!isNumber) {\n _sql = `CAST(${_sql} AS REAL)`\n }\n\n if (isObject && funcArg?.round !== undefined) {\n _sql = `ROUND(${_sql}, ${funcArg.round})`\n }\n\n if (isObject && funcArg.alias) {\n _sql += ` AS ${funcArg.alias}`\n } else {\n _sql += ` AS ${func}_${column}`\n }\n\n sql.push(_sql)\n }\n return sql.join(\", \")\n }\n\n}\n\nexport default SelectArgs;"],"names":[],"mappings":";;;;;;AAQA,MAAM,UAAU,CAAA;IAKb,WAAA,CAAY,KAAY,EAAE,IAA6B,EAAA;AACpD,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;QAClB,MAAM,IAAI,GAAG,EAAE;AAEf,QAAA,KAAK,IAAI,MAAM,IAAI,IAAI,EAAE;YACtB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;YAClC,IAAI,CAAC,KAAK,EAAE;gBACT,MAAM,IAAI,WAAW,CAAC;AACnB,oBAAA,OAAO,EAAE,CAAA,OAAA,EAAU,MAAM,uBAAuB,KAAK,CAAC,KAAK,CAAA,qBAAA,CAAuB;oBAClF,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,oBAAA,MAAM,EAAE;AACV,iBAAA,CAAC;YACL;AACA,YAAA,IAAI,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE;gBACpB,MAAM,IAAI,WAAW,CAAC;AACnB,oBAAA,OAAO,EAAE,CAAA,yDAAA,EAA4D,MAAM,aAAa,KAAK,CAAC,KAAK,CAAA,CAAE;oBACrG,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,oBAAA,MAAM,EAAE;AACV,iBAAA,CAAC;YACL;iBAAO;AACJ,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAkC;AAC/D,gBAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAClD;QACH;QAEA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IAC7B;IAEA,YAAY,CAAC,MAAc,EAAE,SAAwC,EAAA;AAClE,QAAA,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK;QACtB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;QAClC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC;QAClD,IAAI,GAAG,GAAG,EAAE;AACZ,QAAA,KAAK,IAAI,IAAI,IAAI,SAAS,EAAE;AACzB,YAAA,MAAM,OAAO,GAAG,SAAS,CAAC,IAA2C,CAAC;YACtE,MAAM,QAAQ,GAAG,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;;YAEvD,IAAI,GAAG,GAAG,MAAM;YAChB,IAAI,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE;AACxC,gBAAA,GAAG,GAAG,CAAA,SAAA,EAAY,GAAG,CAAA,CAAE;YAC1B;YAEA,IAAI,IAAI,GAAG,CAAA,EAAG,IAAI,CAAC,WAAW,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAG;;YAG1C,IAAI,CAAC,QAAQ,EAAE;AACZ,gBAAA,IAAI,GAAG,CAAA,KAAA,EAAQ,IAAI,CAAA,SAAA,CAAW;YACjC;AAEA,YAAA,IAAI,QAAQ,IAAI,CAAA,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,MAAA,GAAA,MAAA,GAAP,OAAO,CAAE,KAAK,MAAK,SAAS,EAAE;gBAC3C,IAAI,GAAG,SAAS,IAAI,CAAA,EAAA,EAAK,OAAO,CAAC,KAAK,GAAG;YAC5C;AAEA,YAAA,IAAI,QAAQ,IAAI,OAAO,CAAC,KAAK,EAAE;AAC5B,gBAAA,IAAI,IAAI,CAAA,IAAA,EAAO,OAAO,CAAC,KAAK,EAAE;YACjC;iBAAO;AACJ,gBAAA,IAAI,IAAI,CAAA,IAAA,EAAO,IAAI,CAAA,CAAA,EAAI,MAAM,EAAE;YAClC;AAEA,YAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QACjB;AACA,QAAA,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;IACxB;AAEF;;;;"}
|
|
@@ -42,11 +42,11 @@ class AggregateExecuter {
|
|
|
42
42
|
groupBySql = ` GROUP BY ${args.groupBy.join(", ")} `;
|
|
43
43
|
}
|
|
44
44
|
sql += `${select.sql} FROM ${model.table} ${Where.sql}${groupBySql}${OrderBy.sql}${LimitSql}`.trim();
|
|
45
|
-
const
|
|
45
|
+
const res = await model.execute(sql);
|
|
46
46
|
// remove groupBy columns from results
|
|
47
|
-
if (this.removeGroupByColumns && results.length && args.groupBy && args.groupBy.length) {
|
|
47
|
+
if (this.removeGroupByColumns && (res === null || res === void 0 ? void 0 : res.results.length) && args.groupBy && args.groupBy.length) {
|
|
48
48
|
const groupBySet = new Set(args.groupBy);
|
|
49
|
-
for (let { chunk } of utils_chunker.chunkArray(results)) {
|
|
49
|
+
for (let { chunk } of utils_chunker.chunkArray(res === null || res === void 0 ? void 0 : res.results)) {
|
|
50
50
|
for (let row of chunk) {
|
|
51
51
|
for (let column of groupBySet) {
|
|
52
52
|
delete row[column];
|
|
@@ -54,7 +54,7 @@ class AggregateExecuter {
|
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
|
-
return results;
|
|
57
|
+
return res === null || res === void 0 ? void 0 : res.results;
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/model/Executer/Aggregate/index.ts"],"sourcesContent":["import Model from \"../..\";\nimport XansqlError from \"../../../core/XansqlError\";\nimport { chunkArray } from \"../../../utils/chunker\";\nimport WhereArgs from \"../../Args/WhereArgs\";\nimport { AggregateArgsType } from \"../../types\";\nimport LimitArgs from \"../Find/LimitArgs\";\nimport OrderByArgs from \"../Find/OrderByArgs\";\nimport SelectArgs from \"./SelectArgs\";\n\nclass AggregateExecuter {\n\n private model: Model\n private removeGroupByColumns: boolean\n constructor(model: Model, removeGroupByColumns: boolean = true) {\n this.model = model\n this.removeGroupByColumns = removeGroupByColumns\n }\n\n async execute(args: AggregateArgsType) {\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 OrderBy = new OrderByArgs(model, args.orderBy || {})\n let LimitSql = \"\"\n\n if (args.groupBy && args.groupBy.length) {\n LimitSql = (new LimitArgs(model, args.limit || {})).sql\n }\n\n if (!LimitSql && Object.keys(args.limit || {}).length) {\n LimitSql = (new LimitArgs(model, args.limit || {})).sql\n }\n\n let sql = `SELECT `\n let groupBySql = \"\"\n if (args.groupBy && args.groupBy.length) {\n // check column is exists\n for (let column of args.groupBy) {\n if (!model.schema[column]) {\n throw new XansqlError({\n message: `Column ${column} not found in model ${model.table} for groupBy`,\n model: model.table,\n column: column\n });\n }\n }\n sql += args.groupBy.join(\", \") + \", \"\n groupBySql = ` GROUP BY ${args.groupBy.join(\", \")} `\n }\n sql += `${select.sql} FROM ${model.table} ${Where.sql}${groupBySql}${OrderBy.sql}${LimitSql}`.trim()\n const
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/model/Executer/Aggregate/index.ts"],"sourcesContent":["import Model from \"../..\";\nimport XansqlError from \"../../../core/XansqlError\";\nimport { chunkArray } from \"../../../utils/chunker\";\nimport WhereArgs from \"../../Args/WhereArgs\";\nimport { AggregateArgsType } from \"../../types\";\nimport LimitArgs from \"../Find/LimitArgs\";\nimport OrderByArgs from \"../Find/OrderByArgs\";\nimport SelectArgs from \"./SelectArgs\";\n\nclass AggregateExecuter {\n\n private model: Model\n private removeGroupByColumns: boolean\n constructor(model: Model, removeGroupByColumns: boolean = true) {\n this.model = model\n this.removeGroupByColumns = removeGroupByColumns\n }\n\n async execute(args: AggregateArgsType) {\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 OrderBy = new OrderByArgs(model, args.orderBy || {})\n let LimitSql = \"\"\n\n if (args.groupBy && args.groupBy.length) {\n LimitSql = (new LimitArgs(model, args.limit || {})).sql\n }\n\n if (!LimitSql && Object.keys(args.limit || {}).length) {\n LimitSql = (new LimitArgs(model, args.limit || {})).sql\n }\n\n let sql = `SELECT `\n let groupBySql = \"\"\n if (args.groupBy && args.groupBy.length) {\n // check column is exists\n for (let column of args.groupBy) {\n if (!model.schema[column]) {\n throw new XansqlError({\n message: `Column ${column} not found in model ${model.table} for groupBy`,\n model: model.table,\n column: column\n });\n }\n }\n sql += args.groupBy.join(\", \") + \", \"\n groupBySql = ` GROUP BY ${args.groupBy.join(\", \")} `\n }\n sql += `${select.sql} FROM ${model.table} ${Where.sql}${groupBySql}${OrderBy.sql}${LimitSql}`.trim()\n const res = await model.execute(sql)\n\n // remove groupBy columns from results\n if (this.removeGroupByColumns && res?.results.length && args.groupBy && args.groupBy.length) {\n const groupBySet = new Set(args.groupBy)\n for (let { chunk } of chunkArray(res?.results)) {\n for (let row of chunk) {\n for (let column of groupBySet) {\n delete (row as any)[column]\n }\n }\n }\n }\n\n return res?.results\n }\n}\n\nexport default AggregateExecuter"],"names":["SelectArgs","WhereArgs","OrderByArgs","LimitArgs","XansqlError","chunkArray"],"mappings":"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"}
|
|
@@ -40,11 +40,11 @@ class AggregateExecuter {
|
|
|
40
40
|
groupBySql = ` GROUP BY ${args.groupBy.join(", ")} `;
|
|
41
41
|
}
|
|
42
42
|
sql += `${select.sql} FROM ${model.table} ${Where.sql}${groupBySql}${OrderBy.sql}${LimitSql}`.trim();
|
|
43
|
-
const
|
|
43
|
+
const res = await model.execute(sql);
|
|
44
44
|
// remove groupBy columns from results
|
|
45
|
-
if (this.removeGroupByColumns && results.length && args.groupBy && args.groupBy.length) {
|
|
45
|
+
if (this.removeGroupByColumns && (res === null || res === void 0 ? void 0 : res.results.length) && args.groupBy && args.groupBy.length) {
|
|
46
46
|
const groupBySet = new Set(args.groupBy);
|
|
47
|
-
for (let { chunk } of chunkArray(results)) {
|
|
47
|
+
for (let { chunk } of chunkArray(res === null || res === void 0 ? void 0 : res.results)) {
|
|
48
48
|
for (let row of chunk) {
|
|
49
49
|
for (let column of groupBySet) {
|
|
50
50
|
delete row[column];
|
|
@@ -52,7 +52,7 @@ class AggregateExecuter {
|
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
|
-
return results;
|
|
55
|
+
return res === null || res === void 0 ? void 0 : res.results;
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../src/model/Executer/Aggregate/index.ts"],"sourcesContent":["import Model from \"../..\";\nimport XansqlError from \"../../../core/XansqlError\";\nimport { chunkArray } from \"../../../utils/chunker\";\nimport WhereArgs from \"../../Args/WhereArgs\";\nimport { AggregateArgsType } from \"../../types\";\nimport LimitArgs from \"../Find/LimitArgs\";\nimport OrderByArgs from \"../Find/OrderByArgs\";\nimport SelectArgs from \"./SelectArgs\";\n\nclass AggregateExecuter {\n\n private model: Model\n private removeGroupByColumns: boolean\n constructor(model: Model, removeGroupByColumns: boolean = true) {\n this.model = model\n this.removeGroupByColumns = removeGroupByColumns\n }\n\n async execute(args: AggregateArgsType) {\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 OrderBy = new OrderByArgs(model, args.orderBy || {})\n let LimitSql = \"\"\n\n if (args.groupBy && args.groupBy.length) {\n LimitSql = (new LimitArgs(model, args.limit || {})).sql\n }\n\n if (!LimitSql && Object.keys(args.limit || {}).length) {\n LimitSql = (new LimitArgs(model, args.limit || {})).sql\n }\n\n let sql = `SELECT `\n let groupBySql = \"\"\n if (args.groupBy && args.groupBy.length) {\n // check column is exists\n for (let column of args.groupBy) {\n if (!model.schema[column]) {\n throw new XansqlError({\n message: `Column ${column} not found in model ${model.table} for groupBy`,\n model: model.table,\n column: column\n });\n }\n }\n sql += args.groupBy.join(\", \") + \", \"\n groupBySql = ` GROUP BY ${args.groupBy.join(\", \")} `\n }\n sql += `${select.sql} FROM ${model.table} ${Where.sql}${groupBySql}${OrderBy.sql}${LimitSql}`.trim()\n const
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../src/model/Executer/Aggregate/index.ts"],"sourcesContent":["import Model from \"../..\";\nimport XansqlError from \"../../../core/XansqlError\";\nimport { chunkArray } from \"../../../utils/chunker\";\nimport WhereArgs from \"../../Args/WhereArgs\";\nimport { AggregateArgsType } from \"../../types\";\nimport LimitArgs from \"../Find/LimitArgs\";\nimport OrderByArgs from \"../Find/OrderByArgs\";\nimport SelectArgs from \"./SelectArgs\";\n\nclass AggregateExecuter {\n\n private model: Model\n private removeGroupByColumns: boolean\n constructor(model: Model, removeGroupByColumns: boolean = true) {\n this.model = model\n this.removeGroupByColumns = removeGroupByColumns\n }\n\n async execute(args: AggregateArgsType) {\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 OrderBy = new OrderByArgs(model, args.orderBy || {})\n let LimitSql = \"\"\n\n if (args.groupBy && args.groupBy.length) {\n LimitSql = (new LimitArgs(model, args.limit || {})).sql\n }\n\n if (!LimitSql && Object.keys(args.limit || {}).length) {\n LimitSql = (new LimitArgs(model, args.limit || {})).sql\n }\n\n let sql = `SELECT `\n let groupBySql = \"\"\n if (args.groupBy && args.groupBy.length) {\n // check column is exists\n for (let column of args.groupBy) {\n if (!model.schema[column]) {\n throw new XansqlError({\n message: `Column ${column} not found in model ${model.table} for groupBy`,\n model: model.table,\n column: column\n });\n }\n }\n sql += args.groupBy.join(\", \") + \", \"\n groupBySql = ` GROUP BY ${args.groupBy.join(\", \")} `\n }\n sql += `${select.sql} FROM ${model.table} ${Where.sql}${groupBySql}${OrderBy.sql}${LimitSql}`.trim()\n const res = await model.execute(sql)\n\n // remove groupBy columns from results\n if (this.removeGroupByColumns && res?.results.length && args.groupBy && args.groupBy.length) {\n const groupBySet = new Set(args.groupBy)\n for (let { chunk } of chunkArray(res?.results)) {\n for (let row of chunk) {\n for (let column of groupBySet) {\n delete (row as any)[column]\n }\n }\n }\n }\n\n return res?.results\n }\n}\n\nexport default AggregateExecuter"],"names":[],"mappings":"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"}
|
|
@@ -84,14 +84,14 @@ class CreateDataArgs {
|
|
|
84
84
|
}
|
|
85
85
|
else {
|
|
86
86
|
// check is the field is IDField or created_at or updated_at
|
|
87
|
-
if (model.IDColumn === column || field
|
|
87
|
+
if (model.IDColumn === column || utils_index.iof(field, xt_fields_Date) && (field.meta.update || (field.meta.create || field.meta.update))) {
|
|
88
88
|
throw new core_XansqlError({
|
|
89
89
|
message: `Cannot set value for ${model.table}.${column}. It is automatically managed.`,
|
|
90
90
|
model: model.table,
|
|
91
91
|
column: column
|
|
92
92
|
});
|
|
93
93
|
}
|
|
94
|
-
if (value
|
|
94
|
+
if (utils_index.iof(value, File)) {
|
|
95
95
|
this.files[column] = value;
|
|
96
96
|
this.data[column] = '';
|
|
97
97
|
model_include_ValueFormatter.toSql(model, column, value); // for validation
|
|
@@ -102,7 +102,7 @@ class CreateDataArgs {
|
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
104
|
catch (error) {
|
|
105
|
-
if (error
|
|
105
|
+
if (utils_index.iof(error, core_XansqlError)) {
|
|
106
106
|
this.errors.push(error);
|
|
107
107
|
}
|
|
108
108
|
else {
|
|
@@ -135,9 +135,13 @@ class CreateDataArgs {
|
|
|
135
135
|
column: column
|
|
136
136
|
}));
|
|
137
137
|
}
|
|
138
|
-
continue;
|
|
139
138
|
}
|
|
140
|
-
|
|
139
|
+
else if (utils_index.iof(field, xt_fields_Date) && (field.meta.create || field.meta.update)) {
|
|
140
|
+
this.data[column] = model_include_ValueFormatter.toSql(model, column, new Date());
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
this.data[column] = model_include_ValueFormatter.toSql(model, column, null);
|
|
144
|
+
}
|
|
141
145
|
}
|
|
142
146
|
// generate sql
|
|
143
147
|
// const keys = Object.keys(this.data)
|