@zhin.js/database 1.0.0

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 (109) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/lib/base/database.d.ts +71 -0
  4. package/lib/base/database.d.ts.map +1 -0
  5. package/lib/base/database.js +101 -0
  6. package/lib/base/database.js.map +1 -0
  7. package/lib/base/dialect.d.ts +34 -0
  8. package/lib/base/dialect.d.ts.map +1 -0
  9. package/lib/base/dialect.js +21 -0
  10. package/lib/base/dialect.js.map +1 -0
  11. package/lib/base/index.d.ts +6 -0
  12. package/lib/base/index.d.ts.map +1 -0
  13. package/lib/base/index.js +6 -0
  14. package/lib/base/index.js.map +1 -0
  15. package/lib/base/model.d.ts +53 -0
  16. package/lib/base/model.d.ts.map +1 -0
  17. package/lib/base/model.js +65 -0
  18. package/lib/base/model.js.map +1 -0
  19. package/lib/base/query-classes.d.ts +68 -0
  20. package/lib/base/query-classes.d.ts.map +1 -0
  21. package/lib/base/query-classes.js +178 -0
  22. package/lib/base/query-classes.js.map +1 -0
  23. package/lib/base/thenable.d.ts +15 -0
  24. package/lib/base/thenable.d.ts.map +1 -0
  25. package/lib/base/thenable.js +33 -0
  26. package/lib/base/thenable.js.map +1 -0
  27. package/lib/dialects/memory.d.ts +52 -0
  28. package/lib/dialects/memory.d.ts.map +1 -0
  29. package/lib/dialects/memory.js +772 -0
  30. package/lib/dialects/memory.js.map +1 -0
  31. package/lib/dialects/mongodb.d.ts +85 -0
  32. package/lib/dialects/mongodb.d.ts.map +1 -0
  33. package/lib/dialects/mongodb.js +461 -0
  34. package/lib/dialects/mongodb.js.map +1 -0
  35. package/lib/dialects/mysql.d.ts +33 -0
  36. package/lib/dialects/mysql.d.ts.map +1 -0
  37. package/lib/dialects/mysql.js +132 -0
  38. package/lib/dialects/mysql.js.map +1 -0
  39. package/lib/dialects/pg.d.ts +33 -0
  40. package/lib/dialects/pg.d.ts.map +1 -0
  41. package/lib/dialects/pg.js +132 -0
  42. package/lib/dialects/pg.js.map +1 -0
  43. package/lib/dialects/redis.d.ts +87 -0
  44. package/lib/dialects/redis.d.ts.map +1 -0
  45. package/lib/dialects/redis.js +500 -0
  46. package/lib/dialects/redis.js.map +1 -0
  47. package/lib/dialects/sqlite.d.ts +46 -0
  48. package/lib/dialects/sqlite.d.ts.map +1 -0
  49. package/lib/dialects/sqlite.js +201 -0
  50. package/lib/dialects/sqlite.js.map +1 -0
  51. package/lib/index.d.ts +18 -0
  52. package/lib/index.d.ts.map +1 -0
  53. package/lib/index.js +18 -0
  54. package/lib/index.js.map +1 -0
  55. package/lib/registry.d.ts +37 -0
  56. package/lib/registry.d.ts.map +1 -0
  57. package/lib/registry.js +21 -0
  58. package/lib/registry.js.map +1 -0
  59. package/lib/type/document/database.d.ts +60 -0
  60. package/lib/type/document/database.d.ts.map +1 -0
  61. package/lib/type/document/database.js +242 -0
  62. package/lib/type/document/database.js.map +1 -0
  63. package/lib/type/document/model.d.ts +42 -0
  64. package/lib/type/document/model.d.ts.map +1 -0
  65. package/lib/type/document/model.js +65 -0
  66. package/lib/type/document/model.js.map +1 -0
  67. package/lib/type/keyvalue/database.d.ts +64 -0
  68. package/lib/type/keyvalue/database.d.ts.map +1 -0
  69. package/lib/type/keyvalue/database.js +214 -0
  70. package/lib/type/keyvalue/database.js.map +1 -0
  71. package/lib/type/keyvalue/model.d.ts +107 -0
  72. package/lib/type/keyvalue/model.d.ts.map +1 -0
  73. package/lib/type/keyvalue/model.js +261 -0
  74. package/lib/type/keyvalue/model.js.map +1 -0
  75. package/lib/type/related/database.d.ts +32 -0
  76. package/lib/type/related/database.d.ts.map +1 -0
  77. package/lib/type/related/database.js +334 -0
  78. package/lib/type/related/database.js.map +1 -0
  79. package/lib/type/related/model.d.ts +43 -0
  80. package/lib/type/related/model.d.ts.map +1 -0
  81. package/lib/type/related/model.js +108 -0
  82. package/lib/type/related/model.js.map +1 -0
  83. package/lib/types.d.ts +251 -0
  84. package/lib/types.d.ts.map +1 -0
  85. package/lib/types.js +28 -0
  86. package/lib/types.js.map +1 -0
  87. package/package.json +54 -0
  88. package/src/base/database.ts +128 -0
  89. package/src/base/dialect.ts +76 -0
  90. package/src/base/index.ts +5 -0
  91. package/src/base/model.ts +89 -0
  92. package/src/base/query-classes.ts +217 -0
  93. package/src/base/thenable.ts +54 -0
  94. package/src/dialects/memory.ts +880 -0
  95. package/src/dialects/mongodb.ts +533 -0
  96. package/src/dialects/mysql.ts +157 -0
  97. package/src/dialects/pg.ts +157 -0
  98. package/src/dialects/redis.ts +598 -0
  99. package/src/dialects/sqlite.ts +233 -0
  100. package/src/index.ts +20 -0
  101. package/src/registry.ts +59 -0
  102. package/src/type/document/database.ts +283 -0
  103. package/src/type/document/model.ts +86 -0
  104. package/src/type/keyvalue/database.ts +261 -0
  105. package/src/type/keyvalue/model.ts +339 -0
  106. package/src/type/related/database.ts +392 -0
  107. package/src/type/related/model.ts +117 -0
  108. package/src/types.ts +403 -0
  109. package/tsconfig.json +24 -0
