provider_cluster = $provider_cluster; $this->context_containers = array(); $this->query_builders = array(); $this->add_query_builder( new Entity_Query_Builder() ) ->add_query_builder( new Order_Query_Builder( $this->provider_cluster ) ) ->add_taxonomy_builder() ->add_meta_builder(); } public function build_post_query( Query_Settings $selection_settings ): array { return flat_map( $this->query_builders, fn( Post_Query_Builder $query_builder ) => $query_builder->build_post_query( $selection_settings ) ); } public function set_query_context( Query_Context $context ): void { $this->set_context( $context ); foreach ( $this->context_containers as $container ) { $container->set_query_context( $context ); } } protected function add_taxonomy_builder(): self { $value_resolver = $this->create_term_value_resolver(); $term_query_builder = new Term_Query_Builder( $value_resolver ); $taxonomy_builder = new Taxonomy_Query_Builder( $term_query_builder ); $this->add_context_container( $value_resolver ) ->add_query_builder( $taxonomy_builder ); return $this; } protected function add_meta_builder(): self { $field_builder = new Field_Query_Builder( $this->provider_cluster, $this->create_meta_value_resolver() ); $meta_builder = new Meta_Query_Builder( $field_builder ); return $this->add_query_builder( $meta_builder ); } protected function create_term_value_resolver(): Term_Value_Resolver { return new Term_Value_Resolver( $this->provider_cluster ); } protected function create_meta_value_resolver(): Meta_Value_Resolver { return new Meta_Value_Resolver(); } protected function add_query_builder( Post_Query_Builder $query_builder ): self { $this->query_builders[] = $query_builder; return $this; } protected function add_context_container( Query_Context_Container $container ): self { $this->context_containers[] = $container; return $this; } protected function get_provider_cluster(): Field_Provider_Cluster { return $this->provider_cluster; } }