1- import copy
21from typing import Any , Self
32
3+ from mpt_api_client .http .query_state import QueryState
44from mpt_api_client .http .types import Response
55from mpt_api_client .models import Collection , Meta
66from mpt_api_client .models import Model as BaseModel
@@ -18,62 +18,29 @@ def __init__(
1818 self ,
1919 * ,
2020 http_client : Client ,
21- query_rql : RQLQuery | None = None ,
22- query_order_by : list [str ] | None = None ,
23- query_select : list [str ] | None = None ,
21+ query_state : QueryState | None = None ,
2422 endpoint_params : dict [str , str ] | None = None ,
2523 ) -> None :
2624 self .http_client = http_client
27- self .query_rql : RQLQuery | None = query_rql
28- self .query_order_by = query_order_by
29- self .query_select = query_select
25+ self .query_state = query_state or QueryState ()
3026 self .endpoint_params = endpoint_params or {}
3127
32- def clone (self ) -> Self :
33- """Create a copy of collection client for immutable operations.
34-
35- Returns:
36- New collection client with same settings.
37- """
38- return type (self )(
39- http_client = self .http_client ,
40- query_rql = self .query_rql ,
41- query_order_by = copy .copy (self .query_order_by ) if self .query_order_by else None ,
42- query_select = copy .copy (self .query_select ) if self .query_select else None ,
43- endpoint_params = self .endpoint_params ,
44- )
45-
4628 @property
47- def endpoint (self ) -> str :
29+ def path (self ) -> str :
4830 """Service endpoint URL."""
4931 return self ._endpoint .format (** self .endpoint_params )
5032
51- def build_url (
33+ def build_path (
5234 self ,
5335 query_params : dict [str , Any ] | None = None ,
54- ) -> str : # noqa: WPS210
36+ ) -> str :
5537 """Builds the endpoint URL with all the query parameters.
5638
5739 Returns:
58- Partial URL with query parameters.
40+ Complete URL with query parameters.
5941 """
60- query_params = query_params or {}
61- if self .query_order_by :
62- query_params .update ({"order" : "," .join (self .query_order_by )})
63- if self .query_select :
64- query_params .update ({"select" : "," .join (self .query_select )})
65-
66- query_parts = [
67- f"{ param_key } ={ param_value } " for param_key , param_value in query_params .items ()
68- ]
69-
70- if self .query_rql :
71- query_parts .append (str (self .query_rql ))
72-
73- if query_parts :
74- query = "&" .join (query_parts )
75- return f"{ self .endpoint } ?{ query } "
76- return self .endpoint
42+ query = self .query_state .build (query_params )
43+ return f"{ self .path } ?{ query } " if query else self .path
7744
7845 def order_by (self , * fields : str ) -> Self :
7946 """Returns new collection with ordering setup.
@@ -84,23 +51,35 @@ def order_by(self, *fields: str) -> Self:
8451 Raises:
8552 ValueError: If ordering has already been set.
8653 """
87- if self .query_order_by is not None :
54+ if self .query_state . order_by is not None :
8855 raise ValueError ("Ordering is already set. Cannot set ordering multiple times." )
89- new_collection = self .clone ()
90- new_collection .query_order_by = list (fields )
91- return new_collection
56+ return type (self )(
57+ http_client = self .http_client ,
58+ query_state = QueryState (
59+ rql = self .query_state .filter ,
60+ order_by = list (fields ),
61+ select = self .query_state .select ,
62+ ),
63+ endpoint_params = self .endpoint_params ,
64+ )
9265
9366 def filter (self , rql : RQLQuery ) -> Self :
9467 """Creates a new collection with the filter added to the filter collection.
9568
9669 Returns:
9770 New copy of the collection with the filter added.
9871 """
99- if self .query_rql :
100- rql = self .query_rql & rql
101- new_collection = self .clone ()
102- new_collection .query_rql = rql
103- return new_collection
72+ existing_filter = self .query_state .filter
73+ combined_filter = existing_filter & rql if existing_filter else rql
74+ return type (self )(
75+ http_client = self .http_client ,
76+ query_state = QueryState (
77+ rql = combined_filter ,
78+ order_by = self .query_state .order_by ,
79+ select = self .query_state .select ,
80+ ),
81+ endpoint_params = self .endpoint_params ,
82+ )
10483
10584 def select (self , * fields : str ) -> Self :
10685 """Set select fields. Raises ValueError if select fields are already set.
@@ -111,14 +90,19 @@ def select(self, *fields: str) -> Self:
11190 Raises:
11291 ValueError: If select fields are already set.
11392 """
114- if self .query_select is not None :
93+ if self .query_state . select is not None :
11594 raise ValueError (
11695 "Select fields are already set. Cannot set select fields multiple times."
11796 )
118-
119- new_client = self .clone ()
120- new_client .query_select = list (fields )
121- return new_client
97+ return type (self )(
98+ http_client = self .http_client ,
99+ query_state = QueryState (
100+ rql = self .query_state .filter ,
101+ order_by = self .query_state .order_by ,
102+ select = list (fields ),
103+ ),
104+ endpoint_params = self .endpoint_params ,
105+ )
122106
123107 @classmethod
124108 def _create_collection (cls , response : Response ) -> Collection [Model ]:
0 commit comments