boundlessdb 0.7.0 → 0.9.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.
- package/CHANGELOG.md +129 -0
- package/README.md +97 -135
- package/dist/browser.d.ts +3 -3
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +2 -2
- package/dist/browser.js.map +1 -1
- package/dist/event-store.d.ts +3 -1
- package/dist/event-store.d.ts.map +1 -1
- package/dist/event-store.js +52 -14
- package/dist/event-store.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/query-builder.d.ts +28 -15
- package/dist/query-builder.d.ts.map +1 -1
- package/dist/query-builder.js +48 -17
- package/dist/query-builder.js.map +1 -1
- package/dist/storage/memory.d.ts.map +1 -1
- package/dist/storage/memory.js +14 -1
- package/dist/storage/memory.js.map +1 -1
- package/dist/storage/postgres.d.ts +19 -1
- package/dist/storage/postgres.d.ts.map +1 -1
- package/dist/storage/postgres.js +160 -6
- package/dist/storage/postgres.js.map +1 -1
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +153 -3
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/storage/sqljs.d.ts.map +1 -1
- package/dist/storage/sqljs.js +87 -3
- package/dist/storage/sqljs.js.map +1 -1
- package/dist/types.d.ts +48 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +16 -4
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/event-store.browser.d.ts +0 -82
- package/dist/event-store.browser.d.ts.map +0 -1
- package/dist/event-store.browser.js +0 -336
- package/dist/event-store.browser.js.map +0 -1
package/dist/event-store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-store.js","sourceRoot":"","sources":["../src/event-store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"event-store.js","sourceRoot":"","sources":["../src/event-store.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* DCB Event Store - Public API
|
|
3
3
|
*/
|
|
4
|
-
export type { Event, EventWithMetadata, StoredEvent, Query, QueryCondition, UnconstrainedCondition, ConstrainedCondition, MultiKeyConstrainedCondition, ConsistencyConfig, ConsistencyKeyDef, EventTypeConfig, ExtractedKey, AppendResult, ConflictResult, AppendCondition, EventStoreOptions, } from './types.js';
|
|
5
|
-
export { QueryResult, isConflict, isConstrainedCondition, isMultiKeyCondition, normalizeCondition, hasKeys } from './types.js';
|
|
4
|
+
export type { Event, EventWithMetadata, StoredEvent, Query, QueryCondition, UnconstrainedCondition, ConstrainedCondition, MultiKeyConstrainedCondition, MultiTypeCondition, MultiTypeConstrainedCondition, KeyOnlyCondition, ConsistencyConfig, ConsistencyKeyDef, EventTypeConfig, ExtractedKey, AppendResult, ConflictResult, AppendCondition, EventStoreOptions, } from './types.js';
|
|
5
|
+
export { QueryResult, isConflict, isConstrainedCondition, isMultiKeyCondition, isMultiTypeCondition, isMultiTypeConstrainedCondition, isKeyOnlyCondition, normalizeCondition, hasKeys } from './types.js';
|
|
6
6
|
export { EventStore, createEventStore, type EventStoreConfig } from './event-store.js';
|
|
7
7
|
export type { EventStorage, EventToStore } from './storage/interface.js';
|
|
8
8
|
export { InMemoryStorage } from './storage/memory.js';
|
|
9
9
|
export { SqliteStorage } from './storage/sqlite.js';
|
|
10
10
|
export { SqlJsStorage, type SqlJsStorageOptions } from './storage/sqljs.js';
|
|
11
|
-
export { PostgresStorage } from './storage/postgres.js';
|
|
11
|
+
export { PostgresStorage, type PostgresRetryOptions } from './storage/postgres.js';
|
|
12
12
|
export { KeyExtractor, KeyExtractionError } from './config/extractor.js';
|
|
13
13
|
export { validateConfig, ConfigValidationError } from './config/validator.js';
|
|
14
14
|
export { QueryBuilder } from './query-builder.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EAEV,KAAK,EACL,iBAAiB,EACjB,WAAW,EAEX,KAAK,EACL,cAAc,EACd,sBAAsB,EACtB,oBAAoB,EACpB,4BAA4B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EAEV,KAAK,EACL,iBAAiB,EACjB,WAAW,EAEX,KAAK,EACL,cAAc,EACd,sBAAsB,EACtB,oBAAoB,EACpB,4BAA4B,EAC5B,kBAAkB,EAClB,6BAA6B,EAC7B,gBAAgB,EAEhB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,YAAY,EAEZ,YAAY,EACZ,cAAc,EACd,eAAe,EACf,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,+BAA+B,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1M,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGvF,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAGnF,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAG9E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* DCB Event Store - Public API
|
|
3
3
|
*/
|
|
4
|
-
export { QueryResult, isConflict, isConstrainedCondition, isMultiKeyCondition, normalizeCondition, hasKeys } from './types.js';
|
|
4
|
+
export { QueryResult, isConflict, isConstrainedCondition, isMultiKeyCondition, isMultiTypeCondition, isMultiTypeConstrainedCondition, isKeyOnlyCondition, normalizeCondition, hasKeys } from './types.js';
|
|
5
5
|
// Event Store
|
|
6
6
|
export { EventStore, createEventStore } from './event-store.js';
|
|
7
7
|
export { InMemoryStorage } from './storage/memory.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6BH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,+BAA+B,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1M,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAyB,MAAM,kBAAkB,CAAC;AAIvF,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAA4B,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAA6B,MAAM,uBAAuB,CAAC;AAEnF,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9E,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/query-builder.d.ts
CHANGED
|
@@ -22,15 +22,15 @@ export interface QueryExecutor<E extends Event> {
|
|
|
22
22
|
* // Multi-key AND query:
|
|
23
23
|
* const result = await store.query<CourseEvent>()
|
|
24
24
|
* .matchType('StudentSubscribed')
|
|
25
|
-
* .
|
|
26
|
-
* .
|
|
25
|
+
* .andKey('course', 'cs101')
|
|
26
|
+
* .andKey('student', 'alice')
|
|
27
27
|
* .read();
|
|
28
28
|
*
|
|
29
29
|
* // Mixed (AND + OR):
|
|
30
30
|
* const result = await store.query<CourseEvent>()
|
|
31
31
|
* .matchType('StudentSubscribed')
|
|
32
|
-
* .
|
|
33
|
-
* .
|
|
32
|
+
* .andKey('course', 'cs101')
|
|
33
|
+
* .andKey('student', 'alice') // AND on condition 0
|
|
34
34
|
* .matchTypeAndKey('CourseCancelled', 'course', 'cs101') // OR (condition 1)
|
|
35
35
|
* .read();
|
|
36
36
|
* ```
|
|
@@ -42,28 +42,41 @@ export declare class QueryBuilder<E extends Event> {
|
|
|
42
42
|
private _limit?;
|
|
43
43
|
constructor(executor: QueryExecutor<E>);
|
|
44
44
|
/**
|
|
45
|
-
* Add an unconstrained condition (match
|
|
46
|
-
* Use `.
|
|
45
|
+
* Add an unconstrained condition (match events of one or more types).
|
|
46
|
+
* Use `.andKey()` after to add key constraints (AND).
|
|
47
47
|
*
|
|
48
48
|
* @example
|
|
49
49
|
* ```typescript
|
|
50
|
-
* .matchType('CourseCreated') //
|
|
51
|
-
* .matchType('
|
|
50
|
+
* .matchType('CourseCreated') // single type
|
|
51
|
+
* .matchType('CourseCreated', 'CourseCancelled') // multiple types (OR within)
|
|
52
|
+
* .matchType('StudentSubscribed').andKey('course', 'cs101') // type + key
|
|
52
53
|
* ```
|
|
53
54
|
*/
|
|
54
|
-
matchType(
|
|
55
|
+
matchType(...types: string[]): this;
|
|
55
56
|
/**
|
|
56
57
|
* Add a constrained condition (match events of type where key equals value).
|
|
57
|
-
* Shorthand for `.matchType(type).
|
|
58
|
-
* Use `.
|
|
58
|
+
* Shorthand for `.matchType(type).andKey(key, value)`.
|
|
59
|
+
* Use `.andKey()` after to add more key constraints (AND).
|
|
59
60
|
*
|
|
60
61
|
* @example
|
|
61
62
|
* ```typescript
|
|
62
63
|
* .matchTypeAndKey('StudentSubscribed', 'course', 'cs101')
|
|
63
|
-
* .matchTypeAndKey('StudentSubscribed', 'course', 'cs101').
|
|
64
|
+
* .matchTypeAndKey('StudentSubscribed', 'course', 'cs101').andKey('student', 'alice')
|
|
64
65
|
* ```
|
|
65
66
|
*/
|
|
66
67
|
matchTypeAndKey(type: string, key: string, value: string): this;
|
|
68
|
+
/**
|
|
69
|
+
* Key-only query: match events by key, regardless of event type.
|
|
70
|
+
* Starts a new condition (OR with previous conditions).
|
|
71
|
+
* Use `.andKey()` after to add more key constraints (AND).
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```typescript
|
|
75
|
+
* .matchKey('cart', 'abc-123') // all events with cart=abc-123
|
|
76
|
+
* .matchKey('course', 'cs101').andKey('student', 'alice') // AND
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
matchKey(key: string, value: string): this;
|
|
67
80
|
/**
|
|
68
81
|
* Add a key constraint to the last condition (AND).
|
|
69
82
|
* Must be called after `.matchType()` or `.matchTypeAndKey()`.
|
|
@@ -73,11 +86,11 @@ export declare class QueryBuilder<E extends Event> {
|
|
|
73
86
|
* @example
|
|
74
87
|
* ```typescript
|
|
75
88
|
* .matchType('StudentSubscribed')
|
|
76
|
-
* .
|
|
77
|
-
* .
|
|
89
|
+
* .andKey('course', 'cs101')
|
|
90
|
+
* .andKey('student', 'alice') // AND: both keys must match
|
|
78
91
|
* ```
|
|
79
92
|
*/
|
|
80
|
-
|
|
93
|
+
andKey(key: string, value: string): this;
|
|
81
94
|
/**
|
|
82
95
|
* Start reading from a specific position.
|
|
83
96
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-builder.d.ts","sourceRoot":"","sources":["../src/query-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"query-builder.d.ts","sourceRoot":"","sources":["../src/query-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAsE,MAAM,YAAY,CAAC;AAEzI,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,KAAK;IAC5C,IAAI,CAAC,KAAK,EAAE;QACV,UAAU,EAAE,cAAc,EAAE,CAAC;QAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS,KAAK;IAK3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJrC,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEK,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;IAEvD;;;;;;;;;;OAUG;IACH,SAAS,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAYnC;;;;;;;;;;OAUG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAK/D;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1C;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAoCxC;;;;;;;OAOG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKpC;;;;;;;OAOG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CAOtC"}
|
package/dist/query-builder.js
CHANGED
|
@@ -14,15 +14,15 @@
|
|
|
14
14
|
* // Multi-key AND query:
|
|
15
15
|
* const result = await store.query<CourseEvent>()
|
|
16
16
|
* .matchType('StudentSubscribed')
|
|
17
|
-
* .
|
|
18
|
-
* .
|
|
17
|
+
* .andKey('course', 'cs101')
|
|
18
|
+
* .andKey('student', 'alice')
|
|
19
19
|
* .read();
|
|
20
20
|
*
|
|
21
21
|
* // Mixed (AND + OR):
|
|
22
22
|
* const result = await store.query<CourseEvent>()
|
|
23
23
|
* .matchType('StudentSubscribed')
|
|
24
|
-
* .
|
|
25
|
-
* .
|
|
24
|
+
* .andKey('course', 'cs101')
|
|
25
|
+
* .andKey('student', 'alice') // AND on condition 0
|
|
26
26
|
* .matchTypeAndKey('CourseCancelled', 'course', 'cs101') // OR (condition 1)
|
|
27
27
|
* .read();
|
|
28
28
|
* ```
|
|
@@ -36,34 +36,58 @@ export class QueryBuilder {
|
|
|
36
36
|
this.executor = executor;
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
39
|
-
* Add an unconstrained condition (match
|
|
40
|
-
* Use `.
|
|
39
|
+
* Add an unconstrained condition (match events of one or more types).
|
|
40
|
+
* Use `.andKey()` after to add key constraints (AND).
|
|
41
41
|
*
|
|
42
42
|
* @example
|
|
43
43
|
* ```typescript
|
|
44
|
-
* .matchType('CourseCreated') //
|
|
45
|
-
* .matchType('
|
|
44
|
+
* .matchType('CourseCreated') // single type
|
|
45
|
+
* .matchType('CourseCreated', 'CourseCancelled') // multiple types (OR within)
|
|
46
|
+
* .matchType('StudentSubscribed').andKey('course', 'cs101') // type + key
|
|
46
47
|
* ```
|
|
47
48
|
*/
|
|
48
|
-
matchType(
|
|
49
|
-
|
|
49
|
+
matchType(...types) {
|
|
50
|
+
if (types.length === 0) {
|
|
51
|
+
throw new Error('.matchType() requires at least one type');
|
|
52
|
+
}
|
|
53
|
+
if (types.length === 1) {
|
|
54
|
+
this.conditions.push({ type: types[0] });
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
this.conditions.push({ types });
|
|
58
|
+
}
|
|
50
59
|
return this;
|
|
51
60
|
}
|
|
52
61
|
/**
|
|
53
62
|
* Add a constrained condition (match events of type where key equals value).
|
|
54
|
-
* Shorthand for `.matchType(type).
|
|
55
|
-
* Use `.
|
|
63
|
+
* Shorthand for `.matchType(type).andKey(key, value)`.
|
|
64
|
+
* Use `.andKey()` after to add more key constraints (AND).
|
|
56
65
|
*
|
|
57
66
|
* @example
|
|
58
67
|
* ```typescript
|
|
59
68
|
* .matchTypeAndKey('StudentSubscribed', 'course', 'cs101')
|
|
60
|
-
* .matchTypeAndKey('StudentSubscribed', 'course', 'cs101').
|
|
69
|
+
* .matchTypeAndKey('StudentSubscribed', 'course', 'cs101').andKey('student', 'alice')
|
|
61
70
|
* ```
|
|
62
71
|
*/
|
|
63
72
|
matchTypeAndKey(type, key, value) {
|
|
64
73
|
this.conditions.push({ type, keys: [{ name: key, value }] });
|
|
65
74
|
return this;
|
|
66
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Key-only query: match events by key, regardless of event type.
|
|
78
|
+
* Starts a new condition (OR with previous conditions).
|
|
79
|
+
* Use `.andKey()` after to add more key constraints (AND).
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* .matchKey('cart', 'abc-123') // all events with cart=abc-123
|
|
84
|
+
* .matchKey('course', 'cs101').andKey('student', 'alice') // AND
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
matchKey(key, value) {
|
|
88
|
+
this.conditions.push({ keys: [{ name: key, value }] });
|
|
89
|
+
return this;
|
|
90
|
+
}
|
|
67
91
|
/**
|
|
68
92
|
* Add a key constraint to the last condition (AND).
|
|
69
93
|
* Must be called after `.matchType()` or `.matchTypeAndKey()`.
|
|
@@ -73,13 +97,13 @@ export class QueryBuilder {
|
|
|
73
97
|
* @example
|
|
74
98
|
* ```typescript
|
|
75
99
|
* .matchType('StudentSubscribed')
|
|
76
|
-
* .
|
|
77
|
-
* .
|
|
100
|
+
* .andKey('course', 'cs101')
|
|
101
|
+
* .andKey('student', 'alice') // AND: both keys must match
|
|
78
102
|
* ```
|
|
79
103
|
*/
|
|
80
|
-
|
|
104
|
+
andKey(key, value) {
|
|
81
105
|
if (this.conditions.length === 0) {
|
|
82
|
-
throw new Error('.
|
|
106
|
+
throw new Error('.andKey() requires a preceding .matchType(), .matchTypeAndKey(), or .matchKey()');
|
|
83
107
|
}
|
|
84
108
|
const lastIdx = this.conditions.length - 1;
|
|
85
109
|
const last = this.conditions[lastIdx];
|
|
@@ -96,6 +120,13 @@ export class QueryBuilder {
|
|
|
96
120
|
keys: [{ name: legacy.key, value: legacy.value }, { name: key, value }],
|
|
97
121
|
};
|
|
98
122
|
}
|
|
123
|
+
else if ('types' in last) {
|
|
124
|
+
// Multi-type unconstrained — convert to multi-type constrained
|
|
125
|
+
this.conditions[lastIdx] = {
|
|
126
|
+
types: last.types,
|
|
127
|
+
keys: [{ name: key, value }],
|
|
128
|
+
};
|
|
129
|
+
}
|
|
99
130
|
else {
|
|
100
131
|
// Unconstrained (type only) — convert to multi-key
|
|
101
132
|
this.conditions[lastIdx] = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../src/query-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,OAAO,YAAY;IAKM;IAJrB,UAAU,GAAqB,EAAE,CAAC;IAClC,aAAa,CAAU;IACvB,MAAM,CAAU;IAExB,YAA6B,QAA0B;QAA1B,aAAQ,GAAR,QAAQ,CAAkB;IAAG,CAAC;IAE3D
|
|
1
|
+
{"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../src/query-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAkI,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAyH,MAAM,aAAa,CAAC;AAC9U,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAMpH;;;GAGG;AACH,qBAAa,eAAgB,YAAW,YAAY;IAClD,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,YAAY,CAAc;IAE5B,mBAAmB,CACvB,aAAa,EAAE,YAAY,EAAE,EAC7B,IAAI,EAAE,YAAY,EAAE,EAAE,EACtB,SAAS,EAAE,sBAAsB,GAAG,IAAI,GACvC,OAAO,CAAC,yBAAyB,CAAC;IA8C/B,KAAK,CACT,UAAU,EAAE,cAAc,EAAE,EAC5B,YAAY,CAAC,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,EAAE,CAAC;IAwEnB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAOpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;;OAGG;IACH,YAAY,IAAI,WAAW,EAAE;IAI7B;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;;OAGG;IACH,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,YAAY,EAAE,GAAG,IAAI;IAclE;;;OAGG;IACH,YAAY,CACV,WAAW,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,YAAY,EAAE,EACnD,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;KACpD,GACA;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;CA0BxD"}
|
package/dist/storage/memory.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* In-Memory Storage implementation (for testing)
|
|
3
3
|
*/
|
|
4
|
-
import { normalizeCondition, hasKeys } from '../types.js';
|
|
4
|
+
import { isKeyOnlyCondition, isMultiTypeCondition, isMultiTypeConstrainedCondition, normalizeCondition, hasKeys } from '../types.js';
|
|
5
5
|
/**
|
|
6
6
|
* In-memory event storage for testing purposes
|
|
7
7
|
* NOT suitable for production use
|
|
@@ -60,6 +60,19 @@ export class InMemoryStorage {
|
|
|
60
60
|
matching = matching.filter(event => {
|
|
61
61
|
// Must match at least one condition (OR across conditions)
|
|
62
62
|
return normalized.some(cond => {
|
|
63
|
+
// Key-only condition: no type filter, just match keys
|
|
64
|
+
if (isKeyOnlyCondition(cond)) {
|
|
65
|
+
return cond.keys.every(requiredKey => event.keys.some(eventKey => eventKey.name === requiredKey.name && eventKey.value === requiredKey.value));
|
|
66
|
+
}
|
|
67
|
+
// Multi-type conditions: type must be in types[]
|
|
68
|
+
if (isMultiTypeConstrainedCondition(cond)) {
|
|
69
|
+
if (!cond.types.includes(event.type))
|
|
70
|
+
return false;
|
|
71
|
+
return cond.keys.every(requiredKey => event.keys.some(eventKey => eventKey.name === requiredKey.name && eventKey.value === requiredKey.value));
|
|
72
|
+
}
|
|
73
|
+
if (isMultiTypeCondition(cond)) {
|
|
74
|
+
return cond.types.includes(event.type);
|
|
75
|
+
}
|
|
63
76
|
// Type must match
|
|
64
77
|
if (event.type !== cond.type) {
|
|
65
78
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAA0B,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,18 @@
|
|
|
4
4
|
import { type PoolConfig } from 'pg';
|
|
5
5
|
import { type ExtractedKey, type QueryCondition, type StoredEvent } from '../types.js';
|
|
6
6
|
import type { EventStorage, EventToStore, StorageAppendCondition, AppendWithConditionResult } from './interface.js';
|
|
7
|
+
export interface PostgresRetryOptions {
|
|
8
|
+
/** Max retry attempts for serialization failures (default: 10) */
|
|
9
|
+
maxRetries?: number;
|
|
10
|
+
/** Base delay in ms for exponential backoff (default: 50) */
|
|
11
|
+
retryBaseMs?: number;
|
|
12
|
+
/** Max delay in ms — caps exponential growth (default: 2000) */
|
|
13
|
+
retryMaxMs?: number;
|
|
14
|
+
/** Add random jitter to retry delay (default: true) */
|
|
15
|
+
retryJitter?: boolean;
|
|
16
|
+
/** Called on each serialization retry (for monitoring/metrics) */
|
|
17
|
+
onRetry?: (attempt: number, delayMs: number) => void;
|
|
18
|
+
}
|
|
7
19
|
/**
|
|
8
20
|
* PostgreSQL-backed event storage
|
|
9
21
|
*
|
|
@@ -31,7 +43,13 @@ import type { EventStorage, EventToStore, StorageAppendCondition, AppendWithCond
|
|
|
31
43
|
export declare class PostgresStorage implements EventStorage {
|
|
32
44
|
private pool;
|
|
33
45
|
private initialized;
|
|
34
|
-
|
|
46
|
+
private maxRetries;
|
|
47
|
+
private retryBaseMs;
|
|
48
|
+
private retryMaxMs;
|
|
49
|
+
private retryJitter;
|
|
50
|
+
private onRetry?;
|
|
51
|
+
constructor(connectionStringOrConfig: string | PoolConfig, options?: PostgresRetryOptions);
|
|
52
|
+
private getRetryDelay;
|
|
35
53
|
/**
|
|
36
54
|
* Initialize the database schema.
|
|
37
55
|
* Must be called before any other operations.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/storage/postgres.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,IAAI,CAAC;AACvD,OAAO,
|
|
1
|
+
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/storage/postgres.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,IAAI,CAAC;AACvD,OAAO,EAAuJ,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAsJ,MAAM,aAAa,CAAC;AAChY,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAEpH,MAAM,WAAW,oBAAoB;IACnC,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kEAAkE;IAClE,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtD;AA2CD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,eAAgB,YAAW,YAAY;IAClD,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,OAAO,CAAC,CAA6C;gBACjD,wBAAwB,EAAE,MAAM,GAAG,UAAU,EAAE,OAAO,CAAC,EAAE,oBAAoB;IAazF,OAAO,CAAC,aAAa;IAUrB;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B,OAAO,CAAC,iBAAiB;IAMnB,mBAAmB,CACvB,aAAa,EAAE,YAAY,EAAE,EAC7B,IAAI,EAAE,YAAY,EAAE,EAAE,EACtB,SAAS,EAAE,sBAAsB,GAAG,IAAI,GACvC,OAAO,CAAC,yBAAyB,CAAC;IA2GrC;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAiT1B;;OAEG;YACW,eAAe;IAWvB,KAAK,CACT,UAAU,EAAE,cAAc,EAAE,EAC5B,YAAY,CAAC,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,EAAE,CAAC;IAQnB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IASpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B;;OAEG;YACW,YAAY;IAY1B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB5B;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAS7C;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUhD;;;OAGG;IACG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCjF;;;OAGG;IACG,YAAY,CAChB,WAAW,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,YAAY,EAAE,EACnD,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;KACpD,GACA,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IA2HhE,OAAO,CAAC,UAAU;CAUnB"}
|
package/dist/storage/postgres.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* PostgreSQL Storage implementation using pg
|
|
3
3
|
*/
|
|
4
4
|
import { Pool } from 'pg';
|
|
5
|
-
import { normalizeCondition, hasKeys } from '../types.js';
|
|
5
|
+
import { isKeyOnlyCondition, isMultiTypeCondition, isMultiTypeConstrainedCondition, normalizeCondition, hasKeys } from '../types.js';
|
|
6
6
|
const SCHEMA = `
|
|
7
7
|
-- Events (Append-Only Log)
|
|
8
8
|
CREATE TABLE IF NOT EXISTS events (
|
|
@@ -61,13 +61,32 @@ CREATE INDEX IF NOT EXISTS idx_key_position ON event_keys(key_name, key_value, p
|
|
|
61
61
|
export class PostgresStorage {
|
|
62
62
|
pool;
|
|
63
63
|
initialized = false;
|
|
64
|
-
|
|
64
|
+
maxRetries;
|
|
65
|
+
retryBaseMs;
|
|
66
|
+
retryMaxMs;
|
|
67
|
+
retryJitter;
|
|
68
|
+
onRetry;
|
|
69
|
+
constructor(connectionStringOrConfig, options) {
|
|
65
70
|
if (typeof connectionStringOrConfig === 'string') {
|
|
66
71
|
this.pool = new Pool({ connectionString: connectionStringOrConfig });
|
|
67
72
|
}
|
|
68
73
|
else {
|
|
69
74
|
this.pool = new Pool(connectionStringOrConfig);
|
|
70
75
|
}
|
|
76
|
+
this.maxRetries = options?.maxRetries ?? 10;
|
|
77
|
+
this.retryBaseMs = options?.retryBaseMs ?? 50;
|
|
78
|
+
this.retryMaxMs = options?.retryMaxMs ?? 2000;
|
|
79
|
+
this.retryJitter = options?.retryJitter ?? true;
|
|
80
|
+
this.onRetry = options?.onRetry;
|
|
81
|
+
}
|
|
82
|
+
getRetryDelay(lastDelay) {
|
|
83
|
+
if (!this.retryJitter) {
|
|
84
|
+
return Math.min(lastDelay * 2, this.retryMaxMs);
|
|
85
|
+
}
|
|
86
|
+
// Decorrelated jitter: random(base, lastDelay * 3), capped
|
|
87
|
+
const lo = this.retryBaseMs;
|
|
88
|
+
const hi = Math.min(lastDelay * 3, this.retryMaxMs);
|
|
89
|
+
return lo + Math.random() * (hi - lo);
|
|
71
90
|
}
|
|
72
91
|
/**
|
|
73
92
|
* Initialize the database schema.
|
|
@@ -99,8 +118,9 @@ export class PostgresStorage {
|
|
|
99
118
|
const position = await this.getLatestPosition();
|
|
100
119
|
return { position };
|
|
101
120
|
}
|
|
102
|
-
const maxRetries =
|
|
121
|
+
const maxRetries = this.maxRetries;
|
|
103
122
|
let attempt = 0;
|
|
123
|
+
let lastDelay = this.retryBaseMs;
|
|
104
124
|
while (attempt < maxRetries) {
|
|
105
125
|
attempt++;
|
|
106
126
|
const client = await this.pool.connect();
|
|
@@ -152,7 +172,9 @@ export class PostgresStorage {
|
|
|
152
172
|
await client.query('ROLLBACK');
|
|
153
173
|
// Retry on serialization failure (PostgreSQL error code 40001)
|
|
154
174
|
if (error.code === '40001' && attempt < maxRetries) {
|
|
155
|
-
|
|
175
|
+
lastDelay = this.getRetryDelay(lastDelay);
|
|
176
|
+
this.onRetry?.(attempt, lastDelay);
|
|
177
|
+
await new Promise(r => setTimeout(r, lastDelay));
|
|
156
178
|
continue;
|
|
157
179
|
}
|
|
158
180
|
throw error;
|
|
@@ -189,8 +211,12 @@ export class PostgresStorage {
|
|
|
189
211
|
}
|
|
190
212
|
// Normalize all conditions
|
|
191
213
|
const normalized = conditions.map(normalizeCondition);
|
|
192
|
-
const
|
|
193
|
-
const
|
|
214
|
+
const keyOnly = normalized.filter(isKeyOnlyCondition);
|
|
215
|
+
const multiType = normalized.filter(isMultiTypeCondition);
|
|
216
|
+
const multiTypeConstrained = normalized.filter(isMultiTypeConstrainedCondition);
|
|
217
|
+
const singleType = normalized.filter(c => !isKeyOnlyCondition(c) && !isMultiTypeCondition(c) && !isMultiTypeConstrainedCondition(c));
|
|
218
|
+
const constrained = singleType.filter(hasKeys);
|
|
219
|
+
const unconstrained = singleType.filter(c => !hasKeys(c));
|
|
194
220
|
const ctes = [];
|
|
195
221
|
const cteNames = [];
|
|
196
222
|
const positionFilter = fromPosition !== undefined ? fromPosition.toString() : null;
|
|
@@ -214,6 +240,134 @@ export class PostgresStorage {
|
|
|
214
240
|
ctes.push(`unconstrained_matches AS (${cteSql})`);
|
|
215
241
|
cteNames.push('unconstrained_matches');
|
|
216
242
|
}
|
|
243
|
+
// CTE for multi-type unconstrained conditions
|
|
244
|
+
if (multiType.length > 0) {
|
|
245
|
+
multiType.forEach((c, i) => {
|
|
246
|
+
const typePlaceholders = c.types.map(() => {
|
|
247
|
+
const ph = `$${paramIndex}`;
|
|
248
|
+
paramIndex++;
|
|
249
|
+
return ph;
|
|
250
|
+
});
|
|
251
|
+
let cteSql = `
|
|
252
|
+
SELECT position, event_id, event_type, data, metadata, timestamp
|
|
253
|
+
FROM events
|
|
254
|
+
WHERE event_type IN (${typePlaceholders.join(', ')})`;
|
|
255
|
+
params.push(...c.types);
|
|
256
|
+
if (positionFilter !== null) {
|
|
257
|
+
cteSql += ` AND position > $${paramIndex}`;
|
|
258
|
+
params.push(positionFilter);
|
|
259
|
+
paramIndex++;
|
|
260
|
+
}
|
|
261
|
+
ctes.push(`multitype_${i} AS (${cteSql})`);
|
|
262
|
+
cteNames.push(`multitype_${i}`);
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
// CTEs for multi-type constrained conditions (types[] + keys)
|
|
266
|
+
if (multiTypeConstrained.length > 0) {
|
|
267
|
+
multiTypeConstrained.forEach((c, i) => {
|
|
268
|
+
const isMultiKey = c.keys.length > 1;
|
|
269
|
+
if (isMultiKey) {
|
|
270
|
+
const intersectParts = c.keys.map(key => {
|
|
271
|
+
const namePh = `$${paramIndex++}`;
|
|
272
|
+
const valPh = `$${paramIndex++}`;
|
|
273
|
+
params.push(key.name, key.value);
|
|
274
|
+
let part = `
|
|
275
|
+
SELECT position FROM event_keys
|
|
276
|
+
WHERE key_name = ${namePh} AND key_value = ${valPh}`;
|
|
277
|
+
if (positionFilter !== null) {
|
|
278
|
+
part += ` AND position > $${paramIndex++}`;
|
|
279
|
+
params.push(positionFilter);
|
|
280
|
+
}
|
|
281
|
+
return part;
|
|
282
|
+
});
|
|
283
|
+
const typesPhs = c.types.map(t => {
|
|
284
|
+
const ph = `$${paramIndex++}`;
|
|
285
|
+
params.push(t);
|
|
286
|
+
return ph;
|
|
287
|
+
});
|
|
288
|
+
const cteSql = `
|
|
289
|
+
SELECT e.position, e.event_id, e.event_type, e.data, e.metadata, e.timestamp
|
|
290
|
+
FROM (${intersectParts.join('\n INTERSECT')}) keys
|
|
291
|
+
INNER JOIN events e ON e.position = keys.position
|
|
292
|
+
WHERE e.event_type IN (${typesPhs.join(', ')})`;
|
|
293
|
+
ctes.push(`mtc_${i} AS (${cteSql})`);
|
|
294
|
+
cteNames.push(`mtc_${i}`);
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
const namePh = `$${paramIndex++}`;
|
|
298
|
+
const valPh = `$${paramIndex++}`;
|
|
299
|
+
params.push(c.keys[0].name, c.keys[0].value);
|
|
300
|
+
const typesPhs = c.types.map(t => {
|
|
301
|
+
const ph = `$${paramIndex++}`;
|
|
302
|
+
params.push(t);
|
|
303
|
+
return ph;
|
|
304
|
+
});
|
|
305
|
+
let cteSql = `
|
|
306
|
+
SELECT e.position, e.event_id, e.event_type, e.data, e.metadata, e.timestamp
|
|
307
|
+
FROM event_keys k
|
|
308
|
+
INNER JOIN events e ON e.position = k.position
|
|
309
|
+
WHERE k.key_name = ${namePh} AND k.key_value = ${valPh}
|
|
310
|
+
AND e.event_type IN (${typesPhs.join(', ')})`;
|
|
311
|
+
if (positionFilter !== null) {
|
|
312
|
+
cteSql += ` AND e.position > $${paramIndex++}`;
|
|
313
|
+
params.push(positionFilter);
|
|
314
|
+
}
|
|
315
|
+
ctes.push(`mtc_${i} AS (${cteSql})`);
|
|
316
|
+
cteNames.push(`mtc_${i}`);
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
// CTEs for key-only conditions (no type filter)
|
|
321
|
+
if (keyOnly.length > 0) {
|
|
322
|
+
keyOnly.forEach((c, i) => {
|
|
323
|
+
const isMultiKey = c.keys.length > 1;
|
|
324
|
+
const cteName = `keyonly_${i}`;
|
|
325
|
+
if (isMultiKey) {
|
|
326
|
+
const intersectParts = c.keys.map(key => {
|
|
327
|
+
const keyNameParam = `$${paramIndex}`;
|
|
328
|
+
params.push(key.name);
|
|
329
|
+
paramIndex++;
|
|
330
|
+
const keyValueParam = `$${paramIndex}`;
|
|
331
|
+
params.push(key.value);
|
|
332
|
+
paramIndex++;
|
|
333
|
+
let part = `
|
|
334
|
+
SELECT position FROM event_keys
|
|
335
|
+
WHERE key_name = ${keyNameParam} AND key_value = ${keyValueParam}`;
|
|
336
|
+
if (positionFilter !== null) {
|
|
337
|
+
part += ` AND position > $${paramIndex}`;
|
|
338
|
+
params.push(positionFilter);
|
|
339
|
+
paramIndex++;
|
|
340
|
+
}
|
|
341
|
+
return part;
|
|
342
|
+
});
|
|
343
|
+
const cteSql = `
|
|
344
|
+
SELECT e.position, e.event_id, e.event_type, e.data, e.metadata, e.timestamp
|
|
345
|
+
FROM (${intersectParts.join('\n INTERSECT')}) keys
|
|
346
|
+
INNER JOIN events e ON e.position = keys.position`;
|
|
347
|
+
ctes.push(`${cteName} AS (${cteSql})`);
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
const keyNameParam = `$${paramIndex}`;
|
|
351
|
+
params.push(c.keys[0].name);
|
|
352
|
+
paramIndex++;
|
|
353
|
+
const keyValueParam = `$${paramIndex}`;
|
|
354
|
+
params.push(c.keys[0].value);
|
|
355
|
+
paramIndex++;
|
|
356
|
+
let cteSql = `
|
|
357
|
+
SELECT e.position, e.event_id, e.event_type, e.data, e.metadata, e.timestamp
|
|
358
|
+
FROM event_keys k
|
|
359
|
+
INNER JOIN events e ON e.position = k.position
|
|
360
|
+
WHERE k.key_name = ${keyNameParam} AND k.key_value = ${keyValueParam}`;
|
|
361
|
+
if (positionFilter !== null) {
|
|
362
|
+
cteSql += ` AND e.position > $${paramIndex}`;
|
|
363
|
+
params.push(positionFilter);
|
|
364
|
+
paramIndex++;
|
|
365
|
+
}
|
|
366
|
+
ctes.push(`${cteName} AS (${cteSql})`);
|
|
367
|
+
}
|
|
368
|
+
cteNames.push(cteName);
|
|
369
|
+
});
|
|
370
|
+
}
|
|
217
371
|
// Constrained conditions — each condition is its own CTE
|
|
218
372
|
// Multi-key conditions use INTERSECT within a CTE
|
|
219
373
|
// Single-key conditions with the same (key_name, key_value) are grouped
|