Formbase 0.11.0
Pairs with MorphDB 0.12.x. A minor: a form type's raw stream is now readable over HTTP, page by
page, and a projection that builds nothing says why — which changes the public
NotProjectedException constructor in Formbase.Core. Everything on the wire is additive. The M3L
hint adapter maps and records more of what a declaration says, on M3L.Native 0.14.0.
Added
GET /formtypes/{type}/documentsreads a form type's raw stream page by page, oldest first, after
a watermark cursor (after,limit— default 100, at most 1000). Until now the only raw read was a
single document by an id the caller had to already hold, and records carry only declared columns —
so across the HTTP boundary, fields nothing had declared could not be read at all. Each page
carriesrawHead, read before the page and never passed, so a caller is caught up exactly when the
last watermark it received equals it;limit=0reads the head alone. An out-of-rangelimitor a
negativeafteris refused with400rather than adjusted. InFormbase.Core,
FormbaseEngine.ReadDocumentsAsyncandDocumentPageare the same read for an embedding host.
Changed
-
The README's HTTP surface summary no longer says writing a declaration is not on the surface:
PUT
andDELETE /formtypes/{type}/declarationhave been served since 0.8.0. -
POST /formtypes/{type}/projectionsays why it built nothing. A run on a form type with no
declaration answered200withprojected: falseand three empty diagnostic lists — and empty
lists read as "nothing was lost", so the response looked like a successful run with nothing to
do. It now carriesnotProjectedReason:noDeclarationwhen only a declaration can give the form
type a shape,nothingToInferwhen schema intelligence is installed but had no documents to infer
from;nullwheneverprojectedistrue. Additive on the wire. -
The
/problems/not-projecteddetail names the one remedy that applies instead of offering two.
It used to say "declare field hints or trigger a projection" in every case, and with nothing
declared the second remedy is a projection run that projects nothing — a loop the server never
named. With nothing declared it now says to declare first; with a declared shape not yet built it
says to trigger a projection. The problemtypeis unchanged. InFormbase.Core,
NotProjectedExceptiontakes the state as a second constructor argument and exposes it as
HasSchema. -
The M3L hint adapter now maps the whole numeric catalog.
byte,shortandlongjoin
integerin the integer slot — that slot is emitted as a 64-bit column, so no rung of the ladder
loses a value — anddoubleandpercentagejoinfloat,decimalandmoneyin the decimal
slot. Until now a field declared with any of those five names was reported as an unmapped type
and degraded to a text column, which understated what the vocabulary can carry.binaryis
deliberately unchanged: it is the one catalog type with no slot to map to, so it still degrades
to text with a recorded gap. -
The M3L hint adapter counts two losses it used to let through unrecorded. A declared type
parameter (string(50),decimal(10,2)) is recorded as a constraint gap, and an array field —
which lands in a single JSONB column — is recorded with the element type and item nullability it
cannot carry. Neither behaviour changes: the same columns come out. What changes is that the gap
list, which exists to make the loss countable, no longer omits these two. -
The M3L hint adapter records the three composition and ownership constructs M3L 0.13.0 makes
structural. A model declared::aspect(Base)or::subtype(Base)is recorded with its base link,
the same way an inherited model already is; a field contributed by::extendkeeps its column
and is recorded with the owner it came from; and a model under a# Prefix:(or namespace) owner
is recorded with that owner, since the form type is still identified by the bare model name. The
hints themselves are unchanged — before 0.13.0 the base kinds were not models at all and were
skipped without a trace, so this also stops an aspect or subtype from being silently emitted as a
standalone table.
Documentation
- The compose bundle is documented as needing
--build, and its opening smoke check is now
GET /health/readyrather thanGET /settings. The host service is built from the tree, so
docker compose upon its own brings back whatever image the last build left — a checkout that
has moved on since then comes up serving the older one./settingsanswers200from any
build and so cannot tell the two apart; the readiness probe answers404on a build that
predates the store health checks. The container health check already asked the same question
from inside and a stale bundle never reported healthy, but nothing said to look there.
Dependencies
M3L.Nativeto 0.14.0. 0.11.0 adds a multi-file validation entry point (ValidateMultiand its
typed and result-returning siblings) alongside the existing multi-file parse, and 0.12.0 widens
the type catalog withbyte,shortanddoubleand statesfloatas 32-bit; the three new
type names are mapped by the hint adapter in this same release. 0.13.0 adds the# Prefix:owner
header,::extendblocks (merged into their target's fields, each carrying its origin) and the
::aspect/::subtypebase kinds, which are now ordinary models with a base rather than untyped
generic kinds — a document that used those three words as custom kinds changes meaning. The
adapter's handling of them is described above. 0.14.0 resolves enum inheritance into an enum's
values and tightens validation (a later hop of a lookup path without a reference, a value name
repeated across inheritance, an argument on an extend header); the hint adapter parses without
validating and maps enum types to text, so its output does not change.MorphDB.Clientto 0.12.2, and the MorphDB server image indocker-compose.yml, the README and
the live fixtures to0.12.2. The producer's releases since 0.12.0 are patches carrying dependency
rounds and documentation corrections; no wire member moves. The suite with the live MorphDB tests
passes unchanged against the published0.12.2image (330/330).Microsoft.NET.Test.Sdkto 18.10.1 (tests only).