@cityjson/flatcitybuf
    Preparing search index...

    Function searchAttributes

    • Runs every condition against its column's B+tree and AND-intersects the results, returning candidate feature offsets sorted ascending.

      Conditions are evaluated SEQUENTIALLY with an early exit once the accumulator is empty: an impossible first condition costs one traversal, not one per condition.

      Semantics are EXISTENTIAL over CityObjects, and that is why the result is a set of features rather than of (feature, object) pairs: a feature matches Gt(1) if ANY of its CityObjects carries an h greater than 1, even if another carries exactly 1. This is also why the operator is evaluated at the leaf instead of being lowered to "range minus exact" the way the Rust reader does -- see scanRange in stree.ts.

      THE POST-FILTER PLUGS IN AFTER THIS FUNCTION RETURNS: for String columns (needsPostFilter(kind)) the hits are CANDIDATES, because the keys are truncated to 50 bytes and zero-padded. postFilterCandidates (../post-filter.ts) reads each candidate feature, decodes the real attribute value and re-applies operator to the untruncated value, dropping what does not survive; FcbReader.select runs it before featuresCount and paging. Nothing in this file should start doing that work: the traversal deliberately over-returns so the verifier has something to verify, and a bound tightened here is a false negative the verifier can never recover.

      Parameters

      Returns Promise<SearchResultItem[]>