stay consistent with Query.traverse