midway-fatcms 0.0.4 → 0.0.6
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.md +635 -352
- package/dist/controller/manage/CrudStandardDesignApi.d.ts +0 -2
- package/dist/controller/manage/CrudStandardDesignApi.js +11 -85
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/libs/crud-pro/CrudPro.d.ts +9 -1
- package/dist/libs/crud-pro/CrudPro.js +15 -0
- package/dist/libs/crud-pro/README.md +809 -0
- package/dist/libs/crud-pro/README_FUNC.md +193 -0
- package/dist/libs/crud-pro/exceptions.d.ts +2 -0
- package/dist/libs/crud-pro/exceptions.js +2 -0
- package/dist/libs/crud-pro/interfaces.d.ts +34 -1
- package/dist/libs/crud-pro/models/ExecuteContext.d.ts +3 -3
- package/dist/libs/crud-pro/models/ExecuteContext.js +2 -0
- package/dist/libs/crud-pro/models/RequestModel.d.ts +41 -1
- package/dist/libs/crud-pro/models/RequestModel.js +103 -39
- package/dist/libs/crud-pro/models/ResModel.d.ts +6 -4
- package/dist/libs/crud-pro/models/ServiceHub.d.ts +1 -0
- package/dist/libs/crud-pro/models/keys.d.ts +6 -1
- package/dist/libs/crud-pro/models/keys.js +5 -0
- package/dist/libs/crud-pro/services/CrudProDataTypeConvertService.d.ts +52 -0
- package/dist/libs/crud-pro/services/CrudProDataTypeConvertService.js +158 -0
- package/dist/libs/crud-pro/services/CrudProExecuteSqlService.js +20 -1
- package/dist/libs/crud-pro/services/CrudProFieldValidateService.d.ts +7 -0
- package/dist/libs/crud-pro/services/CrudProFieldValidateService.js +32 -0
- package/dist/libs/crud-pro/services/CrudProGenSqlService.d.ts +13 -0
- package/dist/libs/crud-pro/services/CrudProGenSqlService.js +44 -7
- package/dist/libs/crud-pro/services/CrudProOriginToExecuteSql.d.ts +43 -0
- package/dist/libs/crud-pro/services/CrudProOriginToExecuteSql.js +132 -1
- package/dist/libs/crud-pro/services/CrudProTableMetaService.d.ts +15 -1
- package/dist/libs/crud-pro/services/CrudProTableMetaService.js +107 -0
- package/dist/libs/crud-pro/services/CurdProServiceHub.d.ts +5 -1
- package/dist/libs/crud-pro/services/CurdProServiceHub.js +11 -0
- package/dist/libs/crud-pro/utils/DateTimeUtils.d.ts +1 -0
- package/dist/libs/crud-pro/utils/DateTimeUtils.js +3 -0
- package/dist/libs/crud-pro/utils/MixinUtils.d.ts +32 -0
- package/dist/libs/crud-pro/utils/MixinUtils.js +85 -1
- package/dist/libs/crud-pro/utils/ValidateUtils.js +1 -1
- package/dist/libs/crud-sharding/ROUTING_LOGIC.md +944 -0
- package/dist/libs/crud-sharding/ShardingConfig.d.ts +218 -0
- package/dist/libs/crud-sharding/ShardingConfig.js +32 -0
- package/dist/libs/crud-sharding/ShardingCountCache.d.ts +69 -0
- package/dist/libs/crud-sharding/ShardingCountCache.js +160 -0
- package/dist/libs/crud-sharding/ShardingCrudPro.d.ts +363 -0
- package/dist/libs/crud-sharding/ShardingCrudPro.js +699 -0
- package/dist/libs/crud-sharding/ShardingMerger.d.ts +130 -0
- package/dist/libs/crud-sharding/ShardingMerger.js +280 -0
- package/dist/libs/crud-sharding/ShardingRouter.d.ts +69 -0
- package/dist/libs/crud-sharding/ShardingRouter.js +377 -0
- package/dist/libs/crud-sharding/ShardingTableCreator.d.ts +146 -0
- package/dist/libs/crud-sharding/ShardingTableCreator.js +805 -0
- package/dist/libs/crud-sharding/ShardingUtils.d.ts +38 -0
- package/dist/libs/crud-sharding/ShardingUtils.js +77 -0
- package/dist/libs/crud-sharding/index.d.ts +45 -0
- package/dist/libs/crud-sharding/index.js +55 -0
- package/dist/models/StandardColumns.d.ts +71 -0
- package/dist/models/StandardColumns.js +28 -0
- package/dist/service/SysAppService.js +2 -2
- package/dist/service/SysConfigService.js +1 -1
- package/dist/service/SysDictDataService.js +2 -2
- package/dist/service/SysMenuService.js +1 -1
- package/dist/service/UserAccountService.d.ts +1 -1
- package/dist/service/crudstd/CrudStdService.d.ts +0 -1
- package/dist/service/crudstd/CrudStdService.js +0 -27
- package/dist/service/curd/CrudProQuick.d.ts +134 -4
- package/dist/service/curd/CrudProQuick.js +155 -3
- package/dist/service/curd/CurdMixService.d.ts +2 -1
- package/dist/service/curd/CurdMixService.js +5 -1
- package/dist/service/curd/CurdProService.d.ts +44 -2
- package/dist/service/curd/CurdProService.js +53 -1
- package/dist/service/curd/README.md +1001 -0
- package/dist/service/curd/fixSoftDelete.d.ts +14 -0
- package/dist/service/curd/fixSoftDelete.js +29 -11
- package/dist/service/flow/FlowConfigService.js +1 -1
- package/dist/service/flow/FlowInstanceCrudService.js +1 -1
- package/package.json +3 -1
- package/src/controller/gateway/AsyncTaskController.ts +1 -1
- package/src/controller/manage/CrudStandardDesignApi.ts +16 -100
- package/src/index.ts +3 -0
- package/src/libs/crud-pro/CrudPro.ts +19 -1
- package/src/libs/crud-pro/README.md +809 -0
- package/src/libs/crud-pro/README_FUNC.md +193 -0
- package/src/libs/crud-pro/exceptions.ts +2 -0
- package/src/libs/crud-pro/interfaces.ts +38 -1
- package/src/libs/crud-pro/models/ExecuteContext.ts +6 -3
- package/src/libs/crud-pro/models/RequestModel.ts +108 -44
- package/src/libs/crud-pro/models/ResModel.ts +10 -4
- package/src/libs/crud-pro/models/ServiceHub.ts +2 -0
- package/src/libs/crud-pro/models/keys.ts +5 -0
- package/src/libs/crud-pro/services/CrudProDataTypeConvertService.ts +171 -0
- package/src/libs/crud-pro/services/CrudProExecuteSqlService.ts +24 -1
- package/src/libs/crud-pro/services/CrudProFieldValidateService.ts +53 -1
- package/src/libs/crud-pro/services/CrudProGenSqlService.ts +51 -7
- package/src/libs/crud-pro/services/CrudProOriginToExecuteSql.ts +159 -2
- package/src/libs/crud-pro/services/CrudProTableMetaService.ts +139 -1
- package/src/libs/crud-pro/services/CurdProServiceHub.ts +16 -1
- package/src/libs/crud-pro/utils/DateTimeUtils.ts +3 -0
- package/src/libs/crud-pro/utils/MixinUtils.ts +97 -1
- package/src/libs/crud-pro/utils/ValidateUtils.ts +1 -1
- package/src/libs/crud-sharding/ROUTING_LOGIC.md +944 -0
- package/src/libs/crud-sharding/ShardingConfig.ts +240 -0
- package/src/libs/crud-sharding/ShardingCountCache.ts +200 -0
- package/src/libs/crud-sharding/ShardingCrudPro.ts +856 -0
- package/src/libs/crud-sharding/ShardingMerger.ts +382 -0
- package/src/libs/crud-sharding/ShardingRouter.ts +512 -0
- package/src/libs/crud-sharding/ShardingTableCreator.ts +1007 -0
- package/src/libs/crud-sharding/ShardingUtils.ts +84 -0
- package/src/libs/crud-sharding/index.ts +64 -0
- package/src/models/StandardColumns.ts +76 -0
- package/src/service/FileCenterService.ts +1 -1
- package/src/service/SysAppService.ts +2 -2
- package/src/service/SysConfigService.ts +1 -1
- package/src/service/SysDictDataService.ts +2 -2
- package/src/service/SysMenuService.ts +2 -2
- package/src/service/WorkbenchService.ts +1 -1
- package/src/service/anyapi/AnyApiService.ts +1 -1
- package/src/service/asyncTask/AsyncTaskRunnerService.ts +1 -1
- package/src/service/crudstd/CrudStdService.ts +0 -32
- package/src/service/curd/CrudProQuick.ts +164 -5
- package/src/service/curd/CurdMixService.ts +7 -2
- package/src/service/curd/CurdProService.ts +62 -3
- package/src/service/curd/README.md +1001 -0
- package/src/service/curd/fixCfgModel.ts +1 -2
- package/src/service/curd/fixSoftDelete.ts +38 -16
- package/src/service/flow/FlowConfigService.ts +1 -1
- package/src/service/flow/FlowInstanceCrudService.ts +1 -1
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 分表配置模型
|
|
3
|
+
*
|
|
4
|
+
* 支持多种分表策略:
|
|
5
|
+
* - YEAR: 按年分表,如 order_2024, order_2025
|
|
6
|
+
* - MONTH: 按月分表,如 order_202401, order_202402
|
|
7
|
+
* - DAY: 按日分表,如 order_20240101
|
|
8
|
+
* - RANGE: 按范围分表,如 user_0 ~ user_99
|
|
9
|
+
* - HASH: 按哈希分表,如 order_01 ~ order_16
|
|
10
|
+
* - CUSTOM: 自定义分表规则
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* 分表类型
|
|
14
|
+
*/
|
|
15
|
+
export declare enum ShardingType {
|
|
16
|
+
/** 按年分表:table_2024, table_2025 */
|
|
17
|
+
YEAR = "year",
|
|
18
|
+
/** 按月分表:table_202401, table_202402 */
|
|
19
|
+
MONTH = "month",
|
|
20
|
+
/** 按日分表:table_20240101 */
|
|
21
|
+
DAY = "day",
|
|
22
|
+
/** 按范围分表:table_0 ~ table_99 */
|
|
23
|
+
RANGE = "range",
|
|
24
|
+
/** 按哈希分表:table_01 ~ table_16 */
|
|
25
|
+
HASH = "hash",
|
|
26
|
+
/** 自定义分表规则 */
|
|
27
|
+
CUSTOM = "custom"
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 分表配置接口
|
|
31
|
+
*/
|
|
32
|
+
export interface IShardingConfig {
|
|
33
|
+
/**
|
|
34
|
+
* 分表类型
|
|
35
|
+
*/
|
|
36
|
+
type: ShardingType;
|
|
37
|
+
/**
|
|
38
|
+
* 基础表名
|
|
39
|
+
* 例如:t_order
|
|
40
|
+
*/
|
|
41
|
+
baseTable: string;
|
|
42
|
+
/**
|
|
43
|
+
* 分表数量
|
|
44
|
+
* 用于 RANGE 和 HASH 类型
|
|
45
|
+
* 默认值:RANGE 为 10,HASH 为 16
|
|
46
|
+
*/
|
|
47
|
+
tableCount?: number;
|
|
48
|
+
/**
|
|
49
|
+
* 分表字段
|
|
50
|
+
* 用于 RANGE 和 HASH 类型,根据字段值计算分表
|
|
51
|
+
* 例如:user_id, order_id
|
|
52
|
+
*/
|
|
53
|
+
shardingColumn?: string;
|
|
54
|
+
/**
|
|
55
|
+
* 时间字段
|
|
56
|
+
* 用于时间分表类型(YEAR/MONTH/DAY),使用时间分表时必填
|
|
57
|
+
*/
|
|
58
|
+
timeColumn?: string;
|
|
59
|
+
/**
|
|
60
|
+
* 自定义分表路由函数
|
|
61
|
+
* 用于 CUSTOM 类型
|
|
62
|
+
* @param context 分表路由上下文
|
|
63
|
+
* @returns 单个表名或表名数组
|
|
64
|
+
*/
|
|
65
|
+
customRouter?: IShardingRouterFunc;
|
|
66
|
+
/**
|
|
67
|
+
* 分表后缀格式化函数
|
|
68
|
+
* 可自定义后缀格式
|
|
69
|
+
* @param suffix 原始后缀
|
|
70
|
+
* @returns 格式化后的后缀
|
|
71
|
+
*/
|
|
72
|
+
suffixFormatter?: (suffix: string) => string;
|
|
73
|
+
/**
|
|
74
|
+
* 最近分表数量
|
|
75
|
+
*
|
|
76
|
+
* 当查询无法确定具体时间范围时,返回最近N个分表。
|
|
77
|
+
* 适用于时间分表类型(YEAR/MONTH/DAY)。
|
|
78
|
+
*
|
|
79
|
+
* 默认值:
|
|
80
|
+
* - YEAR: 3(最近3年)
|
|
81
|
+
* - MONTH: 12(最近12个月)
|
|
82
|
+
* - DAY: 7(最近7天)
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* // 查询最近6个月的订单
|
|
86
|
+
* const config: IShardingConfig = {
|
|
87
|
+
* type: ShardingType.MONTH,
|
|
88
|
+
* baseTable: 't_order',
|
|
89
|
+
* recentTableCount: 6,
|
|
90
|
+
* };
|
|
91
|
+
*/
|
|
92
|
+
recentTableCount?: number;
|
|
93
|
+
/**
|
|
94
|
+
* 是否自动创建分表
|
|
95
|
+
*
|
|
96
|
+
* 当插入/更新数据时分表不存在,是否自动根据基表结构创建分表。
|
|
97
|
+
* 默认值:false(不自动创建,抛出异常)
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* const config: IShardingConfig = {
|
|
101
|
+
* type: ShardingType.MONTH,
|
|
102
|
+
* baseTable: 't_order',
|
|
103
|
+
* timeColumn: 'created_at',
|
|
104
|
+
* autoCreateTable: true, // 自动创建分表
|
|
105
|
+
* };
|
|
106
|
+
*/
|
|
107
|
+
autoCreateTable?: boolean;
|
|
108
|
+
/**
|
|
109
|
+
* 分表创建选项
|
|
110
|
+
*
|
|
111
|
+
* 当 autoCreateTable 为 true 时,传递给 ShardingTableCreator 的选项。
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* const config: IShardingConfig = {
|
|
115
|
+
* type: ShardingType.MONTH,
|
|
116
|
+
* baseTable: 't_order',
|
|
117
|
+
* autoCreateTable: true,
|
|
118
|
+
* tableCreateOptions: {
|
|
119
|
+
* copyIndexes: true,
|
|
120
|
+
* tableOptions: 'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4',
|
|
121
|
+
* },
|
|
122
|
+
* };
|
|
123
|
+
*/
|
|
124
|
+
tableCreateOptions?: IShardingTableCreateOptions;
|
|
125
|
+
/**
|
|
126
|
+
* COUNT 查询缓存配置
|
|
127
|
+
*
|
|
128
|
+
* 仅对时间分表(YEAR/MONTH/DAY)生效。历史表启用缓存,当前表实时查询。
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* const config: IShardingConfig = {
|
|
132
|
+
* type: ShardingType.MONTH,
|
|
133
|
+
* baseTable: 't_order',
|
|
134
|
+
* timeColumn: 'created_at',
|
|
135
|
+
* countCache: {
|
|
136
|
+
* ttlSeconds: 300, // 缓存5分钟
|
|
137
|
+
* maxSize: 1000, // 最多缓存1000个表的COUNT
|
|
138
|
+
* },
|
|
139
|
+
* };
|
|
140
|
+
*/
|
|
141
|
+
countCache?: IShardingCountCacheConfig;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* COUNT 缓存配置
|
|
145
|
+
*/
|
|
146
|
+
export interface IShardingCountCacheConfig {
|
|
147
|
+
/**
|
|
148
|
+
* 缓存有效期(秒)
|
|
149
|
+
* 默认值:300(5分钟)
|
|
150
|
+
*/
|
|
151
|
+
ttlSeconds?: number;
|
|
152
|
+
/**
|
|
153
|
+
* 缓存最大条目数(LRU淘汰)
|
|
154
|
+
* 默认值:1000
|
|
155
|
+
*/
|
|
156
|
+
maxSize?: number;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* 分表创建选项
|
|
160
|
+
*/
|
|
161
|
+
export interface IShardingTableCreateOptions {
|
|
162
|
+
/** 是否复制索引(默认 false) */
|
|
163
|
+
copyIndexes?: boolean;
|
|
164
|
+
/** 是否忽略外键约束(默认 true) */
|
|
165
|
+
ignoreForeignKeys?: boolean;
|
|
166
|
+
/** 表选项(如 MySQL 的 ENGINE、CHARSET) */
|
|
167
|
+
tableOptions?: string;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* 分表创建结果
|
|
171
|
+
*/
|
|
172
|
+
export interface IShardingTableCreateResult {
|
|
173
|
+
/** 是否成功 */
|
|
174
|
+
success: boolean;
|
|
175
|
+
/** 表名 */
|
|
176
|
+
tableName: string;
|
|
177
|
+
/** 建表 SQL(用于调试) */
|
|
178
|
+
createSql?: string;
|
|
179
|
+
/** 错误信息 */
|
|
180
|
+
error?: Error;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* 分表路由函数类型
|
|
184
|
+
* @param context 分表路由上下文
|
|
185
|
+
* @returns 单个表名或表名数组(查询时可能返回多个)
|
|
186
|
+
*/
|
|
187
|
+
export declare type IShardingRouterFunc = (context: IShardingRouterContext) => string | string[];
|
|
188
|
+
/**
|
|
189
|
+
* 分表路由上下文
|
|
190
|
+
*/
|
|
191
|
+
export interface IShardingRouterContext {
|
|
192
|
+
/**
|
|
193
|
+
* 分表配置
|
|
194
|
+
*/
|
|
195
|
+
config: IShardingConfig;
|
|
196
|
+
/**
|
|
197
|
+
* 操作数据
|
|
198
|
+
* 用于 INSERT 操作时确定分表(resolveForInsert)
|
|
199
|
+
*/
|
|
200
|
+
data?: Record<string, any>;
|
|
201
|
+
/**
|
|
202
|
+
* 查询条件
|
|
203
|
+
* 用于 UPDATE/DELETE/QUERY 等操作时确定分表(resolveForCondition)
|
|
204
|
+
*/
|
|
205
|
+
condition?: Record<string, any>;
|
|
206
|
+
/**
|
|
207
|
+
* SQL 简单名称
|
|
208
|
+
* 用于判断具体的查询类型
|
|
209
|
+
*/
|
|
210
|
+
sqlSimpleName?: string;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* 时间范围
|
|
214
|
+
*/
|
|
215
|
+
export interface IShardingTimeRange {
|
|
216
|
+
start: Date;
|
|
217
|
+
end: Date;
|
|
218
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 分表配置模型
|
|
4
|
+
*
|
|
5
|
+
* 支持多种分表策略:
|
|
6
|
+
* - YEAR: 按年分表,如 order_2024, order_2025
|
|
7
|
+
* - MONTH: 按月分表,如 order_202401, order_202402
|
|
8
|
+
* - DAY: 按日分表,如 order_20240101
|
|
9
|
+
* - RANGE: 按范围分表,如 user_0 ~ user_99
|
|
10
|
+
* - HASH: 按哈希分表,如 order_01 ~ order_16
|
|
11
|
+
* - CUSTOM: 自定义分表规则
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.ShardingType = void 0;
|
|
15
|
+
/**
|
|
16
|
+
* 分表类型
|
|
17
|
+
*/
|
|
18
|
+
var ShardingType;
|
|
19
|
+
(function (ShardingType) {
|
|
20
|
+
/** 按年分表:table_2024, table_2025 */
|
|
21
|
+
ShardingType["YEAR"] = "year";
|
|
22
|
+
/** 按月分表:table_202401, table_202402 */
|
|
23
|
+
ShardingType["MONTH"] = "month";
|
|
24
|
+
/** 按日分表:table_20240101 */
|
|
25
|
+
ShardingType["DAY"] = "day";
|
|
26
|
+
/** 按范围分表:table_0 ~ table_99 */
|
|
27
|
+
ShardingType["RANGE"] = "range";
|
|
28
|
+
/** 按哈希分表:table_01 ~ table_16 */
|
|
29
|
+
ShardingType["HASH"] = "hash";
|
|
30
|
+
/** 自定义分表规则 */
|
|
31
|
+
ShardingType["CUSTOM"] = "custom";
|
|
32
|
+
})(ShardingType = exports.ShardingType || (exports.ShardingType = {}));
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { ShardingType } from './ShardingConfig';
|
|
2
|
+
/**
|
|
3
|
+
* COUNT 查询缓存管理器
|
|
4
|
+
*
|
|
5
|
+
* 特性:
|
|
6
|
+
* 1. 仅对历史时间分表启用缓存,当前时间分表实时查询
|
|
7
|
+
* 2. 基于 LRU 算法淘汰旧缓存
|
|
8
|
+
* 3. 支持 TTL(生存时间)自动过期
|
|
9
|
+
* 4. 缓存键包含表名和查询条件哈希
|
|
10
|
+
*/
|
|
11
|
+
export declare class ShardingCountCache {
|
|
12
|
+
private readonly cache;
|
|
13
|
+
private readonly ttlMs;
|
|
14
|
+
private readonly maxSize;
|
|
15
|
+
private readonly shardingType;
|
|
16
|
+
private readonly baseTable;
|
|
17
|
+
constructor(shardingType: ShardingType | undefined, baseTable: string, ttlSeconds?: number, maxSize?: number);
|
|
18
|
+
/**
|
|
19
|
+
* 获取缓存的 COUNT 值
|
|
20
|
+
*
|
|
21
|
+
* @param tableName 表名
|
|
22
|
+
* @param conditionHash 查询条件哈希(用于区分不同条件的 COUNT)
|
|
23
|
+
* @returns 缓存值(未命中或过期返回 undefined)
|
|
24
|
+
*/
|
|
25
|
+
get(tableName: string, conditionHash: string): number | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* 设置 COUNT 缓存
|
|
28
|
+
*
|
|
29
|
+
* @param tableName 表名
|
|
30
|
+
* @param conditionHash 查询条件哈希
|
|
31
|
+
* @param count COUNT 值
|
|
32
|
+
*/
|
|
33
|
+
set(tableName: string, conditionHash: string, count: number): void;
|
|
34
|
+
/**
|
|
35
|
+
* 清空缓存
|
|
36
|
+
*/
|
|
37
|
+
clear(): void;
|
|
38
|
+
/**
|
|
39
|
+
* 获取缓存统计信息
|
|
40
|
+
*/
|
|
41
|
+
getStats(): {
|
|
42
|
+
size: number;
|
|
43
|
+
maxSize: number;
|
|
44
|
+
ttlSeconds: number;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* 判断是否为时间分表类型
|
|
48
|
+
*/
|
|
49
|
+
private isTimeSharding;
|
|
50
|
+
/**
|
|
51
|
+
* 判断是否为当前时间周期的表
|
|
52
|
+
*
|
|
53
|
+
* 当前表不启用缓存,确保数据实时性
|
|
54
|
+
*/
|
|
55
|
+
private checkIsCurrentTable;
|
|
56
|
+
/**
|
|
57
|
+
* 构建缓存键
|
|
58
|
+
*/
|
|
59
|
+
private buildCacheKey;
|
|
60
|
+
/**
|
|
61
|
+
* LRU 淘汰:当缓存满时淘汰最久未使用的条目
|
|
62
|
+
*/
|
|
63
|
+
private evictIfNeeded;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 计算查询条件的简单哈希
|
|
67
|
+
* 用于生成缓存键
|
|
68
|
+
*/
|
|
69
|
+
export declare function shardingHashCondition(condition: Record<string, any> | undefined): string;
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.shardingHashCondition = exports.ShardingCountCache = void 0;
|
|
4
|
+
const ShardingConfig_1 = require("./ShardingConfig");
|
|
5
|
+
const ShardingUtils_1 = require("./ShardingUtils");
|
|
6
|
+
/**
|
|
7
|
+
* COUNT 查询缓存管理器
|
|
8
|
+
*
|
|
9
|
+
* 特性:
|
|
10
|
+
* 1. 仅对历史时间分表启用缓存,当前时间分表实时查询
|
|
11
|
+
* 2. 基于 LRU 算法淘汰旧缓存
|
|
12
|
+
* 3. 支持 TTL(生存时间)自动过期
|
|
13
|
+
* 4. 缓存键包含表名和查询条件哈希
|
|
14
|
+
*/
|
|
15
|
+
class ShardingCountCache {
|
|
16
|
+
constructor(shardingType, baseTable, ttlSeconds = 300, maxSize = 1000) {
|
|
17
|
+
this.cache = new Map();
|
|
18
|
+
this.shardingType = shardingType;
|
|
19
|
+
this.baseTable = baseTable;
|
|
20
|
+
this.ttlMs = ttlSeconds * 1000;
|
|
21
|
+
this.maxSize = maxSize;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 获取缓存的 COUNT 值
|
|
25
|
+
*
|
|
26
|
+
* @param tableName 表名
|
|
27
|
+
* @param conditionHash 查询条件哈希(用于区分不同条件的 COUNT)
|
|
28
|
+
* @returns 缓存值(未命中或过期返回 undefined)
|
|
29
|
+
*/
|
|
30
|
+
get(tableName, conditionHash) {
|
|
31
|
+
// 非时间分表不启用缓存
|
|
32
|
+
if (!this.isTimeSharding()) {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
// 当前表不启用缓存
|
|
36
|
+
if (this.checkIsCurrentTable(tableName)) {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
const key = this.buildCacheKey(tableName, conditionHash);
|
|
40
|
+
const entry = this.cache.get(key);
|
|
41
|
+
if (!entry) {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
// 检查是否过期
|
|
45
|
+
const now = Date.now();
|
|
46
|
+
if (now - entry.cachedAt > this.ttlMs) {
|
|
47
|
+
this.cache.delete(key);
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
// 更新访问顺序(LRU:移到末尾表示最近使用)
|
|
51
|
+
this.cache.delete(key);
|
|
52
|
+
this.cache.set(key, entry);
|
|
53
|
+
return entry.count;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 设置 COUNT 缓存
|
|
57
|
+
*
|
|
58
|
+
* @param tableName 表名
|
|
59
|
+
* @param conditionHash 查询条件哈希
|
|
60
|
+
* @param count COUNT 值
|
|
61
|
+
*/
|
|
62
|
+
set(tableName, conditionHash, count) {
|
|
63
|
+
// 非时间分表不启用缓存
|
|
64
|
+
if (!this.isTimeSharding()) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// 当前表不缓存
|
|
68
|
+
if (this.checkIsCurrentTable(tableName)) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
// 执行 LRU 淘汰
|
|
72
|
+
this.evictIfNeeded();
|
|
73
|
+
const key = this.buildCacheKey(tableName, conditionHash);
|
|
74
|
+
const entry = {
|
|
75
|
+
count,
|
|
76
|
+
cachedAt: Date.now(),
|
|
77
|
+
key,
|
|
78
|
+
};
|
|
79
|
+
this.cache.set(key, entry);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 清空缓存
|
|
83
|
+
*/
|
|
84
|
+
clear() {
|
|
85
|
+
this.cache.clear();
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* 获取缓存统计信息
|
|
89
|
+
*/
|
|
90
|
+
getStats() {
|
|
91
|
+
return {
|
|
92
|
+
size: this.cache.size,
|
|
93
|
+
maxSize: this.maxSize,
|
|
94
|
+
ttlSeconds: this.ttlMs / 1000,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 判断是否为时间分表类型
|
|
99
|
+
*/
|
|
100
|
+
isTimeSharding() {
|
|
101
|
+
return (this.shardingType === ShardingConfig_1.ShardingType.YEAR ||
|
|
102
|
+
this.shardingType === ShardingConfig_1.ShardingType.MONTH ||
|
|
103
|
+
this.shardingType === ShardingConfig_1.ShardingType.DAY);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 判断是否为当前时间周期的表
|
|
107
|
+
*
|
|
108
|
+
* 当前表不启用缓存,确保数据实时性
|
|
109
|
+
*/
|
|
110
|
+
checkIsCurrentTable(tableName) {
|
|
111
|
+
return (0, ShardingUtils_1.isCurrentTable)(tableName, this.baseTable, this.shardingType);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 构建缓存键
|
|
115
|
+
*/
|
|
116
|
+
buildCacheKey(tableName, conditionHash) {
|
|
117
|
+
return `${tableName}#${conditionHash}`;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* LRU 淘汰:当缓存满时淘汰最久未使用的条目
|
|
121
|
+
*/
|
|
122
|
+
evictIfNeeded() {
|
|
123
|
+
if (this.cache.size >= this.maxSize) {
|
|
124
|
+
// 删除最久未使用的(Map 的第一个元素)
|
|
125
|
+
const firstKey = this.cache.keys().next().value;
|
|
126
|
+
if (firstKey) {
|
|
127
|
+
this.cache.delete(firstKey);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
exports.ShardingCountCache = ShardingCountCache;
|
|
133
|
+
/**
|
|
134
|
+
* 计算查询条件的简单哈希
|
|
135
|
+
* 用于生成缓存键
|
|
136
|
+
*/
|
|
137
|
+
function shardingHashCondition(condition) {
|
|
138
|
+
if (!condition || Object.keys(condition).length === 0) {
|
|
139
|
+
return '*';
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
// 排序键后序列化,确保相同条件生成相同哈希
|
|
143
|
+
const sortedKeys = Object.keys(condition).sort();
|
|
144
|
+
const sortedObj = {};
|
|
145
|
+
for (const key of sortedKeys) {
|
|
146
|
+
sortedObj[key] = condition[key];
|
|
147
|
+
}
|
|
148
|
+
const str = JSON.stringify(sortedObj);
|
|
149
|
+
// 简单的哈希算法(djb2)
|
|
150
|
+
let hash = 5381;
|
|
151
|
+
for (let i = 0; i < str.length; i++) {
|
|
152
|
+
hash = ((hash << 5) + hash) + str.charCodeAt(i);
|
|
153
|
+
}
|
|
154
|
+
return (hash >>> 0).toString(36); // 转为无符号整数,再用36进制压缩
|
|
155
|
+
}
|
|
156
|
+
catch (_a) {
|
|
157
|
+
return '*';
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
exports.shardingHashCondition = shardingHashCondition;
|