Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
9e82466
C++ query builder
JasonAtClockwork Mar 17, 2026
f8e89b5
Updates for documentation
JasonAtClockwork Mar 18, 2026
f71a7c4
Update crates/bindings-cpp/include/spacetimedb/query_builder/expr.h
JasonAtClockwork Mar 20, 2026
ae3e538
Update docs/docs/00200-core-concepts/00100-databases/00500-cheat-shee…
JasonAtClockwork Mar 20, 2026
8cef62e
Merge branch 'master' into jlarabie/cpp-query-builder
JasonAtClockwork Mar 20, 2026
2f5761b
Sync up with changes from the Unreal Query Builder work
JasonAtClockwork Apr 13, 2026
6769b11
Merge branch 'master' into jlarabie/cpp-query-builder
JasonAtClockwork Apr 14, 2026
0f225dc
Clean up of invalid join expressions and matching where consistency f…
JasonAtClockwork Apr 20, 2026
05bc5a2
Update crates/bindings-cpp/include/spacetimedb/query_builder/expr.h
JasonAtClockwork Apr 22, 2026
cea807b
Merge branch 'master' into jlarabie/cpp-query-builder
JasonAtClockwork Apr 23, 2026
00fb728
Expand negative testing and fixed issues around brittle checks
JasonAtClockwork Apr 30, 2026
d5c07c1
Move the internals for where_col/where_ix out of the public api
JasonAtClockwork May 11, 2026
66c80c2
Merge branch 'master' into jlarabie/cpp-query-builder
JasonAtClockwork May 15, 2026
28799b3
Fix from missed pieces in merge
JasonAtClockwork May 15, 2026
3ce446e
Merge branch 'master' into jlarabie/cpp-query-builder
bfops May 16, 2026
d555ed4
Narrowed the API surface for where()
JasonAtClockwork Jun 10, 2026
40f316a
Merge branch 'master' into jlarabie/cpp-query-builder
JasonAtClockwork Jun 10, 2026
30eb64e
Fix query builder test script
JasonAtClockwork Jun 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions crates/bindings-cpp/include/spacetimedb.h
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@

// View context and macros
#include "spacetimedb/view_macros.h"
#include "spacetimedb/query_builder.h"

// =============================================================================
// CONVENIENCE ALIASES AND COMPATIBILITY
Expand Down
22 changes: 18 additions & 4 deletions crates/bindings-cpp/include/spacetimedb/client_visibility_filter.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#pragma once

#include "spacetimedb/query_builder.h"

#include <string>

