Repository navigation
What's Changed
- feat(env): add
Environment.close()to release the LMDB environment explicitly, so the same db path can be reopened without waiting for every Python reference to be collected (fixesEnvAlreadyOpenedon free-threaded Python 3.14, where threads started inside a component kept the environment alive) by @georgeh0 in #2481 - feat(memo): a memo state function can return
recollect_after_run=TrueinMemoStateOutcometo have its state collected again after a re-run, for states that depend on what the function body read by @georgeh0 in #2474 - Rust SDK ergonomics:
#[cocoindex::function(memo, batching)]with per-item memoization, thecontext_key!macro, and connector schemas derived from Rust row types (SchemaFields,TableSchema::from_row) with vector dimensions resolved at runtime from the embedder by @tomz-alt in #2287 GPUPoolrewritten in Rust; it can now acquire multiple whole GPUs at once, and no longer loses wake-ups across event loops by @YaxinCheng in #2277- Performance for large target updates
- Much less memory per declared target state: declared states are released right after pre-commit, and Python row values are held in encoded form (a 1.14 M-row component previously held ~1.33 GiB of row dicts) by @georgeh0 in #2469
fingerprint_object/ memo fingerprints compute plain data natively (~9脳 faster per row); existing fingerprints are unchanged by @georgeh0 in #2470- Target handlers can set
tracks_value_fingerprint = Trueto skipreconcile()for unchanged values, so an update where most rows are unchanged runs no per-row Python at commit by @georgeh0 in #2472 - Postgres: upserts go through
INSERT ... SELECT FROM unnest(arrays)for tables with builtin scalar/array columns by @georgeh0 in #2471 - Postgres: multi-column-key deletes use
IN (VALUES ...)instead of anORchain whose planning time grew quadratically by @georgeh0 in #2458
- fix(core): when one component's write fails (e.g. a target connector's
reconcile()raises), only that component fails, not every component batched into the same transaction (including other apps sharing theEnvironment) by @georgeh0 in #2451 - fix(core): scoped
coco.exception_handlers now receive failures ofmount_eachitems from aLiveMap(andauto_refreshitems) by @georgeh0 in #2478 - fix(core): preview no longer reports actions more than once when its write batch re-runs after the LMDB map grows by @georgeh0 in #2447
- fix(surrealdb): statement errors are raised instead of swallowed; values sent as typed CBOR; string/integer/array record IDs; record writes use
UPSERT ... MERGEand addTableTarget.declare_fieldsfor multi-owner records; HNSW-only vector indexes for SurrealDB 3 by @martinschaer in #2439 - fix(valkey): un-declaring an index or running
App.drop()now also deletes its document hashes by @georgeh0 in #2419 - fix(valkey): CocoIndex connections are identifiable in the server's
CLIENT LIST(LIB-NAME cocoindex); requiresvalkey-glide>=2.5.2by @AbhayMahalle in #2443 - fix(localfs): recursive
walk_dirstops at symlink cycles instead of walking forever by @Sujit-1509 in #2456 - fix(amazon_s3): zero-length reads and partial reads of empty objects return empty bytes instead of sending an invalid range request by @Sujit-1509 in #2437
- docs(target): state that
reconcile()may run more than once per commit by @georgeh0 in #2475
New Contributors
- @YaxinCheng made their first contribution in #2277
- @martinschaer made their first contribution in #2439
- @AbhayMahalle made their first contribution in #2443
Full Changelog: v1.0.24...v1.0.25