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,226 @@
|
|
|
1
|
+
import Foreign from'../../core/classes/ForeignInfo.mjs';import XansqlError from'../../core/XansqlError.mjs';import XqlArray from'../../Types/fields/Array.mjs';import XqlObject from'../../Types/fields/Object.mjs';import XqlRecord from'../../Types/fields/Record.mjs';import XqlTuple from'../../Types/fields/Tuple.mjs';import {isArray,isObject,escapeSqlValue}from'../../utils/index.mjs';import ValueFormatter from'../include/ValueFormatter.mjs';class WhereArgs {
|
|
2
|
+
constructor(model, where, meta) {
|
|
3
|
+
this.sql = '';
|
|
4
|
+
this.condition_keys = ["equals", "not", "lt", "lte", "gt", "gte", "in", "notIn", "between", "notBetween", "contains", "notContains", "startsWith", "endsWith", "isNull", "isNotNull", "isEmpty", "isNotEmpty", "isTrue", "isFalse"];
|
|
5
|
+
this.model = model;
|
|
6
|
+
let schema = model.schema;
|
|
7
|
+
let wheres = [];
|
|
8
|
+
if (Array.isArray(where)) {
|
|
9
|
+
let _ors = [];
|
|
10
|
+
for (let w of where) {
|
|
11
|
+
const whereArgs = new WhereArgs(model, w, meta);
|
|
12
|
+
if (whereArgs.sql) {
|
|
13
|
+
if (whereArgs.wheres.length > 1) {
|
|
14
|
+
_ors.push(`(${whereArgs.wheres.join(" AND ")})`);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
_ors.push(`${whereArgs.wheres.join(" AND ")}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (_ors.length) {
|
|
22
|
+
wheres.push(`(${_ors.join(" OR ")})`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
for (let column in where) {
|
|
27
|
+
this.checkIsAllowed(column);
|
|
28
|
+
const value = where[column];
|
|
29
|
+
const field = schema[column];
|
|
30
|
+
if (Foreign.is(field)) {
|
|
31
|
+
if (!isArray(value) && !isObject(value)) {
|
|
32
|
+
throw new XansqlError({
|
|
33
|
+
message: `${column} must be an object or array in the WHERE clause, but received ${typeof value} in table ${model.table}`,
|
|
34
|
+
model: model.table,
|
|
35
|
+
column
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
else if (isObject(value) && Object.keys(value).length === 0 || isArray(value) && value.length === 0) {
|
|
39
|
+
// skip empty object
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (Foreign.isSchema(field) && isObject(value) && Object.keys(value).some(k => this.condition_keys.includes(k))) {
|
|
43
|
+
const v = this.condition(column, value);
|
|
44
|
+
wheres.push(v);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
let foreign = Foreign.get(model, column);
|
|
48
|
+
let FModel = model.xansql.getModel(foreign.table);
|
|
49
|
+
if (meta && meta.parentTable === foreign.table) {
|
|
50
|
+
throw new XansqlError({
|
|
51
|
+
message: `Circular reference detected in WHERE clause for table ${model.table} on column ${column}`,
|
|
52
|
+
model: model.table,
|
|
53
|
+
column
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
let _sql = '';
|
|
57
|
+
if (Array.isArray(value) || isObject(value)) {
|
|
58
|
+
const where = new WhereArgs(FModel, value, { parentTable: model.table });
|
|
59
|
+
if (where.sql) {
|
|
60
|
+
_sql = where.wheres.join(" AND ");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
throw new XansqlError({
|
|
65
|
+
message: `Invalid value for foreign key ${column} in WHERE clause of table ${model.table}`,
|
|
66
|
+
model: model.table,
|
|
67
|
+
column
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
wheres.push(`EXISTS (SELECT 1 FROM ${foreign.table} WHERE ${foreign.sql} ${_sql ? ` AND ${_sql}` : ""})`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
let v = '';
|
|
74
|
+
if (Array.isArray(value)) {
|
|
75
|
+
const sub = value.map((_v) => {
|
|
76
|
+
return isObject(_v)
|
|
77
|
+
? this.condition(column, _v)
|
|
78
|
+
: `${model.table}.${column} = ${ValueFormatter.toSql(model, column, _v)}`;
|
|
79
|
+
});
|
|
80
|
+
if (sub.length > 1) {
|
|
81
|
+
v = `(${sub.join(" OR ")})`;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
v = sub.join(" OR ");
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else if (isObject(value)) {
|
|
88
|
+
v = this.condition(column, value);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
v = `${model.table}.${column} = ${ValueFormatter.toSql(model, column, value)}`;
|
|
92
|
+
}
|
|
93
|
+
wheres.push(v);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
this.wheres = wheres;
|
|
98
|
+
this.sql = this.wheres.length ? `WHERE ${this.wheres.join(" AND ")} ` : "";
|
|
99
|
+
}
|
|
100
|
+
condition(column, conditions) {
|
|
101
|
+
const model = this.model;
|
|
102
|
+
const generate = Object.keys(conditions).map((subKey) => {
|
|
103
|
+
let value = conditions[subKey];
|
|
104
|
+
if (isObject(value)) {
|
|
105
|
+
throw new XansqlError({
|
|
106
|
+
message: `Invalid value for where condition ${subKey} on column ${column} in table ${model.table}`,
|
|
107
|
+
model: model.table,
|
|
108
|
+
column
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
let val = value;
|
|
112
|
+
if (Array.isArray(val)) {
|
|
113
|
+
if (['in', 'notIn'].includes(subKey)) {
|
|
114
|
+
val = val.map((item) => ValueFormatter.toSql(model, column, item)).join(", ");
|
|
115
|
+
}
|
|
116
|
+
else if (['between', 'notBetween'].includes(subKey)) {
|
|
117
|
+
if (val.length !== 2) {
|
|
118
|
+
throw new XansqlError({
|
|
119
|
+
message: `The 'between' and 'notBetween' operators require an array of exactly two values for column ${column} in table ${model.table}.`,
|
|
120
|
+
model: model.table,
|
|
121
|
+
column
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
val = val.map((item) => ValueFormatter.toSql(model, column, item)).join(" AND ");
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
throw new XansqlError({
|
|
128
|
+
message: `Array value is not supported for operator ${subKey} on column ${column} in table ${model.table}.`,
|
|
129
|
+
model: model.table,
|
|
130
|
+
column
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else if (typeof val === 'boolean') {
|
|
135
|
+
val = val ? "1" : "0";
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
val = ValueFormatter.toSql(model, column, val);
|
|
139
|
+
}
|
|
140
|
+
let col = model.table + "." + column;
|
|
141
|
+
switch (subKey) {
|
|
142
|
+
case 'equals':
|
|
143
|
+
if (val === "NULL")
|
|
144
|
+
return `${col} IS NULL`;
|
|
145
|
+
return `${col} = ${val}`;
|
|
146
|
+
case 'not':
|
|
147
|
+
if (val === "NULL")
|
|
148
|
+
return `${col} IS NOT NULL`;
|
|
149
|
+
return `${col} != ${val}`;
|
|
150
|
+
case 'lt':
|
|
151
|
+
return `${col} < ${val}`;
|
|
152
|
+
case 'lte':
|
|
153
|
+
return `${col} <= ${val}`;
|
|
154
|
+
case 'gt':
|
|
155
|
+
return `${col} > ${val}`;
|
|
156
|
+
case 'gte':
|
|
157
|
+
return `${col} >= ${val}`;
|
|
158
|
+
case 'in':
|
|
159
|
+
if ((val === null || val === void 0 ? void 0 : val.length) === 0) {
|
|
160
|
+
return `1 = 0`;
|
|
161
|
+
}
|
|
162
|
+
else if (!val.includes(",")) {
|
|
163
|
+
return `${col} = ${val}`;
|
|
164
|
+
}
|
|
165
|
+
return `${col} IN (${val})`;
|
|
166
|
+
case 'notIn':
|
|
167
|
+
// handle empty array and val is a single value
|
|
168
|
+
if (val.length === 0) {
|
|
169
|
+
return `1 = 1`;
|
|
170
|
+
}
|
|
171
|
+
else if (!val.includes(",")) {
|
|
172
|
+
return `${col} != ${val}`;
|
|
173
|
+
}
|
|
174
|
+
return `${col} NOT IN (${val})`;
|
|
175
|
+
case 'between':
|
|
176
|
+
return `${col} BETWEEN (${val})`;
|
|
177
|
+
case 'notBetween':
|
|
178
|
+
return `${col} NOT BETWEEN (${val})`;
|
|
179
|
+
case 'contains':
|
|
180
|
+
return `${col} LIKE '%${escapeSqlValue(value)}%'`;
|
|
181
|
+
case 'notContains':
|
|
182
|
+
return `${col} NOT LIKE '%${escapeSqlValue(value)}%'`;
|
|
183
|
+
case 'startsWith':
|
|
184
|
+
return `${col} LIKE '${escapeSqlValue(value)}%'`;
|
|
185
|
+
case 'endsWith':
|
|
186
|
+
return `${col} LIKE '%${escapeSqlValue(value)}'`;
|
|
187
|
+
case 'isNull':
|
|
188
|
+
return `${col} IS NULL`;
|
|
189
|
+
case 'isNotNull':
|
|
190
|
+
return `${col} IS NOT NULL`;
|
|
191
|
+
case 'isEmpty':
|
|
192
|
+
return `(${col} IS NULL OR LENGTH(${col}) = 0)`;
|
|
193
|
+
case 'isNotEmpty':
|
|
194
|
+
return `(WHERE ${col} IS NOT NULL AND LENGTH(${col}) > 0)`;
|
|
195
|
+
case 'isTrue':
|
|
196
|
+
return `${col} = TRUE`;
|
|
197
|
+
case 'isFalse':
|
|
198
|
+
return `${col} = FALSE`;
|
|
199
|
+
default:
|
|
200
|
+
throw new XansqlError({
|
|
201
|
+
message: `Unknown where condition ${subKey} on column ${column} in table ${model.table}`,
|
|
202
|
+
model: model.table,
|
|
203
|
+
column
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
return `${generate.join(' AND ')}`;
|
|
208
|
+
}
|
|
209
|
+
checkIsAllowed(column) {
|
|
210
|
+
const xanv = this.model.schema[column];
|
|
211
|
+
if (Foreign.isArray(xanv))
|
|
212
|
+
return true;
|
|
213
|
+
const isNotAllowed = xanv instanceof XqlArray
|
|
214
|
+
|| xanv instanceof XqlObject
|
|
215
|
+
|| xanv instanceof XqlRecord
|
|
216
|
+
|| xanv instanceof XqlTuple;
|
|
217
|
+
// || xanv instanceof XqlFile
|
|
218
|
+
if (isNotAllowed) {
|
|
219
|
+
throw new XansqlError({
|
|
220
|
+
message: `Field ${column} of type ${xanv.constructor.name} is not allowed in WHERE clause in table ${this.model.table}`,
|
|
221
|
+
model: this.model.table,
|
|
222
|
+
column
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}export{WhereArgs as default};//# sourceMappingURL=WhereArgs.mjs.map
|
|
@@ -0,0 +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 \"../../Types/fields/Array\";\nimport XqlObject from \"../../Types/fields/Object\";\nimport XqlRecord from \"../../Types/fields/Record\";\nimport XqlTuple from \"../../Types/fields/Tuple\";\nimport { escapeSqlValue, isArray, isObject } from \"../../utils\";\nimport ValueFormatter from \"../include/ValueFormatter\";\nimport { WhereArgsType, WhereSubCondition } from \"../type\";\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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"}
|
package/model/Base.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { EventNames, EventHandler } from '../core/classes/EventManager.js';
|
|
2
|
+
import { XansqlModelOptions } from '../core/type.js';
|
|
3
|
+
import Xansql from '../core/Xansql.js';
|
|
4
|
+
import { XansqlSchemaObject } from '../Types/types.js';
|
|
5
|
+
|
|
6
|
+
type Hooks = 'beforeFind' | 'afterFind' | 'beforeCreate' | 'afterCreate' | 'beforeUpdate' | 'afterUpdate' | 'beforeDelete' | 'afterDelete' | 'beforeAggregate' | 'afterAggregate' | 'beforeExecute' | 'afterExecute' | 'beforeMigrate' | 'afterMigrate' | 'transform';
|
|
7
|
+
type Relation = {
|
|
8
|
+
type: "array" | "schema";
|
|
9
|
+
column: string;
|
|
10
|
+
};
|
|
11
|
+
declare abstract class ModelBase {
|
|
12
|
+
readonly schema: XansqlSchemaObject;
|
|
13
|
+
readonly table: string;
|
|
14
|
+
readonly IDColumn: string;
|
|
15
|
+
readonly columns: string[];
|
|
16
|
+
readonly relations: Relation[];
|
|
17
|
+
options: Required<XansqlModelOptions>;
|
|
18
|
+
xansql: Xansql;
|
|
19
|
+
alias: string;
|
|
20
|
+
constructor(table: string, schema: XansqlSchemaObject);
|
|
21
|
+
isIDColumn(column: string): boolean;
|
|
22
|
+
protected callHook(hook: Hooks, ...args: any): Promise<any>;
|
|
23
|
+
on<K extends EventNames>(event: K, handler: EventHandler<K>): void;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export { ModelBase as default };
|
package/model/Base.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var tslib=require('tslib'),ForeignInfo=require('../core/classes/ForeignInfo.js'),XansqlError=require('../core/XansqlError.js'),IDField=require('../Types/fields/IDField.js');class ModelBase {
|
|
2
|
+
constructor(table, schema) {
|
|
3
|
+
this.IDColumn = '';
|
|
4
|
+
this.columns = [];
|
|
5
|
+
this.relations = [];
|
|
6
|
+
this.options = {
|
|
7
|
+
hooks: {}
|
|
8
|
+
};
|
|
9
|
+
this.xansql = null;
|
|
10
|
+
this.alias = '';
|
|
11
|
+
this.table = table;
|
|
12
|
+
this.schema = schema;
|
|
13
|
+
for (let column in schema) {
|
|
14
|
+
const field = schema[column];
|
|
15
|
+
if (field instanceof IDField.default) {
|
|
16
|
+
if (this.IDColumn) {
|
|
17
|
+
throw new XansqlError.default({
|
|
18
|
+
message: `Model ${this.table} has multiple ID columns (${this.IDColumn} and ${column})`,
|
|
19
|
+
model: this.table,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
this.IDColumn = column;
|
|
23
|
+
}
|
|
24
|
+
if (ForeignInfo.default.isArray(field)) {
|
|
25
|
+
this.relations.push({ type: "array", column });
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
if (ForeignInfo.default.isSchema(field)) {
|
|
29
|
+
this.relations.push({ type: "schema", column });
|
|
30
|
+
}
|
|
31
|
+
this.columns.push(column);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (!this.IDColumn) {
|
|
35
|
+
throw new XansqlError.default({
|
|
36
|
+
message: `Schema ${this.table} must have an id column`,
|
|
37
|
+
model: this.table,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
isIDColumn(column) {
|
|
42
|
+
return column === this.IDColumn;
|
|
43
|
+
}
|
|
44
|
+
async callHook(hook, ...args) {
|
|
45
|
+
const xansql = this.xansql;
|
|
46
|
+
const config = xansql.config;
|
|
47
|
+
const modelHooks = this.options.hooks || {};
|
|
48
|
+
const configHooks = config.hooks || {};
|
|
49
|
+
let returnValue = null;
|
|
50
|
+
if (hook in modelHooks) {
|
|
51
|
+
returnValue = await modelHooks[hook].apply(this, args);
|
|
52
|
+
}
|
|
53
|
+
if (hook in configHooks) {
|
|
54
|
+
returnValue = await configHooks[hook].apply(null, [this, ...args]);
|
|
55
|
+
}
|
|
56
|
+
return returnValue;
|
|
57
|
+
}
|
|
58
|
+
on(event, handler) {
|
|
59
|
+
this.xansql.EventManager.on(event, (_a) => {
|
|
60
|
+
var { model } = _a, rest = tslib.__rest(_a, ["model"]);
|
|
61
|
+
handler.apply(this, rest);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}exports.default=ModelBase;//# sourceMappingURL=Base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Base.js","sources":["../../src/model/Base.ts"],"sourcesContent":["import { EventHandler, EventNames } from \"../core/classes/EventManager\";\nimport Foreign from \"../core/classes/ForeignInfo\";\nimport { XansqlModelOptions } from \"../core/type\";\nimport Xansql from \"../core/Xansql\";\nimport XansqlError from \"../core/XansqlError\";\nimport XqlIDField from \"../Types/fields/IDField\";\nimport { XansqlSchemaObject } from \"../Types/types\";\n\ntype Hooks =\n | 'beforeFind'\n | 'afterFind'\n | 'beforeCreate'\n | 'afterCreate'\n | 'beforeUpdate'\n | 'afterUpdate'\n | 'beforeDelete'\n | 'afterDelete'\n | 'beforeAggregate'\n | 'afterAggregate'\n | 'beforeExecute'\n | 'afterExecute'\n | 'beforeMigrate'\n | 'afterMigrate'\n | 'transform';\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 options: Required<XansqlModelOptions> = {\n hooks: {}\n }\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 instanceof 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 isIDColumn(column: string): boolean {\n return column === this.IDColumn;\n }\n\n protected async callHook(hook: Hooks, ...args: any): Promise<any> {\n const xansql = this.xansql;\n const config = xansql.config;\n\n const modelHooks: any = this.options.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 EventNames>(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":["XqlIDField","XansqlError","Foreign","__rest"],"mappings":"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"}
|
package/model/Base.mjs
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import {__rest}from'tslib';import Foreign from'../core/classes/ForeignInfo.mjs';import XansqlError from'../core/XansqlError.mjs';import XqlIDField from'../Types/fields/IDField.mjs';class ModelBase {
|
|
2
|
+
constructor(table, schema) {
|
|
3
|
+
this.IDColumn = '';
|
|
4
|
+
this.columns = [];
|
|
5
|
+
this.relations = [];
|
|
6
|
+
this.options = {
|
|
7
|
+
hooks: {}
|
|
8
|
+
};
|
|
9
|
+
this.xansql = null;
|
|
10
|
+
this.alias = '';
|
|
11
|
+
this.table = table;
|
|
12
|
+
this.schema = schema;
|
|
13
|
+
for (let column in schema) {
|
|
14
|
+
const field = schema[column];
|
|
15
|
+
if (field instanceof XqlIDField) {
|
|
16
|
+
if (this.IDColumn) {
|
|
17
|
+
throw new XansqlError({
|
|
18
|
+
message: `Model ${this.table} has multiple ID columns (${this.IDColumn} and ${column})`,
|
|
19
|
+
model: this.table,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
this.IDColumn = column;
|
|
23
|
+
}
|
|
24
|
+
if (Foreign.isArray(field)) {
|
|
25
|
+
this.relations.push({ type: "array", column });
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
if (Foreign.isSchema(field)) {
|
|
29
|
+
this.relations.push({ type: "schema", column });
|
|
30
|
+
}
|
|
31
|
+
this.columns.push(column);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (!this.IDColumn) {
|
|
35
|
+
throw new XansqlError({
|
|
36
|
+
message: `Schema ${this.table} must have an id column`,
|
|
37
|
+
model: this.table,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
isIDColumn(column) {
|
|
42
|
+
return column === this.IDColumn;
|
|
43
|
+
}
|
|
44
|
+
async callHook(hook, ...args) {
|
|
45
|
+
const xansql = this.xansql;
|
|
46
|
+
const config = xansql.config;
|
|
47
|
+
const modelHooks = this.options.hooks || {};
|
|
48
|
+
const configHooks = config.hooks || {};
|
|
49
|
+
let returnValue = null;
|
|
50
|
+
if (hook in modelHooks) {
|
|
51
|
+
returnValue = await modelHooks[hook].apply(this, args);
|
|
52
|
+
}
|
|
53
|
+
if (hook in configHooks) {
|
|
54
|
+
returnValue = await configHooks[hook].apply(null, [this, ...args]);
|
|
55
|
+
}
|
|
56
|
+
return returnValue;
|
|
57
|
+
}
|
|
58
|
+
on(event, handler) {
|
|
59
|
+
this.xansql.EventManager.on(event, (_a) => {
|
|
60
|
+
var { model } = _a, rest = __rest(_a, ["model"]);
|
|
61
|
+
handler.apply(this, rest);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}export{ModelBase as default};//# sourceMappingURL=Base.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Base.mjs","sources":["../../src/model/Base.ts"],"sourcesContent":["import { EventHandler, EventNames } from \"../core/classes/EventManager\";\nimport Foreign from \"../core/classes/ForeignInfo\";\nimport { XansqlModelOptions } from \"../core/type\";\nimport Xansql from \"../core/Xansql\";\nimport XansqlError from \"../core/XansqlError\";\nimport XqlIDField from \"../Types/fields/IDField\";\nimport { XansqlSchemaObject } from \"../Types/types\";\n\ntype Hooks =\n | 'beforeFind'\n | 'afterFind'\n | 'beforeCreate'\n | 'afterCreate'\n | 'beforeUpdate'\n | 'afterUpdate'\n | 'beforeDelete'\n | 'afterDelete'\n | 'beforeAggregate'\n | 'afterAggregate'\n | 'beforeExecute'\n | 'afterExecute'\n | 'beforeMigrate'\n | 'afterMigrate'\n | 'transform';\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 options: Required<XansqlModelOptions> = {\n hooks: {}\n }\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 instanceof 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 isIDColumn(column: string): boolean {\n return column === this.IDColumn;\n }\n\n protected async callHook(hook: Hooks, ...args: any): Promise<any> {\n const xansql = this.xansql;\n const config = xansql.config;\n\n const modelHooks: any = this.options.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 EventNames>(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":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var ForeignInfo=require('../../../core/classes/ForeignInfo.js'),XansqlError=require('../../../core/XansqlError.js'),IDField=require('../../../Types/fields/IDField.js'),Number=require('../../../Types/fields/Number.js');class SelectArgs {
|
|
2
|
+
constructor(model, args) {
|
|
3
|
+
this.model = model;
|
|
4
|
+
const sqls = [];
|
|
5
|
+
for (let column in args) {
|
|
6
|
+
const field = model.schema[column];
|
|
7
|
+
if (!field) {
|
|
8
|
+
throw new XansqlError.default({
|
|
9
|
+
message: `Column ${column} not found in model ${model.table} for aggregate select`,
|
|
10
|
+
model: model.table,
|
|
11
|
+
column: column
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
if (ForeignInfo.default.is(field)) {
|
|
15
|
+
throw new XansqlError.default({
|
|
16
|
+
message: `Cannot perform aggregate functions on foreign key column ${column} in model ${model.table}`,
|
|
17
|
+
model: model.table,
|
|
18
|
+
column: column
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
const columnArg = args[column];
|
|
23
|
+
sqls.push(this.columnFormat(column, columnArg));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
this.sql = sqls.join(", ");
|
|
27
|
+
}
|
|
28
|
+
columnFormat(column, columnArg) {
|
|
29
|
+
let model = this.model;
|
|
30
|
+
const field = model.schema[column];
|
|
31
|
+
const isNumber = field instanceof Number.default || field instanceof IDField.default;
|
|
32
|
+
let sql = [];
|
|
33
|
+
for (let func in columnArg) {
|
|
34
|
+
const funcArg = columnArg[func];
|
|
35
|
+
const isObject = funcArg && typeof funcArg === "object";
|
|
36
|
+
// apply distinct
|
|
37
|
+
let col = column;
|
|
38
|
+
if (isObject && funcArg.distinct === true) {
|
|
39
|
+
col = `DISTINCT ${col}`;
|
|
40
|
+
}
|
|
41
|
+
let _sql = `${func.toUpperCase()}(${col})`;
|
|
42
|
+
// make to integer for all as REAL
|
|
43
|
+
if (!isNumber) {
|
|
44
|
+
_sql = `CAST(${_sql} AS REAL)`;
|
|
45
|
+
}
|
|
46
|
+
if (isObject && (funcArg === null || funcArg === void 0 ? void 0 : funcArg.round) !== undefined) {
|
|
47
|
+
_sql = `ROUND(${_sql}, ${funcArg.round})`;
|
|
48
|
+
}
|
|
49
|
+
if (isObject && funcArg.alias) {
|
|
50
|
+
_sql += ` AS ${funcArg.alias}`;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
_sql += ` AS ${func}_${column}`;
|
|
54
|
+
}
|
|
55
|
+
sql.push(_sql);
|
|
56
|
+
}
|
|
57
|
+
return sql.join(", ");
|
|
58
|
+
}
|
|
59
|
+
}exports.default=SelectArgs;//# sourceMappingURL=SelectArgs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectArgs.js","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 \"../../../Types/fields/IDField\";\nimport XqlNumber from \"../../../Types/fields/Number\";\nimport { AggregateSelectArgsColumnType, AggregateSelectArgsType } from \"../../type\";\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 instanceof XqlNumber || field instanceof 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","XqlNumber","XqlIDField"],"mappings":"gSAOA,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,mBAAW,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,mBAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE;gBACpB,MAAM,IAAID,mBAAW,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,KAAK,YAAYE,cAAS,IAAI,KAAK,YAAYC,eAAU;QAC1E,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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import Foreign from'../../../core/classes/ForeignInfo.mjs';import XansqlError from'../../../core/XansqlError.mjs';import XqlIDField from'../../../Types/fields/IDField.mjs';import XqlNumber from'../../../Types/fields/Number.mjs';class SelectArgs {
|
|
2
|
+
constructor(model, args) {
|
|
3
|
+
this.model = model;
|
|
4
|
+
const sqls = [];
|
|
5
|
+
for (let column in args) {
|
|
6
|
+
const field = model.schema[column];
|
|
7
|
+
if (!field) {
|
|
8
|
+
throw new XansqlError({
|
|
9
|
+
message: `Column ${column} not found in model ${model.table} for aggregate select`,
|
|
10
|
+
model: model.table,
|
|
11
|
+
column: column
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
if (Foreign.is(field)) {
|
|
15
|
+
throw new XansqlError({
|
|
16
|
+
message: `Cannot perform aggregate functions on foreign key column ${column} in model ${model.table}`,
|
|
17
|
+
model: model.table,
|
|
18
|
+
column: column
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
const columnArg = args[column];
|
|
23
|
+
sqls.push(this.columnFormat(column, columnArg));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
this.sql = sqls.join(", ");
|
|
27
|
+
}
|
|
28
|
+
columnFormat(column, columnArg) {
|
|
29
|
+
let model = this.model;
|
|
30
|
+
const field = model.schema[column];
|
|
31
|
+
const isNumber = field instanceof XqlNumber || field instanceof XqlIDField;
|
|
32
|
+
let sql = [];
|
|
33
|
+
for (let func in columnArg) {
|
|
34
|
+
const funcArg = columnArg[func];
|
|
35
|
+
const isObject = funcArg && typeof funcArg === "object";
|
|
36
|
+
// apply distinct
|
|
37
|
+
let col = column;
|
|
38
|
+
if (isObject && funcArg.distinct === true) {
|
|
39
|
+
col = `DISTINCT ${col}`;
|
|
40
|
+
}
|
|
41
|
+
let _sql = `${func.toUpperCase()}(${col})`;
|
|
42
|
+
// make to integer for all as REAL
|
|
43
|
+
if (!isNumber) {
|
|
44
|
+
_sql = `CAST(${_sql} AS REAL)`;
|
|
45
|
+
}
|
|
46
|
+
if (isObject && (funcArg === null || funcArg === void 0 ? void 0 : funcArg.round) !== undefined) {
|
|
47
|
+
_sql = `ROUND(${_sql}, ${funcArg.round})`;
|
|
48
|
+
}
|
|
49
|
+
if (isObject && funcArg.alias) {
|
|
50
|
+
_sql += ` AS ${funcArg.alias}`;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
_sql += ` AS ${func}_${column}`;
|
|
54
|
+
}
|
|
55
|
+
sql.push(_sql);
|
|
56
|
+
}
|
|
57
|
+
return sql.join(", ");
|
|
58
|
+
}
|
|
59
|
+
}export{SelectArgs as default};//# sourceMappingURL=SelectArgs.mjs.map
|
|
@@ -0,0 +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 \"../../../Types/fields/IDField\";\nimport XqlNumber from \"../../../Types/fields/Number\";\nimport { AggregateSelectArgsColumnType, AggregateSelectArgsType } from \"../../type\";\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 instanceof XqlNumber || field instanceof 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":"oOAOA,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,KAAK,YAAY,SAAS,IAAI,KAAK,YAAY,UAAU;QAC1E,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"}
|