Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion apple/_version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.10.8"
__version__ = "0.10.9"
2 changes: 1 addition & 1 deletion fixtures/benchmarks/large_0100_config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"recall_a": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/benchmarks/large_0500_config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"recall_a": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/benchmarks/large_1000_config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"recall_a": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/benchmarks/large_5000_config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"recall_a": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/benchmarks/medium_0100_config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"recall_a": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/benchmarks/medium_0500_config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"recall_a": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/benchmarks/medium_1000_config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"recall_a": {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"_PINEAPPLE_CREATE_TIME": "2026-05-28T11:31:47Z",
"pipeline_config": {
"operators": {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"_PINEAPPLE_CREATE_TIME": "2026-05-28T11:31:47Z",
"pipeline_config": {
"operators": {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"_PINEAPPLE_CREATE_TIME": "2026-05-28T11:31:47Z",
"pipeline_config": {
"operators": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/benchmarks/realistic_for_you_config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"_PINEAPPLE_CREATE_TIME": "2026-05-28T11:31:47Z",
"pipeline_config": {
"operators": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/benchmarks/realistic_for_you_latency_config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"_PINEAPPLE_CREATE_TIME": "2026-05-28T11:31:47Z",
"pipeline_config": {
"operators": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/benchmarks/small_010_config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"recall": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/benchmarks/small_050_config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"recall": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/benchmarks/small_100_config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"recall": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/barrier_transform_reorder.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "barrier semantics (transform before reorder)",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"normalize_score": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/bench_cpu_work_parity.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "transform_bench_cpu byte-identical work output across runtimes (M12)",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"bench": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/control_op_nil_field_no_crash.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "control operator nil field does not crash — branch skipped",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"ctrl_if": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/data_parallel.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "data_parallel transform (sharded item execution)",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"copy_tag": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/data_parallel_lua.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "data_parallel Lua transform (verify shard-independent computation)",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"recall_items": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/deeply_nested_subflow.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "deeply nested SubFlow (depth-3 expansion)",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"copy_tag": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/field_mode_nullable_vs_defaulted.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "three field modes — strict vs nullable vs defaulted",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"write_nil": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/field_mode_strict_nil_error.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "strict field mode — nil triggers error",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"write_nil": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/filter_removes_all.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "filter_condition removes all items — empty result",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"remove_banned": {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "implicit row-set: filter → common-only → item-field transform",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"recall_items": {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "implicit row-set: filter then common-only transform (no dependency needed)",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"recall_items": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/implicit_row_set_filter_then_item.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "implicit row-set: filter then item-field transform (no field overlap)",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"recall_items": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/lua_e2e_conditional_sort.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "Lua E2E: recall → discount → stats → conditional sort",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"recall_items": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/multi_recall_row_set_ordering.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "multi-recall row-set ordering (ConsumesRowSet semantics)",
"description": "Regression test for differential fuzz divergence #945: operators between recalls must wait for preceding recall via ConsumesRowSet before iterating items.",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"recall_a": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/multi_skip.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "multiple independent skip flags",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"copy_tag": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/nested_subflow.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "nested SubFlow pipeline",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"copy_tag": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/nullable_field_pass_through.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "nullable field mode — explicit nil pass-through vs missing error",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"set_nil": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/recall_merge_filter_sort.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "recall → merge → filter → sort (full pipeline)",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"recall_hot": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/recall_rank_truncate.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "recall → lua scoring → sort → truncate (recommendation pipeline)",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"recall_candidates": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/reorder_topn_boost_parity.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "reorder_topn_boost byte-identical reorder output across runtimes (H8)",
"requires": ["bench"],
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"boost": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/resource_operators.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
]
},
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"recall_hot": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/size_dispatch_truncate.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "transform_size → dispatch → truncate (common↔item interaction)",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"count_items": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/skip_branch.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "skip/branch via Lua control flag",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"set_flag": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/subflow_if_else_control_flow.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "SubFlow if/else control flow with namespaced fields",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"my_sf::if_1": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/pipelines/transform_then_filter.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "transform_copy then filter_truncate",
"config": {
"_PINEAPPLE_VERSION": "0.10.8",
"_PINEAPPLE_VERSION": "0.10.9",
"pipeline_config": {
"operators": {
"copy_score": {
Expand Down
1 change: 1 addition & 0 deletions pine-cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,7 @@ if(PINE_CPP_BUILD_TESTS)
tests/test_format_g.cpp
tests/test_column_frame.cpp
tests/test_row_frame.cpp
tests/test_window_view_race.cpp
tests/test_frame_equivalence.cpp
tests/test_register_operator.cpp
tests/test_metrics.cpp
Expand Down
24 changes: 19 additions & 5 deletions pine-cpp/include/pine/column_frame.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,29 @@ class ColumnFrame : public Frame {
ColumnFrame();
ColumnFrame(Variant::object_t common, std::vector<Variant::object_t> items);

// Non-copyable, non-movable. unique_ptr<ColumnStore> already enforces
// this implicitly, but pin it explicitly to mirror RowFrame's
// post-#103 declaration and keep the contract self-describing.
ColumnFrame(const ColumnFrame&) = delete;
ColumnFrame& operator=(const ColumnFrame&) = delete;
ColumnFrame(ColumnFrame&&) = delete;
ColumnFrame& operator=(ColumnFrame&&) = delete;

// Static convenience constructor kept for callers that already know
// they want a ColumnFrame window view. parallel_execute uses the
// virtual Frame::make_window_view on the parent — this static form
// returns a ColumnFrame-typed unique_ptr for tests / legacy code.
//
// CONTRACT: the caller must keep `parent` alive AND must not mutate
// `parent` while any window view exists. parallel_execute satisfies
// both: shards execute synchronously between cv-waits on the parent
// node, and the parent frame is read-only during the shard window.
// Concurrency contract (post-#103): parent and the returned view
// share the same shared_mutex (mu_ is a shared_ptr, copied on
// make_window_view). Concurrent shard reads parallelize via
// shared_lock. Cross-op apply_output on parent serializes against
// any live view's reads via unique_lock — required because
// view_items_ aliases parent.items_, so storage-level locking must
// span both. The pre-#103 comment claimed parent was read-only
// during the view's lifetime; the v0.9.2 ready-queue scheduler
// breaks that assumption (no-field-conflict ops can run in
// parallel), so the storage layer enforces it now.
static std::unique_ptr<ColumnFrame> make_window_view(const ColumnFrame& parent, std::size_t row_offset,
std::size_t row_count);

Expand Down Expand Up @@ -88,7 +102,7 @@ class ColumnFrame : public Frame {
private:
void write_item_field_locked(std::size_t idx, const std::string& field, const Variant& value);

mutable std::shared_mutex mu_;
mutable std::shared_ptr<std::shared_mutex> mu_;
Variant::object_t common_;
std::unique_ptr<ColumnStore> items_;
std::vector<std::string> warnings_;
Expand Down
2 changes: 1 addition & 1 deletion pine-cpp/include/pine/pine.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ namespace pine {
// mirrors pine-go's `const Version` in pine-go/version.go. Keep in sync
// with pine-go and the _PINEAPPLE_VERSION field embedded in compiled
// configs.
inline constexpr const char* kVersion = "0.10.8";
inline constexpr const char* kVersion = "0.10.9";

class Error : public std::runtime_error {
public:
Expand Down
Loading