xansql 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Types/fields/Array.d.ts +7 -0
- package/Types/fields/Array.js +6 -0
- package/Types/fields/Array.js.map +1 -0
- package/Types/fields/Array.mjs +6 -0
- package/Types/fields/Array.mjs.map +1 -0
- package/Types/fields/Boolean.d.ts +8 -0
- package/Types/fields/Boolean.js +11 -0
- package/Types/fields/Boolean.js.map +1 -0
- package/Types/fields/Boolean.mjs +11 -0
- package/Types/fields/Boolean.mjs.map +1 -0
- package/Types/fields/Date.d.ts +10 -0
- package/Types/fields/Date.js +22 -0
- package/Types/fields/Date.js.map +1 -0
- package/Types/fields/Date.mjs +22 -0
- package/Types/fields/Date.mjs.map +1 -0
- package/Types/fields/Enum.d.ts +8 -0
- package/Types/fields/Enum.js +10 -0
- package/Types/fields/Enum.js.map +1 -0
- package/Types/fields/Enum.mjs +10 -0
- package/Types/fields/Enum.mjs.map +1 -0
- package/Types/fields/File.d.ts +7 -0
- package/Types/fields/File.js +6 -0
- package/Types/fields/File.js.map +1 -0
- package/Types/fields/File.mjs +6 -0
- package/Types/fields/File.mjs.map +1 -0
- package/Types/fields/IDField.d.ts +6 -0
- package/Types/fields/IDField.js +2 -0
- package/Types/fields/IDField.js.map +1 -0
- package/Types/fields/IDField.mjs +2 -0
- package/Types/fields/IDField.mjs.map +1 -0
- package/Types/fields/Number.d.ts +8 -0
- package/Types/fields/Number.js +11 -0
- package/Types/fields/Number.js.map +1 -0
- package/Types/fields/Number.mjs +11 -0
- package/Types/fields/Number.mjs.map +1 -0
- package/Types/fields/Object.d.ts +8 -0
- package/Types/fields/Object.js +11 -0
- package/Types/fields/Object.js.map +1 -0
- package/Types/fields/Object.mjs +11 -0
- package/Types/fields/Object.mjs.map +1 -0
- package/Types/fields/Record.d.ts +8 -0
- package/Types/fields/Record.js +11 -0
- package/Types/fields/Record.js.map +1 -0
- package/Types/fields/Record.mjs +11 -0
- package/Types/fields/Record.mjs.map +1 -0
- package/Types/fields/Schema.d.ts +16 -0
- package/Types/fields/Schema.js +34 -0
- package/Types/fields/Schema.js.map +1 -0
- package/Types/fields/Schema.mjs +34 -0
- package/Types/fields/Schema.mjs.map +1 -0
- package/Types/fields/String.d.ts +10 -0
- package/Types/fields/String.js +20 -0
- package/Types/fields/String.js.map +1 -0
- package/Types/fields/String.mjs +20 -0
- package/Types/fields/String.mjs.map +1 -0
- package/Types/fields/Tuple.d.ts +8 -0
- package/Types/fields/Tuple.js +11 -0
- package/Types/fields/Tuple.js.map +1 -0
- package/Types/fields/Tuple.mjs +11 -0
- package/Types/fields/Tuple.mjs.map +1 -0
- package/Types/fields/Union.d.ts +8 -0
- package/Types/fields/Union.js +11 -0
- package/Types/fields/Union.js.map +1 -0
- package/Types/fields/Union.mjs +11 -0
- package/Types/fields/Union.mjs.map +1 -0
- package/Types/index.d.ts +56 -0
- package/Types/index.js +129 -0
- package/Types/index.js.map +1 -0
- package/Types/index.mjs +129 -0
- package/Types/index.mjs.map +1 -0
- package/Types/types.d.ts +20 -0
- package/core/ExcuteMeta.d.ts +11 -0
- package/core/ExcuteMeta.js +22 -0
- package/core/ExcuteMeta.js.map +1 -0
- package/core/ExcuteMeta.mjs +22 -0
- package/core/ExcuteMeta.mjs.map +1 -0
- package/core/Xansql.d.ts +46 -0
- package/core/Xansql.js +132 -0
- package/core/Xansql.js.map +1 -0
- package/core/Xansql.mjs +132 -0
- package/core/Xansql.mjs.map +1 -0
- package/core/XansqlError.js +11 -0
- package/core/XansqlError.js.map +1 -0
- package/core/XansqlError.mjs +11 -0
- package/core/XansqlError.mjs.map +1 -0
- package/core/XansqlResult.d.ts +12 -0
- package/core/XansqlResult.js +32 -0
- package/core/XansqlResult.js.map +1 -0
- package/core/XansqlResult.mjs +32 -0
- package/core/XansqlResult.mjs.map +1 -0
- package/core/classes/EventManager.d.ts +72 -0
- package/core/classes/EventManager.js +21 -0
- package/core/classes/EventManager.js.map +1 -0
- package/core/classes/EventManager.mjs +21 -0
- package/core/classes/EventManager.mjs.map +1 -0
- package/core/classes/ForeignInfo.js +51 -0
- package/core/classes/ForeignInfo.js.map +1 -0
- package/core/classes/ForeignInfo.mjs +51 -0
- package/core/classes/ForeignInfo.mjs.map +1 -0
- package/core/classes/Migration/ForeingMigration.d.ts +12 -0
- package/core/classes/Migration/ForeingMigration.js +52 -0
- package/core/classes/Migration/ForeingMigration.js.map +1 -0
- package/core/classes/Migration/ForeingMigration.mjs +52 -0
- package/core/classes/Migration/ForeingMigration.mjs.map +1 -0
- package/core/classes/Migration/IndexMigration.d.ts +12 -0
- package/core/classes/Migration/IndexMigration.js +49 -0
- package/core/classes/Migration/IndexMigration.js.map +1 -0
- package/core/classes/Migration/IndexMigration.mjs +49 -0
- package/core/classes/Migration/IndexMigration.mjs.map +1 -0
- package/core/classes/Migration/TableMigration.d.ts +33 -0
- package/core/classes/Migration/TableMigration.js +215 -0
- package/core/classes/Migration/TableMigration.js.map +1 -0
- package/core/classes/Migration/TableMigration.mjs +215 -0
- package/core/classes/Migration/TableMigration.mjs.map +1 -0
- package/core/classes/Migration/index.d.ts +12 -0
- package/core/classes/Migration/index.js +189 -0
- package/core/classes/Migration/index.js.map +1 -0
- package/core/classes/Migration/index.mjs +189 -0
- package/core/classes/Migration/index.mjs.map +1 -0
- package/core/classes/ModelFormatter.js +166 -0
- package/core/classes/ModelFormatter.js.map +1 -0
- package/core/classes/ModelFormatter.mjs +166 -0
- package/core/classes/ModelFormatter.mjs.map +1 -0
- package/core/classes/TypesGenerator.d.ts +13 -0
- package/core/classes/TypesGenerator.js +170 -0
- package/core/classes/TypesGenerator.js.map +1 -0
- package/core/classes/TypesGenerator.mjs +170 -0
- package/core/classes/TypesGenerator.mjs.map +1 -0
- package/core/classes/XansqlConfig.js +33 -0
- package/core/classes/XansqlConfig.js.map +1 -0
- package/core/classes/XansqlConfig.mjs +33 -0
- package/core/classes/XansqlConfig.mjs.map +1 -0
- package/core/classes/XansqlFetch.js +304 -0
- package/core/classes/XansqlFetch.js.map +1 -0
- package/core/classes/XansqlFetch.mjs +304 -0
- package/core/classes/XansqlFetch.mjs.map +1 -0
- package/core/classes/XansqlTransaction.d.ts +13 -0
- package/core/classes/XansqlTransaction.js +46 -0
- package/core/classes/XansqlTransaction.js.map +1 -0
- package/core/classes/XansqlTransaction.mjs +46 -0
- package/core/classes/XansqlTransaction.mjs.map +1 -0
- package/core/type.d.ts +117 -0
- package/index.d.ts +3 -0
- package/index.js +1 -0
- package/index.js.map +1 -0
- package/index.mjs +1 -0
- package/index.mjs.map +1 -0
- package/model/Args/RelationExcuteArgs.js +5 -0
- package/model/Args/RelationExcuteArgs.js.map +1 -0
- package/model/Args/RelationExcuteArgs.mjs +5 -0
- package/model/Args/RelationExcuteArgs.mjs.map +1 -0
- package/model/Args/WhereArgs.js +226 -0
- package/model/Args/WhereArgs.js.map +1 -0
- package/model/Args/WhereArgs.mjs +226 -0
- package/model/Args/WhereArgs.mjs.map +1 -0
- package/model/Base.d.ts +26 -0
- package/model/Base.js +64 -0
- package/model/Base.js.map +1 -0
- package/model/Base.mjs +64 -0
- package/model/Base.mjs.map +1 -0
- package/model/Executer/Aggregate/SelectArgs.js +59 -0
- package/model/Executer/Aggregate/SelectArgs.js.map +1 -0
- package/model/Executer/Aggregate/SelectArgs.mjs +59 -0
- package/model/Executer/Aggregate/SelectArgs.mjs.map +1 -0
- package/model/Executer/Aggregate/index.js +59 -0
- package/model/Executer/Aggregate/index.js.map +1 -0
- package/model/Executer/Aggregate/index.mjs +59 -0
- package/model/Executer/Aggregate/index.mjs.map +1 -0
- package/model/Executer/Create/CreateDataArgs.js +145 -0
- package/model/Executer/Create/CreateDataArgs.js.map +1 -0
- package/model/Executer/Create/CreateDataArgs.mjs +145 -0
- package/model/Executer/Create/CreateDataArgs.mjs.map +1 -0
- package/model/Executer/Create/index.js +101 -0
- package/model/Executer/Create/index.js.map +1 -0
- package/model/Executer/Create/index.mjs +101 -0
- package/model/Executer/Create/index.mjs.map +1 -0
- package/model/Executer/Delete/index.js +112 -0
- package/model/Executer/Delete/index.js.map +1 -0
- package/model/Executer/Delete/index.mjs +112 -0
- package/model/Executer/Delete/index.mjs.map +1 -0
- package/model/Executer/Find/DistinctArgs.js +32 -0
- package/model/Executer/Find/DistinctArgs.js.map +1 -0
- package/model/Executer/Find/DistinctArgs.mjs +32 -0
- package/model/Executer/Find/DistinctArgs.mjs.map +1 -0
- package/model/Executer/Find/LimitArgs.js +31 -0
- package/model/Executer/Find/LimitArgs.js.map +1 -0
- package/model/Executer/Find/LimitArgs.mjs +31 -0
- package/model/Executer/Find/LimitArgs.mjs.map +1 -0
- package/model/Executer/Find/OrderByArgs.js +29 -0
- package/model/Executer/Find/OrderByArgs.js.map +1 -0
- package/model/Executer/Find/OrderByArgs.mjs +29 -0
- package/model/Executer/Find/OrderByArgs.mjs.map +1 -0
- package/model/Executer/Find/SelectArgs.js +119 -0
- package/model/Executer/Find/SelectArgs.js.map +1 -0
- package/model/Executer/Find/SelectArgs.mjs +119 -0
- package/model/Executer/Find/SelectArgs.mjs.map +1 -0
- package/model/Executer/Find/index.js +338 -0
- package/model/Executer/Find/index.js.map +1 -0
- package/model/Executer/Find/index.mjs +338 -0
- package/model/Executer/Find/index.mjs.map +1 -0
- package/model/Executer/Update/UpdateDataArgs.js +124 -0
- package/model/Executer/Update/UpdateDataArgs.js.map +1 -0
- package/model/Executer/Update/UpdateDataArgs.mjs +124 -0
- package/model/Executer/Update/UpdateDataArgs.mjs.map +1 -0
- package/model/Executer/Update/index.js +207 -0
- package/model/Executer/Update/index.js.map +1 -0
- package/model/Executer/Update/index.mjs +207 -0
- package/model/Executer/Update/index.mjs.map +1 -0
- package/model/include/ValueFormatter.js +99 -0
- package/model/include/ValueFormatter.js.map +1 -0
- package/model/include/ValueFormatter.mjs +99 -0
- package/model/include/ValueFormatter.mjs.map +1 -0
- package/model/index.d.ts +29 -0
- package/model/index.js +236 -0
- package/model/index.js.map +1 -0
- package/model/index.mjs +236 -0
- package/model/index.mjs.map +1 -0
- package/model/type.d.ts +106 -0
- package/package.json +32 -0
- package/readme.md +359 -0
- package/utils/chunker.js +53 -0
- package/utils/chunker.js.map +1 -0
- package/utils/chunker.mjs +53 -0
- package/utils/chunker.mjs.map +1 -0
- package/utils/index.js +49 -0
- package/utils/index.js.map +1 -0
- package/utils/index.mjs +49 -0
- package/utils/index.mjs.map +1 -0
- package/utils/sha256.js +66 -0
- package/utils/sha256.js.map +1 -0
- package/utils/sha256.mjs +66 -0
- package/utils/sha256.mjs.map +1 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import CreateDataArgs from'./CreateDataArgs.mjs';import SelectArgs from'../Find/SelectArgs.mjs';import {chunkArray}from'../../../utils/chunker.mjs';import RelationExecuteArgs from'../../Args/RelationExcuteArgs.mjs';import ExecuteMeta from'../../../core/ExcuteMeta.mjs';class CreateExecuter {
|
|
2
|
+
constructor(model) {
|
|
3
|
+
this.model = model;
|
|
4
|
+
}
|
|
5
|
+
async execute(args) {
|
|
6
|
+
const xansql = this.model.xansql;
|
|
7
|
+
const model = this.model;
|
|
8
|
+
const createArgs = new CreateDataArgs(model, args.data);
|
|
9
|
+
const isRelation = args instanceof RelationExecuteArgs;
|
|
10
|
+
// only for validation
|
|
11
|
+
if (args.select)
|
|
12
|
+
new SelectArgs(model, args.select || {});
|
|
13
|
+
const insertIds = [];
|
|
14
|
+
let results = [];
|
|
15
|
+
for (let { chunk } of chunkArray(createArgs.values)) {
|
|
16
|
+
for (let arg of chunk) {
|
|
17
|
+
let insertId;
|
|
18
|
+
const fileColumns = Object.keys(arg.files);
|
|
19
|
+
const uploadedFileIds = [];
|
|
20
|
+
try {
|
|
21
|
+
if (fileColumns.length > 0) {
|
|
22
|
+
let executeId = undefined;
|
|
23
|
+
if (typeof window !== "undefined") {
|
|
24
|
+
executeId = ExecuteMeta.set({
|
|
25
|
+
model,
|
|
26
|
+
action: "UPLOAD_FILE",
|
|
27
|
+
modelType: isRelation ? "child" : "main",
|
|
28
|
+
args: arg
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
for (let file_col of fileColumns) {
|
|
32
|
+
const filemeta = await xansql.uploadFile(arg.files[file_col], executeId);
|
|
33
|
+
uploadedFileIds.push(filemeta.fileId);
|
|
34
|
+
arg.data[file_col] = `'${JSON.stringify(filemeta)}'`;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
let executeId = undefined;
|
|
38
|
+
if (typeof window !== "undefined") {
|
|
39
|
+
executeId = ExecuteMeta.set({
|
|
40
|
+
model,
|
|
41
|
+
action: "INSERT",
|
|
42
|
+
modelType: isRelation ? "child" : "main",
|
|
43
|
+
args: arg
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
const keys = Object.keys(arg.data);
|
|
47
|
+
const sql = `INSERT INTO ${model.table} (${keys.join(", ")}) VALUES (${keys.map(k => arg.data[k]).join(", ")})`;
|
|
48
|
+
const created = await xansql.execute(sql, executeId);
|
|
49
|
+
insertId = created.insertId;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (fileColumns.length > 0) {
|
|
53
|
+
let executeId = undefined;
|
|
54
|
+
if (typeof window !== "undefined") {
|
|
55
|
+
executeId = ExecuteMeta.set({
|
|
56
|
+
model,
|
|
57
|
+
action: "DELETE_FILE",
|
|
58
|
+
modelType: isRelation ? "child" : "main",
|
|
59
|
+
args: arg
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
for (let fileId of uploadedFileIds) {
|
|
63
|
+
try {
|
|
64
|
+
await xansql.deleteFile(fileId, executeId);
|
|
65
|
+
}
|
|
66
|
+
catch (error) { }
|
|
67
|
+
}
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (insertId) {
|
|
72
|
+
insertIds.push(insertId);
|
|
73
|
+
results.push({ [model.IDColumn]: insertId });
|
|
74
|
+
// execute relations
|
|
75
|
+
for (let rel_column in arg.relations) {
|
|
76
|
+
const relInfo = arg.relations[rel_column];
|
|
77
|
+
const foreign = relInfo.foreign;
|
|
78
|
+
const FModel = xansql.getModel(foreign.table);
|
|
79
|
+
for (let relData of relInfo.data) {
|
|
80
|
+
const fdata = Object.assign(Object.assign({}, relData), { [foreign.column]: insertId });
|
|
81
|
+
const rargs = new RelationExecuteArgs({
|
|
82
|
+
data: fdata
|
|
83
|
+
});
|
|
84
|
+
await FModel.create(rargs);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (args.select) {
|
|
91
|
+
results = await model.find({
|
|
92
|
+
where: {
|
|
93
|
+
[model.IDColumn]: insertIds.length === 1 ? insertIds[0] : { in: insertIds }
|
|
94
|
+
},
|
|
95
|
+
limit: "all",
|
|
96
|
+
select: args.select
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
return results;
|
|
100
|
+
}
|
|
101
|
+
}export{CreateExecuter as default};//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../src/model/Executer/Create/index.ts"],"sourcesContent":["import Model from \"../..\"\nimport CreateDataArgs from \"./CreateDataArgs\"\nimport { CreateArgsType } from \"../../type\"\nimport SelectArgs from \"../Find/SelectArgs\"\nimport { chunkArray } from \"../../../utils/chunker\"\nimport RelationExecuteArgs from \"../../Args/RelationExcuteArgs\"\nimport ExecuteMeta from \"../../../core/ExcuteMeta\"\n\nclass CreateExecuter {\n model: Model\n constructor(model: Model) {\n this.model = model\n }\n async execute(args: CreateArgsType) {\n const xansql = this.model.xansql\n const model = this.model\n const createArgs = new CreateDataArgs(model, args.data)\n const isRelation = args instanceof RelationExecuteArgs\n\n // only for validation\n if (args.select) new SelectArgs(model, args.select || {})\n\n const insertIds = []\n let results = []\n\n for (let { chunk } of chunkArray(createArgs.values)) {\n for (let arg of chunk) {\n let insertId\n const fileColumns = Object.keys(arg.files)\n const uploadedFileIds: string[] = []\n try {\n\n if (fileColumns.length > 0) {\n let executeId = undefined;\n if (typeof window !== \"undefined\") {\n executeId = ExecuteMeta.set({\n model,\n action: \"UPLOAD_FILE\",\n modelType: isRelation ? \"child\" : \"main\",\n args: arg\n });\n }\n for (let file_col of fileColumns) {\n const filemeta = await xansql.uploadFile(arg.files[file_col], executeId)\n uploadedFileIds.push(filemeta.fileId)\n arg.data[file_col] = `'${JSON.stringify(filemeta)}'`\n }\n }\n let executeId = undefined;\n if (typeof window !== \"undefined\") {\n executeId = ExecuteMeta.set({\n model,\n action: \"INSERT\",\n modelType: isRelation ? \"child\" : \"main\",\n args: arg\n });\n }\n const keys = Object.keys(arg.data)\n const sql = `INSERT INTO ${model.table} (${keys.join(\", \")}) VALUES (${keys.map(k => arg.data[k]).join(\", \")})`\n const created = await xansql.execute(sql, executeId)\n insertId = created.insertId\n } catch (error: any) {\n if (fileColumns.length > 0) {\n let executeId = undefined;\n if (typeof window !== \"undefined\") {\n executeId = ExecuteMeta.set({\n model,\n action: \"DELETE_FILE\",\n modelType: isRelation ? \"child\" : \"main\",\n args: arg\n });\n }\n for (let fileId of uploadedFileIds) {\n try {\n await xansql.deleteFile(fileId, executeId)\n } catch (error) { }\n }\n throw error\n }\n }\n if (insertId) {\n insertIds.push(insertId)\n results.push({ [model.IDColumn]: insertId })\n\n // execute relations\n for (let rel_column in arg.relations) {\n const relInfo = arg.relations[rel_column]\n const foreign = relInfo.foreign\n const FModel = xansql.getModel(foreign.table)\n for (let relData of relInfo.data) {\n const fdata = {\n ...relData,\n [foreign.column]: insertId\n }\n const rargs = new RelationExecuteArgs({\n data: fdata\n })\n await FModel.create(rargs as any)\n }\n }\n }\n }\n }\n\n if (args.select) {\n results = await model.find({\n where: {\n [model.IDColumn]: insertIds.length === 1 ? insertIds[0] : { in: insertIds }\n },\n limit: \"all\",\n select: args.select\n })\n }\n\n return results\n }\n\n}\n\nexport default CreateExecuter"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var WhereArgs=require('../../Args/WhereArgs.js'),RelationExcuteArgs=require('../../Args/RelationExcuteArgs.js'),ForeignInfo=require('../../../core/classes/ForeignInfo.js'),File=require('../../../Types/fields/File.js'),chunker=require('../../../utils/chunker.js'),ExcuteMeta=require('../../../core/ExcuteMeta.js'),XansqlError=require('../../../core/XansqlError.js');class DeleteExecuter {
|
|
2
|
+
constructor(model) {
|
|
3
|
+
this.model = model;
|
|
4
|
+
}
|
|
5
|
+
async execute(args) {
|
|
6
|
+
const xansql = this.model.xansql;
|
|
7
|
+
const model = this.model;
|
|
8
|
+
const isRelation = args instanceof RelationExcuteArgs.default;
|
|
9
|
+
if (!args.where || Object.keys(args.where).length === 0) {
|
|
10
|
+
throw new XansqlError.default({
|
|
11
|
+
message: `Delete operation on model ${model.table} requires a WHERE clause to prevent accidental deletion of all records.`,
|
|
12
|
+
model: model.table
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
let fileColumns = [];
|
|
16
|
+
let foreignFields = {};
|
|
17
|
+
for (let column in model.schema) {
|
|
18
|
+
const field = model.schema[column];
|
|
19
|
+
if (field instanceof File.default) {
|
|
20
|
+
fileColumns.push(column);
|
|
21
|
+
}
|
|
22
|
+
if (ForeignInfo.default.isArray(field)) {
|
|
23
|
+
foreignFields[column] = field;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const results = await model.find({
|
|
27
|
+
where: args.where,
|
|
28
|
+
limit: "all",
|
|
29
|
+
select: Object.assign({ [model.IDColumn]: true }, (args.select || {}))
|
|
30
|
+
});
|
|
31
|
+
if (results.length === 0) {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
for (let column in foreignFields) {
|
|
35
|
+
const field = foreignFields[column];
|
|
36
|
+
const meta = field.meta || {};
|
|
37
|
+
const foreign = ForeignInfo.default.get(model, column);
|
|
38
|
+
const FModel = model.xansql.getModel(foreign.table);
|
|
39
|
+
if (meta.optional || meta.nullable) {
|
|
40
|
+
// update foreign column to null
|
|
41
|
+
await FModel.update(new RelationExcuteArgs.default({
|
|
42
|
+
data: { [foreign.column]: null },
|
|
43
|
+
where: { [foreign.column]: args.where }
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// delete all foreign rows
|
|
48
|
+
await FModel.delete(new RelationExcuteArgs.default({
|
|
49
|
+
where: { [foreign.column]: args.where }
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
let fileRows = [];
|
|
54
|
+
if (fileColumns.length) {
|
|
55
|
+
let fileWhere = [
|
|
56
|
+
...fileColumns.map(col => ({ [col]: { isNotNull: true } }))
|
|
57
|
+
];
|
|
58
|
+
if (Array.isArray(args.where)) {
|
|
59
|
+
fileWhere = [...args.where, ...fileWhere];
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
fileWhere = [args.where, ...fileWhere];
|
|
63
|
+
}
|
|
64
|
+
fileRows = await model.find({
|
|
65
|
+
where: fileWhere,
|
|
66
|
+
limit: "all",
|
|
67
|
+
select: fileColumns.reduce((acc, col) => {
|
|
68
|
+
acc[col] = true;
|
|
69
|
+
return acc;
|
|
70
|
+
}, {})
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
let executeId = undefined;
|
|
74
|
+
if (typeof window !== "undefined") {
|
|
75
|
+
executeId = ExcuteMeta.default.set({
|
|
76
|
+
model,
|
|
77
|
+
action: "DELETE",
|
|
78
|
+
modelType: isRelation ? "child" : "main",
|
|
79
|
+
args
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const Where = new WhereArgs.default(model, args.where);
|
|
83
|
+
const sql = `DELETE FROM ${model.table} ${Where.sql}`.trim();
|
|
84
|
+
const { affectedRows } = await xansql.execute(sql, executeId);
|
|
85
|
+
if (!affectedRows || affectedRows === 0) {
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
// delete files
|
|
89
|
+
if (fileColumns.length && fileRows.length) {
|
|
90
|
+
let executeId = undefined;
|
|
91
|
+
if (typeof window !== "undefined") {
|
|
92
|
+
executeId = ExcuteMeta.default.set({
|
|
93
|
+
model,
|
|
94
|
+
action: "DELETE_FILE",
|
|
95
|
+
modelType: isRelation ? "child" : "main",
|
|
96
|
+
args
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
for (let { chunk } of chunker.chunkArray(fileRows)) {
|
|
100
|
+
for (let row of chunk) {
|
|
101
|
+
for (let file_col of fileColumns) {
|
|
102
|
+
const filemeta = row[file_col];
|
|
103
|
+
if (filemeta) {
|
|
104
|
+
await xansql.deleteFile(filemeta.fileId, executeId);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return results;
|
|
111
|
+
}
|
|
112
|
+
}exports.default=DeleteExecuter;//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/model/Executer/Delete/index.ts"],"sourcesContent":["import Model from \"../..\"\nimport WhereArgs from \"../../Args/WhereArgs\"\nimport { DeleteArgsType, WhereArgsType } from \"../../type\"\nimport RelationExecuteArgs from \"../../Args/RelationExcuteArgs\"\nimport Foreign from \"../../../core/classes/ForeignInfo\"\nimport XqlFile from \"../../../Types/fields/File\"\nimport { XqlFields } from \"../../../Types/types\"\nimport { chunkArray } from \"../../../utils/chunker\"\nimport ExecuteMeta from \"../../../core/ExcuteMeta\"\nimport XansqlError from \"../../../core/XansqlError\"\n\n\nclass DeleteExecuter {\n model: Model\n constructor(model: Model) {\n this.model = model\n }\n\n async execute(args: DeleteArgsType) {\n const xansql = this.model.xansql\n const model = this.model\n const isRelation = args instanceof RelationExecuteArgs\n if (!args.where || Object.keys(args.where).length === 0) {\n throw new XansqlError({\n message: `Delete operation on model ${model.table} requires a WHERE clause to prevent accidental deletion of all records.`,\n model: model.table\n })\n }\n\n let fileColumns: string[] = []\n let foreignFields: { [col: string]: XqlFields } = {}\n\n for (let column in model.schema) {\n const field = model.schema[column]\n if (field instanceof XqlFile) {\n fileColumns.push(column)\n }\n\n if (Foreign.isArray(field)) {\n foreignFields[column] = field\n }\n }\n\n const results = await model.find({\n where: args.where,\n limit: \"all\",\n select: {\n [model.IDColumn]: true,\n ...(args.select || {})\n }\n })\n\n if (results.length === 0) {\n return []\n }\n\n for (let column in foreignFields) {\n const field = foreignFields[column]\n const meta = field.meta || {}\n const foreign = Foreign.get(model, column)\n const FModel = model.xansql.getModel(foreign.table)\n if (meta.optional || meta.nullable) {\n // update foreign column to null\n await FModel.update(new RelationExecuteArgs({\n data: { [foreign.column]: null },\n where: { [foreign.column]: args.where }\n }) as any)\n } else {\n // delete all foreign rows\n await FModel.delete(new RelationExecuteArgs({\n where: { [foreign.column]: args.where }\n }) as any)\n }\n }\n\n let fileRows: any[] = []\n if (fileColumns.length) {\n let fileWhere: WhereArgsType = [\n ...fileColumns.map(col => ({ [col]: { isNotNull: true } }))\n ]\n if (Array.isArray(args.where)) {\n fileWhere = [...args.where, ...fileWhere]\n } else {\n fileWhere = [args.where, ...fileWhere]\n }\n\n fileRows = await model.find({\n where: fileWhere,\n limit: \"all\",\n select: fileColumns.reduce((acc, col) => {\n acc[col] = true\n return acc\n }, {} as any)\n })\n }\n\n let executeId = undefined;\n if (typeof window !== \"undefined\") {\n executeId = ExecuteMeta.set({\n model,\n action: \"DELETE\",\n modelType: isRelation ? \"child\" : \"main\",\n args\n });\n }\n\n const Where = new WhereArgs(model, args.where)\n const sql = `DELETE FROM ${model.table} ${Where.sql}`.trim()\n const { affectedRows } = await xansql.execute(sql, executeId)\n if (!affectedRows || affectedRows === 0) {\n return []\n }\n\n // delete files\n if (fileColumns.length && fileRows.length) {\n let executeId = undefined;\n if (typeof window !== \"undefined\") {\n executeId = ExecuteMeta.set({\n model,\n action: \"DELETE_FILE\",\n modelType: isRelation ? \"child\" : \"main\",\n args\n });\n }\n for (let { chunk } of chunkArray(fileRows)) {\n for (let row of chunk) {\n for (let file_col of fileColumns) {\n const filemeta = row[file_col]\n if (filemeta) {\n await xansql.deleteFile(filemeta.fileId, executeId)\n }\n }\n }\n }\n }\n\n return results\n }\n}\n\nexport default DeleteExecuter"],"names":["RelationExecuteArgs","XansqlError","XqlFile","Foreign","ExecuteMeta","WhereArgs","chunkArray"],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import WhereArgs from'../../Args/WhereArgs.mjs';import RelationExecuteArgs from'../../Args/RelationExcuteArgs.mjs';import Foreign from'../../../core/classes/ForeignInfo.mjs';import XqlFile from'../../../Types/fields/File.mjs';import {chunkArray}from'../../../utils/chunker.mjs';import ExecuteMeta from'../../../core/ExcuteMeta.mjs';import XansqlError from'../../../core/XansqlError.mjs';class DeleteExecuter {
|
|
2
|
+
constructor(model) {
|
|
3
|
+
this.model = model;
|
|
4
|
+
}
|
|
5
|
+
async execute(args) {
|
|
6
|
+
const xansql = this.model.xansql;
|
|
7
|
+
const model = this.model;
|
|
8
|
+
const isRelation = args instanceof RelationExecuteArgs;
|
|
9
|
+
if (!args.where || Object.keys(args.where).length === 0) {
|
|
10
|
+
throw new XansqlError({
|
|
11
|
+
message: `Delete operation on model ${model.table} requires a WHERE clause to prevent accidental deletion of all records.`,
|
|
12
|
+
model: model.table
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
let fileColumns = [];
|
|
16
|
+
let foreignFields = {};
|
|
17
|
+
for (let column in model.schema) {
|
|
18
|
+
const field = model.schema[column];
|
|
19
|
+
if (field instanceof XqlFile) {
|
|
20
|
+
fileColumns.push(column);
|
|
21
|
+
}
|
|
22
|
+
if (Foreign.isArray(field)) {
|
|
23
|
+
foreignFields[column] = field;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const results = await model.find({
|
|
27
|
+
where: args.where,
|
|
28
|
+
limit: "all",
|
|
29
|
+
select: Object.assign({ [model.IDColumn]: true }, (args.select || {}))
|
|
30
|
+
});
|
|
31
|
+
if (results.length === 0) {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
for (let column in foreignFields) {
|
|
35
|
+
const field = foreignFields[column];
|
|
36
|
+
const meta = field.meta || {};
|
|
37
|
+
const foreign = Foreign.get(model, column);
|
|
38
|
+
const FModel = model.xansql.getModel(foreign.table);
|
|
39
|
+
if (meta.optional || meta.nullable) {
|
|
40
|
+
// update foreign column to null
|
|
41
|
+
await FModel.update(new RelationExecuteArgs({
|
|
42
|
+
data: { [foreign.column]: null },
|
|
43
|
+
where: { [foreign.column]: args.where }
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// delete all foreign rows
|
|
48
|
+
await FModel.delete(new RelationExecuteArgs({
|
|
49
|
+
where: { [foreign.column]: args.where }
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
let fileRows = [];
|
|
54
|
+
if (fileColumns.length) {
|
|
55
|
+
let fileWhere = [
|
|
56
|
+
...fileColumns.map(col => ({ [col]: { isNotNull: true } }))
|
|
57
|
+
];
|
|
58
|
+
if (Array.isArray(args.where)) {
|
|
59
|
+
fileWhere = [...args.where, ...fileWhere];
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
fileWhere = [args.where, ...fileWhere];
|
|
63
|
+
}
|
|
64
|
+
fileRows = await model.find({
|
|
65
|
+
where: fileWhere,
|
|
66
|
+
limit: "all",
|
|
67
|
+
select: fileColumns.reduce((acc, col) => {
|
|
68
|
+
acc[col] = true;
|
|
69
|
+
return acc;
|
|
70
|
+
}, {})
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
let executeId = undefined;
|
|
74
|
+
if (typeof window !== "undefined") {
|
|
75
|
+
executeId = ExecuteMeta.set({
|
|
76
|
+
model,
|
|
77
|
+
action: "DELETE",
|
|
78
|
+
modelType: isRelation ? "child" : "main",
|
|
79
|
+
args
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const Where = new WhereArgs(model, args.where);
|
|
83
|
+
const sql = `DELETE FROM ${model.table} ${Where.sql}`.trim();
|
|
84
|
+
const { affectedRows } = await xansql.execute(sql, executeId);
|
|
85
|
+
if (!affectedRows || affectedRows === 0) {
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
// delete files
|
|
89
|
+
if (fileColumns.length && fileRows.length) {
|
|
90
|
+
let executeId = undefined;
|
|
91
|
+
if (typeof window !== "undefined") {
|
|
92
|
+
executeId = ExecuteMeta.set({
|
|
93
|
+
model,
|
|
94
|
+
action: "DELETE_FILE",
|
|
95
|
+
modelType: isRelation ? "child" : "main",
|
|
96
|
+
args
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
for (let { chunk } of chunkArray(fileRows)) {
|
|
100
|
+
for (let row of chunk) {
|
|
101
|
+
for (let file_col of fileColumns) {
|
|
102
|
+
const filemeta = row[file_col];
|
|
103
|
+
if (filemeta) {
|
|
104
|
+
await xansql.deleteFile(filemeta.fileId, executeId);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return results;
|
|
111
|
+
}
|
|
112
|
+
}export{DeleteExecuter as default};//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../src/model/Executer/Delete/index.ts"],"sourcesContent":["import Model from \"../..\"\nimport WhereArgs from \"../../Args/WhereArgs\"\nimport { DeleteArgsType, WhereArgsType } from \"../../type\"\nimport RelationExecuteArgs from \"../../Args/RelationExcuteArgs\"\nimport Foreign from \"../../../core/classes/ForeignInfo\"\nimport XqlFile from \"../../../Types/fields/File\"\nimport { XqlFields } from \"../../../Types/types\"\nimport { chunkArray } from \"../../../utils/chunker\"\nimport ExecuteMeta from \"../../../core/ExcuteMeta\"\nimport XansqlError from \"../../../core/XansqlError\"\n\n\nclass DeleteExecuter {\n model: Model\n constructor(model: Model) {\n this.model = model\n }\n\n async execute(args: DeleteArgsType) {\n const xansql = this.model.xansql\n const model = this.model\n const isRelation = args instanceof RelationExecuteArgs\n if (!args.where || Object.keys(args.where).length === 0) {\n throw new XansqlError({\n message: `Delete operation on model ${model.table} requires a WHERE clause to prevent accidental deletion of all records.`,\n model: model.table\n })\n }\n\n let fileColumns: string[] = []\n let foreignFields: { [col: string]: XqlFields } = {}\n\n for (let column in model.schema) {\n const field = model.schema[column]\n if (field instanceof XqlFile) {\n fileColumns.push(column)\n }\n\n if (Foreign.isArray(field)) {\n foreignFields[column] = field\n }\n }\n\n const results = await model.find({\n where: args.where,\n limit: \"all\",\n select: {\n [model.IDColumn]: true,\n ...(args.select || {})\n }\n })\n\n if (results.length === 0) {\n return []\n }\n\n for (let column in foreignFields) {\n const field = foreignFields[column]\n const meta = field.meta || {}\n const foreign = Foreign.get(model, column)\n const FModel = model.xansql.getModel(foreign.table)\n if (meta.optional || meta.nullable) {\n // update foreign column to null\n await FModel.update(new RelationExecuteArgs({\n data: { [foreign.column]: null },\n where: { [foreign.column]: args.where }\n }) as any)\n } else {\n // delete all foreign rows\n await FModel.delete(new RelationExecuteArgs({\n where: { [foreign.column]: args.where }\n }) as any)\n }\n }\n\n let fileRows: any[] = []\n if (fileColumns.length) {\n let fileWhere: WhereArgsType = [\n ...fileColumns.map(col => ({ [col]: { isNotNull: true } }))\n ]\n if (Array.isArray(args.where)) {\n fileWhere = [...args.where, ...fileWhere]\n } else {\n fileWhere = [args.where, ...fileWhere]\n }\n\n fileRows = await model.find({\n where: fileWhere,\n limit: \"all\",\n select: fileColumns.reduce((acc, col) => {\n acc[col] = true\n return acc\n }, {} as any)\n })\n }\n\n let executeId = undefined;\n if (typeof window !== \"undefined\") {\n executeId = ExecuteMeta.set({\n model,\n action: \"DELETE\",\n modelType: isRelation ? \"child\" : \"main\",\n args\n });\n }\n\n const Where = new WhereArgs(model, args.where)\n const sql = `DELETE FROM ${model.table} ${Where.sql}`.trim()\n const { affectedRows } = await xansql.execute(sql, executeId)\n if (!affectedRows || affectedRows === 0) {\n return []\n }\n\n // delete files\n if (fileColumns.length && fileRows.length) {\n let executeId = undefined;\n if (typeof window !== \"undefined\") {\n executeId = ExecuteMeta.set({\n model,\n action: \"DELETE_FILE\",\n modelType: isRelation ? \"child\" : \"main\",\n args\n });\n }\n for (let { chunk } of chunkArray(fileRows)) {\n for (let row of chunk) {\n for (let file_col of fileColumns) {\n const filemeta = row[file_col]\n if (filemeta) {\n await xansql.deleteFile(filemeta.fileId, executeId)\n }\n }\n }\n }\n }\n\n return results\n }\n}\n\nexport default DeleteExecuter"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var XansqlError=require('../../../core/XansqlError.js');class DistinctArgs {
|
|
2
|
+
constructor(model, args, where, orderBy) {
|
|
3
|
+
/**
|
|
4
|
+
* SQL representation of the distinct clause
|
|
5
|
+
* format: WHERE id IN (SELECT MIN(id) FROM table GROUP BY col1) AND id IN (SELECT MAX(id) FROM table GROUP BY col2)
|
|
6
|
+
*/
|
|
7
|
+
this.sql = '';
|
|
8
|
+
const distinct = args || [];
|
|
9
|
+
if (distinct && distinct.length) {
|
|
10
|
+
let dcols = [];
|
|
11
|
+
for (let col of distinct) {
|
|
12
|
+
if (!(col in model.schema)) {
|
|
13
|
+
throw new XansqlError.default({
|
|
14
|
+
message: `Column ${col} not found in model ${model.table} for distinct`,
|
|
15
|
+
model: model.table,
|
|
16
|
+
column: col
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
let MX = orderBy && orderBy[col] === "desc" ? "MAX" : "min";
|
|
20
|
+
dcols.push(`${model.table}.${model.IDColumn} IN (
|
|
21
|
+
SELECT ${MX}(${model.table}.${model.IDColumn})
|
|
22
|
+
FROM ${model.table}
|
|
23
|
+
${where.sql}
|
|
24
|
+
GROUP BY ${col}
|
|
25
|
+
)`);
|
|
26
|
+
}
|
|
27
|
+
if (dcols.length) {
|
|
28
|
+
this.sql = `${dcols.join(" AND ")}`.trim();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}exports.default=DistinctArgs;//# sourceMappingURL=DistinctArgs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DistinctArgs.js","sources":["../../../../src/model/Executer/Find/DistinctArgs.ts"],"sourcesContent":["import Model from \"../..\"\nimport XansqlError from \"../../../core/XansqlError\"\nimport WhereArgs from \"../../Args/WhereArgs\"\nimport { DistinctArgsType, OrderByArgsType } from \"../../type\"\n\nclass DistinctArgs {\n /**\n * SQL representation of the distinct clause\n * format: WHERE id IN (SELECT MIN(id) FROM table GROUP BY col1) AND id IN (SELECT MAX(id) FROM table GROUP BY col2)\n */\n readonly sql: string = ''\n\n constructor(model: Model, args: DistinctArgsType, where: WhereArgs, orderBy?: OrderByArgsType) {\n const distinct = args || []\n if (distinct && distinct.length) {\n let dcols: string[] = []\n for (let col of distinct) {\n if (!(col in model.schema)) {\n throw new XansqlError({\n message: `Column ${col} not found in model ${model.table} for distinct`,\n model: model.table,\n column: col\n })\n };\n let MX = orderBy && orderBy[col] === \"desc\" ? \"MAX\" : \"min\"\n dcols.push(`${model.table}.${model.IDColumn} IN (\n SELECT ${MX}(${model.table}.${model.IDColumn})\n FROM ${model.table}\n ${where.sql}\n GROUP BY ${col}\n )`)\n }\n if (dcols.length) {\n this.sql = `${dcols.join(\" AND \")}`.trim()\n }\n }\n\n }\n}\nexport default DistinctArgs;\n"],"names":["XansqlError"],"mappings":"8HAKA,MAAM,YAAY,CAAA;AAOf,IAAA,WAAA,CAAY,KAAY,EAAE,IAAsB,EAAE,KAAgB,EAAE,OAAyB,EAAA;AAN7F;;;AAGG;QACM,IAAA,CAAA,GAAG,GAAW,EAAE;AAGtB,QAAA,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE;AAC3B,QAAA,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,EAAE;YAC9B,IAAI,KAAK,GAAa,EAAE;AACxB,YAAA,KAAK,IAAI,GAAG,IAAI,QAAQ,EAAE;gBACvB,IAAI,EAAE,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE;oBACzB,MAAM,IAAIA,mBAAW,CAAC;AACnB,wBAAA,OAAO,EAAE,CAAA,OAAA,EAAU,GAAG,uBAAuB,KAAK,CAAC,KAAK,CAAA,aAAA,CAAe;wBACvE,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,wBAAA,MAAM,EAAE;AACV,qBAAA,CAAC;gBACL;AACA,gBAAA,IAAI,EAAE,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,GAAG,KAAK,GAAG,KAAK;gBAC3D,KAAK,CAAC,IAAI,CAAC,CAAA,EAAG,KAAK,CAAC,KAAK,CAAA,CAAA,EAAI,KAAK,CAAC,QAAQ,CAAA;AAC/B,sBAAA,EAAA,EAAE,IAAI,KAAK,CAAC,KAAK,CAAA,CAAA,EAAI,KAAK,CAAC,QAAQ,CAAA;AACrC,oBAAA,EAAA,KAAK,CAAC,KAAK;AAChB,eAAA,EAAA,KAAK,CAAC,GAAG;2BACC,GAAG;AAChB,aAAA,CAAA,CAAC;YACN;AACA,YAAA,IAAI,KAAK,CAAC,MAAM,EAAE;AACf,gBAAA,IAAI,CAAC,GAAG,GAAG,CAAA,EAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA,CAAE,CAAC,IAAI,EAAE;YAC7C;QACH;IAEH;AACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import XansqlError from'../../../core/XansqlError.mjs';class DistinctArgs {
|
|
2
|
+
constructor(model, args, where, orderBy) {
|
|
3
|
+
/**
|
|
4
|
+
* SQL representation of the distinct clause
|
|
5
|
+
* format: WHERE id IN (SELECT MIN(id) FROM table GROUP BY col1) AND id IN (SELECT MAX(id) FROM table GROUP BY col2)
|
|
6
|
+
*/
|
|
7
|
+
this.sql = '';
|
|
8
|
+
const distinct = args || [];
|
|
9
|
+
if (distinct && distinct.length) {
|
|
10
|
+
let dcols = [];
|
|
11
|
+
for (let col of distinct) {
|
|
12
|
+
if (!(col in model.schema)) {
|
|
13
|
+
throw new XansqlError({
|
|
14
|
+
message: `Column ${col} not found in model ${model.table} for distinct`,
|
|
15
|
+
model: model.table,
|
|
16
|
+
column: col
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
let MX = orderBy && orderBy[col] === "desc" ? "MAX" : "min";
|
|
20
|
+
dcols.push(`${model.table}.${model.IDColumn} IN (
|
|
21
|
+
SELECT ${MX}(${model.table}.${model.IDColumn})
|
|
22
|
+
FROM ${model.table}
|
|
23
|
+
${where.sql}
|
|
24
|
+
GROUP BY ${col}
|
|
25
|
+
)`);
|
|
26
|
+
}
|
|
27
|
+
if (dcols.length) {
|
|
28
|
+
this.sql = `${dcols.join(" AND ")}`.trim();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}export{DistinctArgs as default};//# sourceMappingURL=DistinctArgs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DistinctArgs.mjs","sources":["../../../../src/model/Executer/Find/DistinctArgs.ts"],"sourcesContent":["import Model from \"../..\"\nimport XansqlError from \"../../../core/XansqlError\"\nimport WhereArgs from \"../../Args/WhereArgs\"\nimport { DistinctArgsType, OrderByArgsType } from \"../../type\"\n\nclass DistinctArgs {\n /**\n * SQL representation of the distinct clause\n * format: WHERE id IN (SELECT MIN(id) FROM table GROUP BY col1) AND id IN (SELECT MAX(id) FROM table GROUP BY col2)\n */\n readonly sql: string = ''\n\n constructor(model: Model, args: DistinctArgsType, where: WhereArgs, orderBy?: OrderByArgsType) {\n const distinct = args || []\n if (distinct && distinct.length) {\n let dcols: string[] = []\n for (let col of distinct) {\n if (!(col in model.schema)) {\n throw new XansqlError({\n message: `Column ${col} not found in model ${model.table} for distinct`,\n model: model.table,\n column: col\n })\n };\n let MX = orderBy && orderBy[col] === \"desc\" ? \"MAX\" : \"min\"\n dcols.push(`${model.table}.${model.IDColumn} IN (\n SELECT ${MX}(${model.table}.${model.IDColumn})\n FROM ${model.table}\n ${where.sql}\n GROUP BY ${col}\n )`)\n }\n if (dcols.length) {\n this.sql = `${dcols.join(\" AND \")}`.trim()\n }\n }\n\n }\n}\nexport default DistinctArgs;\n"],"names":[],"mappings":"uDAKA,MAAM,YAAY,CAAA;AAOf,IAAA,WAAA,CAAY,KAAY,EAAE,IAAsB,EAAE,KAAgB,EAAE,OAAyB,EAAA;AAN7F;;;AAGG;QACM,IAAA,CAAA,GAAG,GAAW,EAAE;AAGtB,QAAA,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE;AAC3B,QAAA,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,EAAE;YAC9B,IAAI,KAAK,GAAa,EAAE;AACxB,YAAA,KAAK,IAAI,GAAG,IAAI,QAAQ,EAAE;gBACvB,IAAI,EAAE,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE;oBACzB,MAAM,IAAI,WAAW,CAAC;AACnB,wBAAA,OAAO,EAAE,CAAA,OAAA,EAAU,GAAG,uBAAuB,KAAK,CAAC,KAAK,CAAA,aAAA,CAAe;wBACvE,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,wBAAA,MAAM,EAAE;AACV,qBAAA,CAAC;gBACL;AACA,gBAAA,IAAI,EAAE,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,GAAG,KAAK,GAAG,KAAK;gBAC3D,KAAK,CAAC,IAAI,CAAC,CAAA,EAAG,KAAK,CAAC,KAAK,CAAA,CAAA,EAAI,KAAK,CAAC,QAAQ,CAAA;AAC/B,sBAAA,EAAA,EAAE,IAAI,KAAK,CAAC,KAAK,CAAA,CAAA,EAAI,KAAK,CAAC,QAAQ,CAAA;AACrC,oBAAA,EAAA,KAAK,CAAC,KAAK;AAChB,eAAA,EAAA,KAAK,CAAC,GAAG;2BACC,GAAG;AAChB,aAAA,CAAA,CAAC;YACN;AACA,YAAA,IAAI,KAAK,CAAC,MAAM,EAAE;AACf,gBAAA,IAAI,CAAC,GAAG,GAAG,CAAA,EAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA,CAAE,CAAC,IAAI,EAAE;YAC7C;QACH;IAEH;AACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var XansqlError=require('../../../core/XansqlError.js');class LimitArgs {
|
|
2
|
+
constructor(model, args) {
|
|
3
|
+
var _a, _b;
|
|
4
|
+
const xansql = model.xansql;
|
|
5
|
+
const maxLimit = xansql.config.maxLimit.find;
|
|
6
|
+
if (args === "all") {
|
|
7
|
+
this.take = 10000000; // set a very high limit for "all"
|
|
8
|
+
this.skip = 0;
|
|
9
|
+
this.sql = ``;
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
let take = (_a = args.take) !== null && _a !== void 0 ? _a : maxLimit;
|
|
13
|
+
let skip = (_b = args.skip) !== null && _b !== void 0 ? _b : 0;
|
|
14
|
+
if (take < 0 || !Number.isInteger(take)) {
|
|
15
|
+
throw new XansqlError.default({
|
|
16
|
+
message: `Invalid take value in limit clause for model ${model.table}`,
|
|
17
|
+
model: model.table
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
if (skip < 0 || !Number.isInteger(skip)) {
|
|
21
|
+
throw new XansqlError.default({
|
|
22
|
+
message: `Invalid skip value in limit clause for model ${model.table}`,
|
|
23
|
+
model: model.table
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
this.take = take;
|
|
27
|
+
this.skip = skip;
|
|
28
|
+
this.sql = `LIMIT ${take} ${skip ? `OFFSET ${skip} ` : ""}`.trim();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}exports.default=LimitArgs;//# sourceMappingURL=LimitArgs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LimitArgs.js","sources":["../../../../src/model/Executer/Find/LimitArgs.ts"],"sourcesContent":["import Model from \"../..\";\nimport XansqlError from \"../../../core/XansqlError\";\nimport { LimitArgsType } from \"../../type\";\n\nclass LimitArgs {\n readonly take: number;\n readonly skip: number;\n\n /**\n * SQL representation of the limit clause\n * format: LIMIT take OFFSET skip\n */\n readonly sql: string;\n\n constructor(model: Model, args: LimitArgsType) {\n const xansql = model.xansql\n const maxLimit = xansql.config.maxLimit.find\n if (args === \"all\") {\n this.take = 10000000 // set a very high limit for \"all\"\n this.skip = 0\n this.sql = ``\n } else {\n let take = args.take ?? maxLimit\n let skip = args.skip ?? 0\n if (take < 0 || !Number.isInteger(take)) {\n throw new XansqlError({\n message: `Invalid take value in limit clause for model ${model.table}`,\n model: model.table\n })\n }\n if (skip < 0 || !Number.isInteger(skip)) {\n throw new XansqlError({\n message: `Invalid skip value in limit clause for model ${model.table}`,\n model: model.table\n })\n }\n\n this.take = take\n this.skip = skip\n this.sql = `LIMIT ${take} ${skip ? `OFFSET ${skip} ` : \"\"}`.trim()\n }\n }\n}\nexport default LimitArgs;\n"],"names":["XansqlError"],"mappings":"8HAIA,MAAM,SAAS,CAAA;IAUZ,WAAA,CAAY,KAAY,EAAE,IAAmB,EAAA;;AAC1C,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;QAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI;AAC5C,QAAA,IAAI,IAAI,KAAK,KAAK,EAAE;AACjB,YAAA,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAA;AACpB,YAAA,IAAI,CAAC,IAAI,GAAG,CAAC;AACb,YAAA,IAAI,CAAC,GAAG,GAAG,CAAA,CAAE;QAChB;aAAO;YACJ,IAAI,IAAI,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,QAAQ;YAChC,IAAI,IAAI,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,CAAC;AACzB,YAAA,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;gBACtC,MAAM,IAAIA,mBAAW,CAAC;AACnB,oBAAA,OAAO,EAAE,CAAA,6CAAA,EAAgD,KAAK,CAAC,KAAK,CAAA,CAAE;oBACtE,KAAK,EAAE,KAAK,CAAC;AACf,iBAAA,CAAC;YACL;AACA,YAAA,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;gBACtC,MAAM,IAAIA,mBAAW,CAAC;AACnB,oBAAA,OAAO,EAAE,CAAA,6CAAA,EAAgD,KAAK,CAAC,KAAK,CAAA,CAAE;oBACtE,KAAK,EAAE,KAAK,CAAC;AACf,iBAAA,CAAC;YACL;AAEA,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI;YAChB,IAAI,CAAC,GAAG,GAAG,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,EAAI,IAAI,GAAG,UAAU,IAAI,CAAA,CAAA,CAAG,GAAG,EAAE,CAAA,CAAE,CAAC,IAAI,EAAE;QACrE;IACH;AACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import XansqlError from'../../../core/XansqlError.mjs';class LimitArgs {
|
|
2
|
+
constructor(model, args) {
|
|
3
|
+
var _a, _b;
|
|
4
|
+
const xansql = model.xansql;
|
|
5
|
+
const maxLimit = xansql.config.maxLimit.find;
|
|
6
|
+
if (args === "all") {
|
|
7
|
+
this.take = 10000000; // set a very high limit for "all"
|
|
8
|
+
this.skip = 0;
|
|
9
|
+
this.sql = ``;
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
let take = (_a = args.take) !== null && _a !== void 0 ? _a : maxLimit;
|
|
13
|
+
let skip = (_b = args.skip) !== null && _b !== void 0 ? _b : 0;
|
|
14
|
+
if (take < 0 || !Number.isInteger(take)) {
|
|
15
|
+
throw new XansqlError({
|
|
16
|
+
message: `Invalid take value in limit clause for model ${model.table}`,
|
|
17
|
+
model: model.table
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
if (skip < 0 || !Number.isInteger(skip)) {
|
|
21
|
+
throw new XansqlError({
|
|
22
|
+
message: `Invalid skip value in limit clause for model ${model.table}`,
|
|
23
|
+
model: model.table
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
this.take = take;
|
|
27
|
+
this.skip = skip;
|
|
28
|
+
this.sql = `LIMIT ${take} ${skip ? `OFFSET ${skip} ` : ""}`.trim();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}export{LimitArgs as default};//# sourceMappingURL=LimitArgs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LimitArgs.mjs","sources":["../../../../src/model/Executer/Find/LimitArgs.ts"],"sourcesContent":["import Model from \"../..\";\nimport XansqlError from \"../../../core/XansqlError\";\nimport { LimitArgsType } from \"../../type\";\n\nclass LimitArgs {\n readonly take: number;\n readonly skip: number;\n\n /**\n * SQL representation of the limit clause\n * format: LIMIT take OFFSET skip\n */\n readonly sql: string;\n\n constructor(model: Model, args: LimitArgsType) {\n const xansql = model.xansql\n const maxLimit = xansql.config.maxLimit.find\n if (args === \"all\") {\n this.take = 10000000 // set a very high limit for \"all\"\n this.skip = 0\n this.sql = ``\n } else {\n let take = args.take ?? maxLimit\n let skip = args.skip ?? 0\n if (take < 0 || !Number.isInteger(take)) {\n throw new XansqlError({\n message: `Invalid take value in limit clause for model ${model.table}`,\n model: model.table\n })\n }\n if (skip < 0 || !Number.isInteger(skip)) {\n throw new XansqlError({\n message: `Invalid skip value in limit clause for model ${model.table}`,\n model: model.table\n })\n }\n\n this.take = take\n this.skip = skip\n this.sql = `LIMIT ${take} ${skip ? `OFFSET ${skip} ` : \"\"}`.trim()\n }\n }\n}\nexport default LimitArgs;\n"],"names":[],"mappings":"uDAIA,MAAM,SAAS,CAAA;IAUZ,WAAA,CAAY,KAAY,EAAE,IAAmB,EAAA;;AAC1C,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;QAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI;AAC5C,QAAA,IAAI,IAAI,KAAK,KAAK,EAAE;AACjB,YAAA,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAA;AACpB,YAAA,IAAI,CAAC,IAAI,GAAG,CAAC;AACb,YAAA,IAAI,CAAC,GAAG,GAAG,CAAA,CAAE;QAChB;aAAO;YACJ,IAAI,IAAI,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,QAAQ;YAChC,IAAI,IAAI,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,CAAC;AACzB,YAAA,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;gBACtC,MAAM,IAAI,WAAW,CAAC;AACnB,oBAAA,OAAO,EAAE,CAAA,6CAAA,EAAgD,KAAK,CAAC,KAAK,CAAA,CAAE;oBACtE,KAAK,EAAE,KAAK,CAAC;AACf,iBAAA,CAAC;YACL;AACA,YAAA,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;gBACtC,MAAM,IAAI,WAAW,CAAC;AACnB,oBAAA,OAAO,EAAE,CAAA,6CAAA,EAAgD,KAAK,CAAC,KAAK,CAAA,CAAE;oBACtE,KAAK,EAAE,KAAK,CAAC;AACf,iBAAA,CAAC;YACL;AAEA,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI;YAChB,IAAI,CAAC,GAAG,GAAG,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,EAAI,IAAI,GAAG,UAAU,IAAI,CAAA,CAAA,CAAG,GAAG,EAAE,CAAA,CAAE,CAAC,IAAI,EAAE;QACrE;IACH;AACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var XansqlError=require('../../../core/XansqlError.js');class OrderByArgs {
|
|
2
|
+
constructor(model, args) {
|
|
3
|
+
/**
|
|
4
|
+
* SQL representation of the order by clause
|
|
5
|
+
* format: ORDER BY col1 ASC, col2 DESC
|
|
6
|
+
*/
|
|
7
|
+
this.sql = '';
|
|
8
|
+
const items = [];
|
|
9
|
+
for (let column in args) {
|
|
10
|
+
const val = args[column];
|
|
11
|
+
if (!(column in model.schema)) {
|
|
12
|
+
throw new XansqlError.default({
|
|
13
|
+
message: `Column ${column} not found in model ${model.table} for order by`,
|
|
14
|
+
model: model.table,
|
|
15
|
+
column: column
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
if (['asc', 'desc'].includes(val) === false) {
|
|
19
|
+
throw new XansqlError.default({
|
|
20
|
+
message: `Invalid order by direction for column ${column} in model ${model.table}. Expected 'asc' or 'desc', got '${val}'`,
|
|
21
|
+
model: model.table,
|
|
22
|
+
column: column
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
items.push(`${model.table}.${column} ${val.toUpperCase()}`);
|
|
26
|
+
}
|
|
27
|
+
this.sql = items.length ? `ORDER BY ${items.join(', ')} ` : "";
|
|
28
|
+
}
|
|
29
|
+
}exports.default=OrderByArgs;//# sourceMappingURL=OrderByArgs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrderByArgs.js","sources":["../../../../src/model/Executer/Find/OrderByArgs.ts"],"sourcesContent":["import Model from \"../..\"\nimport XansqlError from \"../../../core/XansqlError\"\nimport { OrderByArgsType } from \"../../type\"\n\nclass OrderByArgs {\n /**\n * SQL representation of the order by clause\n * format: ORDER BY col1 ASC, col2 DESC\n */\n readonly sql: string = ''\n\n constructor(model: Model, args: OrderByArgsType) {\n const items = []\n for (let column in args) {\n const val = args[column]\n if (!(column in model.schema)) {\n throw new XansqlError({\n message: `Column ${column} not found in model ${model.table} for order by`,\n model: model.table,\n column: column\n })\n };\n if (['asc', 'desc'].includes(val) === false) {\n throw new XansqlError({\n message: `Invalid order by direction for column ${column} in model ${model.table}. Expected 'asc' or 'desc', got '${val}'`,\n model: model.table,\n column: column\n })\n }\n items.push(`${model.table}.${column} ${val.toUpperCase()}`)\n }\n this.sql = items.length ? `ORDER BY ${items.join(', ')} ` : \"\"\n }\n}\n\nexport default OrderByArgs;"],"names":["XansqlError"],"mappings":"8HAIA,MAAM,WAAW,CAAA;IAOd,WAAA,CAAY,KAAY,EAAE,IAAqB,EAAA;AAN/C;;;AAGG;QACM,IAAA,CAAA,GAAG,GAAW,EAAE;QAGtB,MAAM,KAAK,GAAG,EAAE;AAChB,QAAA,KAAK,IAAI,MAAM,IAAI,IAAI,EAAE;AACtB,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;YACxB,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE;gBAC5B,MAAM,IAAIA,mBAAW,CAAC;AACnB,oBAAA,OAAO,EAAE,CAAA,OAAA,EAAU,MAAM,uBAAuB,KAAK,CAAC,KAAK,CAAA,aAAA,CAAe;oBAC1E,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,oBAAA,MAAM,EAAE;AACV,iBAAA,CAAC;YACL;AACA,YAAA,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE;gBAC1C,MAAM,IAAIA,mBAAW,CAAC;oBACnB,OAAO,EAAE,yCAAyC,MAAM,CAAA,UAAA,EAAa,KAAK,CAAC,KAAK,CAAA,iCAAA,EAAoC,GAAG,CAAA,CAAA,CAAG;oBAC1H,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,oBAAA,MAAM,EAAE;AACV,iBAAA,CAAC;YACL;AACA,YAAA,KAAK,CAAC,IAAI,CAAC,CAAA,EAAG,KAAK,CAAC,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI,GAAG,CAAC,WAAW,EAAE,CAAA,CAAE,CAAC;QAC9D;QACA,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAA,SAAA,EAAY,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE;IACjE;AACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import XansqlError from'../../../core/XansqlError.mjs';class OrderByArgs {
|
|
2
|
+
constructor(model, args) {
|
|
3
|
+
/**
|
|
4
|
+
* SQL representation of the order by clause
|
|
5
|
+
* format: ORDER BY col1 ASC, col2 DESC
|
|
6
|
+
*/
|
|
7
|
+
this.sql = '';
|
|
8
|
+
const items = [];
|
|
9
|
+
for (let column in args) {
|
|
10
|
+
const val = args[column];
|
|
11
|
+
if (!(column in model.schema)) {
|
|
12
|
+
throw new XansqlError({
|
|
13
|
+
message: `Column ${column} not found in model ${model.table} for order by`,
|
|
14
|
+
model: model.table,
|
|
15
|
+
column: column
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
if (['asc', 'desc'].includes(val) === false) {
|
|
19
|
+
throw new XansqlError({
|
|
20
|
+
message: `Invalid order by direction for column ${column} in model ${model.table}. Expected 'asc' or 'desc', got '${val}'`,
|
|
21
|
+
model: model.table,
|
|
22
|
+
column: column
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
items.push(`${model.table}.${column} ${val.toUpperCase()}`);
|
|
26
|
+
}
|
|
27
|
+
this.sql = items.length ? `ORDER BY ${items.join(', ')} ` : "";
|
|
28
|
+
}
|
|
29
|
+
}export{OrderByArgs as default};//# sourceMappingURL=OrderByArgs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrderByArgs.mjs","sources":["../../../../src/model/Executer/Find/OrderByArgs.ts"],"sourcesContent":["import Model from \"../..\"\nimport XansqlError from \"../../../core/XansqlError\"\nimport { OrderByArgsType } from \"../../type\"\n\nclass OrderByArgs {\n /**\n * SQL representation of the order by clause\n * format: ORDER BY col1 ASC, col2 DESC\n */\n readonly sql: string = ''\n\n constructor(model: Model, args: OrderByArgsType) {\n const items = []\n for (let column in args) {\n const val = args[column]\n if (!(column in model.schema)) {\n throw new XansqlError({\n message: `Column ${column} not found in model ${model.table} for order by`,\n model: model.table,\n column: column\n })\n };\n if (['asc', 'desc'].includes(val) === false) {\n throw new XansqlError({\n message: `Invalid order by direction for column ${column} in model ${model.table}. Expected 'asc' or 'desc', got '${val}'`,\n model: model.table,\n column: column\n })\n }\n items.push(`${model.table}.${column} ${val.toUpperCase()}`)\n }\n this.sql = items.length ? `ORDER BY ${items.join(', ')} ` : \"\"\n }\n}\n\nexport default OrderByArgs;"],"names":[],"mappings":"uDAIA,MAAM,WAAW,CAAA;IAOd,WAAA,CAAY,KAAY,EAAE,IAAqB,EAAA;AAN/C;;;AAGG;QACM,IAAA,CAAA,GAAG,GAAW,EAAE;QAGtB,MAAM,KAAK,GAAG,EAAE;AAChB,QAAA,KAAK,IAAI,MAAM,IAAI,IAAI,EAAE;AACtB,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;YACxB,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE;gBAC5B,MAAM,IAAI,WAAW,CAAC;AACnB,oBAAA,OAAO,EAAE,CAAA,OAAA,EAAU,MAAM,uBAAuB,KAAK,CAAC,KAAK,CAAA,aAAA,CAAe;oBAC1E,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,oBAAA,MAAM,EAAE;AACV,iBAAA,CAAC;YACL;AACA,YAAA,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE;gBAC1C,MAAM,IAAI,WAAW,CAAC;oBACnB,OAAO,EAAE,yCAAyC,MAAM,CAAA,UAAA,EAAa,KAAK,CAAC,KAAK,CAAA,iCAAA,EAAoC,GAAG,CAAA,CAAA,CAAG;oBAC1H,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,oBAAA,MAAM,EAAE;AACV,iBAAA,CAAC;YACL;AACA,YAAA,KAAK,CAAC,IAAI,CAAC,CAAA,EAAG,KAAK,CAAC,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI,GAAG,CAAC,WAAW,EAAE,CAAA,CAAE,CAAC;QAC9D;QACA,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAA,SAAA,EAAY,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE;IACjE;AACF"}
|