Match a StringOp against a set of candidates (materials, ancestors,
classification refs). Positive ops match if ANY satisfies them; negative
ops match only if NONE violates them; a string | undefined candidate is
handled per-entry by stringOpMatches (#4930). An empty LIST stays
distinct: "no candidates at all" never matches, negative ops included.
Match a StringOp against a set of candidates (materials, ancestors, classification refs). Positive ops match if ANY satisfies them; negative ops match only if NONE violates them; a
string | undefinedcandidate is handled per-entry bystringOpMatches(#4930). An empty LIST stays distinct: "no candidates at all" never matches, negative ops included.