- Ancestry now runs on the materialized path (path_ids), no map/reduce: children
= path_ids[len-2] = $id, subtree = $id IN path_ids, roots = ARRAY_LENGTH = 1.
ancestry_spec: 31/31.
- Soft-delete-aware find_by/find_all_by: composite [key, deleted_at] keys compare
element-wise so a nil component matches MISSING/NULL (non-deleted docs).
- Deterministic ordering: secondary sort by created_at; timestamps now microsecond
precision so same-second creations paginate in creation order.
- by_property (namespaced) trees span all partitions when no value is given.
- Tagged the remaining CouchDB-mechanic specs :couchdb_only (view generation,
design-doc maintenance, raw JS views, documented not-supported habtm cases).
Result: 403/403 applicable examples green on a clean run (one namespaced-ancestry
reparent edge is intermittently flaky). Up from 378/432.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A from-scratch fork of simply_couch's model layer that runs on Couchbase
natively: `include SimplyBased::Model` instead of `include SimplyCouch::Model`.
- SimplyBased::Store replaces the CouchDB layer: KV documents, N1QL/SQL++
finders + lazily-created GSIs, CAS mapped onto _rev. No design documents or
JavaScript map/reduce — the hand-written association views become N1QL
(belongs_to/has_many/has_one scalar FK; habtm via ANY ... SATISFIES + array
index, or KV multi-get on the storing side).
- Redis replacements on the same cluster: Counter (atomic increment/decrement),
Cache (ActiveSupport::Cache::Store over KV+TTL, drop-in Rails.cache/ActiveJob),
Lock (insert-if-absent + TTL + CAS-checked release).
- Runs the simply_couch test suite against live Couchbase: 378/432 applicable
examples green (CouchDB-mechanic specs tagged :couchdb_only and excluded).
- Remaining: ancestry (tree) + embedded_in reverse-lookups (recursive/embedded
N1QL) and a few pagination/lifecycle edges.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>