Skip to content

Commit 4c46605

Browse files
golorodenclaude
andauthored
fix: allow primitive values in EventQL query results (#305)
The isStreamRow function was incorrectly requiring payload to be a Record (object). This caused runEventQlQuery to fail with "Failed to run EventQL query" when the query returned primitive values (boolean, number, string) instead of objects. Fixes #304 Co-authored-by: Claude <[email protected]>
1 parent 33650ff commit 4c46605

File tree

2 files changed

+66
-2
lines changed

2 files changed

+66
-2
lines changed

src/runEventQlQuery.test.ts

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,69 @@ suite('runEventQlQuery', { timeout: 30_000 }, () => {
6868
assert.equal(secondRow.id, '1');
6969
assert.equal(secondRow.data.value, 42);
7070
});
71+
72+
test('reads rows with primitive number values.', async (): Promise<void> => {
73+
const client = container.getClient();
74+
75+
const event: EventCandidate = {
76+
source: 'https://www.eventsourcingdb.io',
77+
subject: '/test',
78+
type: 'io.eventsourcingdb.test',
79+
data: { value: 42 },
80+
};
81+
82+
await client.writeEvents([event]);
83+
84+
const rowsRead: unknown[] = [];
85+
for await (const row of client.runEventQlQuery('FROM e IN events PROJECT INTO e.data.value')) {
86+
rowsRead.push(row);
87+
}
88+
89+
assert.equal(rowsRead.length, 1);
90+
assert.equal(rowsRead[0], 42);
91+
});
92+
93+
test('reads rows with primitive boolean values.', async (): Promise<void> => {
94+
const client = container.getClient();
95+
96+
const event: EventCandidate = {
97+
source: 'https://www.eventsourcingdb.io',
98+
subject: '/test',
99+
type: 'io.eventsourcingdb.test',
100+
data: { value: 42 },
101+
};
102+
103+
await client.writeEvents([event]);
104+
105+
const rowsRead: unknown[] = [];
106+
for await (const row of client.runEventQlQuery(
107+
'FROM e IN events PROJECT INTO e.data.value > 0',
108+
)) {
109+
rowsRead.push(row);
110+
}
111+
112+
assert.equal(rowsRead.length, 1);
113+
assert.equal(rowsRead[0], true);
114+
});
115+
116+
test('reads rows with primitive string values.', async (): Promise<void> => {
117+
const client = container.getClient();
118+
119+
const event: EventCandidate = {
120+
source: 'https://www.eventsourcingdb.io',
121+
subject: '/test',
122+
type: 'io.eventsourcingdb.test',
123+
data: { name: 'hello' },
124+
};
125+
126+
await client.writeEvents([event]);
127+
128+
const rowsRead: unknown[] = [];
129+
for await (const row of client.runEventQlQuery('FROM e IN events PROJECT INTO e.data.name')) {
130+
rowsRead.push(row);
131+
}
132+
133+
assert.equal(rowsRead.length, 1);
134+
assert.equal(rowsRead[0], 'hello');
135+
});
71136
});

src/stream/isStreamRow.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
import { isRecord } from 'src/types/isRecord.js';
21
import { hasShapeOf } from '../types/hasShapeOf.js';
32
import type { StreamRow } from './StreamRow.js';
43

54
const isStreamRow = (line: unknown): line is StreamRow => {
65
return hasShapeOf<StreamRow>(line, {
76
type: value => value === 'row',
8-
payload: isRecord,
7+
payload: (value: unknown): value is unknown => value !== undefined,
98
});
109
};
1110

0 commit comments

Comments
 (0)