As a developer, I suggest to move the classes for representing schema information (ModelManager, EntityType, Attributes, and Relation) from the query package to a separate package because they are not only required for queries, but also for other purposes.
In addition, the distinction between "core" and "record" is not clear. Nor the reason, why two different containers are needed for generic condition. "Record" appears at first glance as the implementation detail of the query implementation; In this case, however, the class does not belong to the public API.
Furthermore, the classes "SearchService", "SearchQuery" and "Searchable" should be stored in a separate package, because they represent a separate function layer above the processing of structured queries.
In addition, the createQuery () method should be moved from the ModelManager interface to the BaseEntityManager interface (or better, its own QueryService), in order to be able to implement ModelManager as a pure repository of schema information.
See for a list of API changes