Compare a stored property value against a filter value. The single
definition of whereProperty / findByProperty semantics: same-type only
(no coercion, so '60' = 60 is false), null on either side never matches
(including !=), == aliases =, and contains / startsWith are
string-only. Every store-level property filter routes through here — the
indexed table, the on-demand fallback in @ifc-lite/query, the
cache-restored and server-converted tables — so the same query cannot answer
differently on different stores.
Deliberately NOT routed through here: ifc-lite query --where
(packages/cli/src/commands/query.ts). Its values arrive from argv as
strings, so it coerces (String(a) === String(b), Number(a) > Number(b))
and normalises IFC booleans (.T./'true'); it also adds an exists
operator and is first-match rather than any-match. Same-type-only semantics
would make every numeric CLI filter match nothing, so unifying it is a
behaviour change for CLI users and out of scope here.
Compare a stored property value against a filter value. The single definition of
whereProperty/findByPropertysemantics: same-type only (no coercion, so'60' = 60is false),nullon either side never matches (including!=),==aliases=, andcontains/startsWithare string-only. Every store-level property filter routes through here — the indexed table, the on-demand fallback in@ifc-lite/query, the cache-restored and server-converted tables — so the same query cannot answer differently on different stores.Deliberately NOT routed through here:
ifc-lite query --where(packages/cli/src/commands/query.ts). Its values arrive from argv as strings, so it coerces (String(a) === String(b),Number(a) > Number(b)) and normalises IFC booleans (.T./'true'); it also adds anexistsoperator and is first-match rather than any-match. Same-type-only semantics would make every numeric CLI filter match nothing, so unifying it is a behaviour change for CLI users and out of scope here.