@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 @@
|
|
|
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":"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"}
|
|
@@ -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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"}
|