@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.
Files changed (118) hide show
  1. package/README.md +903 -0
  2. package/dist/bin/cli-export.d.ts +7 -0
  3. package/dist/bin/cli-export.d.ts.map +1 -0
  4. package/dist/bin/cli-export.js +318 -0
  5. package/dist/bin/cli-export.js.map +1 -0
  6. package/dist/bin/cli-import.d.ts +7 -0
  7. package/dist/bin/cli-import.d.ts.map +1 -0
  8. package/dist/bin/cli-import.js +298 -0
  9. package/dist/bin/cli-import.js.map +1 -0
  10. package/dist/bin/server.d.ts +7 -0
  11. package/dist/bin/server.d.ts.map +1 -0
  12. package/dist/bin/server.js +92 -0
  13. package/dist/bin/server.js.map +1 -0
  14. package/dist/examples/sql-example.d.ts +7 -0
  15. package/dist/examples/sql-example.d.ts.map +1 -0
  16. package/dist/examples/sql-example.js +131 -0
  17. package/dist/examples/sql-example.js.map +1 -0
  18. package/dist/src/BulkOp.d.ts +74 -0
  19. package/dist/src/BulkOp.d.ts.map +1 -0
  20. package/dist/src/BulkOp.js +143 -0
  21. package/dist/src/BulkOp.js.map +1 -0
  22. package/dist/src/Collection.d.ts +232 -0
  23. package/dist/src/Collection.d.ts.map +1 -0
  24. package/dist/src/Collection.js +705 -0
  25. package/dist/src/Collection.js.map +1 -0
  26. package/dist/src/Cursor.d.ts +94 -0
  27. package/dist/src/Cursor.d.ts.map +1 -0
  28. package/dist/src/Cursor.js +259 -0
  29. package/dist/src/Cursor.js.map +1 -0
  30. package/dist/src/Database.d.ts +98 -0
  31. package/dist/src/Database.d.ts.map +1 -0
  32. package/dist/src/Database.js +198 -0
  33. package/dist/src/Database.js.map +1 -0
  34. package/dist/src/Operators.d.ts +73 -0
  35. package/dist/src/Operators.d.ts.map +1 -0
  36. package/dist/src/Operators.js +339 -0
  37. package/dist/src/Operators.js.map +1 -0
  38. package/dist/src/QueryCache.d.ts +87 -0
  39. package/dist/src/QueryCache.d.ts.map +1 -0
  40. package/dist/src/QueryCache.js +155 -0
  41. package/dist/src/QueryCache.js.map +1 -0
  42. package/dist/src/SQLExecutor.d.ts +60 -0
  43. package/dist/src/SQLExecutor.d.ts.map +1 -0
  44. package/dist/src/SQLExecutor.js +317 -0
  45. package/dist/src/SQLExecutor.js.map +1 -0
  46. package/dist/src/SQLParser.d.ts +181 -0
  47. package/dist/src/SQLParser.d.ts.map +1 -0
  48. package/dist/src/SQLParser.js +640 -0
  49. package/dist/src/SQLParser.js.map +1 -0
  50. package/dist/src/Schema.d.ts +92 -0
  51. package/dist/src/Schema.d.ts.map +1 -0
  52. package/dist/src/Schema.js +253 -0
  53. package/dist/src/Schema.js.map +1 -0
  54. package/dist/src/Transaction.d.ts +118 -0
  55. package/dist/src/Transaction.d.ts.map +1 -0
  56. package/dist/src/Transaction.js +233 -0
  57. package/dist/src/Transaction.js.map +1 -0
  58. package/dist/src/Utils.d.ts +68 -0
  59. package/dist/src/Utils.d.ts.map +1 -0
  60. package/dist/src/Utils.js +187 -0
  61. package/dist/src/Utils.js.map +1 -0
  62. package/dist/src/errors.d.ts +58 -0
  63. package/dist/src/errors.d.ts.map +1 -0
  64. package/dist/src/errors.js +85 -0
  65. package/dist/src/errors.js.map +1 -0
  66. package/dist/src/index.d.ts +39 -0
  67. package/dist/src/index.d.ts.map +1 -0
  68. package/dist/src/index.js +44 -0
  69. package/dist/src/index.js.map +1 -0
  70. package/dist/test/basic.test.d.ts +5 -0
  71. package/dist/test/basic.test.d.ts.map +1 -0
  72. package/dist/test/basic.test.js +283 -0
  73. package/dist/test/basic.test.js.map +1 -0
  74. package/dist/test/index.test.d.ts +5 -0
  75. package/dist/test/index.test.d.ts.map +1 -0
  76. package/dist/test/index.test.js +126 -0
  77. package/dist/test/index.test.js.map +1 -0
  78. package/dist/test/jsonb.test.d.ts +5 -0
  79. package/dist/test/jsonb.test.d.ts.map +1 -0
  80. package/dist/test/jsonb.test.js +165 -0
  81. package/dist/test/jsonb.test.js.map +1 -0
  82. package/dist/test/optimization.test.d.ts +6 -0
  83. package/dist/test/optimization.test.d.ts.map +1 -0
  84. package/dist/test/optimization.test.js +196 -0
  85. package/dist/test/optimization.test.js.map +1 -0
  86. package/dist/test/schema.test.d.ts +5 -0
  87. package/dist/test/schema.test.d.ts.map +1 -0
  88. package/dist/test/schema.test.js +197 -0
  89. package/dist/test/schema.test.js.map +1 -0
  90. package/dist/test/sql.test.d.ts +7 -0
  91. package/dist/test/sql.test.d.ts.map +1 -0
  92. package/dist/test/sql.test.js +21 -0
  93. package/dist/test/sql.test.js.map +1 -0
  94. package/package.json +73 -0
  95. package/src/BulkOp.js +181 -0
  96. package/src/BulkOp.ts +191 -0
  97. package/src/Collection.js +843 -0
  98. package/src/Collection.ts +896 -0
  99. package/src/Cursor.js +315 -0
  100. package/src/Cursor.ts +319 -0
  101. package/src/Database.js +244 -0
  102. package/src/Database.ts +268 -0
  103. package/src/Operators.js +382 -0
  104. package/src/Operators.ts +375 -0
  105. package/src/QueryCache.js +190 -0
  106. package/src/QueryCache.ts +208 -0
  107. package/src/SQLExecutor.ts +391 -0
  108. package/src/SQLParser.ts +814 -0
  109. package/src/Schema.js +292 -0
  110. package/src/Schema.ts +317 -0
  111. package/src/Transaction.js +291 -0
  112. package/src/Transaction.ts +313 -0
  113. package/src/Utils.js +205 -0
  114. package/src/Utils.ts +205 -0
  115. package/src/errors.js +93 -0
  116. package/src/errors.ts +93 -0
  117. package/src/index.js +90 -0
  118. 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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"}