namespace SpacetimeDB {
Expand All @@ -21,21 +23,33 @@ namespace SpacetimeDB {
/// will be reported during `spacetime publish`, not at compile time.
class Filter {
private:
const char* sql_text_;
std::string sql_text_;

public:
/// Create a SQL-based client visibility filter
static Filter Sql(const char* sql) {
return Filter(sql);
}

/// Create a SQL-based client visibility filter from an owned string
static Filter Sql(std::string sql) {
return Filter(std::move(sql));
}

/// Create a SQL-based client visibility filter from a typed query-builder value.
template<query_builder::QueryLike TQuery>
static Filter Sql(const TQuery& query) {
return Filter(query.into_sql());
}

/// Get the SQL text for this filter
const char* sql_text() const {
const std::string& sql_text() const {
return sql_text_;
}

private:
explicit Filter(const char* sql) : sql_text_(sql) {}
explicit Filter(const char* sql) : sql_text_(sql != nullptr ? sql : "") {}
explicit Filter(std::string sql) : sql_text_(std::move(sql)) {}
};

} // namespace SpacetimeDB
} // namespace SpacetimeDB
5 changes: 5 additions & 0 deletions crates/bindings-cpp/include/spacetimedb/internal/Module.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ class Module {
public:
// Registration support routed through the V10 module-definition builder.
static void RegisterClientVisibilityFilter(const char* sql);
static void RegisterClientVisibilityFilter(const std::string& sql);
static void SetCaseConversionPolicy(CaseConversionPolicy policy);
static void RegisterExplicitTableName(const std::string& source_name, const std::string& canonical_name);
static void RegisterExplicitFunctionName(const std::string& source_name, const std::string& canonical_name);
Expand Down Expand Up @@ -152,6 +153,10 @@ class Module {
static void RegisterClientVisibilityFilter(const char* sql) {
Internal::Module::RegisterClientVisibilityFilter(sql);
}

static void RegisterClientVisibilityFilter(const std::string& sql) {
Internal::Module::RegisterClientVisibilityFilter(sql);
}

// Module metadata (future extension)
static void SetMetadata([[maybe_unused]] const char* name, [[maybe_unused]] const char* version) {
Expand Down
35 changes: 27 additions & 8 deletions crates/bindings-cpp/include/spacetimedb/internal/v10_builder.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include "autogen/RawRowLevelSecurityDefV9.g.h"
#include "autogen/RawTypeDefV10.g.h"
#include "field_registration.h"
#include "../query_builder.h"
#include "buffer_pool.h"
#include "runtime_registration.h"
#include "template_utils.h"
Expand Down Expand Up @@ -466,10 +467,14 @@ class V10Builder {
[func](ViewContext& ctx, BytesSource args_source) -> std::vector<uint8_t> {
(void)args_source;
auto result = func(ctx);
auto result_vec = view_result_to_vec(std::move(result));
IterBuf buf = IterBuf::take();
{
bsatn::Writer writer(buf.get());
bsatn::Writer writer(buf.get());
if constexpr (query_builder::QueryBuilderReturn<ReturnType>) {
writer.write_u8(1);
bsatn::serialize(writer, result.into_sql());
} else {
writer.write_u8(0);
auto result_vec = view_result_to_vec(std::move(result));
bsatn::serialize(writer, result_vec);
}
return buf.release();
Expand All @@ -480,10 +485,14 @@ class V10Builder {
[func](AnonymousViewContext& ctx, BytesSource args_source) -> std::vector<uint8_t> {
(void)args_source;
auto result = func(ctx);
auto result_vec = view_result_to_vec(std::move(result));
IterBuf buf = IterBuf::take();
{
bsatn::Writer writer(buf.get());
bsatn::Writer writer(buf.get());
if constexpr (query_builder::QueryBuilderReturn<ReturnType>) {
writer.write_u8(1);
bsatn::serialize(writer, result.into_sql());
} else {
writer.write_u8(0);
auto result_vec = view_result_to_vec(std::move(result));
bsatn::serialize(writer, result_vec);
}
return buf.release();
Expand All @@ -492,8 +501,17 @@ class V10Builder {
}

auto& type_reg = getModuleTypeRegistration();
auto bsatn_return = bsatn::bsatn_traits<ReturnType>::algebraic_type();
AlgebraicType return_type = type_reg.registerType(bsatn_return, "", &typeid(ReturnType));
AlgebraicType return_type = [&]() {
if constexpr (query_builder::QueryBuilderReturn<ReturnType>) {
using RowType = query_builder::query_row_type_t<ReturnType>;
auto row_bsatn = bsatn::bsatn_traits<RowType>::algebraic_type();
auto row_type = type_reg.registerType(row_bsatn, "", &typeid(RowType));
return MakeQueryReturnAlgebraicType(std::move(row_type));
} else {
auto bsatn_return = bsatn::bsatn_traits<ReturnType>::algebraic_type();
return type_reg.registerType(bsatn_return, "", &typeid(ReturnType));
}
}();
bool is_anonymous = std::is_same_v<ContextType, AnonymousViewContext>;
uint32_t index = static_cast<uint32_t>(is_anonymous ? (GetAnonymousViewHandlerCount() - 1) : (GetViewHandlerCount() - 1));

Expand Down Expand Up @@ -658,6 +676,7 @@ class V10Builder {
uint16_t field_idx) const;
static AlgebraicType MakeUnitAlgebraicType();
static AlgebraicType MakeStringAlgebraicType();
static AlgebraicType MakeQueryReturnAlgebraicType(AlgebraicType row_type);

std::vector<std::pair<std::string, bool>> table_is_event_;
std::optional<CaseConversionPolicy> case_conversion_policy_;
Expand Down
Loading
Loading