wok-server 0.5.0 → 0.6.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/README.en.md +61 -0
- package/README.md +44 -29
- package/dist/cache/cache.js +98 -98
- package/dist/cache/config.js +19 -19
- package/dist/cache/index.js +27 -27
- package/dist/cache/purge-task.js +46 -46
- package/dist/cache/stat.js +47 -47
- package/dist/config/convert.js +36 -36
- package/dist/config/exception.js +14 -14
- package/dist/config/index.js +81 -81
- package/dist/http-client/index.js +136 -136
- package/dist/i18n/ar.js +17 -17
- package/dist/i18n/de.js +17 -17
- package/dist/i18n/en-us.js +17 -17
- package/dist/i18n/es.js +17 -17
- package/dist/i18n/fr.js +17 -17
- package/dist/i18n/i18n.js +231 -231
- package/dist/i18n/index.js +52 -52
- package/dist/i18n/ja.js +17 -17
- package/dist/i18n/ko.js +17 -17
- package/dist/i18n/msg.js +2 -2
- package/dist/i18n/pt.js +17 -17
- package/dist/i18n/ru.js +17 -17
- package/dist/i18n/tag.js +18 -18
- package/dist/i18n/zh-HK.js +17 -17
- package/dist/i18n/zh-TW.js +17 -17
- package/dist/i18n/zh-cn.js +17 -17
- package/dist/index.js +14 -14
- package/dist/lock/index.js +114 -114
- package/dist/log/config.js +35 -35
- package/dist/log/date.js +21 -21
- package/dist/log/file.js +198 -198
- package/dist/log/index.js +135 -135
- package/dist/log/level.js +33 -33
- package/dist/log/log.js +56 -56
- package/dist/log/store.js +19 -19
- package/dist/mongodb/collection.js +2 -2
- package/dist/mongodb/config.js +34 -34
- package/dist/mongodb/doc.js +2 -2
- package/dist/mongodb/exception.js +14 -14
- package/dist/mongodb/index.js +58 -58
- package/dist/mongodb/manager/base.js +563 -563
- package/dist/mongodb/manager/index.js +63 -63
- package/dist/mongodb/manager/tx-strict.js +84 -84
- package/dist/mongodb/manager/tx.js +30 -30
- package/dist/mongodb/migration.js +52 -52
- package/dist/mvc/access-log.js +33 -33
- package/dist/mvc/config.js +27 -27
- package/dist/mvc/exchange.js +113 -113
- package/dist/mvc/handler/index.js +7 -6
- package/dist/mvc/handler/json.js +65 -65
- package/dist/mvc/handler/restful.js +35 -35
- package/dist/mvc/handler/sse.js +65 -0
- package/dist/mvc/handler/upload.js +31 -31
- package/dist/mvc/index.js +50 -50
- package/dist/mvc/interceptor.js +2 -2
- package/dist/mvc/query.js +43 -43
- package/dist/mvc/render/file.js +132 -132
- package/dist/mvc/render/html/html.js +90 -90
- package/dist/mvc/render/html/index.js +18 -18
- package/dist/mvc/render/html/style.js +2 -2
- package/dist/mvc/render/index.js +7 -7
- package/dist/mvc/render/json.js +26 -26
- package/dist/mvc/render/text.js +16 -16
- package/dist/mvc/router.js +2 -2
- package/dist/mvc/server.js +272 -272
- package/dist/mvc/static/header.js +67 -67
- package/dist/mvc/static/index.js +6 -6
- package/dist/mvc/static/mime-type.js +84 -84
- package/dist/mvc/static/server-cache-config.js +66 -66
- package/dist/mvc/static/server-cache.js +133 -133
- package/dist/mvc/static/static-handler.js +372 -372
- package/dist/mysql/config.js +51 -51
- package/dist/mysql/exception.js +14 -14
- package/dist/mysql/index.js +87 -87
- package/dist/mysql/manager/base.js +239 -239
- package/dist/mysql/manager/index.js +107 -107
- package/dist/mysql/manager/ops/count.js +20 -20
- package/dist/mysql/manager/ops/criteria.js +356 -356
- package/dist/mysql/manager/ops/delete.js +65 -65
- package/dist/mysql/manager/ops/exist.js +26 -26
- package/dist/mysql/manager/ops/find.js +169 -169
- package/dist/mysql/manager/ops/index.js +14 -14
- package/dist/mysql/manager/ops/insert.js +106 -106
- package/dist/mysql/manager/ops/modify.js +10 -10
- package/dist/mysql/manager/ops/paginate.js +23 -23
- package/dist/mysql/manager/ops/query.js +9 -9
- package/dist/mysql/manager/ops/update.js +216 -216
- package/dist/mysql/manager/ops/utils.js +24 -24
- package/dist/mysql/manager/tx-strict.js +103 -103
- package/dist/mysql/manager/tx.js +30 -30
- package/dist/mysql/manager/utils.js +56 -56
- package/dist/mysql/migration.js +136 -136
- package/dist/mysql/table-info.js +8 -8
- package/dist/task/daily.js +59 -59
- package/dist/task/fixed-delay.js +38 -38
- package/dist/task/fixed-rate.js +42 -42
- package/dist/task/index.js +9 -9
- package/dist/task/task.js +56 -56
- package/dist/validation/exception.js +36 -36
- package/dist/validation/index.js +40 -40
- package/dist/validation/validator/array.js +34 -34
- package/dist/validation/validator/enum.js +28 -28
- package/dist/validation/validator/index.js +14 -14
- package/dist/validation/validator/length.js +40 -40
- package/dist/validation/validator/max-length.js +35 -35
- package/dist/validation/validator/max.js +29 -29
- package/dist/validation/validator/min-length.js +33 -33
- package/dist/validation/validator/min.js +29 -29
- package/dist/validation/validator/not-blank.js +33 -33
- package/dist/validation/validator/not-null.js +21 -21
- package/dist/validation/validator/plain-obj.js +32 -32
- package/dist/validation/validator/regexp.js +34 -34
- package/documentation/en/cache.md +56 -0
- package/documentation/en/config.md +96 -0
- package/documentation/en/engineering.md +256 -0
- package/documentation/en/http-client.md +32 -0
- package/documentation/en/i18n.md +143 -0
- package/documentation/en/index.md +24 -0
- package/documentation/en/lock.md +51 -0
- package/documentation/en/log.md +109 -0
- package/documentation/en/mongodb.md +256 -0
- package/documentation/en/mvc.md +688 -0
- package/documentation/en/mysql.md +552 -0
- package/documentation/en/task.md +45 -0
- package/documentation/en/test.md +56 -0
- package/documentation/en/validate.md +130 -0
- package/documentation/zh-cn/mvc.md +66 -24
- package/package.json +3 -1
- package/skills/wok-server-api-rules/SKILL.md +350 -0
- package/skills/wok-server-cache/SKILL.md +216 -0
- package/skills/wok-server-config/SKILL.md +200 -0
- package/skills/wok-server-getting-started/SKILL.md +123 -0
- package/skills/wok-server-getting-started/references/engineering.md +169 -0
- package/skills/wok-server-http-client/SKILL.md +164 -0
- package/skills/wok-server-i18n/SKILL.md +214 -0
- package/skills/wok-server-lock/SKILL.md +144 -0
- package/skills/wok-server-log/SKILL.md +218 -0
- package/skills/wok-server-mongodb/SKILL.md +235 -0
- package/skills/wok-server-mvc/SKILL.md +251 -0
- package/skills/wok-server-mvc/references/respond-html.md +157 -0
- package/skills/wok-server-mvc/references/sse.md +121 -0
- package/skills/wok-server-mvc/references/static-files.md +47 -0
- package/skills/wok-server-mvc/references/upload.md +62 -0
- package/skills/wok-server-mvc/references/websocket.md +30 -0
- package/skills/wok-server-mysql/SKILL.md +315 -0
- package/skills/wok-server-mysql/references/multi-datasource.md +76 -0
- package/skills/wok-server-mysql/references/version-control.md +22 -0
- package/skills/wok-server-task/SKILL.md +158 -0
- package/skills/wok-server-validate/SKILL.md +167 -0
- package/src/cache/cache.ts +118 -0
- package/src/cache/config.ts +53 -0
- package/src/cache/index.ts +27 -0
- package/src/cache/purge-task.ts +53 -0
- package/src/cache/stat.ts +47 -0
- package/src/config/convert.ts +27 -0
- package/src/config/exception.ts +8 -0
- package/src/config/index.ts +92 -0
- package/src/http-client/index.ts +202 -0
- package/src/i18n/ar.ts +16 -0
- package/src/i18n/de.ts +16 -0
- package/src/i18n/en-us.ts +16 -0
- package/src/i18n/es.ts +16 -0
- package/src/i18n/fr.ts +16 -0
- package/src/i18n/i18n.ts +230 -0
- package/src/i18n/index.ts +50 -0
- package/src/i18n/ja.ts +16 -0
- package/src/i18n/ko.ts +16 -0
- package/src/i18n/msg.ts +50 -0
- package/src/i18n/pt.ts +16 -0
- package/src/i18n/ru.ts +16 -0
- package/src/i18n/tag.ts +18 -0
- package/src/i18n/zh-HK.ts +16 -0
- package/src/i18n/zh-TW.ts +16 -0
- package/src/i18n/zh-cn.ts +16 -0
- package/src/index.ts +11 -0
- package/src/lock/index.ts +164 -0
- package/src/log/config.ts +71 -0
- package/src/log/date.ts +19 -0
- package/src/log/file.ts +215 -0
- package/src/log/index.ts +136 -0
- package/src/log/level.ts +29 -0
- package/src/log/log.ts +77 -0
- package/src/log/store.ts +31 -0
- package/src/mongodb/collection.ts +25 -0
- package/src/mongodb/config.ts +69 -0
- package/src/mongodb/doc.ts +12 -0
- package/src/mongodb/exception.ts +8 -0
- package/src/mongodb/index.ts +71 -0
- package/src/mongodb/manager/base.ts +674 -0
- package/src/mongodb/manager/index.ts +80 -0
- package/src/mongodb/manager/tx-strict.ts +153 -0
- package/src/mongodb/manager/tx.ts +34 -0
- package/src/mongodb/migration.ts +66 -0
- package/src/mvc/access-log.ts +33 -0
- package/src/mvc/config.ts +70 -0
- package/src/mvc/exchange.ts +126 -0
- package/src/mvc/handler/index.ts +4 -0
- package/src/mvc/handler/json.ts +96 -0
- package/src/mvc/handler/restful.ts +39 -0
- package/src/mvc/handler/sse.ts +90 -0
- package/src/mvc/handler/upload.ts +54 -0
- package/src/mvc/index.ts +48 -0
- package/src/mvc/interceptor.ts +12 -0
- package/src/mvc/query.ts +36 -0
- package/src/mvc/render/file.ts +148 -0
- package/src/mvc/render/html/html.ts +187 -0
- package/src/mvc/render/html/index.ts +16 -0
- package/src/mvc/render/html/style.ts +1201 -0
- package/src/mvc/render/index.ts +4 -0
- package/src/mvc/render/json.ts +24 -0
- package/src/mvc/render/text.ts +14 -0
- package/src/mvc/router.ts +13 -0
- package/src/mvc/server.ts +315 -0
- package/src/mvc/static/header.ts +86 -0
- package/src/mvc/static/index.ts +3 -0
- package/src/mvc/static/mime-type.ts +81 -0
- package/src/mvc/static/server-cache-config.ts +92 -0
- package/src/mvc/static/server-cache.ts +171 -0
- package/src/mvc/static/static-handler.ts +445 -0
- package/src/mysql/config.ts +130 -0
- package/src/mysql/exception.ts +8 -0
- package/src/mysql/index.ts +88 -0
- package/src/mysql/manager/base.ts +285 -0
- package/src/mysql/manager/index.ts +112 -0
- package/src/mysql/manager/ops/count.ts +30 -0
- package/src/mysql/manager/ops/criteria.ts +412 -0
- package/src/mysql/manager/ops/delete.ts +96 -0
- package/src/mysql/manager/ops/exist.ts +41 -0
- package/src/mysql/manager/ops/find.ts +226 -0
- package/src/mysql/manager/ops/index.ts +11 -0
- package/src/mysql/manager/ops/insert.ts +120 -0
- package/src/mysql/manager/ops/modify.ts +14 -0
- package/src/mysql/manager/ops/paginate.ts +60 -0
- package/src/mysql/manager/ops/query.ts +13 -0
- package/src/mysql/manager/ops/update.ts +294 -0
- package/src/mysql/manager/ops/utils.ts +20 -0
- package/src/mysql/manager/tx-strict.ts +138 -0
- package/src/mysql/manager/tx.ts +31 -0
- package/src/mysql/manager/utils.ts +75 -0
- package/src/mysql/migration.ts +149 -0
- package/src/mysql/table-info.ts +41 -0
- package/src/task/daily.ts +70 -0
- package/src/task/fixed-delay.ts +45 -0
- package/src/task/fixed-rate.ts +49 -0
- package/src/task/index.ts +4 -0
- package/src/task/task.ts +70 -0
- package/src/validation/exception.ts +27 -0
- package/src/validation/index.ts +61 -0
- package/src/validation/validator/array.ts +32 -0
- package/src/validation/validator/enum.ts +25 -0
- package/src/validation/validator/index.ts +11 -0
- package/src/validation/validator/length.ts +42 -0
- package/src/validation/validator/max-length.ts +33 -0
- package/src/validation/validator/max.ts +26 -0
- package/src/validation/validator/min-length.ts +31 -0
- package/src/validation/validator/min.ts +26 -0
- package/src/validation/validator/not-blank.ts +31 -0
- package/src/validation/validator/not-null.ts +19 -0
- package/src/validation/validator/plain-obj.ts +30 -0
- package/src/validation/validator/regexp.ts +32 -0
- package/types/cache/cache.d.ts +52 -52
- package/types/cache/config.d.ts +32 -32
- package/types/cache/index.d.ts +2 -2
- package/types/cache/purge-task.d.ts +11 -11
- package/types/cache/stat.d.ts +26 -26
- package/types/config/convert.d.ts +6 -6
- package/types/config/exception.d.ts +7 -7
- package/types/config/index.d.ts +25 -25
- package/types/http-client/index.d.ts +71 -71
- package/types/i18n/ar.d.ts +2 -2
- package/types/i18n/de.d.ts +2 -2
- package/types/i18n/en-us.d.ts +2 -2
- package/types/i18n/es.d.ts +2 -2
- package/types/i18n/fr.d.ts +2 -2
- package/types/i18n/i18n.d.ts +102 -102
- package/types/i18n/index.d.ts +9 -9
- package/types/i18n/ja.d.ts +2 -2
- package/types/i18n/ko.d.ts +2 -2
- package/types/i18n/msg.d.ts +50 -50
- package/types/i18n/pt.d.ts +2 -2
- package/types/i18n/ru.d.ts +2 -2
- package/types/i18n/tag.d.ts +11 -11
- package/types/i18n/zh-HK.d.ts +2 -2
- package/types/i18n/zh-TW.d.ts +2 -2
- package/types/i18n/zh-cn.d.ts +2 -2
- package/types/index.d.ts +11 -11
- package/types/lock/index.d.ts +64 -64
- package/types/log/config.d.ts +35 -35
- package/types/log/date.d.ts +2 -2
- package/types/log/file.d.ts +13 -13
- package/types/log/index.d.ts +53 -53
- package/types/log/level.d.ts +14 -14
- package/types/log/log.d.ts +40 -40
- package/types/log/store.d.ts +19 -19
- package/types/mongodb/collection.d.ts +25 -25
- package/types/mongodb/config.d.ts +45 -45
- package/types/mongodb/doc.d.ts +11 -11
- package/types/mongodb/exception.d.ts +7 -7
- package/types/mongodb/index.d.ts +29 -29
- package/types/mongodb/manager/base.d.ts +188 -188
- package/types/mongodb/manager/index.d.ts +38 -38
- package/types/mongodb/manager/tx-strict.d.ts +41 -41
- package/types/mongodb/manager/tx.d.ts +21 -21
- package/types/mongodb/migration.d.ts +12 -12
- package/types/mvc/access-log.d.ts +7 -7
- package/types/mvc/config.d.ts +42 -42
- package/types/mvc/exchange.d.ts +72 -72
- package/types/mvc/handler/index.d.ts +4 -3
- package/types/mvc/handler/json.d.ts +44 -44
- package/types/mvc/handler/restful.d.ts +11 -11
- package/types/mvc/handler/sse.d.ts +34 -0
- package/types/mvc/handler/upload.d.ts +36 -36
- package/types/mvc/index.d.ts +22 -22
- package/types/mvc/interceptor.d.ts +11 -11
- package/types/mvc/query.d.ts +13 -13
- package/types/mvc/render/file.d.ts +10 -10
- package/types/mvc/render/html/html.d.ts +98 -98
- package/types/mvc/render/html/index.d.ts +11 -11
- package/types/mvc/render/html/style.d.ts +1201 -1201
- package/types/mvc/render/index.d.ts +4 -4
- package/types/mvc/render/json.d.ts +17 -17
- package/types/mvc/render/text.d.ts +10 -10
- package/types/mvc/router.d.ts +11 -11
- package/types/mvc/server.d.ts +90 -90
- package/types/mvc/static/header.d.ts +27 -27
- package/types/mvc/static/index.d.ts +3 -3
- package/types/mvc/static/mime-type.d.ts +2 -2
- package/types/mvc/static/server-cache-config.d.ts +30 -30
- package/types/mvc/static/server-cache.d.ts +76 -76
- package/types/mvc/static/static-handler.d.ts +77 -77
- package/types/mysql/config.d.ts +90 -90
- package/types/mysql/exception.d.ts +7 -7
- package/types/mysql/index.d.ts +16 -16
- package/types/mysql/manager/base.d.ts +165 -165
- package/types/mysql/manager/index.d.ts +36 -36
- package/types/mysql/manager/ops/count.d.ts +13 -13
- package/types/mysql/manager/ops/criteria.d.ts +134 -134
- package/types/mysql/manager/ops/delete.d.ts +46 -46
- package/types/mysql/manager/ops/exist.d.ts +6 -6
- package/types/mysql/manager/ops/find.d.ts +86 -86
- package/types/mysql/manager/ops/index.d.ts +10 -10
- package/types/mysql/manager/ops/insert.d.ts +18 -18
- package/types/mysql/manager/ops/modify.d.ts +3 -3
- package/types/mysql/manager/ops/paginate.d.ts +36 -36
- package/types/mysql/manager/ops/query.d.ts +3 -3
- package/types/mysql/manager/ops/update.d.ts +76 -76
- package/types/mysql/manager/ops/utils.d.ts +5 -5
- package/types/mysql/manager/tx-strict.d.ts +36 -36
- package/types/mysql/manager/tx.d.ts +15 -15
- package/types/mysql/manager/utils.d.ts +17 -17
- package/types/mysql/migration.d.ts +8 -8
- package/types/mysql/table-info.d.ts +36 -36
- package/types/task/daily.d.ts +16 -16
- package/types/task/fixed-delay.d.ts +9 -9
- package/types/task/fixed-rate.d.ts +9 -9
- package/types/task/index.d.ts +4 -4
- package/types/task/task.d.ts +34 -34
- package/types/validation/exception.d.ts +38 -38
- package/types/validation/index.d.ts +32 -32
- package/types/validation/validator/array.d.ts +5 -5
- package/types/validation/validator/enum.d.ts +8 -8
- package/types/validation/validator/index.d.ts +11 -11
- package/types/validation/validator/length.d.ts +10 -10
- package/types/validation/validator/max-length.d.ts +8 -8
- package/types/validation/validator/max.d.ts +7 -7
- package/types/validation/validator/min-length.d.ts +6 -6
- package/types/validation/validator/min.d.ts +7 -7
- package/types/validation/validator/not-blank.d.ts +7 -7
- package/types/validation/validator/not-null.d.ts +6 -6
- package/types/validation/validator/plain-obj.d.ts +7 -7
- package/types/validation/validator/regexp.d.ts +8 -8
|
@@ -1,356 +1,356 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.buildQuery = exports.MysqlCriteria = void 0;
|
|
4
|
-
const exception_1 = require("../../exception");
|
|
5
|
-
/**
|
|
6
|
-
* 生成条件查询中键的sql片段,包含 sql 内容和要传递的值
|
|
7
|
-
*/
|
|
8
|
-
function generateMysqlCriteriaKeySqlSeg(key) {
|
|
9
|
-
if (Array.isArray(key)) {
|
|
10
|
-
if (key[0] === 'json_extract') {
|
|
11
|
-
return { sqlSeg: `JSON_EXTRACT(??, ${JSON.stringify(key[2])})`, value: key[1] };
|
|
12
|
-
}
|
|
13
|
-
if (key[0] === 'json_length') {
|
|
14
|
-
return { sqlSeg: `JSON_LENGTH(??)`, value: key[1] };
|
|
15
|
-
}
|
|
16
|
-
throw new exception_1.MysqlException(`Unsupported MysqlCriteriaKey type: ${key[0]}`);
|
|
17
|
-
}
|
|
18
|
-
return { sqlSeg: '??', value: key };
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* mysql 查询条件( query criterion ),默认查询条件都是并且关系(and), 部分方法会有例外,在使用的时候请注意方法说明。
|
|
22
|
-
*
|
|
23
|
-
* @param <T> 表类型
|
|
24
|
-
*/
|
|
25
|
-
class MysqlCriteria {
|
|
26
|
-
/**
|
|
27
|
-
* 条件列表.
|
|
28
|
-
*/
|
|
29
|
-
criteria = [];
|
|
30
|
-
/**
|
|
31
|
-
* 相等.
|
|
32
|
-
* @param column
|
|
33
|
-
* @param value
|
|
34
|
-
*/
|
|
35
|
-
eq(column, value) {
|
|
36
|
-
this.criteria.push({ type: 'eq', key: column, value });
|
|
37
|
-
return this;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* 不等于,注意不相等不能走索引,谨慎使用
|
|
41
|
-
* @param column
|
|
42
|
-
* @param value
|
|
43
|
-
*/
|
|
44
|
-
neq(column, value) {
|
|
45
|
-
this.criteria.push({ type: 'neq', key: column, value });
|
|
46
|
-
return this;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* like
|
|
50
|
-
* @param column
|
|
51
|
-
* @param value
|
|
52
|
-
* @returns
|
|
53
|
-
*/
|
|
54
|
-
like(column, value) {
|
|
55
|
-
this.criteria.push({ type: 'like', key: column, value });
|
|
56
|
-
return this;
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* not like
|
|
60
|
-
* @param column
|
|
61
|
-
* @param value
|
|
62
|
-
* @returns
|
|
63
|
-
*/
|
|
64
|
-
notLike(column, value) {
|
|
65
|
-
this.criteria.push({ type: 'notLike', key: column, value });
|
|
66
|
-
return this;
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* BETWEEN x and y
|
|
70
|
-
*/
|
|
71
|
-
between(column, min, max) {
|
|
72
|
-
this.criteria.push({ type: 'between', key: column, value: [min, max] });
|
|
73
|
-
return this;
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* 大于
|
|
77
|
-
* @param column
|
|
78
|
-
* @param value
|
|
79
|
-
*/
|
|
80
|
-
gt(column, value) {
|
|
81
|
-
this.criteria.push({ type: 'gt', key: column, value });
|
|
82
|
-
return this;
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* 大于等于
|
|
86
|
-
* @param column
|
|
87
|
-
* @param value
|
|
88
|
-
*/
|
|
89
|
-
gte(column, value) {
|
|
90
|
-
this.criteria.push({ type: 'gte', key: column, value });
|
|
91
|
-
return this;
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* 小于
|
|
95
|
-
* @param column
|
|
96
|
-
* @param value
|
|
97
|
-
*/
|
|
98
|
-
lt(column, value) {
|
|
99
|
-
this.criteria.push({ type: 'lt', key: column, value });
|
|
100
|
-
return this;
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* 小于等于
|
|
104
|
-
* @param column
|
|
105
|
-
* @param value
|
|
106
|
-
*/
|
|
107
|
-
lte(column, value) {
|
|
108
|
-
this.criteria.push({ type: 'lte', key: column, value });
|
|
109
|
-
return this;
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* in 条件
|
|
113
|
-
* @param column
|
|
114
|
-
* @param values
|
|
115
|
-
*/
|
|
116
|
-
in(column, values) {
|
|
117
|
-
this.criteria.push({ type: 'in', key: column, value: values });
|
|
118
|
-
return this;
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* not in 条件
|
|
122
|
-
* @param column
|
|
123
|
-
* @param values
|
|
124
|
-
*/
|
|
125
|
-
notIn(column, values) {
|
|
126
|
-
this.criteria.push({ type: 'notIn', key: column, value: values });
|
|
127
|
-
return this;
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* 嵌入其它的查询条件,与现有的查询条件是或者关系.
|
|
131
|
-
* @param criteria
|
|
132
|
-
*/
|
|
133
|
-
or(orCriteria) {
|
|
134
|
-
const criteria = new MysqlCriteria();
|
|
135
|
-
orCriteria(criteria);
|
|
136
|
-
this.criteria.push({ type: 'or', criteria });
|
|
137
|
-
return this;
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* 嵌入其它的查询条件,与现有的查询条件是并且关系.
|
|
141
|
-
* @param criteria
|
|
142
|
-
*/
|
|
143
|
-
and(andCriteria) {
|
|
144
|
-
const criteria = new MysqlCriteria();
|
|
145
|
-
andCriteria(criteria);
|
|
146
|
-
this.criteria.push({ type: 'and', criteria });
|
|
147
|
-
return this;
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* 字段为空
|
|
151
|
-
* @param field
|
|
152
|
-
* @returns
|
|
153
|
-
*/
|
|
154
|
-
isNull(field) {
|
|
155
|
-
this.criteria.push({ type: 'isNull', key: field });
|
|
156
|
-
return this;
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* 字段非空
|
|
160
|
-
* @param field
|
|
161
|
-
* @returns
|
|
162
|
-
*/
|
|
163
|
-
isNotNull(field) {
|
|
164
|
-
this.criteria.push({ type: 'isNotNull', key: field });
|
|
165
|
-
return this;
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* 判定是否空,未设置条件.
|
|
169
|
-
* @returns
|
|
170
|
-
*/
|
|
171
|
-
isEmpty() {
|
|
172
|
-
return !this.criteria.length;
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* 检查条件信息是否有效,在出错时能给予较详细的提示,以方便排查.
|
|
176
|
-
*/
|
|
177
|
-
check() {
|
|
178
|
-
for (const criterion of this.criteria) {
|
|
179
|
-
if (criterion.type === 'or' || criterion.type === 'and') {
|
|
180
|
-
if (!criterion.criteria) {
|
|
181
|
-
throw new exception_1.MysqlException(`${criterion.type} clause cannot be empty`);
|
|
182
|
-
}
|
|
183
|
-
criterion.criteria.check();
|
|
184
|
-
continue;
|
|
185
|
-
}
|
|
186
|
-
if (!criterion.key) {
|
|
187
|
-
throw new exception_1.MysqlException('The column name of the query criteria cannot be blank.');
|
|
188
|
-
}
|
|
189
|
-
if (criterion.type === 'isNull' || criterion.type === 'isNotNull') {
|
|
190
|
-
continue;
|
|
191
|
-
}
|
|
192
|
-
if (criterion.type === 'in' || criterion.type === 'notIn') {
|
|
193
|
-
if (!Array.isArray(criterion.value)) {
|
|
194
|
-
throw new exception_1.MysqlException(`Invalid ${criterion.type} condition,the condition value is not a array type,column name:${criterion.key.toString()}`);
|
|
195
|
-
}
|
|
196
|
-
if (!criterion.value.length) {
|
|
197
|
-
throw new exception_1.MysqlException(`Invalid ${criterion.type} condition,the condition value cannot be an empty array,column name:${criterion.key.toString()}`);
|
|
198
|
-
}
|
|
199
|
-
continue;
|
|
200
|
-
}
|
|
201
|
-
if (criterion.type === 'between') {
|
|
202
|
-
if (!Array.isArray(criterion.value)) {
|
|
203
|
-
throw new exception_1.MysqlException(`Invalid between condition,the condition value is not an array type,column name:${criterion.key.toString()}, value:${criterion.value}`);
|
|
204
|
-
}
|
|
205
|
-
if (criterion.value.length !== 2) {
|
|
206
|
-
throw new exception_1.MysqlException(`Invalid between condition,the condition value must be an array of length 2,column: ${criterion.key.toString()},value:${criterion.value.length}`);
|
|
207
|
-
}
|
|
208
|
-
continue;
|
|
209
|
-
}
|
|
210
|
-
if (typeof criterion.value !== 'number' &&
|
|
211
|
-
typeof criterion.value !== 'string' &&
|
|
212
|
-
typeof criterion.value !== 'boolean' &&
|
|
213
|
-
!(criterion.value instanceof Date)) {
|
|
214
|
-
throw new exception_1.MysqlException('The value of the query criteria is invalid,only number,string,boolean and Date are supported,' +
|
|
215
|
-
`column name : ${criterion.key.toString()},value : ${criterion.value} .`);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* 生成查询数据
|
|
221
|
-
*/
|
|
222
|
-
generateQuery() {
|
|
223
|
-
this.check();
|
|
224
|
-
const sqlFragments = [];
|
|
225
|
-
const values = [];
|
|
226
|
-
for (const criterion of this.criteria) {
|
|
227
|
-
// 普通的查询
|
|
228
|
-
if (criterion.key && criterion.value !== undefined) {
|
|
229
|
-
// between 特殊处理
|
|
230
|
-
if (criterion.type === 'between') {
|
|
231
|
-
sqlFragments.push('and ?? between ? and ? ');
|
|
232
|
-
values.push(criterion.key, criterion.value[0], criterion.value[1]);
|
|
233
|
-
continue;
|
|
234
|
-
}
|
|
235
|
-
// 符号
|
|
236
|
-
let sign = '';
|
|
237
|
-
if (criterion.type === 'eq') {
|
|
238
|
-
sign = '=';
|
|
239
|
-
}
|
|
240
|
-
else if (criterion.type === 'neq') {
|
|
241
|
-
sign = '!=';
|
|
242
|
-
}
|
|
243
|
-
else if (criterion.type === 'gt') {
|
|
244
|
-
sign = '>';
|
|
245
|
-
}
|
|
246
|
-
else if (criterion.type === 'gte') {
|
|
247
|
-
sign = '>=';
|
|
248
|
-
}
|
|
249
|
-
else if (criterion.type === 'lt') {
|
|
250
|
-
sign = '<';
|
|
251
|
-
}
|
|
252
|
-
else if (criterion.type === 'lte') {
|
|
253
|
-
sign = '<=';
|
|
254
|
-
}
|
|
255
|
-
else if (criterion.type === 'in') {
|
|
256
|
-
sign = 'in';
|
|
257
|
-
}
|
|
258
|
-
else if (criterion.type === 'notIn') {
|
|
259
|
-
sign = 'not in';
|
|
260
|
-
}
|
|
261
|
-
else if (criterion.type === 'like') {
|
|
262
|
-
sign = 'like';
|
|
263
|
-
}
|
|
264
|
-
else if (criterion.type === 'notLike') {
|
|
265
|
-
sign = 'not like';
|
|
266
|
-
}
|
|
267
|
-
if (sign) {
|
|
268
|
-
const keySeg = generateMysqlCriteriaKeySqlSeg(criterion.key);
|
|
269
|
-
if (criterion.type === 'in' || criterion.type === 'notIn') {
|
|
270
|
-
sqlFragments.push(`and ${keySeg.sqlSeg} ${sign} (?) `);
|
|
271
|
-
}
|
|
272
|
-
else {
|
|
273
|
-
sqlFragments.push(`and ${keySeg.sqlSeg} ${sign} ? `);
|
|
274
|
-
}
|
|
275
|
-
values.push(keySeg.value, criterion.value);
|
|
276
|
-
}
|
|
277
|
-
continue;
|
|
278
|
-
}
|
|
279
|
-
else if (criterion.key) {
|
|
280
|
-
const keySeg = generateMysqlCriteriaKeySqlSeg(criterion.key);
|
|
281
|
-
if (criterion.type === 'isNull') {
|
|
282
|
-
sqlFragments.push(`and ${keySeg.sqlSeg} is null `);
|
|
283
|
-
values.push(keySeg.value);
|
|
284
|
-
continue;
|
|
285
|
-
}
|
|
286
|
-
if (criterion.type === 'isNotNull') {
|
|
287
|
-
sqlFragments.push(`and ${keySeg.sqlSeg} is not null `);
|
|
288
|
-
values.push(keySeg.value);
|
|
289
|
-
continue;
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
// 特殊查询 or 和 and
|
|
293
|
-
else if (criterion.criteria) {
|
|
294
|
-
const query = criterion.criteria.generateQuery();
|
|
295
|
-
if (criterion.type === 'or') {
|
|
296
|
-
sqlFragments.push(`or (${query.sql}) `);
|
|
297
|
-
values.push(...query.values);
|
|
298
|
-
continue;
|
|
299
|
-
}
|
|
300
|
-
if (criterion.type === 'and') {
|
|
301
|
-
sqlFragments.push(`and (${query.sql}) `);
|
|
302
|
-
values.push(...query.values);
|
|
303
|
-
continue;
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
if (!sqlFragments.length) {
|
|
308
|
-
throw new exception_1.MysqlException('No valid query criteria have been set.');
|
|
309
|
-
}
|
|
310
|
-
let sql = sqlFragments.join('');
|
|
311
|
-
// 去除掉第一个条件的连接关键字,可能是 and 或 or
|
|
312
|
-
if (sql.startsWith('and')) {
|
|
313
|
-
sql = sql.substring(3);
|
|
314
|
-
}
|
|
315
|
-
else if (sql.startsWith('or')) {
|
|
316
|
-
sql = sql.substring(2);
|
|
317
|
-
}
|
|
318
|
-
return { sql, values };
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
exports.MysqlCriteria = MysqlCriteria;
|
|
322
|
-
function convertToCriteria(example) {
|
|
323
|
-
const criteria = new MysqlCriteria();
|
|
324
|
-
Object.entries(example).forEach(entry => {
|
|
325
|
-
const [key, value] = entry;
|
|
326
|
-
criteria.eq(key, value);
|
|
327
|
-
});
|
|
328
|
-
return criteria;
|
|
329
|
-
}
|
|
330
|
-
/**
|
|
331
|
-
* 将混合的查询条件转换成查询语句,如果最终构建的条件是空的,返回 undefined
|
|
332
|
-
* @param criteria
|
|
333
|
-
* @returns
|
|
334
|
-
*/
|
|
335
|
-
function buildQuery(criteria) {
|
|
336
|
-
if (criteria instanceof Function) {
|
|
337
|
-
const c = new MysqlCriteria();
|
|
338
|
-
criteria(c);
|
|
339
|
-
if (!c.isEmpty()) {
|
|
340
|
-
return c.generateQuery();
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
else if (criteria instanceof MysqlCriteria) {
|
|
344
|
-
if (!criteria.isEmpty()) {
|
|
345
|
-
return criteria.generateQuery();
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
else {
|
|
349
|
-
const c = convertToCriteria(criteria);
|
|
350
|
-
if (!c.isEmpty()) {
|
|
351
|
-
return c.generateQuery();
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
return undefined;
|
|
355
|
-
}
|
|
356
|
-
exports.buildQuery = buildQuery;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildQuery = exports.MysqlCriteria = void 0;
|
|
4
|
+
const exception_1 = require("../../exception");
|
|
5
|
+
/**
|
|
6
|
+
* 生成条件查询中键的sql片段,包含 sql 内容和要传递的值
|
|
7
|
+
*/
|
|
8
|
+
function generateMysqlCriteriaKeySqlSeg(key) {
|
|
9
|
+
if (Array.isArray(key)) {
|
|
10
|
+
if (key[0] === 'json_extract') {
|
|
11
|
+
return { sqlSeg: `JSON_EXTRACT(??, ${JSON.stringify(key[2])})`, value: key[1] };
|
|
12
|
+
}
|
|
13
|
+
if (key[0] === 'json_length') {
|
|
14
|
+
return { sqlSeg: `JSON_LENGTH(??)`, value: key[1] };
|
|
15
|
+
}
|
|
16
|
+
throw new exception_1.MysqlException(`Unsupported MysqlCriteriaKey type: ${key[0]}`);
|
|
17
|
+
}
|
|
18
|
+
return { sqlSeg: '??', value: key };
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* mysql 查询条件( query criterion ),默认查询条件都是并且关系(and), 部分方法会有例外,在使用的时候请注意方法说明。
|
|
22
|
+
*
|
|
23
|
+
* @param <T> 表类型
|
|
24
|
+
*/
|
|
25
|
+
class MysqlCriteria {
|
|
26
|
+
/**
|
|
27
|
+
* 条件列表.
|
|
28
|
+
*/
|
|
29
|
+
criteria = [];
|
|
30
|
+
/**
|
|
31
|
+
* 相等.
|
|
32
|
+
* @param column
|
|
33
|
+
* @param value
|
|
34
|
+
*/
|
|
35
|
+
eq(column, value) {
|
|
36
|
+
this.criteria.push({ type: 'eq', key: column, value });
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 不等于,注意不相等不能走索引,谨慎使用
|
|
41
|
+
* @param column
|
|
42
|
+
* @param value
|
|
43
|
+
*/
|
|
44
|
+
neq(column, value) {
|
|
45
|
+
this.criteria.push({ type: 'neq', key: column, value });
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* like
|
|
50
|
+
* @param column
|
|
51
|
+
* @param value
|
|
52
|
+
* @returns
|
|
53
|
+
*/
|
|
54
|
+
like(column, value) {
|
|
55
|
+
this.criteria.push({ type: 'like', key: column, value });
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* not like
|
|
60
|
+
* @param column
|
|
61
|
+
* @param value
|
|
62
|
+
* @returns
|
|
63
|
+
*/
|
|
64
|
+
notLike(column, value) {
|
|
65
|
+
this.criteria.push({ type: 'notLike', key: column, value });
|
|
66
|
+
return this;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* BETWEEN x and y
|
|
70
|
+
*/
|
|
71
|
+
between(column, min, max) {
|
|
72
|
+
this.criteria.push({ type: 'between', key: column, value: [min, max] });
|
|
73
|
+
return this;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 大于
|
|
77
|
+
* @param column
|
|
78
|
+
* @param value
|
|
79
|
+
*/
|
|
80
|
+
gt(column, value) {
|
|
81
|
+
this.criteria.push({ type: 'gt', key: column, value });
|
|
82
|
+
return this;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 大于等于
|
|
86
|
+
* @param column
|
|
87
|
+
* @param value
|
|
88
|
+
*/
|
|
89
|
+
gte(column, value) {
|
|
90
|
+
this.criteria.push({ type: 'gte', key: column, value });
|
|
91
|
+
return this;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 小于
|
|
95
|
+
* @param column
|
|
96
|
+
* @param value
|
|
97
|
+
*/
|
|
98
|
+
lt(column, value) {
|
|
99
|
+
this.criteria.push({ type: 'lt', key: column, value });
|
|
100
|
+
return this;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 小于等于
|
|
104
|
+
* @param column
|
|
105
|
+
* @param value
|
|
106
|
+
*/
|
|
107
|
+
lte(column, value) {
|
|
108
|
+
this.criteria.push({ type: 'lte', key: column, value });
|
|
109
|
+
return this;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* in 条件
|
|
113
|
+
* @param column
|
|
114
|
+
* @param values
|
|
115
|
+
*/
|
|
116
|
+
in(column, values) {
|
|
117
|
+
this.criteria.push({ type: 'in', key: column, value: values });
|
|
118
|
+
return this;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* not in 条件
|
|
122
|
+
* @param column
|
|
123
|
+
* @param values
|
|
124
|
+
*/
|
|
125
|
+
notIn(column, values) {
|
|
126
|
+
this.criteria.push({ type: 'notIn', key: column, value: values });
|
|
127
|
+
return this;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* 嵌入其它的查询条件,与现有的查询条件是或者关系.
|
|
131
|
+
* @param criteria
|
|
132
|
+
*/
|
|
133
|
+
or(orCriteria) {
|
|
134
|
+
const criteria = new MysqlCriteria();
|
|
135
|
+
orCriteria(criteria);
|
|
136
|
+
this.criteria.push({ type: 'or', criteria });
|
|
137
|
+
return this;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* 嵌入其它的查询条件,与现有的查询条件是并且关系.
|
|
141
|
+
* @param criteria
|
|
142
|
+
*/
|
|
143
|
+
and(andCriteria) {
|
|
144
|
+
const criteria = new MysqlCriteria();
|
|
145
|
+
andCriteria(criteria);
|
|
146
|
+
this.criteria.push({ type: 'and', criteria });
|
|
147
|
+
return this;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* 字段为空
|
|
151
|
+
* @param field
|
|
152
|
+
* @returns
|
|
153
|
+
*/
|
|
154
|
+
isNull(field) {
|
|
155
|
+
this.criteria.push({ type: 'isNull', key: field });
|
|
156
|
+
return this;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* 字段非空
|
|
160
|
+
* @param field
|
|
161
|
+
* @returns
|
|
162
|
+
*/
|
|
163
|
+
isNotNull(field) {
|
|
164
|
+
this.criteria.push({ type: 'isNotNull', key: field });
|
|
165
|
+
return this;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* 判定是否空,未设置条件.
|
|
169
|
+
* @returns
|
|
170
|
+
*/
|
|
171
|
+
isEmpty() {
|
|
172
|
+
return !this.criteria.length;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* 检查条件信息是否有效,在出错时能给予较详细的提示,以方便排查.
|
|
176
|
+
*/
|
|
177
|
+
check() {
|
|
178
|
+
for (const criterion of this.criteria) {
|
|
179
|
+
if (criterion.type === 'or' || criterion.type === 'and') {
|
|
180
|
+
if (!criterion.criteria) {
|
|
181
|
+
throw new exception_1.MysqlException(`${criterion.type} clause cannot be empty`);
|
|
182
|
+
}
|
|
183
|
+
criterion.criteria.check();
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (!criterion.key) {
|
|
187
|
+
throw new exception_1.MysqlException('The column name of the query criteria cannot be blank.');
|
|
188
|
+
}
|
|
189
|
+
if (criterion.type === 'isNull' || criterion.type === 'isNotNull') {
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (criterion.type === 'in' || criterion.type === 'notIn') {
|
|
193
|
+
if (!Array.isArray(criterion.value)) {
|
|
194
|
+
throw new exception_1.MysqlException(`Invalid ${criterion.type} condition,the condition value is not a array type,column name:${criterion.key.toString()}`);
|
|
195
|
+
}
|
|
196
|
+
if (!criterion.value.length) {
|
|
197
|
+
throw new exception_1.MysqlException(`Invalid ${criterion.type} condition,the condition value cannot be an empty array,column name:${criterion.key.toString()}`);
|
|
198
|
+
}
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
if (criterion.type === 'between') {
|
|
202
|
+
if (!Array.isArray(criterion.value)) {
|
|
203
|
+
throw new exception_1.MysqlException(`Invalid between condition,the condition value is not an array type,column name:${criterion.key.toString()}, value:${criterion.value}`);
|
|
204
|
+
}
|
|
205
|
+
if (criterion.value.length !== 2) {
|
|
206
|
+
throw new exception_1.MysqlException(`Invalid between condition,the condition value must be an array of length 2,column: ${criterion.key.toString()},value:${criterion.value.length}`);
|
|
207
|
+
}
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
if (typeof criterion.value !== 'number' &&
|
|
211
|
+
typeof criterion.value !== 'string' &&
|
|
212
|
+
typeof criterion.value !== 'boolean' &&
|
|
213
|
+
!(criterion.value instanceof Date)) {
|
|
214
|
+
throw new exception_1.MysqlException('The value of the query criteria is invalid,only number,string,boolean and Date are supported,' +
|
|
215
|
+
`column name : ${criterion.key.toString()},value : ${criterion.value} .`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* 生成查询数据
|
|
221
|
+
*/
|
|
222
|
+
generateQuery() {
|
|
223
|
+
this.check();
|
|
224
|
+
const sqlFragments = [];
|
|
225
|
+
const values = [];
|
|
226
|
+
for (const criterion of this.criteria) {
|
|
227
|
+
// 普通的查询
|
|
228
|
+
if (criterion.key && criterion.value !== undefined) {
|
|
229
|
+
// between 特殊处理
|
|
230
|
+
if (criterion.type === 'between') {
|
|
231
|
+
sqlFragments.push('and ?? between ? and ? ');
|
|
232
|
+
values.push(criterion.key, criterion.value[0], criterion.value[1]);
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
// 符号
|
|
236
|
+
let sign = '';
|
|
237
|
+
if (criterion.type === 'eq') {
|
|
238
|
+
sign = '=';
|
|
239
|
+
}
|
|
240
|
+
else if (criterion.type === 'neq') {
|
|
241
|
+
sign = '!=';
|
|
242
|
+
}
|
|
243
|
+
else if (criterion.type === 'gt') {
|
|
244
|
+
sign = '>';
|
|
245
|
+
}
|
|
246
|
+
else if (criterion.type === 'gte') {
|
|
247
|
+
sign = '>=';
|
|
248
|
+
}
|
|
249
|
+
else if (criterion.type === 'lt') {
|
|
250
|
+
sign = '<';
|
|
251
|
+
}
|
|
252
|
+
else if (criterion.type === 'lte') {
|
|
253
|
+
sign = '<=';
|
|
254
|
+
}
|
|
255
|
+
else if (criterion.type === 'in') {
|
|
256
|
+
sign = 'in';
|
|
257
|
+
}
|
|
258
|
+
else if (criterion.type === 'notIn') {
|
|
259
|
+
sign = 'not in';
|
|
260
|
+
}
|
|
261
|
+
else if (criterion.type === 'like') {
|
|
262
|
+
sign = 'like';
|
|
263
|
+
}
|
|
264
|
+
else if (criterion.type === 'notLike') {
|
|
265
|
+
sign = 'not like';
|
|
266
|
+
}
|
|
267
|
+
if (sign) {
|
|
268
|
+
const keySeg = generateMysqlCriteriaKeySqlSeg(criterion.key);
|
|
269
|
+
if (criterion.type === 'in' || criterion.type === 'notIn') {
|
|
270
|
+
sqlFragments.push(`and ${keySeg.sqlSeg} ${sign} (?) `);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
sqlFragments.push(`and ${keySeg.sqlSeg} ${sign} ? `);
|
|
274
|
+
}
|
|
275
|
+
values.push(keySeg.value, criterion.value);
|
|
276
|
+
}
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
else if (criterion.key) {
|
|
280
|
+
const keySeg = generateMysqlCriteriaKeySqlSeg(criterion.key);
|
|
281
|
+
if (criterion.type === 'isNull') {
|
|
282
|
+
sqlFragments.push(`and ${keySeg.sqlSeg} is null `);
|
|
283
|
+
values.push(keySeg.value);
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
if (criterion.type === 'isNotNull') {
|
|
287
|
+
sqlFragments.push(`and ${keySeg.sqlSeg} is not null `);
|
|
288
|
+
values.push(keySeg.value);
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// 特殊查询 or 和 and
|
|
293
|
+
else if (criterion.criteria) {
|
|
294
|
+
const query = criterion.criteria.generateQuery();
|
|
295
|
+
if (criterion.type === 'or') {
|
|
296
|
+
sqlFragments.push(`or (${query.sql}) `);
|
|
297
|
+
values.push(...query.values);
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
if (criterion.type === 'and') {
|
|
301
|
+
sqlFragments.push(`and (${query.sql}) `);
|
|
302
|
+
values.push(...query.values);
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
if (!sqlFragments.length) {
|
|
308
|
+
throw new exception_1.MysqlException('No valid query criteria have been set.');
|
|
309
|
+
}
|
|
310
|
+
let sql = sqlFragments.join('');
|
|
311
|
+
// 去除掉第一个条件的连接关键字,可能是 and 或 or
|
|
312
|
+
if (sql.startsWith('and')) {
|
|
313
|
+
sql = sql.substring(3);
|
|
314
|
+
}
|
|
315
|
+
else if (sql.startsWith('or')) {
|
|
316
|
+
sql = sql.substring(2);
|
|
317
|
+
}
|
|
318
|
+
return { sql, values };
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
exports.MysqlCriteria = MysqlCriteria;
|
|
322
|
+
function convertToCriteria(example) {
|
|
323
|
+
const criteria = new MysqlCriteria();
|
|
324
|
+
Object.entries(example).forEach(entry => {
|
|
325
|
+
const [key, value] = entry;
|
|
326
|
+
criteria.eq(key, value);
|
|
327
|
+
});
|
|
328
|
+
return criteria;
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* 将混合的查询条件转换成查询语句,如果最终构建的条件是空的,返回 undefined
|
|
332
|
+
* @param criteria
|
|
333
|
+
* @returns
|
|
334
|
+
*/
|
|
335
|
+
function buildQuery(criteria) {
|
|
336
|
+
if (criteria instanceof Function) {
|
|
337
|
+
const c = new MysqlCriteria();
|
|
338
|
+
criteria(c);
|
|
339
|
+
if (!c.isEmpty()) {
|
|
340
|
+
return c.generateQuery();
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
else if (criteria instanceof MysqlCriteria) {
|
|
344
|
+
if (!criteria.isEmpty()) {
|
|
345
|
+
return criteria.generateQuery();
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
const c = convertToCriteria(criteria);
|
|
350
|
+
if (!c.isEmpty()) {
|
|
351
|
+
return c.generateQuery();
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
return undefined;
|
|
355
|
+
}
|
|
356
|
+
exports.buildQuery = buildQuery;
|