boundlessdb 0.8.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 +114 -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 +2 -2
- 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 +6 -0
- package/dist/storage/postgres.d.ts.map +1 -1
- package/dist/storage/postgres.js +151 -11
- 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,8 +1,8 @@
|
|
|
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';
|
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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"}
|
|
@@ -9,8 +9,12 @@ export interface PostgresRetryOptions {
|
|
|
9
9
|
maxRetries?: number;
|
|
10
10
|
/** Base delay in ms for exponential backoff (default: 50) */
|
|
11
11
|
retryBaseMs?: number;
|
|
12
|
+
/** Max delay in ms — caps exponential growth (default: 2000) */
|
|
13
|
+
retryMaxMs?: number;
|
|
12
14
|
/** Add random jitter to retry delay (default: true) */
|
|
13
15
|
retryJitter?: boolean;
|
|
16
|
+
/** Called on each serialization retry (for monitoring/metrics) */
|
|
17
|
+
onRetry?: (attempt: number, delayMs: number) => void;
|
|
14
18
|
}
|
|
15
19
|
/**
|
|
16
20
|
* PostgreSQL-backed event storage
|
|
@@ -41,7 +45,9 @@ export declare class PostgresStorage implements EventStorage {
|
|
|
41
45
|
private initialized;
|
|
42
46
|
private maxRetries;
|
|
43
47
|
private retryBaseMs;
|
|
48
|
+
private retryMaxMs;
|
|
44
49
|
private retryJitter;
|
|
50
|
+
private onRetry?;
|
|
45
51
|
constructor(connectionStringOrConfig: string | PoolConfig, options?: PostgresRetryOptions);
|
|
46
52
|
private getRetryDelay;
|
|
47
53
|
/**
|
|
@@ -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 (
|
|
@@ -63,7 +63,9 @@ export class PostgresStorage {
|
|
|
63
63
|
initialized = false;
|
|
64
64
|
maxRetries;
|
|
65
65
|
retryBaseMs;
|
|
66
|
+
retryMaxMs;
|
|
66
67
|
retryJitter;
|
|
68
|
+
onRetry;
|
|
67
69
|
constructor(connectionStringOrConfig, options) {
|
|
68
70
|
if (typeof connectionStringOrConfig === 'string') {
|
|
69
71
|
this.pool = new Pool({ connectionString: connectionStringOrConfig });
|
|
@@ -73,13 +75,18 @@ export class PostgresStorage {
|
|
|
73
75
|
}
|
|
74
76
|
this.maxRetries = options?.maxRetries ?? 10;
|
|
75
77
|
this.retryBaseMs = options?.retryBaseMs ?? 50;
|
|
78
|
+
this.retryMaxMs = options?.retryMaxMs ?? 2000;
|
|
76
79
|
this.retryJitter = options?.retryJitter ?? true;
|
|
80
|
+
this.onRetry = options?.onRetry;
|
|
77
81
|
}
|
|
78
|
-
getRetryDelay(
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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);
|
|
83
90
|
}
|
|
84
91
|
/**
|
|
85
92
|
* Initialize the database schema.
|
|
@@ -113,6 +120,7 @@ export class PostgresStorage {
|
|
|
113
120
|
}
|
|
114
121
|
const maxRetries = this.maxRetries;
|
|
115
122
|
let attempt = 0;
|
|
123
|
+
let lastDelay = this.retryBaseMs;
|
|
116
124
|
while (attempt < maxRetries) {
|
|
117
125
|
attempt++;
|
|
118
126
|
const client = await this.pool.connect();
|
|
@@ -164,9 +172,9 @@ export class PostgresStorage {
|
|
|
164
172
|
await client.query('ROLLBACK');
|
|
165
173
|
// Retry on serialization failure (PostgreSQL error code 40001)
|
|
166
174
|
if (error.code === '40001' && attempt < maxRetries) {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
await new Promise(r => setTimeout(r,
|
|
175
|
+
lastDelay = this.getRetryDelay(lastDelay);
|
|
176
|
+
this.onRetry?.(attempt, lastDelay);
|
|
177
|
+
await new Promise(r => setTimeout(r, lastDelay));
|
|
170
178
|
continue;
|
|
171
179
|
}
|
|
172
180
|
throw error;
|
|
@@ -203,8 +211,12 @@ export class PostgresStorage {
|
|
|
203
211
|
}
|
|
204
212
|
// Normalize all conditions
|
|
205
213
|
const normalized = conditions.map(normalizeCondition);
|
|
206
|
-
const
|
|
207
|
-
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));
|
|
208
220
|
const ctes = [];
|
|
209
221
|
const cteNames = [];
|
|
210
222
|
const positionFilter = fromPosition !== undefined ? fromPosition.toString() : null;
|
|
@@ -228,6 +240,134 @@ export class PostgresStorage {
|
|
|
228
240
|
ctes.push(`unconstrained_matches AS (${cteSql})`);
|
|
229
241
|
cteNames.push('unconstrained_matches');
|
|
230
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
|
+
}
|
|
231
371
|
// Constrained conditions — each condition is its own CTE
|
|
232
372
|
// Multi-key conditions use INTERSECT within a CTE
|
|
233
373
|
// Single-key conditions with the same (key_name, key_value) are grouped
|