Skip to content

feat: Run an EventQL query whose rows are deserialized into a given type. - #10

Merged
goloroden merged 6 commits into
mainfrom
typed-eventql-rows
Oct 8, 2026
Merged

goloroden merged 6 commits into
mainfrom
typed-eventql-rows

Conversation

@goloroden

Copy link
Copy Markdown
Member

runEventQlQuery returned every row as a JsonNode, so callers converted each row themselves. The .NET SDK offers the same as RunEventQlQueryAsync<TRow>.

What changes:

  • runEventQlQuery(query, rowType) returns a Stream of the given type, e.g. a record that matches the projection, or Integer for COUNT().
  • Each row is deserialized with the data mapper of the client, since rows carry the data of the application.
  • A row that does not match the type ends the stream with the exception of the mapper.
  • Errors that the server reports within the stream stay text, as in the other client SDKs.
  • The README shows the typed variant.

Part of the series on the API before the first release. Builds on #9.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Hc2MPSLu7HDHTm8HiBsrDz

goloroden and others added 5 commits October 7, 2026 23:42
… as Java package.

Wherever a registry requires a namespace, the client SDKs and the image
of EventSourcingDB use thenativeweb: Packagist, Go modules, Docker Hub.
Maven requires one, so the artifacts are now io.thenativeweb:eventsourcingdb
and io.thenativeweb:eventsourcingdb-testcontainers. The Java packages
follow the group ID, as is the convention in Java, and are now
io.thenativeweb.eventsourcingdb and its testcontainers subpackage.

Nothing has been published yet, so no caller is affected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hc2MPSLu7HDHTm8HiBsrDz
…NullAway.

Java can not say whether a value may be null. Both packages are now
@NullMarked, so everything is non-null unless it is marked @nullable,
as the optional fields of EventCandidate and of the options are.
Kotlin reads these annotations, and Spring Boot 4 uses them, too.

NullAway checks the code against the annotations as part of the build,
and runs as the only check of Error Prone. Making LineStream pass it
made explicit that it reads only once it has opened its stream.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hc2MPSLu7HDHTm8HiBsrDz
…fter 10 seconds by default.

The client created an HTTP client of its own that nobody could
configure, without a timeout for connecting, a proxy, or TLS. An
unreachable server left a request waiting for the timeout of the
operating system.

A Client now takes ClientOptions, whose HTTP client it sends requests
with if one is given. It does not close that HTTP client, since it
belongs to the caller. The HTTP client it creates otherwise gives up
connecting after 10 seconds. There is deliberately no timeout for whole
requests, since it would end every stream that observes events.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hc2MPSLu7HDHTm8HiBsrDz
The client serialized and deserialized the data of events with a JSON
mapper of its own, so the configuration of an application, e.g. its
modules or its naming strategy, did not apply to its events.

ClientOptions now takes a data mapper, which the client uses to write
the data of events and in Event.data(Class). It applies to the data of
events only: the client keeps reading everything else the server sends
with its own mapper, so that the configuration of an application can
not break it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hc2MPSLu7HDHTm8HiBsrDz
…ype.

runEventQlQuery returned every row as a JsonNode, so callers converted
each row themselves. It now also takes the type to deserialize each row
into, e.g. a record that matches the projection, and uses the data
mapper of the client for that, since rows carry the data of the
application. A row that does not match the type ends the stream with
the exception of the mapper. Errors that the server reports stay text,
as in the other client SDKs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hc2MPSLu7HDHTm8HiBsrDz
@goloroden
goloroden requested a review from a team as a code owner October 8, 2026 05:19
@goloroden goloroden self-assigned this Oct 8, 2026
Base automatically changed from configure-data-mapper to main October 8, 2026 06:59
main holds the squashed predecessors of this pull request, whose content
this branch already contains, so the merge keeps the content of this
branch as it is.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hc2MPSLu7HDHTm8HiBsrDz
@goloroden
goloroden merged commit c3f6771 into main Oct 8, 2026
2 checks passed
@goloroden
goloroden deleted the typed-eventql-rows branch October 8, 2026 07:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant