@quereus/store 0.3.6 → 0.3.7

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 (54) hide show
  1. package/README.md +2 -2
  2. package/dist/src/common/ddl-generator.d.ts +15 -0
  3. package/dist/src/common/ddl-generator.d.ts.map +1 -0
  4. package/dist/src/common/ddl-generator.js +131 -0
  5. package/dist/src/common/ddl-generator.js.map +1 -0
  6. package/dist/src/common/encoding.d.ts +65 -0
  7. package/dist/src/common/encoding.d.ts.map +1 -0
  8. package/dist/src/common/encoding.js +339 -0
  9. package/dist/src/common/encoding.js.map +1 -0
  10. package/dist/src/common/events.d.ts +119 -0
  11. package/dist/src/common/events.d.ts.map +1 -0
  12. package/dist/src/common/events.js +158 -0
  13. package/dist/src/common/events.js.map +1 -0
  14. package/dist/src/common/index.d.ts +15 -0
  15. package/dist/src/common/index.d.ts.map +1 -0
  16. package/dist/src/common/index.js +23 -0
  17. package/dist/src/common/index.js.map +1 -0
  18. package/dist/src/common/key-builder.d.ts +58 -0
  19. package/dist/src/common/key-builder.d.ts.map +1 -0
  20. package/dist/src/common/key-builder.js +130 -0
  21. package/dist/src/common/key-builder.js.map +1 -0
  22. package/dist/src/common/kv-store.d.ts +150 -0
  23. package/dist/src/common/kv-store.d.ts.map +1 -0
  24. package/dist/src/common/kv-store.js +6 -0
  25. package/dist/src/common/kv-store.js.map +1 -0
  26. package/dist/src/common/memory-store.d.ts +37 -0
  27. package/dist/src/common/memory-store.d.ts.map +1 -0
  28. package/dist/src/common/memory-store.js +146 -0
  29. package/dist/src/common/memory-store.js.map +1 -0
  30. package/dist/src/common/serialization.d.ts +41 -0
  31. package/dist/src/common/serialization.d.ts.map +1 -0
  32. package/dist/src/common/serialization.js +111 -0
  33. package/dist/src/common/serialization.js.map +1 -0
  34. package/dist/src/common/store-connection.d.ts +34 -0
  35. package/dist/src/common/store-connection.d.ts.map +1 -0
  36. package/dist/src/common/store-connection.js +55 -0
  37. package/dist/src/common/store-connection.js.map +1 -0
  38. package/dist/src/common/store-module.d.ts +111 -0
  39. package/dist/src/common/store-module.d.ts.map +1 -0
  40. package/dist/src/common/store-module.js +331 -0
  41. package/dist/src/common/store-module.js.map +1 -0
  42. package/dist/src/common/store-table.d.ts +115 -0
  43. package/dist/src/common/store-table.d.ts.map +1 -0
  44. package/dist/src/common/store-table.js +472 -0
  45. package/dist/src/common/store-table.js.map +1 -0
  46. package/dist/src/common/transaction.d.ts +57 -0
  47. package/dist/src/common/transaction.d.ts.map +1 -0
  48. package/dist/src/common/transaction.js +156 -0
  49. package/dist/src/common/transaction.js.map +1 -0
  50. package/dist/src/index.d.ts +17 -0
  51. package/dist/src/index.d.ts.map +1 -0
  52. package/dist/src/index.js +18 -0
  53. package/dist/src/index.js.map +1 -0
  54. package/package.json +1 -1
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Reactive event types and emitter for schema and data changes.
3
+ */
4
+ import type { Row, SqlValue } from '@quereus/quereus';
5
+ /**
6
+ * Schema change event types.
7
+ */
8
+ export interface SchemaChangeEvent {
9
+ type: 'create' | 'alter' | 'drop';
10
+ objectType: 'table' | 'index';
11
+ schemaName: string;
12
+ objectName: string;
13
+ ddl?: string;
14
+ /** True if this event originated from sync (remote replica) or cross-tab. */
15
+ remote?: boolean;
16
+ }
17
+ /**
18
+ * Data change event types.
19
+ */
20
+ export interface DataChangeEvent {
21
+ type: 'insert' | 'update' | 'delete';
22
+ schemaName: string;
23
+ tableName: string;
24
+ /** Primary key values. Alias: pk */
25
+ key?: SqlValue[];
26
+ /** Primary key values. Alias: key */
27
+ pk?: SqlValue[];
28
+ oldRow?: Row;
29
+ newRow?: Row;
30
+ /** Column names that were changed (for update events). */
31
+ changedColumns?: string[];
32
+ /** True if this event originated from sync (remote replica) or cross-tab. */
33
+ remote?: boolean;
34
+ }
35
+ /**
36
+ * Event listener types.
37
+ */
38
+ export type SchemaChangeListener = (event: SchemaChangeEvent) => void;
39
+ export type DataChangeListener = (event: DataChangeEvent) => void;
40
+ /**
41
+ * Key for identifying a pending remote schema event.
42
+ */
43
+ interface PendingRemoteSchemaEvent {
44
+ type: 'create' | 'alter' | 'drop';
45
+ objectType: 'table' | 'index';
46
+ schemaName: string;
47
+ objectName: string;
48
+ }
49
+ /**
50
+ * Simple event emitter for store events.
51
+ */
52
+ export declare class StoreEventEmitter {
53
+ private schemaListeners;
54
+ private dataListeners;
55
+ private batchedDataEvents;
56
+ private isBatching;
57
+ /**
58
+ * Pending remote schema events that should be marked as remote when they arrive.
59
+ * Uses a Map with stringified key for O(1) lookup.
60
+ */
61
+ private pendingRemoteSchemaEvents;
62
+ /**
63
+ * Subscribe to schema change events.
64
+ * @returns Unsubscribe function.
65
+ */
66
+ onSchemaChange(listener: SchemaChangeListener): () => void;
67
+ /**
68
+ * Subscribe to data change events.
69
+ * @returns Unsubscribe function.
70
+ */
71
+ onDataChange(listener: DataChangeListener): () => void;
72
+ /**
73
+ * Emit a schema change event.
74
+ * If the event matches a pending remote event, it's automatically marked as remote.
75
+ */
76
+ emitSchemaChange(event: SchemaChangeEvent): void;
77
+ /**
78
+ * Create a unique key for a schema event signature.
79
+ */
80
+ private makeSchemaEventKey;
81
+ /**
82
+ * Register an expected remote schema event.
83
+ * When a matching event is emitted, it will be automatically marked as remote.
84
+ * Uses reference counting to handle concurrent applies of the same event type.
85
+ */
86
+ expectRemoteSchemaEvent(event: PendingRemoteSchemaEvent): void;
87
+ /**
88
+ * Clear an expected remote schema event (e.g., if the operation failed).
89
+ */
90
+ clearExpectedRemoteSchemaEvent(event: PendingRemoteSchemaEvent): void;
91
+ /**
92
+ * Emit a data change event.
93
+ * If batching is active, queues the event for later emission.
94
+ */
95
+ emitDataChange(event: DataChangeEvent): void;
96
+ /**
97
+ * Start batching data change events.
98
+ * Events will be queued until flush() or discard() is called.
99
+ */
100
+ startBatch(): void;
101
+ /**
102
+ * Flush batched data change events to listeners.
103
+ */
104
+ flushBatch(): void;
105
+ /**
106
+ * Discard batched data change events (e.g., on rollback).
107
+ */
108
+ discardBatch(): void;
109
+ /**
110
+ * Check if there are any listeners registered.
111
+ */
112
+ hasListeners(): boolean;
113
+ /**
114
+ * Remove all listeners.
115
+ */
116
+ removeAllListeners(): void;
117
+ }
118
+ export {};
119
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/common/events.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAClC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;IACjB,qCAAqC;IACrC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,6EAA6E;IAC7E,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;AACtE,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;AAElE;;GAEG;AACH,UAAU,wBAAwB;IAChC,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAClC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,eAAe,CAAwC;IAC/D,OAAO,CAAC,aAAa,CAAsC;IAC3D,OAAO,CAAC,iBAAiB,CAAyB;IAClD,OAAO,CAAC,UAAU,CAAS;IAC3B;;;OAGG;IACH,OAAO,CAAC,yBAAyB,CAAkC;IAEnE;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,IAAI;IAK1D;;;OAGG;IACH,YAAY,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,IAAI;IAKtD;;;OAGG;IACH,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAuBhD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;;;OAIG;IACH,uBAAuB,CAAC,KAAK,EAAE,wBAAwB,GAAG,IAAI;IAM9D;;OAEG;IACH,8BAA8B,CAAC,KAAK,EAAE,wBAAwB,GAAG,IAAI;IAYrE;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAe5C;;;OAGG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;IACH,UAAU,IAAI,IAAI;IAgBlB;;OAEG;IACH,YAAY,IAAI,IAAI;IAKpB;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,kBAAkB,IAAI,IAAI;CAM3B"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Reactive event types and emitter for schema and data changes.
3
+ */
4
+ /**
5
+ * Simple event emitter for store events.
6
+ */
7
+ export class StoreEventEmitter {
8
+ schemaListeners = new Set();
9
+ dataListeners = new Set();
10
+ batchedDataEvents = [];
11
+ isBatching = false;
12
+ /**
13
+ * Pending remote schema events that should be marked as remote when they arrive.
14
+ * Uses a Map with stringified key for O(1) lookup.
15
+ */
16
+ pendingRemoteSchemaEvents = new Map();
17
+ /**
18
+ * Subscribe to schema change events.
19
+ * @returns Unsubscribe function.
20
+ */
21
+ onSchemaChange(listener) {
22
+ this.schemaListeners.add(listener);
23
+ return () => this.schemaListeners.delete(listener);
24
+ }
25
+ /**
26
+ * Subscribe to data change events.
27
+ * @returns Unsubscribe function.
28
+ */
29
+ onDataChange(listener) {
30
+ this.dataListeners.add(listener);
31
+ return () => this.dataListeners.delete(listener);
32
+ }
33
+ /**
34
+ * Emit a schema change event.
35
+ * If the event matches a pending remote event, it's automatically marked as remote.
36
+ */
37
+ emitSchemaChange(event) {
38
+ // Check if this event matches a pending remote event
39
+ const key = this.makeSchemaEventKey(event);
40
+ const pendingCount = this.pendingRemoteSchemaEvents.get(key);
41
+ if (pendingCount !== undefined && pendingCount > 0) {
42
+ // Mark as remote and decrement the pending count
43
+ event = { ...event, remote: true };
44
+ if (pendingCount === 1) {
45
+ this.pendingRemoteSchemaEvents.delete(key);
46
+ }
47
+ else {
48
+ this.pendingRemoteSchemaEvents.set(key, pendingCount - 1);
49
+ }
50
+ }
51
+ for (const listener of this.schemaListeners) {
52
+ try {
53
+ listener(event);
54
+ }
55
+ catch (e) {
56
+ console.error('Schema change listener error:', e);
57
+ }
58
+ }
59
+ }
60
+ /**
61
+ * Create a unique key for a schema event signature.
62
+ */
63
+ makeSchemaEventKey(event) {
64
+ return `${event.type}:${event.objectType}:${event.schemaName.toLowerCase()}:${event.objectName.toLowerCase()}`;
65
+ }
66
+ /**
67
+ * Register an expected remote schema event.
68
+ * When a matching event is emitted, it will be automatically marked as remote.
69
+ * Uses reference counting to handle concurrent applies of the same event type.
70
+ */
71
+ expectRemoteSchemaEvent(event) {
72
+ const key = this.makeSchemaEventKey(event);
73
+ const current = this.pendingRemoteSchemaEvents.get(key) ?? 0;
74
+ this.pendingRemoteSchemaEvents.set(key, current + 1);
75
+ }
76
+ /**
77
+ * Clear an expected remote schema event (e.g., if the operation failed).
78
+ */
79
+ clearExpectedRemoteSchemaEvent(event) {
80
+ const key = this.makeSchemaEventKey(event);
81
+ const current = this.pendingRemoteSchemaEvents.get(key);
82
+ if (current !== undefined && current > 0) {
83
+ if (current === 1) {
84
+ this.pendingRemoteSchemaEvents.delete(key);
85
+ }
86
+ else {
87
+ this.pendingRemoteSchemaEvents.set(key, current - 1);
88
+ }
89
+ }
90
+ }
91
+ /**
92
+ * Emit a data change event.
93
+ * If batching is active, queues the event for later emission.
94
+ */
95
+ emitDataChange(event) {
96
+ if (this.isBatching) {
97
+ this.batchedDataEvents.push(event);
98
+ return;
99
+ }
100
+ for (const listener of this.dataListeners) {
101
+ try {
102
+ listener(event);
103
+ }
104
+ catch (e) {
105
+ console.error('Data change listener error:', e);
106
+ }
107
+ }
108
+ }
109
+ /**
110
+ * Start batching data change events.
111
+ * Events will be queued until flush() or discard() is called.
112
+ */
113
+ startBatch() {
114
+ this.isBatching = true;
115
+ this.batchedDataEvents = [];
116
+ }
117
+ /**
118
+ * Flush batched data change events to listeners.
119
+ */
120
+ flushBatch() {
121
+ this.isBatching = false;
122
+ const events = this.batchedDataEvents;
123
+ this.batchedDataEvents = [];
124
+ for (const event of events) {
125
+ for (const listener of this.dataListeners) {
126
+ try {
127
+ listener(event);
128
+ }
129
+ catch (e) {
130
+ console.error('Data change listener error:', e);
131
+ }
132
+ }
133
+ }
134
+ }
135
+ /**
136
+ * Discard batched data change events (e.g., on rollback).
137
+ */
138
+ discardBatch() {
139
+ this.isBatching = false;
140
+ this.batchedDataEvents = [];
141
+ }
142
+ /**
143
+ * Check if there are any listeners registered.
144
+ */
145
+ hasListeners() {
146
+ return this.schemaListeners.size > 0 || this.dataListeners.size > 0;
147
+ }
148
+ /**
149
+ * Remove all listeners.
150
+ */
151
+ removeAllListeners() {
152
+ this.schemaListeners.clear();
153
+ this.dataListeners.clear();
154
+ this.batchedDataEvents = [];
155
+ this.isBatching = false;
156
+ }
157
+ }
158
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/common/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Common utilities for the persistent store module.
3
+ */
4
+ export type { KVStore, KVEntry, WriteBatch, BatchOp, IterateOptions, KVStoreFactory, KVStoreOptions, KVStoreProvider, } from './kv-store.js';
5
+ export { encodeValue, encodeCompositeKey, decodeValue, decodeCompositeKey, registerCollationEncoder, getCollationEncoder, type CollationEncoder, type EncodeOptions, } from './encoding.js';
6
+ export { serializeRow, deserializeRow, serializeValue, deserializeValue, serializeStats, deserializeStats, type TableStats, } from './serialization.js';
7
+ export { KEY_PREFIX, buildDataKey, buildIndexKey, buildMetaKey, buildTablePrefix, buildTableScanBounds, buildIndexScanBounds, buildMetaScanBounds, } from './key-builder.js';
8
+ export { StoreEventEmitter, type SchemaChangeEvent, type DataChangeEvent, type SchemaChangeListener, type DataChangeListener, } from './events.js';
9
+ export { generateTableDDL, generateIndexDDL, } from './ddl-generator.js';
10
+ export { TransactionCoordinator, type TransactionCallbacks, } from './transaction.js';
11
+ export { InMemoryKVStore } from './memory-store.js';
12
+ export { StoreTable, type StoreTableConfig, type StoreTableModule, } from './store-table.js';
13
+ export { StoreConnection } from './store-connection.js';
14
+ export { StoreModule, type StoreModuleConfig } from './store-module.js';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EACV,OAAO,EACP,OAAO,EACP,UAAU,EACV,OAAO,EACP,cAAc,EACd,cAAc,EACd,cAAc,EACd,eAAe,GAChB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,aAAa,GACnB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,KAAK,UAAU,GAChB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,UAAU,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,iBAAiB,EACjB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,GACxB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,sBAAsB,EACtB,KAAK,oBAAoB,GAC1B,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EACL,UAAU,EACV,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Common utilities for the persistent store module.
3
+ */
4
+ // Key encoding
5
+ export { encodeValue, encodeCompositeKey, decodeValue, decodeCompositeKey, registerCollationEncoder, getCollationEncoder, } from './encoding.js';
6
+ // Row serialization
7
+ export { serializeRow, deserializeRow, serializeValue, deserializeValue, serializeStats, deserializeStats, } from './serialization.js';
8
+ // Key building
9
+ export { KEY_PREFIX, buildDataKey, buildIndexKey, buildMetaKey, buildTablePrefix, buildTableScanBounds, buildIndexScanBounds, buildMetaScanBounds, } from './key-builder.js';
10
+ // Events
11
+ export { StoreEventEmitter, } from './events.js';
12
+ // DDL generation
13
+ export { generateTableDDL, generateIndexDDL, } from './ddl-generator.js';
14
+ // Transaction support
15
+ export { TransactionCoordinator, } from './transaction.js';
16
+ // In-memory KV store
17
+ export { InMemoryKVStore } from './memory-store.js';
18
+ // Generic store table and connection
19
+ export { StoreTable, } from './store-table.js';
20
+ export { StoreConnection } from './store-connection.js';
21
+ // Generic store module
22
+ export { StoreModule } from './store-module.js';
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,eAAe;AACf,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,GAGpB,MAAM,eAAe,CAAC;AAEvB,oBAAoB;AACpB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,gBAAgB,GAEjB,MAAM,oBAAoB,CAAC;AAE5B,eAAe;AACf,OAAO,EACL,UAAU,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,SAAS;AACT,OAAO,EACL,iBAAiB,GAKlB,MAAM,aAAa,CAAC;AAErB,iBAAiB;AACjB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAE5B,sBAAsB;AACtB,OAAO,EACL,sBAAsB,GAEvB,MAAM,kBAAkB,CAAC;AAE1B,qBAAqB;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,qCAAqC;AACrC,OAAO,EACL,UAAU,GAGX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,uBAAuB;AACvB,OAAO,EAAE,WAAW,EAA0B,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Key builder utilities for constructing storage keys.
3
+ *
4
+ * Key prefixes:
5
+ * d: - Data rows
6
+ * i: - Secondary indexes
7
+ * m: - Metadata (DDL, stats)
8
+ */
9
+ import type { SqlValue } from '@quereus/quereus';
10
+ import { type EncodeOptions } from './encoding.js';
11
+ /** Key prefix bytes. */
12
+ export declare const KEY_PREFIX: {
13
+ readonly DATA: Uint8Array<ArrayBuffer>;
14
+ readonly INDEX: Uint8Array<ArrayBuffer>;
15
+ readonly META: Uint8Array<ArrayBuffer>;
16
+ };
17
+ /**
18
+ * Build a data row key.
19
+ * Format: d:{schema}.{table}:{encoded_pk}
20
+ */
21
+ export declare function buildDataKey(schemaName: string, tableName: string, pkValues: SqlValue[], options?: EncodeOptions): Uint8Array;
22
+ /**
23
+ * Build a secondary index key.
24
+ * Format: i:{schema}.{table}.{indexName}:{encoded_index_cols}:{encoded_pk}
25
+ */
26
+ export declare function buildIndexKey(schemaName: string, tableName: string, indexName: string, indexValues: SqlValue[], pkValues: SqlValue[], options?: EncodeOptions): Uint8Array;
27
+ /**
28
+ * Build a metadata key.
29
+ * Format: m:{type}:{schema}.{name}
30
+ */
31
+ export declare function buildMetaKey(metaType: 'ddl' | 'stats' | 'index', schemaName: string, objectName: string, subName?: string): Uint8Array;
32
+ /**
33
+ * Build a table prefix for range scans.
34
+ * Format: {prefix}:{schema}.{table}
35
+ */
36
+ export declare function buildTablePrefix(prefix: 'd' | 'i' | 'm', schemaName: string, tableName: string): Uint8Array;
37
+ /**
38
+ * Build range bounds for scanning all rows of a table.
39
+ */
40
+ export declare function buildTableScanBounds(schemaName: string, tableName: string): {
41
+ gte: Uint8Array;
42
+ lt: Uint8Array;
43
+ };
44
+ /**
45
+ * Build range bounds for scanning an index.
46
+ */
47
+ export declare function buildIndexScanBounds(schemaName: string, tableName: string, indexName: string, prefixValues?: SqlValue[], options?: EncodeOptions): {
48
+ gte: Uint8Array;
49
+ lt: Uint8Array;
50
+ };
51
+ /**
52
+ * Build range bounds for scanning all metadata of a type.
53
+ */
54
+ export declare function buildMetaScanBounds(metaType: 'ddl' | 'stats' | 'index', schemaName?: string): {
55
+ gte: Uint8Array;
56
+ lt: Uint8Array;
57
+ };
58
+ //# sourceMappingURL=key-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-builder.d.ts","sourceRoot":"","sources":["../../../src/common/key-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAIvE,wBAAwB;AACxB,eAAO,MAAM,UAAU;;;;CAIb,CAAC;AAKX;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,EAAE,EACpB,OAAO,CAAC,EAAE,aAAa,GACtB,UAAU,CAKZ;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,QAAQ,EAAE,EACvB,QAAQ,EAAE,QAAQ,EAAE,EACpB,OAAO,CAAC,EAAE,aAAa,GACtB,UAAU,CAMZ;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,KAAK,GAAG,OAAO,GAAG,OAAO,EACnC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,UAAU,CAMZ;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EACvB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,UAAU,CAEZ;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,UAAU,CAAA;CAAE,CAMrC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,QAAQ,EAAE,EACzB,OAAO,CAAC,EAAE,aAAa,GACtB;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,UAAU,CAAA;CAAE,CAiBrC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,KAAK,GAAG,OAAO,GAAG,OAAO,EACnC,UAAU,CAAC,EAAE,MAAM,GAClB;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,UAAU,CAAA;CAAE,CASrC"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Key builder utilities for constructing storage keys.
3
+ *
4
+ * Key prefixes:
5
+ * d: - Data rows
6
+ * i: - Secondary indexes
7
+ * m: - Metadata (DDL, stats)
8
+ */
9
+ import { encodeCompositeKey } from './encoding.js';
10
+ const encoder = new TextEncoder();
11
+ /** Key prefix bytes. */
12
+ export const KEY_PREFIX = {
13
+ DATA: encoder.encode('d:'),
14
+ INDEX: encoder.encode('i:'),
15
+ META: encoder.encode('m:'),
16
+ };
17
+ /** Separator between key components. */
18
+ const SEPARATOR = encoder.encode(':');
19
+ /**
20
+ * Build a data row key.
21
+ * Format: d:{schema}.{table}:{encoded_pk}
22
+ */
23
+ export function buildDataKey(schemaName, tableName, pkValues, options) {
24
+ const tablePrefix = buildTablePrefix('d', schemaName, tableName);
25
+ const pkEncoded = encodeCompositeKey(pkValues, options);
26
+ return concatBytes(tablePrefix, SEPARATOR, pkEncoded);
27
+ }
28
+ /**
29
+ * Build a secondary index key.
30
+ * Format: i:{schema}.{table}.{indexName}:{encoded_index_cols}:{encoded_pk}
31
+ */
32
+ export function buildIndexKey(schemaName, tableName, indexName, indexValues, pkValues, options) {
33
+ const prefix = encoder.encode(`i:${schemaName}.${tableName}.${indexName}:`);
34
+ const indexEncoded = encodeCompositeKey(indexValues, options);
35
+ const pkEncoded = encodeCompositeKey(pkValues, options);
36
+ return concatBytes(prefix, indexEncoded, SEPARATOR, pkEncoded);
37
+ }
38
+ /**
39
+ * Build a metadata key.
40
+ * Format: m:{type}:{schema}.{name}
41
+ */
42
+ export function buildMetaKey(metaType, schemaName, objectName, subName) {
43
+ let key = `m:${metaType}:${schemaName}.${objectName}`;
44
+ if (subName) {
45
+ key += `#${subName}`;
46
+ }
47
+ return encoder.encode(key);
48
+ }
49
+ /**
50
+ * Build a table prefix for range scans.
51
+ * Format: {prefix}:{schema}.{table}
52
+ */
53
+ export function buildTablePrefix(prefix, schemaName, tableName) {
54
+ return encoder.encode(`${prefix}:${schemaName}.${tableName}`);
55
+ }
56
+ /**
57
+ * Build range bounds for scanning all rows of a table.
58
+ */
59
+ export function buildTableScanBounds(schemaName, tableName) {
60
+ const prefix = `d:${schemaName}.${tableName}:`;
61
+ return {
62
+ gte: encoder.encode(prefix),
63
+ lt: incrementLastByte(encoder.encode(prefix)),
64
+ };
65
+ }
66
+ /**
67
+ * Build range bounds for scanning an index.
68
+ */
69
+ export function buildIndexScanBounds(schemaName, tableName, indexName, prefixValues, options) {
70
+ const prefix = `i:${schemaName}.${tableName}.${indexName}:`;
71
+ const prefixBytes = encoder.encode(prefix);
72
+ if (prefixValues && prefixValues.length > 0) {
73
+ const valueBytes = encodeCompositeKey(prefixValues, options);
74
+ const gte = concatBytes(prefixBytes, valueBytes);
75
+ return {
76
+ gte,
77
+ lt: incrementLastByte(gte),
78
+ };
79
+ }
80
+ return {
81
+ gte: prefixBytes,
82
+ lt: incrementLastByte(prefixBytes),
83
+ };
84
+ }
85
+ /**
86
+ * Build range bounds for scanning all metadata of a type.
87
+ */
88
+ export function buildMetaScanBounds(metaType, schemaName) {
89
+ let prefix = `m:${metaType}:`;
90
+ if (schemaName) {
91
+ prefix += `${schemaName}.`;
92
+ }
93
+ return {
94
+ gte: encoder.encode(prefix),
95
+ lt: incrementLastByte(encoder.encode(prefix)),
96
+ };
97
+ }
98
+ /**
99
+ * Increment the last byte of a key to create an exclusive upper bound.
100
+ */
101
+ function incrementLastByte(key) {
102
+ const result = new Uint8Array(key.length);
103
+ result.set(key);
104
+ // Increment from the end, handling overflow
105
+ for (let i = result.length - 1; i >= 0; i--) {
106
+ if (result[i] < 0xff) {
107
+ result[i]++;
108
+ return result;
109
+ }
110
+ result[i] = 0;
111
+ }
112
+ // All bytes were 0xff, append 0x00
113
+ const extended = new Uint8Array(result.length + 1);
114
+ extended.set(result);
115
+ return extended;
116
+ }
117
+ /**
118
+ * Concatenate multiple byte arrays.
119
+ */
120
+ function concatBytes(...arrays) {
121
+ const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);
122
+ const result = new Uint8Array(totalLength);
123
+ let offset = 0;
124
+ for (const arr of arrays) {
125
+ result.set(arr, offset);
126
+ offset += arr.length;
127
+ }
128
+ return result;
129
+ }
130
+ //# sourceMappingURL=key-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-builder.js","sourceRoot":"","sources":["../../../src/common/key-builder.ts"],"names":[],"mappings":"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"}