update: redesign TinyQuery with predicate