@yanit/jsondb 0.1.1
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 +903 -0
- package/dist/bin/cli-export.d.ts +7 -0
- package/dist/bin/cli-export.d.ts.map +1 -0
- package/dist/bin/cli-export.js +318 -0
- package/dist/bin/cli-export.js.map +1 -0
- package/dist/bin/cli-import.d.ts +7 -0
- package/dist/bin/cli-import.d.ts.map +1 -0
- package/dist/bin/cli-import.js +298 -0
- package/dist/bin/cli-import.js.map +1 -0
- package/dist/bin/server.d.ts +7 -0
- package/dist/bin/server.d.ts.map +1 -0
- package/dist/bin/server.js +92 -0
- package/dist/bin/server.js.map +1 -0
- package/dist/examples/sql-example.d.ts +7 -0
- package/dist/examples/sql-example.d.ts.map +1 -0
- package/dist/examples/sql-example.js +131 -0
- package/dist/examples/sql-example.js.map +1 -0
- package/dist/src/BulkOp.d.ts +74 -0
- package/dist/src/BulkOp.d.ts.map +1 -0
- package/dist/src/BulkOp.js +143 -0
- package/dist/src/BulkOp.js.map +1 -0
- package/dist/src/Collection.d.ts +232 -0
- package/dist/src/Collection.d.ts.map +1 -0
- package/dist/src/Collection.js +705 -0
- package/dist/src/Collection.js.map +1 -0
- package/dist/src/Cursor.d.ts +94 -0
- package/dist/src/Cursor.d.ts.map +1 -0
- package/dist/src/Cursor.js +259 -0
- package/dist/src/Cursor.js.map +1 -0
- package/dist/src/Database.d.ts +98 -0
- package/dist/src/Database.d.ts.map +1 -0
- package/dist/src/Database.js +198 -0
- package/dist/src/Database.js.map +1 -0
- package/dist/src/Operators.d.ts +73 -0
- package/dist/src/Operators.d.ts.map +1 -0
- package/dist/src/Operators.js +339 -0
- package/dist/src/Operators.js.map +1 -0
- package/dist/src/QueryCache.d.ts +87 -0
- package/dist/src/QueryCache.d.ts.map +1 -0
- package/dist/src/QueryCache.js +155 -0
- package/dist/src/QueryCache.js.map +1 -0
- package/dist/src/SQLExecutor.d.ts +60 -0
- package/dist/src/SQLExecutor.d.ts.map +1 -0
- package/dist/src/SQLExecutor.js +317 -0
- package/dist/src/SQLExecutor.js.map +1 -0
- package/dist/src/SQLParser.d.ts +181 -0
- package/dist/src/SQLParser.d.ts.map +1 -0
- package/dist/src/SQLParser.js +640 -0
- package/dist/src/SQLParser.js.map +1 -0
- package/dist/src/Schema.d.ts +92 -0
- package/dist/src/Schema.d.ts.map +1 -0
- package/dist/src/Schema.js +253 -0
- package/dist/src/Schema.js.map +1 -0
- package/dist/src/Transaction.d.ts +118 -0
- package/dist/src/Transaction.d.ts.map +1 -0
- package/dist/src/Transaction.js +233 -0
- package/dist/src/Transaction.js.map +1 -0
- package/dist/src/Utils.d.ts +68 -0
- package/dist/src/Utils.d.ts.map +1 -0
- package/dist/src/Utils.js +187 -0
- package/dist/src/Utils.js.map +1 -0
- package/dist/src/errors.d.ts +58 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +85 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/index.d.ts +39 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +44 -0
- package/dist/src/index.js.map +1 -0
- package/dist/test/basic.test.d.ts +5 -0
- package/dist/test/basic.test.d.ts.map +1 -0
- package/dist/test/basic.test.js +283 -0
- package/dist/test/basic.test.js.map +1 -0
- package/dist/test/index.test.d.ts +5 -0
- package/dist/test/index.test.d.ts.map +1 -0
- package/dist/test/index.test.js +126 -0
- package/dist/test/index.test.js.map +1 -0
- package/dist/test/jsonb.test.d.ts +5 -0
- package/dist/test/jsonb.test.d.ts.map +1 -0
- package/dist/test/jsonb.test.js +165 -0
- package/dist/test/jsonb.test.js.map +1 -0
- package/dist/test/optimization.test.d.ts +6 -0
- package/dist/test/optimization.test.d.ts.map +1 -0
- package/dist/test/optimization.test.js +196 -0
- package/dist/test/optimization.test.js.map +1 -0
- package/dist/test/schema.test.d.ts +5 -0
- package/dist/test/schema.test.d.ts.map +1 -0
- package/dist/test/schema.test.js +197 -0
- package/dist/test/schema.test.js.map +1 -0
- package/dist/test/sql.test.d.ts +7 -0
- package/dist/test/sql.test.d.ts.map +1 -0
- package/dist/test/sql.test.js +21 -0
- package/dist/test/sql.test.js.map +1 -0
- package/package.json +73 -0
- package/src/BulkOp.js +181 -0
- package/src/BulkOp.ts +191 -0
- package/src/Collection.js +843 -0
- package/src/Collection.ts +896 -0
- package/src/Cursor.js +315 -0
- package/src/Cursor.ts +319 -0
- package/src/Database.js +244 -0
- package/src/Database.ts +268 -0
- package/src/Operators.js +382 -0
- package/src/Operators.ts +375 -0
- package/src/QueryCache.js +190 -0
- package/src/QueryCache.ts +208 -0
- package/src/SQLExecutor.ts +391 -0
- package/src/SQLParser.ts +814 -0
- package/src/Schema.js +292 -0
- package/src/Schema.ts +317 -0
- package/src/Transaction.js +291 -0
- package/src/Transaction.ts +313 -0
- package/src/Utils.js +205 -0
- package/src/Utils.ts +205 -0
- package/src/errors.js +93 -0
- package/src/errors.ts +93 -0
- package/src/index.js +90 -0
- package/src/index.ts +106 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 查询结果缓存模块
|
|
3
|
+
* 缓存相同查询的结果,提升重复查询性能
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 缓存条目接口
|
|
7
|
+
*/
|
|
8
|
+
interface CacheEntry {
|
|
9
|
+
data: unknown;
|
|
10
|
+
createdAt: number;
|
|
11
|
+
expiresAt: number;
|
|
12
|
+
lastAccessed: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 查询缓存选项
|
|
16
|
+
*/
|
|
17
|
+
interface QueryCacheOptions {
|
|
18
|
+
maxSize?: number;
|
|
19
|
+
ttl?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 查询缓存类
|
|
23
|
+
*/
|
|
24
|
+
export declare class QueryCache {
|
|
25
|
+
maxSize: number;
|
|
26
|
+
ttl: number;
|
|
27
|
+
cache: Map<string, CacheEntry>;
|
|
28
|
+
hits: number;
|
|
29
|
+
misses: number;
|
|
30
|
+
constructor(options?: QueryCacheOptions);
|
|
31
|
+
/**
|
|
32
|
+
* 生成查询缓存键
|
|
33
|
+
*/
|
|
34
|
+
generateKey(collection: string, query: Record<string, unknown>, options?: Record<string, unknown>): string;
|
|
35
|
+
/**
|
|
36
|
+
* 获取缓存
|
|
37
|
+
*/
|
|
38
|
+
get(key: string): unknown | null;
|
|
39
|
+
/**
|
|
40
|
+
* 设置缓存
|
|
41
|
+
*/
|
|
42
|
+
set(key: string, data: unknown, ttl?: number): void;
|
|
43
|
+
/**
|
|
44
|
+
* 删除缓存
|
|
45
|
+
*/
|
|
46
|
+
delete(key: string): void;
|
|
47
|
+
/**
|
|
48
|
+
* 清空缓存
|
|
49
|
+
*/
|
|
50
|
+
clear(): void;
|
|
51
|
+
/**
|
|
52
|
+
* 删除与集合相关的所有缓存
|
|
53
|
+
*/
|
|
54
|
+
invalidateCollection(collection: string): void;
|
|
55
|
+
/**
|
|
56
|
+
* 删除最久未使用的条目(LRU)
|
|
57
|
+
*/
|
|
58
|
+
private _evictOldest;
|
|
59
|
+
/**
|
|
60
|
+
* 获取缓存统计
|
|
61
|
+
*/
|
|
62
|
+
getStats(): {
|
|
63
|
+
size: number;
|
|
64
|
+
maxSize: number;
|
|
65
|
+
hits: number;
|
|
66
|
+
misses: number;
|
|
67
|
+
hitRate: string;
|
|
68
|
+
ttl: number;
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 全局查询缓存实例
|
|
73
|
+
*/
|
|
74
|
+
export declare const globalQueryCache: QueryCache;
|
|
75
|
+
/**
|
|
76
|
+
* 缓存查询装饰器
|
|
77
|
+
*/
|
|
78
|
+
export declare function cacheQuery(queryFn: (this: unknown, collection: {
|
|
79
|
+
name: string;
|
|
80
|
+
}, query: Record<string, unknown>, queryOptions: Record<string, unknown>) => Promise<unknown>, options?: {
|
|
81
|
+
cache?: QueryCache;
|
|
82
|
+
ttl?: number;
|
|
83
|
+
}): (this: unknown, collection: {
|
|
84
|
+
name: string;
|
|
85
|
+
}, query: Record<string, unknown>, queryOptions: Record<string, unknown>) => Promise<any>;
|
|
86
|
+
export {};
|
|
87
|
+
//# sourceMappingURL=QueryCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryCache.d.ts","sourceRoot":"","sources":["../../src/QueryCache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,UAAU,UAAU;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,UAAU,iBAAiB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;gBAEH,OAAO,GAAE,iBAAsB;IAQ3C;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,MAAM;IAe9G;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAsBhC;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAcnD;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIzB;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAQ9C;;OAEG;IACH,OAAO,CAAC,YAAY;IAgBpB;;OAEG;IACH,QAAQ,IAAI;QACV,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;KACb;CAWF;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,YAG3B,CAAC;AAEH;;GAEG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,EACjJ,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,UAAU,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,IAK5B,MAAM,OAAO,EAAE,YAAY;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,kBAiBzI"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 查询结果缓存模块
|
|
3
|
+
* 缓存相同查询的结果,提升重复查询性能
|
|
4
|
+
*/
|
|
5
|
+
import { createHash } from 'crypto';
|
|
6
|
+
/**
|
|
7
|
+
* 查询缓存类
|
|
8
|
+
*/
|
|
9
|
+
export class QueryCache {
|
|
10
|
+
maxSize;
|
|
11
|
+
ttl;
|
|
12
|
+
cache;
|
|
13
|
+
hits;
|
|
14
|
+
misses;
|
|
15
|
+
constructor(options = {}) {
|
|
16
|
+
this.maxSize = options.maxSize || 1000;
|
|
17
|
+
this.ttl = options.ttl || 60000;
|
|
18
|
+
this.cache = new Map();
|
|
19
|
+
this.hits = 0;
|
|
20
|
+
this.misses = 0;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 生成查询缓存键
|
|
24
|
+
*/
|
|
25
|
+
generateKey(collection, query, options = {}) {
|
|
26
|
+
const keyData = JSON.stringify({
|
|
27
|
+
collection,
|
|
28
|
+
query,
|
|
29
|
+
options: {
|
|
30
|
+
sort: options.sort,
|
|
31
|
+
limit: options.limit,
|
|
32
|
+
skip: options.skip,
|
|
33
|
+
projection: options.projection
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
return createHash('sha256').update(keyData).digest('hex');
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 获取缓存
|
|
40
|
+
*/
|
|
41
|
+
get(key) {
|
|
42
|
+
const entry = this.cache.get(key);
|
|
43
|
+
if (!entry) {
|
|
44
|
+
this.misses++;
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
// 检查是否过期
|
|
48
|
+
if (Date.now() > entry.expiresAt) {
|
|
49
|
+
this.cache.delete(key);
|
|
50
|
+
this.misses++;
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
// 更新访问时间(LRU)
|
|
54
|
+
entry.lastAccessed = Date.now();
|
|
55
|
+
this.hits++;
|
|
56
|
+
return entry.data;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 设置缓存
|
|
60
|
+
*/
|
|
61
|
+
set(key, data, ttl) {
|
|
62
|
+
// 如果缓存已满,删除最久未使用的条目
|
|
63
|
+
if (this.cache.size >= this.maxSize) {
|
|
64
|
+
this._evictOldest();
|
|
65
|
+
}
|
|
66
|
+
this.cache.set(key, {
|
|
67
|
+
data,
|
|
68
|
+
createdAt: Date.now(),
|
|
69
|
+
expiresAt: Date.now() + (ttl || this.ttl),
|
|
70
|
+
lastAccessed: Date.now()
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 删除缓存
|
|
75
|
+
*/
|
|
76
|
+
delete(key) {
|
|
77
|
+
this.cache.delete(key);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 清空缓存
|
|
81
|
+
*/
|
|
82
|
+
clear() {
|
|
83
|
+
this.cache.clear();
|
|
84
|
+
this.hits = 0;
|
|
85
|
+
this.misses = 0;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* 删除与集合相关的所有缓存
|
|
89
|
+
*/
|
|
90
|
+
invalidateCollection(collection) {
|
|
91
|
+
for (const [key] of this.cache.entries()) {
|
|
92
|
+
if (key.includes(collection)) {
|
|
93
|
+
this.cache.delete(key);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 删除最久未使用的条目(LRU)
|
|
99
|
+
*/
|
|
100
|
+
_evictOldest() {
|
|
101
|
+
let oldestKey = null;
|
|
102
|
+
let oldestTime = Infinity;
|
|
103
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
104
|
+
if (entry.lastAccessed < oldestTime) {
|
|
105
|
+
oldestTime = entry.lastAccessed;
|
|
106
|
+
oldestKey = key;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (oldestKey) {
|
|
110
|
+
this.cache.delete(oldestKey);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 获取缓存统计
|
|
115
|
+
*/
|
|
116
|
+
getStats() {
|
|
117
|
+
const total = this.hits + this.misses;
|
|
118
|
+
return {
|
|
119
|
+
size: this.cache.size,
|
|
120
|
+
maxSize: this.maxSize,
|
|
121
|
+
hits: this.hits,
|
|
122
|
+
misses: this.misses,
|
|
123
|
+
hitRate: total > 0 ? ((this.hits / total) * 100).toFixed(2) + '%' : '0%',
|
|
124
|
+
ttl: this.ttl
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 全局查询缓存实例
|
|
130
|
+
*/
|
|
131
|
+
export const globalQueryCache = new QueryCache({
|
|
132
|
+
maxSize: 500,
|
|
133
|
+
ttl: 30000 // 30 秒
|
|
134
|
+
});
|
|
135
|
+
/**
|
|
136
|
+
* 缓存查询装饰器
|
|
137
|
+
*/
|
|
138
|
+
export function cacheQuery(queryFn, options = {}) {
|
|
139
|
+
const cache = options.cache || globalQueryCache;
|
|
140
|
+
const ttl = options.ttl;
|
|
141
|
+
return async function (collection, query, queryOptions) {
|
|
142
|
+
const key = cache.generateKey(collection.name, query, queryOptions);
|
|
143
|
+
// 尝试从缓存获取
|
|
144
|
+
const cached = cache.get(key);
|
|
145
|
+
if (cached !== null) {
|
|
146
|
+
return cached;
|
|
147
|
+
}
|
|
148
|
+
// 执行查询
|
|
149
|
+
const result = await queryFn.call(this, collection, query, queryOptions);
|
|
150
|
+
// 存入缓存
|
|
151
|
+
cache.set(key, result, ttl);
|
|
152
|
+
return result;
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=QueryCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryCache.js","sourceRoot":"","sources":["../../src/QueryCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQL 执行器模块
|
|
3
|
+
* 将解析后的 SQL 语句转换为 JSONDB Collection API 调用
|
|
4
|
+
*/
|
|
5
|
+
import type { Collection } from './Collection.js';
|
|
6
|
+
import type { SQLStatement } from './SQLParser.js';
|
|
7
|
+
/**
|
|
8
|
+
* SQL 执行结果
|
|
9
|
+
*/
|
|
10
|
+
export interface SQLExecutionResult {
|
|
11
|
+
success: boolean;
|
|
12
|
+
data?: unknown[];
|
|
13
|
+
affectedRows?: number;
|
|
14
|
+
insertId?: string;
|
|
15
|
+
error?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* SQL 执行器类
|
|
19
|
+
*/
|
|
20
|
+
export declare class SQLExecutor {
|
|
21
|
+
private collection;
|
|
22
|
+
constructor(collection: Collection);
|
|
23
|
+
/**
|
|
24
|
+
* 执行 SQL 语句
|
|
25
|
+
*/
|
|
26
|
+
execute(statement: SQLStatement): Promise<SQLExecutionResult>;
|
|
27
|
+
/**
|
|
28
|
+
* 执行 SELECT 语句
|
|
29
|
+
*/
|
|
30
|
+
private executeSelect;
|
|
31
|
+
/**
|
|
32
|
+
* 执行 INSERT 语句
|
|
33
|
+
*/
|
|
34
|
+
private executeInsert;
|
|
35
|
+
/**
|
|
36
|
+
* 执行 UPDATE 语句
|
|
37
|
+
*/
|
|
38
|
+
private executeUpdate;
|
|
39
|
+
/**
|
|
40
|
+
* 执行 DELETE 语句
|
|
41
|
+
*/
|
|
42
|
+
private executeDelete;
|
|
43
|
+
/**
|
|
44
|
+
* 将 WHERE 子句转换为 MongoDB 风格查询
|
|
45
|
+
*/
|
|
46
|
+
private whereToQuery;
|
|
47
|
+
/**
|
|
48
|
+
* 将单个条件转换为查询对象
|
|
49
|
+
*/
|
|
50
|
+
private conditionToQuery;
|
|
51
|
+
/**
|
|
52
|
+
* 应用 GROUP BY (简化实现)
|
|
53
|
+
*/
|
|
54
|
+
private applyGroupBy;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 在 Collection 上执行 SQL
|
|
58
|
+
*/
|
|
59
|
+
export declare function executeSQL(collection: Collection, sql: string): Promise<SQLExecutionResult>;
|
|
60
|
+
//# sourceMappingURL=SQLExecutor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SQLExecutor.d.ts","sourceRoot":"","sources":["../../src/SQLExecutor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EACV,YAAY,EAMb,MAAM,gBAAgB,CAAC;AAIxB;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,UAAU,CAAa;gBAEnB,UAAU,EAAE,UAAU;IAIlC;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,YAAY,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAyBnE;;OAEG;YACW,aAAa;IAyE3B;;OAEG;YACW,aAAa;IA8B3B;;OAEG;YACW,aAAa;IAqB3B;;OAEG;YACW,aAAa;IAe3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAgCpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAmFxB;;OAEG;IACH,OAAO,CAAC,YAAY;CA6BrB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,kBAAkB,CAAC,CAY7B"}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQL 执行器模块
|
|
3
|
+
* 将解析后的 SQL 语句转换为 JSONDB Collection API 调用
|
|
4
|
+
*/
|
|
5
|
+
import { parseSQL } from './SQLParser.js';
|
|
6
|
+
/**
|
|
7
|
+
* SQL 执行器类
|
|
8
|
+
*/
|
|
9
|
+
export class SQLExecutor {
|
|
10
|
+
collection;
|
|
11
|
+
constructor(collection) {
|
|
12
|
+
this.collection = collection;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 执行 SQL 语句
|
|
16
|
+
*/
|
|
17
|
+
async execute(statement) {
|
|
18
|
+
try {
|
|
19
|
+
switch (statement.type) {
|
|
20
|
+
case 'SELECT':
|
|
21
|
+
return await this.executeSelect(statement);
|
|
22
|
+
case 'INSERT':
|
|
23
|
+
return await this.executeInsert(statement);
|
|
24
|
+
case 'UPDATE':
|
|
25
|
+
return await this.executeUpdate(statement);
|
|
26
|
+
case 'DELETE':
|
|
27
|
+
return await this.executeDelete(statement);
|
|
28
|
+
default:
|
|
29
|
+
return {
|
|
30
|
+
success: false,
|
|
31
|
+
error: `不支持的 SQL 语句类型:${statement.type}`
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return {
|
|
37
|
+
success: false,
|
|
38
|
+
error: `SQL 执行错误:${error.message}`
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 执行 SELECT 语句
|
|
44
|
+
*/
|
|
45
|
+
async executeSelect(statement) {
|
|
46
|
+
// 构建查询
|
|
47
|
+
let cursor = this.collection.find({});
|
|
48
|
+
// 应用 WHERE 子句
|
|
49
|
+
if (statement.where) {
|
|
50
|
+
const query = this.whereToQuery(statement.where);
|
|
51
|
+
cursor = this.collection.find(query);
|
|
52
|
+
}
|
|
53
|
+
// 应用 ORDER BY
|
|
54
|
+
if (statement.orderBy && statement.orderBy.length > 0) {
|
|
55
|
+
const sortSpec = {};
|
|
56
|
+
for (const { column, direction } of statement.orderBy) {
|
|
57
|
+
sortSpec[column] = direction === 'DESC' ? -1 : 1;
|
|
58
|
+
}
|
|
59
|
+
cursor = cursor.sort(sortSpec);
|
|
60
|
+
}
|
|
61
|
+
// 应用 LIMIT
|
|
62
|
+
if (statement.limit !== undefined) {
|
|
63
|
+
cursor = cursor.limit(statement.limit);
|
|
64
|
+
}
|
|
65
|
+
// 应用 OFFSET
|
|
66
|
+
if (statement.offset !== undefined) {
|
|
67
|
+
cursor = cursor.skip(statement.offset);
|
|
68
|
+
}
|
|
69
|
+
// 执行查询
|
|
70
|
+
let results = await cursor.toArray();
|
|
71
|
+
// 应用投影(列选择)
|
|
72
|
+
if (statement.columns && statement.columns.length > 0 && !statement.columns.includes('*')) {
|
|
73
|
+
const projection = {};
|
|
74
|
+
for (const col of statement.columns) {
|
|
75
|
+
projection[col] = 1;
|
|
76
|
+
}
|
|
77
|
+
results = results.map(doc => {
|
|
78
|
+
const projected = {};
|
|
79
|
+
for (const col of statement.columns) {
|
|
80
|
+
if (doc[col] !== undefined) {
|
|
81
|
+
projected[col] = doc[col];
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return projected;
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
// 应用 DISTINCT
|
|
88
|
+
if (statement.distinct) {
|
|
89
|
+
const seen = new Set();
|
|
90
|
+
results = results.filter(doc => {
|
|
91
|
+
const key = JSON.stringify(doc);
|
|
92
|
+
if (seen.has(key)) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
seen.add(key);
|
|
96
|
+
return true;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
// 应用 GROUP BY (简化版)
|
|
100
|
+
if (statement.groupBy && statement.groupBy.length > 0) {
|
|
101
|
+
results = this.applyGroupBy(results, statement.groupBy);
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
success: true,
|
|
105
|
+
data: results
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 执行 INSERT 语句
|
|
110
|
+
*/
|
|
111
|
+
async executeInsert(statement) {
|
|
112
|
+
const docs = [];
|
|
113
|
+
for (const row of statement.values) {
|
|
114
|
+
const doc = {};
|
|
115
|
+
for (let i = 0; i < statement.columns.length; i++) {
|
|
116
|
+
doc[statement.columns[i]] = row[i];
|
|
117
|
+
}
|
|
118
|
+
docs.push(doc);
|
|
119
|
+
}
|
|
120
|
+
if (docs.length === 1) {
|
|
121
|
+
const inserted = await this.collection.insertOne(docs[0]);
|
|
122
|
+
return {
|
|
123
|
+
success: true,
|
|
124
|
+
data: [inserted],
|
|
125
|
+
affectedRows: 1,
|
|
126
|
+
insertId: inserted._id
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
const result = await this.collection.insertMany(docs);
|
|
131
|
+
return {
|
|
132
|
+
success: true,
|
|
133
|
+
data: docs,
|
|
134
|
+
affectedRows: result.insertedCount,
|
|
135
|
+
insertId: result.insertedIds[0]
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* 执行 UPDATE 语句
|
|
141
|
+
*/
|
|
142
|
+
async executeUpdate(statement) {
|
|
143
|
+
// 构建 $set 对象
|
|
144
|
+
const $set = {};
|
|
145
|
+
for (const { column, value } of statement.set) {
|
|
146
|
+
$set[column] = value;
|
|
147
|
+
}
|
|
148
|
+
// 构建查询
|
|
149
|
+
let query = {};
|
|
150
|
+
if (statement.where) {
|
|
151
|
+
query = this.whereToQuery(statement.where);
|
|
152
|
+
}
|
|
153
|
+
const result = await this.collection.updateMany(query, { $set });
|
|
154
|
+
return {
|
|
155
|
+
success: true,
|
|
156
|
+
affectedRows: result.modifiedCount
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* 执行 DELETE 语句
|
|
161
|
+
*/
|
|
162
|
+
async executeDelete(statement) {
|
|
163
|
+
// 构建查询
|
|
164
|
+
let query = {};
|
|
165
|
+
if (statement.where) {
|
|
166
|
+
query = this.whereToQuery(statement.where);
|
|
167
|
+
}
|
|
168
|
+
const result = await this.collection.deleteMany(query);
|
|
169
|
+
return {
|
|
170
|
+
success: true,
|
|
171
|
+
affectedRows: result.deletedCount
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* 将 WHERE 子句转换为 MongoDB 风格查询
|
|
176
|
+
*/
|
|
177
|
+
whereToQuery(where) {
|
|
178
|
+
switch (where.type) {
|
|
179
|
+
case 'condition':
|
|
180
|
+
return this.conditionToQuery(where.column, where.operator, where.value);
|
|
181
|
+
case 'and':
|
|
182
|
+
if (where.conditions.length === 0)
|
|
183
|
+
return {};
|
|
184
|
+
if (where.conditions.length === 1) {
|
|
185
|
+
return this.whereToQuery(where.conditions[0]);
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
$and: where.conditions.map(c => this.whereToQuery(c))
|
|
189
|
+
};
|
|
190
|
+
case 'or':
|
|
191
|
+
if (where.conditions.length === 0)
|
|
192
|
+
return {};
|
|
193
|
+
if (where.conditions.length === 1) {
|
|
194
|
+
return this.whereToQuery(where.conditions[0]);
|
|
195
|
+
}
|
|
196
|
+
return {
|
|
197
|
+
$or: where.conditions.map(c => this.whereToQuery(c))
|
|
198
|
+
};
|
|
199
|
+
case 'not':
|
|
200
|
+
const condition = this.whereToQuery(where.condition);
|
|
201
|
+
return { $nor: [condition] };
|
|
202
|
+
default:
|
|
203
|
+
return {};
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* 将单个条件转换为查询对象
|
|
208
|
+
*/
|
|
209
|
+
conditionToQuery(column, operator, value) {
|
|
210
|
+
const query = {};
|
|
211
|
+
switch (operator.toUpperCase()) {
|
|
212
|
+
case '=':
|
|
213
|
+
query[column] = value;
|
|
214
|
+
break;
|
|
215
|
+
case '!=':
|
|
216
|
+
case '<>':
|
|
217
|
+
query[column] = { $ne: value };
|
|
218
|
+
break;
|
|
219
|
+
case '<':
|
|
220
|
+
query[column] = { $lt: value };
|
|
221
|
+
break;
|
|
222
|
+
case '<=':
|
|
223
|
+
query[column] = { $lte: value };
|
|
224
|
+
break;
|
|
225
|
+
case '>':
|
|
226
|
+
query[column] = { $gt: value };
|
|
227
|
+
break;
|
|
228
|
+
case '>=':
|
|
229
|
+
query[column] = { $gte: value };
|
|
230
|
+
break;
|
|
231
|
+
case 'LIKE':
|
|
232
|
+
// 转换 SQL LIKE 到正则表达式
|
|
233
|
+
if (typeof value === 'string') {
|
|
234
|
+
let regex = value
|
|
235
|
+
.replace(/[.+?^${}()|[\]\\]/g, '\\$&') // 转义特殊字符
|
|
236
|
+
.replace(/%/g, '.*') // % 匹配任意字符
|
|
237
|
+
.replace(/_/g, '.'); // _ 匹配单个字符
|
|
238
|
+
query[column] = { $regex: new RegExp(`^${regex}$`, 'i') };
|
|
239
|
+
}
|
|
240
|
+
break;
|
|
241
|
+
case 'IN':
|
|
242
|
+
if (Array.isArray(value)) {
|
|
243
|
+
query[column] = { $in: value };
|
|
244
|
+
}
|
|
245
|
+
break;
|
|
246
|
+
case 'NOT IN':
|
|
247
|
+
if (Array.isArray(value)) {
|
|
248
|
+
query[column] = { $nin: value };
|
|
249
|
+
}
|
|
250
|
+
break;
|
|
251
|
+
case 'IS':
|
|
252
|
+
if (value === null) {
|
|
253
|
+
query[column] = { $exists: false };
|
|
254
|
+
}
|
|
255
|
+
else if (value === true) {
|
|
256
|
+
query[column] = { $exists: true };
|
|
257
|
+
}
|
|
258
|
+
break;
|
|
259
|
+
case 'IS NOT':
|
|
260
|
+
if (value === null) {
|
|
261
|
+
query[column] = { $exists: true };
|
|
262
|
+
}
|
|
263
|
+
break;
|
|
264
|
+
case 'BETWEEN':
|
|
265
|
+
// 假设 value 是 [min, max] 数组
|
|
266
|
+
if (Array.isArray(value) && value.length === 2) {
|
|
267
|
+
query[column] = {
|
|
268
|
+
$gte: value[0],
|
|
269
|
+
$lte: value[1]
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
break;
|
|
273
|
+
default:
|
|
274
|
+
query[column] = { [`$${operator.toLowerCase()}`]: value };
|
|
275
|
+
}
|
|
276
|
+
return query;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* 应用 GROUP BY (简化实现)
|
|
280
|
+
*/
|
|
281
|
+
applyGroupBy(docs, groupBy) {
|
|
282
|
+
const groups = new Map();
|
|
283
|
+
for (const doc of docs) {
|
|
284
|
+
const key = groupBy.map(col => JSON.stringify(doc[col])).join('|');
|
|
285
|
+
if (!groups.has(key)) {
|
|
286
|
+
groups.set(key, []);
|
|
287
|
+
}
|
|
288
|
+
groups.get(key).push(doc);
|
|
289
|
+
}
|
|
290
|
+
return Array.from(groups.entries()).map(([key, groupDocs]) => {
|
|
291
|
+
const result = {};
|
|
292
|
+
// 添加分组字段
|
|
293
|
+
const keyParts = key.split('|');
|
|
294
|
+
groupBy.forEach((col, i) => {
|
|
295
|
+
result[col] = JSON.parse(keyParts[i]);
|
|
296
|
+
});
|
|
297
|
+
// 添加聚合字段(简化:只添加计数)
|
|
298
|
+
result._count = groupDocs.length;
|
|
299
|
+
return result;
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* 在 Collection 上执行 SQL
|
|
305
|
+
*/
|
|
306
|
+
export async function executeSQL(collection, sql) {
|
|
307
|
+
const parseResult = parseSQL(sql);
|
|
308
|
+
if (!parseResult.success || !parseResult.statement) {
|
|
309
|
+
return {
|
|
310
|
+
success: false,
|
|
311
|
+
error: parseResult.error || 'SQL 解析失败'
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
const executor = new SQLExecutor(collection);
|
|
315
|
+
return await executor.execute(parseResult.statement);
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=SQLExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SQLExecutor.js","sourceRoot":"","sources":["../../src/SQLExecutor.ts"],"names":[],"mappings":"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"}
|