@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,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * JSONDB Web 管理工具服务器
4
+ * 提供静态文件服务
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../bin/server.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * JSONDB Web 管理工具服务器
4
+ * 提供静态文件服务
5
+ */
6
+ import http from 'http';
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ import { fileURLToPath } from 'url';
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = path.dirname(__filename);
12
+ const PORT = process.env.PORT || 3040;
13
+ const PUBLIC_DIR = path.join(__dirname, '..', 'public');
14
+ const mimeTypes = {
15
+ '.html': 'text/html',
16
+ '.js': 'text/javascript',
17
+ '.css': 'text/css',
18
+ '.json': 'application/json',
19
+ '.png': 'image/png',
20
+ '.jpg': 'image/jpeg',
21
+ '.gif': 'image/gif',
22
+ '.svg': 'image/svg+xml',
23
+ '.ico': 'image/x-icon'
24
+ };
25
+ const server = http.createServer((req, res) => {
26
+ console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);
27
+ // 处理 API 路由
28
+ if (req.url.startsWith('/api/')) {
29
+ handleApi(req, res);
30
+ return;
31
+ }
32
+ // 静态文件服务 - 规范化路径
33
+ let urlPath = req.url === '/' ? '/admin.html' : req.url;
34
+ urlPath = path.normalize(urlPath);
35
+ let filePath = path.join(PUBLIC_DIR, urlPath);
36
+ // 安全检查:确保路径在 PUBLIC_DIR 内
37
+ if (!filePath.startsWith(PUBLIC_DIR)) {
38
+ res.writeHead(403, { 'Content-Type': 'text/plain; charset=utf-8' });
39
+ res.end('禁止访问');
40
+ return;
41
+ }
42
+ const ext = path.extname(filePath);
43
+ const contentType = mimeTypes[ext] || 'application/octet-stream';
44
+ // 添加 UTF-8 字符集
45
+ const charset = ext === '.html' || ext === '.js' || ext === '.css' || ext === '.json' ? '; charset=utf-8' : '';
46
+ // 添加缓存控制
47
+ res.setHeader('Cache-Control', 'no-cache');
48
+ fs.readFile(filePath, (err, content) => {
49
+ if (err) {
50
+ console.error(`文件读取错误:${filePath}`, err.message);
51
+ if (err.code === 'ENOENT') {
52
+ res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
53
+ res.end(`文件不存在:${urlPath}`);
54
+ }
55
+ else {
56
+ res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
57
+ res.end('服务器错误');
58
+ }
59
+ }
60
+ else {
61
+ console.log(`发送文件:${filePath} (${content.length} bytes)`);
62
+ res.writeHead(200, {
63
+ 'Content-Type': contentType + charset,
64
+ 'Content-Length': content.length
65
+ });
66
+ res.end(content);
67
+ }
68
+ });
69
+ });
70
+ // 简单的 API 处理(可选扩展)
71
+ function handleApi(req, res) {
72
+ res.writeHead(200, { 'Content-Type': 'application/json' });
73
+ res.end(JSON.stringify({ message: 'API 端点' }));
74
+ }
75
+ server.listen(PORT, () => {
76
+ console.log(`
77
+ ╔═══════════════════════════════════════════════════════════╗
78
+ ║ JSONDB Web 管理工具已启动 ║
79
+ ╚═══════════════════════════════════════════════════════════╝
80
+
81
+ 🌐 访问地址:http://127.0.0.1:${PORT}
82
+
83
+ 📋 使用说明:
84
+ 1. 点击"打开数据库文件夹"按钮
85
+ 2. 选择包含 JSON/JSONB 文件的目录
86
+ 3. 在左侧选择集合
87
+ 4. 执行查询或导出数据
88
+
89
+ ═══════════════════════════════════════════════════════
90
+ `);
91
+ });
92
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../bin/server.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;AACtC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAExD,MAAM,SAAS,GAA2B;IACxC,OAAO,EAAE,WAAW;IACpB,KAAK,EAAE,iBAAiB;IACxB,MAAM,EAAE,UAAU;IAClB,OAAO,EAAE,kBAAkB;IAC3B,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,cAAc;CACvB,CAAC;AAEF,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IAC5C,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IAEtE,YAAY;IACZ,IAAI,GAAG,CAAC,GAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACpB,OAAO;IACT,CAAC;IAED,iBAAiB;IACjB,IAAI,OAAO,GAAG,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,GAAI,CAAC;IACzD,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAE9C,0BAA0B;IAC1B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC;QACpE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;IAEjE,eAAe;IACf,MAAM,OAAO,GAAG,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/G,SAAS;IACT,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAE3C,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;QACrC,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,CAAC,KAAK,CAAC,UAAU,QAAQ,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YACjD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC;gBACpE,GAAG,CAAC,GAAG,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC;gBACpE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,QAAQ,QAAQ,KAAK,OAAO,CAAC,MAAM,SAAS,CAAC,CAAC;YAC1D,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;gBACjB,cAAc,EAAE,WAAW,GAAG,OAAO;gBACrC,gBAAgB,EAAE,OAAO,CAAC,MAAM;aACjC,CAAC,CAAC;YACH,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,mBAAmB;AACnB,SAAS,SAAS,CAAC,GAAyB,EAAE,GAAwB;IACpE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;IACvB,OAAO,CAAC,GAAG,CAAC;;;;;6BAKe,IAAI;;;;;;;;;GAS9B,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * JSONDB SQL 查询使用示例
3
+ *
4
+ * JSONDB 支持标准 SQL 语法子集,可以直接使用 SQL 进行增删改查操作
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=sql-example.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-example.d.ts","sourceRoot":"","sources":["../../examples/sql-example.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * JSONDB SQL 查询使用示例
3
+ *
4
+ * JSONDB 支持标准 SQL 语法子集,可以直接使用 SQL 进行增删改查操作
5
+ */
6
+ import { Database } from '../src/index.js';
7
+ async function main() {
8
+ const db = new Database('./test-data/sql-example-db');
9
+ await db.open();
10
+ const users = db.collection('users');
11
+ // 清空集合
12
+ await users.deleteMany({});
13
+ console.log('========== JSONDB SQL 查询示例 ==========\n');
14
+ // ========== 1. INSERT 插入数据 ==========
15
+ console.log('1️⃣ INSERT - 插入数据');
16
+ // 单条插入
17
+ await users.sql("INSERT INTO users (name, age, email, department) VALUES ('Alice', 25, 'alice@example.com', 'Engineering')");
18
+ // 多条插入
19
+ await users.sql(`
20
+ INSERT INTO users (name, age, email, department) VALUES
21
+ ('Bob', 30, 'bob@example.com', 'Sales'),
22
+ ('Charlie', 28, 'charlie@example.com', 'Engineering'),
23
+ ('David', 35, 'david@example.com', 'HR'),
24
+ ('Eve', 22, 'eve@example.com', 'Sales')
25
+ `);
26
+ console.log('✅ 已插入 5 条记录\n');
27
+ // ========== 2. SELECT 查询数据 ==========
28
+ console.log('2️⃣ SELECT - 查询数据');
29
+ // 查询所有
30
+ console.log('查询所有用户:');
31
+ const all = await users.sql('SELECT * FROM users');
32
+ console.log(` 共 ${all.data?.length} 条\n`);
33
+ // 指定列查询
34
+ console.log('只查询姓名和年龄:');
35
+ const names = await users.sql('SELECT name, age FROM users');
36
+ console.log(` ${JSON.stringify(names.data?.map((u) => u.name))}\n`);
37
+ // WHERE 条件查询
38
+ console.log('查询年龄大于 25 岁的用户:');
39
+ const older = await users.sql('SELECT * FROM users WHERE age > 25');
40
+ console.log(` 共 ${older.data?.length} 条\n`);
41
+ // 多条件 AND
42
+ console.log('查询 Engineering 部门且年龄大于 25 的用户:');
43
+ const andResult = await users.sql("SELECT * FROM users WHERE age > 25 AND department = 'Engineering'");
44
+ console.log(` 共 ${andResult.data?.length} 条\n`);
45
+ // OR 条件
46
+ console.log('查询年龄小于 25 或大于 30 的用户:');
47
+ const orResult = await users.sql('SELECT * FROM users WHERE age < 25 OR age > 30');
48
+ console.log(` 共 ${orResult.data?.length} 条\n`);
49
+ // ========== 3. 比较操作符 ==========
50
+ console.log('3️⃣ 比较操作符');
51
+ console.log('年龄 >= 30:');
52
+ const gte = await users.sql('SELECT * FROM users WHERE age >= 30');
53
+ console.log(` 共 ${gte.data?.length} 条\n`);
54
+ console.log('部门 != Engineering:');
55
+ const ne = await users.sql("SELECT * FROM users WHERE department != 'Engineering'");
56
+ console.log(` 共 ${ne.data?.length} 条\n`);
57
+ // ========== 4. LIKE 模糊查询 ==========
58
+ console.log('4️⃣ LIKE 模糊查询');
59
+ console.log('邮箱以 @example.com 结尾:');
60
+ const like = await users.sql("SELECT * FROM users WHERE email LIKE '%@example.com'");
61
+ console.log(` 共 ${like.data?.length} 条\n`);
62
+ console.log('姓名以 A 开头:');
63
+ const likeStart = await users.sql("SELECT * FROM users WHERE name LIKE 'A%'");
64
+ console.log(` 共 ${likeStart.data?.length} 条\n`);
65
+ // ========== 5. IN 操作符 ==========
66
+ console.log('5️⃣ IN 操作符');
67
+ console.log('部门在 (Engineering, Sales) 中:');
68
+ const inResult = await users.sql("SELECT * FROM users WHERE department IN ('Engineering', 'Sales')");
69
+ console.log(` 共 ${inResult.data?.length} 条\n`);
70
+ // ========== 6. ORDER BY 排序 ==========
71
+ console.log('6️⃣ ORDER BY 排序');
72
+ console.log('按年龄升序:');
73
+ const asc = await users.sql('SELECT name, age FROM users ORDER BY age ASC');
74
+ console.log(` ${JSON.stringify(asc.data?.map((u) => u.age))}\n`);
75
+ console.log('按年龄降序:');
76
+ const desc = await users.sql('SELECT name, age FROM users ORDER BY age DESC');
77
+ console.log(` ${JSON.stringify(desc.data?.map((u) => u.age))}\n`);
78
+ // ========== 7. LIMIT 和 OFFSET ==========
79
+ console.log('7️⃣ LIMIT 和 OFFSET');
80
+ console.log('限制 3 条:');
81
+ const limit = await users.sql('SELECT * FROM users LIMIT 3');
82
+ console.log(` 共 ${limit.data?.length} 条\n`);
83
+ console.log('跳过前 2 条,取 2 条:');
84
+ const offset = await users.sql('SELECT * FROM users LIMIT 2 OFFSET 2');
85
+ console.log(` 共 ${offset.data?.length} 条\n`);
86
+ // ========== 8. DISTINCT 去重 ==========
87
+ console.log('8️⃣ DISTINCT 去重');
88
+ console.log('所有不同的部门:');
89
+ const distinct = await users.sql('SELECT DISTINCT department FROM users');
90
+ console.log(` ${JSON.stringify(distinct.data?.map((d) => d.department))}\n`);
91
+ // ========== 9. UPDATE 更新数据 ==========
92
+ console.log('9️⃣ UPDATE - 更新数据');
93
+ console.log('将 Alice 的年龄更新为 26:');
94
+ const update = await users.sql("UPDATE users SET age = 26 WHERE name = 'Alice'");
95
+ console.log(` 更新了 ${update.affectedRows} 条记录\n`);
96
+ console.log('将所有用户部门设置为 Unknown:');
97
+ const updateAll = await users.sql("UPDATE users SET department = 'Unknown'");
98
+ console.log(` 更新了 ${updateAll.affectedRows} 条记录\n`);
99
+ // ========== 10. DELETE 删除数据 ==========
100
+ console.log('🔟 DELETE - 删除数据');
101
+ console.log('删除年龄小于 25 的用户:');
102
+ const deleteResult = await users.sql('DELETE FROM users WHERE age < 25');
103
+ console.log(` 删除了 ${deleteResult.affectedRows} 条记录\n`);
104
+ // ========== 11. 复杂查询示例 ==========
105
+ console.log('📊 复杂查询示例');
106
+ console.log('查询 Sales 或 Engineering 部门,年龄 25-30 岁,按年龄降序,取前 2 条:');
107
+ const complex = await users.sql(`
108
+ SELECT name, age, department
109
+ FROM users
110
+ WHERE department IN ('Engineering', 'Sales')
111
+ AND age BETWEEN 25 AND 30
112
+ ORDER BY age DESC
113
+ LIMIT 2
114
+ `);
115
+ console.log(` ${JSON.stringify(complex.data, null, 2)}\n`);
116
+ // ========== 12. SQL 解析器直接使用 ==========
117
+ console.log('🔧 SQL 解析器直接使用');
118
+ const { parseSQL } = await import('../src/SQLParser.js');
119
+ const sql = 'SELECT name, age FROM users WHERE age > 25 ORDER BY age DESC LIMIT 10';
120
+ const parsed = parseSQL(sql);
121
+ console.log(`解析 SQL: ${sql}`);
122
+ console.log(`结果:${JSON.stringify(parsed, null, 2)}\n`);
123
+ await db.close();
124
+ // 清理
125
+ import('fs').then(({ rmSync }) => {
126
+ rmSync('./test-data/sql-example-db', { recursive: true, force: true });
127
+ });
128
+ console.log('========== 示例结束 ==========\n');
129
+ }
130
+ main().catch(console.error);
131
+ //# sourceMappingURL=sql-example.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-example.js","sourceRoot":"","sources":["../../examples/sql-example.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * JSONDB 批量操作优化模块
3
+ * 提供高效的批量插入、更新、删除操作
4
+ */
5
+ import type { Collection } from './Collection.js';
6
+ /**
7
+ * 批量操作结果接口
8
+ */
9
+ interface BulkResult {
10
+ insertedCount: number;
11
+ updatedCount: number;
12
+ deletedCount: number;
13
+ insertedIds: string[];
14
+ errors: string[];
15
+ }
16
+ /**
17
+ * 更新操作接口
18
+ */
19
+ interface UpdateOperation {
20
+ query: Record<string, unknown>;
21
+ update: Record<string, unknown>;
22
+ options: Record<string, unknown>;
23
+ }
24
+ /**
25
+ * 批量操作类
26
+ */
27
+ export declare class BulkOperation {
28
+ collection: Collection;
29
+ operations: Array<{
30
+ type: string;
31
+ [key: string]: unknown;
32
+ }>;
33
+ insertDocs: Array<Record<string, unknown>>;
34
+ updateOps: UpdateOperation[];
35
+ deleteQuerys: Array<Record<string, unknown>>;
36
+ constructor(collection: Collection);
37
+ /**
38
+ * 添加插入操作
39
+ */
40
+ insert(docs: Record<string, unknown> | Array<Record<string, unknown>>): BulkOperation;
41
+ /**
42
+ * 添加更新操作
43
+ */
44
+ update(query: Record<string, unknown>, update: Record<string, unknown>, options?: Record<string, unknown>): BulkOperation;
45
+ /**
46
+ * 添加删除操作
47
+ */
48
+ delete(query: Record<string, unknown>): BulkOperation;
49
+ /**
50
+ * 执行所有操作(单次写入)
51
+ */
52
+ execute(): Promise<BulkResult>;
53
+ }
54
+ /**
55
+ * 创建批量操作实例
56
+ */
57
+ export declare function createBulkOp(collection: Collection): BulkOperation;
58
+ /**
59
+ * 批量插入(简化版)
60
+ */
61
+ export declare function bulkInsert(collection: Collection, docs: Array<Record<string, unknown>>): Promise<BulkResult>;
62
+ /**
63
+ * 批量更新(简化版)
64
+ */
65
+ export declare function bulkUpdate(collection: Collection, operations: Array<{
66
+ query: Record<string, unknown>;
67
+ update: Record<string, unknown>;
68
+ }>): Promise<BulkResult>;
69
+ /**
70
+ * 批量删除(简化版)
71
+ */
72
+ export declare function bulkDelete(collection: Collection, querys: Array<Record<string, unknown>>): Promise<BulkResult>;
73
+ export {};
74
+ //# sourceMappingURL=BulkOp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BulkOp.d.ts","sourceRoot":"","sources":["../../src/BulkOp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;GAEG;AACH,UAAU,UAAU;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;IAC5D,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3C,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;gBAEjC,UAAU,EAAE,UAAU;IAQlC;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,aAAa;IAerF;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,aAAa;IAK7H;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa;IAKrD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;CAiErC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa,CAElE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAIlH;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,GACrF,OAAO,CAAC,UAAU,CAAC,CAMrB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAMpH"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * JSONDB 批量操作优化模块
3
+ * 提供高效的批量插入、更新、删除操作
4
+ */
5
+ import { generateId, deepClone } from './Utils.js';
6
+ import { matchQuery, applyUpdate } from './Operators.js';
7
+ /**
8
+ * 批量操作类
9
+ */
10
+ export class BulkOperation {
11
+ collection;
12
+ operations;
13
+ insertDocs;
14
+ updateOps;
15
+ deleteQuerys;
16
+ constructor(collection) {
17
+ this.collection = collection;
18
+ this.operations = [];
19
+ this.insertDocs = [];
20
+ this.updateOps = [];
21
+ this.deleteQuerys = [];
22
+ }
23
+ /**
24
+ * 添加插入操作
25
+ */
26
+ insert(docs) {
27
+ const docArray = Array.isArray(docs) ? docs : [docs];
28
+ const now = new Date().toISOString();
29
+ for (const doc of docArray) {
30
+ this.insertDocs.push({
31
+ ...deepClone(doc),
32
+ _id: doc._id || generateId(),
33
+ createdAt: doc.createdAt || now
34
+ });
35
+ }
36
+ return this;
37
+ }
38
+ /**
39
+ * 添加更新操作
40
+ */
41
+ update(query, update, options = {}) {
42
+ this.updateOps.push({ query, update, options });
43
+ return this;
44
+ }
45
+ /**
46
+ * 添加删除操作
47
+ */
48
+ delete(query) {
49
+ this.deleteQuerys.push(query);
50
+ return this;
51
+ }
52
+ /**
53
+ * 执行所有操作(单次写入)
54
+ */
55
+ async execute() {
56
+ await this.collection._load();
57
+ const result = {
58
+ insertedCount: 0,
59
+ updatedCount: 0,
60
+ deletedCount: 0,
61
+ insertedIds: [],
62
+ errors: []
63
+ };
64
+ try {
65
+ // 1. 执行插入
66
+ if (this.insertDocs.length > 0) {
67
+ // 批量验证
68
+ if (this.collection._validateOnInsert) {
69
+ for (const doc of this.insertDocs) {
70
+ this.collection._validate(doc);
71
+ }
72
+ }
73
+ this.collection._data._documents.push(...this.insertDocs);
74
+ result.insertedCount = this.insertDocs.length;
75
+ result.insertedIds = this.insertDocs.map(d => d._id);
76
+ }
77
+ // 2. 执行更新
78
+ for (const { query, update, options } of this.updateOps) {
79
+ for (let i = 0; i < this.collection._data._documents.length; i++) {
80
+ const doc = this.collection._data._documents[i];
81
+ if (matchQuery(doc, query)) {
82
+ const updatedDoc = applyUpdate(doc, update);
83
+ updatedDoc.updatedAt = new Date().toISOString();
84
+ if (JSON.stringify(doc) !== JSON.stringify(updatedDoc)) {
85
+ this.collection._data._documents[i] = updatedDoc;
86
+ result.updatedCount++;
87
+ }
88
+ }
89
+ }
90
+ }
91
+ // 3. 执行删除
92
+ for (const query of this.deleteQuerys) {
93
+ const initialLength = this.collection._data._documents.length;
94
+ this.collection._data._documents = this.collection._data._documents.filter(doc => !matchQuery(doc, query));
95
+ result.deletedCount += initialLength - this.collection._data._documents.length;
96
+ }
97
+ // 4. 单次保存
98
+ await this.collection._save();
99
+ // 5. 失效缓存
100
+ this.collection._cache = null;
101
+ this.collection._cacheTime = 0;
102
+ }
103
+ catch (error) {
104
+ result.errors.push(error.message);
105
+ }
106
+ return result;
107
+ }
108
+ }
109
+ /**
110
+ * 创建批量操作实例
111
+ */
112
+ export function createBulkOp(collection) {
113
+ return new BulkOperation(collection);
114
+ }
115
+ /**
116
+ * 批量插入(简化版)
117
+ */
118
+ export async function bulkInsert(collection, docs) {
119
+ const op = createBulkOp(collection);
120
+ op.insert(docs);
121
+ return await op.execute();
122
+ }
123
+ /**
124
+ * 批量更新(简化版)
125
+ */
126
+ export async function bulkUpdate(collection, operations) {
127
+ const op = createBulkOp(collection);
128
+ for (const { query, update } of operations) {
129
+ op.update(query, update);
130
+ }
131
+ return await op.execute();
132
+ }
133
+ /**
134
+ * 批量删除(简化版)
135
+ */
136
+ export async function bulkDelete(collection, querys) {
137
+ const op = createBulkOp(collection);
138
+ for (const query of querys) {
139
+ op.delete(query);
140
+ }
141
+ return await op.execute();
142
+ }
143
+ //# sourceMappingURL=BulkOp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BulkOp.js","sourceRoot":"","sources":["../../src/BulkOp.ts"],"names":[],"mappings":"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"}