partition

Partitions a tokenized query into combination candidates against buildingNameWords (buildingId -> lowercased CMS name words). For each building that is a container match, the tokens consumed by the container group are removed and the REMAINING text/numeric tokens become that match's CombinationMatch.entityTokens.

Token-order independence: tokens are treated as a SET when choosing the container group, so business 101 and 101 business produce equal results.

A building is only included when (a) it clears scoreContainer for some non-empty subset of the text tokens AND (b) at least one token REMAINS for the entity leg. Container-only queries (every text token consumed, nothing left) are NOT combination matches — those are plain building searches and yield an empty list. Results are ordered by container score DESC, then by buildingId for stable ties.

NOTE: the intersection guard ("the remaining tokens must match a real entity in that building") is applied by the UI leg once it has the building's entities; this method returns every structurally-valid candidate so the caller can apply that guard.