@@ -0,0 +1,42 @@
1
+ import { Model } from '../../base';
2
+ import { DocumentDatabase } from './database.js';
3
+ import { DocumentQueryResult } from '../../types.js';
4
+ /**
5
+ * 文档型模型类
6
+ * 继承自 Model,提供文档型数据库特有的操作
7
+ */
8
+ export declare class DocumentModel<T extends object = object, D = any> extends Model<D, T, DocumentQueryResult> {
9
+ constructor(database: DocumentDatabase<D>, name: string);
10
+ /**
11
+ * 创建文档
12
+ */
13
+ create(document: T): Promise<T & {
14
+ _id: string;
15
+ }>;
16
+ create(documents: T[]): Promise<(T & {
17
+ _id: string;
18
+ })[]>;
19
+ /**
20
+ * 查找单个文档
21
+ */
22
+ selectOne<K extends keyof T>(...fields: Array<K>): Promise<(Pick<T, K> & {
23
+ _id: string;
24
+ }) | null>;
25
+ /**
26
+ * 根据ID查找文档
27
+ */
28
+ selectById(id: string): Promise<any>;
29
+ /**
30
+ * 根据ID更新文档
31
+ */
32
+ updateById(id: string, update: Partial<T>): Promise<number>;
33
+ /**
34
+ * 根据ID删除文档
35
+ */
36
+ deleteById(id: string): Promise<number>;
37
+ /**
38
+ * 生成文档ID
39
+ */
40
+ private generateId;
41
+ }
42
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/type/document/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAC,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAa,MAAM,gBAAgB,CAAC;AAEhE;;;GAGG;AACH,qBAAa,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,GAAE,GAAG,CAAE,SAAQ,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,mBAAmB,CAAC;gBAElG,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAC7B,IAAI,EAAE,MAAM;IAKd;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IAyB9D;;OAEG;IACG,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IAKvG;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM;IAK3B;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAMjE;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM7C;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB"}
@@ -0,0 +1,65 @@
1
+ import { Model } from '../../base';
2
+ /**
3
+ * 文档型模型类
4
+ * 继承自 Model,提供文档型数据库特有的操作
5
+ */
6
+ export class DocumentModel extends Model {
7
+ constructor(database, name) {
8
+ super(database, name);
9
+ }
10
+ async create(documents) {
11
+ const isArray = Array.isArray(documents);
12
+ const docs = isArray ? documents : [documents];
13
+ const results = [];
14
+ for (const doc of docs) {
15
+ const _id = this.generateId();
16
+ const docWithId = { ...doc, _id };
17
+ await this.dialect.query({
18
+ operation: 'insertOne',
19
+ filter: {},
20
+ projection: {},
21
+ collection: this.name,
22
+ }, [docWithId]);
23
+ results.push(docWithId);
24
+ }
25
+ return isArray ? results : results[0];
26
+ }
27
+ /**
28
+ * 查找单个文档
29
+ */
30
+ async selectOne(...fields) {
31
+ const results = await this.select(...fields).limit(1);
32
+ return results.length > 0 ? results[0] : null;
33
+ }
34
+ /**
35
+ * 根据ID查找文档
36
+ */
37
+ async selectById(id) {
38
+ return this.select('_id').where({
39
+ _id: id,
40
+ }).limit(1).then((results) => results[0] || null);
41
+ }
42
+ /**
43
+ * 根据ID更新文档
44
+ */
45
+ async updateById(id, update) {
46
+ return this.update(update).where({
47
+ _id: id,
48
+ });
49
+ }
50
+ /**
51
+ * 根据ID删除文档
52
+ */
53
+ async deleteById(id) {
54
+ return this.delete({
55
+ _id: id,
56
+ });
57
+ }
58
+ /**
59
+ * 生成文档ID
60
+ */
61
+ generateId() {
62
+ return Math.random().toString(36).substr(2, 9) + Date.now().toString(36);
63
+ }
64
+ }
65
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/type/document/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAC,MAAM,YAAY,CAAC;AAIlC;;;GAGG;AACH,MAAM,OAAO,aAAiD,SAAQ,KAAgC;IACpG,YACE,QAA6B,EAC7B,IAAY;QAEZ,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;IAOD,KAAK,CAAC,MAAM,CAAC,SAAkB;QAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAE/C,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;YAElC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CACtB;gBACE,SAAS,EAAE,WAAW;gBACtB,MAAM,EAAE,EAAE;gBACV,UAAU,EAAE,EAAE;gBACd,UAAU,EAAE,IAAI,CAAC,IAAI;aACtB,EACD,CAAC,SAAS,CAAC,CACZ,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAoB,GAAG,MAAgB;QACpD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtD,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAmC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,EAAU;QACzB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAY,CAAC,CAAC,KAAK,CAAC;YACrC,GAAG,EAAE,EAAE;SACR,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IACzD,CAAC;IACD;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,MAAkB;QAC7C,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC;YAC/B,GAAG,EAAE,EAAE;SACQ,CAAC,CAAA;IACpB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,EAAU;QACzB,OAAO,IAAI,CAAC,MAAM,CAAC;YACjB,GAAG,EAAE,EAAE;SACQ,CAAC,CAAA;IACpB,CAAC;IAED;;OAEG;IACK,UAAU;QAChB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;CACF"}
@@ -0,0 +1,64 @@
1
+ import { Database, Dialect } from '../../base';
2
+ import { KeyValueModel } from './model.js';
3
+ import { QueryParams, BuildQueryResult, KeyValueQueryResult, CreateQueryParams, SelectQueryParams, InsertQueryParams, UpdateQueryParams, DeleteQueryParams, AlterQueryParams, DropTableQueryParams, DropIndexQueryParams } from '../../types.js';
4
+ /**
5
+ * 键值数据库类
6
+ * 支持简单的键值对存储
7
+ */
8
+ export declare class KeyValueDatabase<D = any, S extends Record<string, object> = Record<string, object>> extends Database<D, S, KeyValueQueryResult> {
9
+ constructor(dialect: Dialect<D, KeyValueQueryResult>, schemas?: Database.Schemas<S>);
10
+ protected initialize(): Promise<void>;
11
+ /**
12
+ * 构建查询(重写基类方法)
13
+ */
14
+ buildQuery<U extends object = any>(params: QueryParams<U>): BuildQueryResult<KeyValueQueryResult>;
15
+ /**
16
+ * 构建创建桶查询
17
+ */
18
+ protected buildCreateQuery<T extends object>(params: CreateQueryParams<T>): BuildQueryResult<KeyValueQueryResult>;
19
+ /**
20
+ * 构建查询键值查询
21
+ */
22
+ protected buildSelectQuery<T extends object>(params: SelectQueryParams<T>): BuildQueryResult<KeyValueQueryResult>;
23
+ /**
24
+ * 构建插入键值查询
25
+ */
26
+ protected buildInsertQuery<T extends object>(params: InsertQueryParams<T>): BuildQueryResult<KeyValueQueryResult>;
27
+ /**
28
+ * 构建更新键值查询
29
+ */
30
+ protected buildUpdateQuery<T extends object>(params: UpdateQueryParams<T>): BuildQueryResult<KeyValueQueryResult>;
31
+ /**
32
+ * 构建删除键值查询
33
+ */
34
+ protected buildDeleteQuery<T extends object>(params: DeleteQueryParams<T>): BuildQueryResult<KeyValueQueryResult>;
35
+ /**
36
+ * 构建修改桶查询
37
+ */
38
+ protected buildAlterQuery<T extends object>(params: AlterQueryParams<T>): BuildQueryResult<KeyValueQueryResult>;
39
+ /**
40
+ * 构建删除桶查询
41
+ */
42
+ protected buildDropTableQuery<T extends object>(params: DropTableQueryParams<T>): BuildQueryResult<KeyValueQueryResult>;
43
+ /**
44
+ * 构建删除索引查询
45
+ */
46
+ protected buildDropIndexQuery(params: DropIndexQueryParams): BuildQueryResult<KeyValueQueryResult>;
47
+ /**
48
+ * 从条件中提取键名
49
+ */
50
+ private extractKeyFromCondition;
51
+ /**
52
+ * 从数据中提取键名
53
+ */
54
+ private extractKeyFromData;
55
+ /**
56
+ * 获取模型
57
+ */
58
+ model<T extends keyof S>(name: T): KeyValueModel<S[T], D>;
59
+ /**
60
+ * 获取所有模型名称
61
+ */
62
+ getModelNames(): string[];
63
+ }
64
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/type/keyvalue/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EAEnB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AAExB;;;GAGG;AACH,qBAAa,gBAAgB,CAC3B,CAAC,GAAC,GAAG,EACL,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CACzD,SAAQ,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,mBAAmB,CAAC;gBAGzC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAC,mBAAmB,CAAC,EACvC,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;cAKf,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3C;;OAEG;IACH,UAAU,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,mBAAmB,CAAC;IAuBjG;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,mBAAmB,CAAC;IAUjH;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,mBAAmB,CAAC;IAsBjH;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,mBAAmB,CAAC;IAcjH;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,mBAAmB,CAAC;IAcjH;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,mBAAmB,CAAC;IAajH;;OAEG;IACH,SAAS,CAAC,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,mBAAmB,CAAC;IAU/G;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,mBAAmB,CAAC;IAUvH;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,GAAG,gBAAgB,CAAC,mBAAmB,CAAC;IAUlG;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA0B/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkB1B;;OAEG;IACH,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IASzD;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE;CAG1B"}
@@ -0,0 +1,214 @@
1
+ import { Database } from '../../base';
2
+ import { KeyValueModel } from './model.js';
3
+ /**
4
+ * 键值数据库类
5
+ * 支持简单的键值对存储
6
+ */
7
+ export class KeyValueDatabase extends Database {
8
+ constructor(dialect, schemas) {
9
+ super(dialect, schemas);
10
+ }
11
+ async initialize() {
12
+ // 键值数据库不需要预定义表结构
13
+ // 桶会在第一次使用时自动创建
14
+ }
15
+ /**
16
+ * 构建查询(重写基类方法)
17
+ */
18
+ buildQuery(params) {
19
+ switch (params.type) {
20
+ case 'create':
21
+ return this.buildCreateQuery(params);
22
+ case 'select':
23
+ return this.buildSelectQuery(params);
24
+ case 'insert':
25
+ return this.buildInsertQuery(params);
26
+ case 'update':
27
+ return this.buildUpdateQuery(params);
28
+ case 'delete':
29
+ return this.buildDeleteQuery(params);
30
+ case 'alter':
31
+ return this.buildAlterQuery(params);
32
+ case 'drop_table':
33
+ return this.buildDropTableQuery(params);
34
+ case 'drop_index':
35
+ return this.buildDropIndexQuery(params);
36
+ default:
37
+ throw new Error(`Unsupported query type: ${params.type}`);
38
+ }
39
+ }
40
+ /**
41
+ * 构建创建桶查询
42
+ */
43
+ buildCreateQuery(params) {
44
+ return {
45
+ query: {
46
+ bucket: params.tableName,
47
+ operation: 'keys'
48
+ },
49
+ params: []
50
+ };
51
+ }
52
+ /**
53
+ * 构建查询键值查询
54
+ */
55
+ buildSelectQuery(params) {
56
+ // 键值数据库的查询通常是获取所有键或特定键
57
+ const query = {
58
+ bucket: params.tableName,
59
+ operation: 'keys'
60
+ };
61
+ // 如果有条件,尝试提取键名
62
+ if (params.conditions) {
63
+ const key = this.extractKeyFromCondition(params.conditions);
64
+ if (key) {
65
+ query.operation = 'get';
66
+ query.key = key;
67
+ }
68
+ }
69
+ return {
70
+ query,
71
+ params: []
72
+ };
73
+ }
74
+ /**
75
+ * 构建插入键值查询
76
+ */
77
+ buildInsertQuery(params) {
78
+ const key = this.extractKeyFromData(params.data);
79
+ return {
80
+ query: {
81
+ bucket: params.tableName,
82
+ operation: 'set',
83
+ key: key || 'default',
84
+ value: params.data
85
+ },
86
+ params: [params.data]
87
+ };
88
+ }
89
+ /**
90
+ * 构建更新键值查询
91
+ */
92
+ buildUpdateQuery(params) {
93
+ const key = this.extractKeyFromCondition(params.conditions);
94
+ return {
95
+ query: {
96
+ bucket: params.tableName,
97
+ operation: 'set',
98
+ key: key || 'default',
99
+ value: params.update
100
+ },
101
+ params: [params.update]
102
+ };
103
+ }
104
+ /**
105
+ * 构建删除键值查询
106
+ */
107
+ buildDeleteQuery(params) {
108
+ const key = this.extractKeyFromCondition(params.conditions);
109
+ return {
110
+ query: {
111
+ bucket: params.tableName,
112
+ operation: 'delete',
113
+ key: key || 'default'
114
+ },
115
+ params: []
116
+ };
117
+ }
118
+ /**
119
+ * 构建修改桶查询
120
+ */
121
+ buildAlterQuery(params) {
122
+ return {
123
+ query: {
124
+ bucket: params.tableName,
125
+ operation: 'keys'
126
+ },
127
+ params: [params.alterations]
128
+ };
129
+ }
130
+ /**
131
+ * 构建删除桶查询
132
+ */
133
+ buildDropTableQuery(params) {
134
+ return {
135
+ query: {
136
+ bucket: params.tableName,
137
+ operation: 'clear'
138
+ },
139
+ params: []
140
+ };
141
+ }
142
+ /**
143
+ * 构建删除索引查询
144
+ */
145
+ buildDropIndexQuery(params) {
146
+ return {
147
+ query: {
148
+ bucket: params.tableName,
149
+ operation: 'keys'
150
+ },
151
+ params: [params.indexName]
152
+ };
153
+ }
154
+ /**
155
+ * 从条件中提取键名
156
+ */
157
+ extractKeyFromCondition(condition) {
158
+ if (typeof condition !== 'object' || condition === null) {
159
+ return null;
160
+ }
161
+ // 查找 key 字段
162
+ if ('key' in condition) {
163
+ return condition.key;
164
+ }
165
+ // 查找 id 字段
166
+ if ('id' in condition) {
167
+ return condition.id;
168
+ }
169
+ // 递归查找
170
+ for (const value of Object.values(condition)) {
171
+ if (typeof value === 'object' && value !== null) {
172
+ const result = this.extractKeyFromCondition(value);
173
+ if (result)
174
+ return result;
175
+ }
176
+ }
177
+ return null;
178
+ }
179
+ /**
180
+ * 从数据中提取键名
181
+ */
182
+ extractKeyFromData(data) {
183
+ if (typeof data !== 'object' || data === null) {
184
+ return null;
185
+ }
186
+ // 查找 key 字段
187
+ if ('key' in data) {
188
+ return data.key;
189
+ }
190
+ // 查找 id 字段
191
+ if ('id' in data) {
192
+ return data.id;
193
+ }
194
+ return null;
195
+ }
196
+ /**
197
+ * 获取模型
198
+ */
199
+ model(name) {
200
+ let model = this.models.get(name);
201
+ if (!model) {
202
+ model = new KeyValueModel(this, name);
203
+ this.models.set(name, model);
204
+ }
205
+ return model;
206
+ }
207
+ /**
208
+ * 获取所有模型名称
209
+ */
210
+ getModelNames() {
211
+ return Object.keys(this.schemas || {});
212
+ }
213
+ }
214
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/type/keyvalue/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ import { Model } from '../../base';
2
+ import { KeyValueDatabase } from './database.js';
3
+ import { KeyValueQueryResult } from '../../types.js';
4
+ /**
5
+ * 键值模型类
6
+ * 继承自 Model,提供键值数据库特有的操作
7
+ */
8
+ export declare class KeyValueModel<T extends object = object, D = any> extends Model<D, T, KeyValueQueryResult> {
9
+ constructor(database: KeyValueDatabase<D>, name: string);
10
+ /**
11
+ * 设置键值对
12
+ */
13
+ set(key: string, value: any, ttl?: number): Promise<void>;
14
+ /**
15
+ * 获取值
16
+ */
17
+ get<V = any>(key: string): Promise<V | null>;
18
+ /**
19
+ * 删除键
20
+ */
21
+ deleteByKey(key: string): Promise<boolean>;
22
+ /**
23
+ * 检查键是否存在
24
+ */
25
+ has(key: string): Promise<boolean>;
26
+ /**
27
+ * 获取所有键
28
+ */
29
+ keys(): Promise<string[]>;
30
+ /**
31
+ * 获取所有值
32
+ */
33
+ values<V = any>(): Promise<V[]>;
34
+ /**
35
+ * 获取所有键值对
36
+ */
37
+ entries<V = any>(): Promise<Array<[string, V]>>;
38
+ /**
39
+ * 清空桶
40
+ */
41
+ clear(): Promise<void>;
42
+ /**
43
+ * 获取桶大小
44
+ */
45
+ size(): Promise<number>;
46
+ /**
47
+ * 批量设置
48
+ */
49
+ setMany(entries: Array<[string, any]>, ttl?: number): Promise<void>;
50
+ /**
51
+ * 设置过期时间
52
+ */
53
+ expire(key: string, ttl: number): Promise<boolean>;
54
+ /**
55
+ * 获取剩余过期时间(秒)
56
+ */
57
+ ttl(key: string): Promise<number | null>;
58
+ /**
59
+ * 移除过期时间
60
+ */
61
+ persist(key: string): Promise<boolean>;
62
+ /**
63
+ * 清理过期键
64
+ */
65
+ cleanup(): Promise<number>;
66
+ /**
67
+ * 获取键的模式匹配
68
+ */
69
+ keysByPattern(pattern: string): Promise<string[]>;
70
+ /**
71
+ * 原子操作:如果不存在则设置
72
+ */
73
+ setIfNotExists(key: string, value: any, ttl?: number): Promise<boolean>;
74
+ /**
75
+ * 原子操作:如果存在则设置
76
+ */
77
+ setIfExists(key: string, value: any, ttl?: number): Promise<boolean>;
78
+ /**
79
+ * 原子操作:获取并设置
80
+ */
81
+ getAndSet<V = any>(key: string, value: any, ttl?: number): Promise<V | null>;
82
+ /**
83
+ * 原子操作:删除并获取
84
+ */
85
+ deleteAndGet<V = any>(key: string): Promise<V | null>;
86
+ /**
87
+ * 创建数据(键值数据库的创建就是设置)
88
+ */
89
+ create(data: T): Promise<T>;
90
+ /**
91
+ * 查找单个数据
92
+ */
93
+ selectOne(query: {
94
+ key: string;
95
+ }): Promise<any>;
96
+ /**
97
+ * 统计数量
98
+ */
99
+ count(): Promise<number>;
100
+ /**
101
+ * 检查是否存在
102
+ */
103
+ exists(query: {
104
+ key: string;
105
+ }): Promise<boolean>;
106
+ }
107
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/type/keyvalue/model.ts"],"names":[],"mappings":"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"}