2525from requests import HTTPError
2626
2727from opengemini_client .client import Client
28+ from opengemini_client .measurement import Measurement , MeasurementCondition
2829from opengemini_client .models import Config , BatchPoints , Query , QueryResult , Series , SeriesResult , RpConfig , \
2930 ValuesResult , KeyValue
3031from opengemini_client .url_const import UrlConst
@@ -97,10 +98,10 @@ def __enter__(self):
9798 def __exit__ (self , _exc_type , _exc_val , _exc_tb ):
9899 self .session .close ()
99100
100- def get_server_url (self ):
101+ def _get_server_url (self ):
101102 return next (self .endpoints_iter )
102103
103- def update_headers (self , method , url_path , headers = None ) -> dict :
104+ def _update_headers (self , method , url_path , headers = None ) -> dict :
104105 if headers is None :
105106 headers = {}
106107
@@ -121,10 +122,10 @@ def update_headers(self, method, url_path, headers=None) -> dict:
121122
122123 return headers
123124
124- def request (self , method , server_url , url_path , headers = None , body = None , params = None ) -> requests .Response :
125+ def _request (self , method , server_url , url_path , headers = None , body = None , params = None ) -> requests .Response :
125126 if params is None :
126127 params = {}
127- headers = self .update_headers (method , url_path , headers )
128+ headers = self ._update_headers (method , url_path , headers )
128129 full_url = server_url + url_path
129130 if self .config .gzip_enabled and body is not None :
130131 compressed = io .BytesIO ()
@@ -139,36 +140,37 @@ def request(self, method, server_url, url_path, headers=None, body=None, params=
139140 raise HTTPError (f"request error resp, code: { resp .status_code } , body: { resp .text } " )
140141 return resp
141142
142- def exec_http_request_by_index (self , idx , method , url_path , headers = None , body = None ) -> requests .Response :
143+ def _exec_http_request_by_index (self , idx , method , url_path , headers = None , body = None ) -> requests .Response :
143144 if idx >= len (self .endpoints ) or idx < 0 :
144145 raise ValueError ("openGeminiDB client error. Index out of range" )
145- return self .request (method , self .endpoints [idx ], url_path , headers , body )
146+ return self ._request (method , self .endpoints [idx ], url_path , headers , body )
146147
147148 def ping (self , idx : int ):
148- resp = self .exec_http_request_by_index (idx , 'GET' , UrlConst .PING )
149+ resp = self ._exec_http_request_by_index (idx , 'GET' , UrlConst .PING )
149150 if resp .status_code != HTTPStatus .NO_CONTENT :
150151 raise HTTPError (f"ping error resp, code: { resp .status_code } , body: { resp .text } " )
151152
152153 def query (self , query : Query ) -> QueryResult :
153- server_url = self .get_server_url ()
154- params = {'db' : query .database , 'q' : query .command , 'rp' : query .retention_policy }
154+ server_url = self ._get_server_url ()
155+ params = {'db' : query .database , 'q' : query .command , 'rp' : query .retention_policy ,
156+ 'epoch' : query .precision .epoch ()}
155157
156- resp = self .request (method = 'GET' , server_url = server_url , url_path = UrlConst .QUERY , params = params )
158+ resp = self ._request (method = 'GET' , server_url = server_url , url_path = UrlConst .QUERY , params = params )
157159 if resp .status_code == HTTPStatus .OK :
158160 return resolve_query_body (resp )
159161 raise HTTPError (f"query error resp, code: { resp .status_code } , body: { resp .text } " )
160162
161163 def _query_post (self , query : Query ) -> QueryResult :
162- server_url = self .get_server_url ()
164+ server_url = self ._get_server_url ()
163165 params = {'db' : query .database , 'q' : query .command , 'rp' : query .retention_policy }
164166
165- resp = self .request (method = 'POST' , server_url = server_url , url_path = UrlConst .QUERY , params = params )
167+ resp = self ._request (method = 'POST' , server_url = server_url , url_path = UrlConst .QUERY , params = params )
166168 if resp .status_code == HTTPStatus .OK :
167169 return resolve_query_body (resp )
168170 raise HTTPError (f"query_post error resp, code: { resp .status_code } , body: { resp .text } " )
169171
170172 def write_batch_points (self , database : str , batch_points : BatchPoints ):
171- server_url = self .get_server_url ()
173+ server_url = self ._get_server_url ()
172174 params = {'db' : database }
173175 with io .StringIO () as writer :
174176 for point in batch_points .points :
@@ -177,7 +179,7 @@ def write_batch_points(self, database: str, batch_points: BatchPoints):
177179 writer .write (point .to_string ())
178180 writer .write ('\n ' )
179181 body = writer .getvalue ().encode ()
180- resp = self .request (method = "POST" , server_url = server_url , url_path = UrlConst .WRITE , params = params , body = body )
182+ resp = self ._request (method = "POST" , server_url = server_url , url_path = UrlConst .WRITE , params = params , body = body )
181183 if resp .status_code == HTTPStatus .NO_CONTENT :
182184 return
183185 raise HTTPError (f"write_batch_points error resp, code: { resp .status_code } , body: { resp .text } " )
@@ -279,6 +281,37 @@ def _show_with_result_key_value(self, database, command: str) -> List[ValuesResu
279281 values_results .append (values_result )
280282 return values_results
281283
284+ def create_measurement (self , measurement : Measurement ):
285+ if measurement is None :
286+ raise ValueError ("empty measurement" )
287+ measurement .check ()
288+ command = measurement .to_string ()
289+ return self ._query_post (Query (database = measurement .database , command = command , retention_policy = '' ))
290+
291+ def show_measurements (self , condition : MeasurementCondition ) -> List [str ]:
292+ if condition is None :
293+ raise ValueError ("empty measurement condition" )
294+ condition .check ()
295+ command = condition .to_string ()
296+ result = self .query (Query (database = condition .database , command = command , retention_policy = '' ))
297+ if result .error is not None :
298+ raise HTTPError (f"show_measurements error result, error: { result .error } " )
299+ measurements = []
300+ if len (result .results ) != 0 and len (result .results [0 ].series ) == 0 :
301+ return measurements
302+ for v in result .results [0 ].series [0 ].values :
303+ if isinstance (v [0 ], str ):
304+ measurements .append (str (v [0 ]))
305+ return measurements
306+
307+ def drop_measurement (self , database , retention_policy , measurement : str ):
308+ if not database :
309+ raise ValueError ("empty database name" )
310+ if not measurement :
311+ raise ValueError ("empty measurement name" )
312+ command = f"DROP MEASUREMENT { measurement } "
313+ return self ._query_post (Query (database = database , command = command , retention_policy = retention_policy ))
314+
282315 def show_tag_keys (self , database , command : str ) -> List [ValuesResult ]:
283316 return self ._show_with_result_any (database , command )
284317
0 commit comments