Skip to content

Commit b8146a6

Browse files
committed
Support for other endpoints and bump minor version
1 parent 5d42be5 commit b8146a6

File tree

3 files changed

+151
-5
lines changed

3 files changed

+151
-5
lines changed

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "xtdb"
3-
version = "0.1.1"
3+
version = "0.2.0"
44
packages = [{ include = "xtdb" }]
55
include = ["xtdb/**"]
66
exclude = [

tests/integration/test_xtdb_session.py

+68-1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ def test_query_simple_filter(xtdb_session: XTDBSession):
5353
result = xtdb_session.query(query, tx_id=0)
5454
assert result[0].dict() == {"TestEntity/name": "test", "type": "TestEntity", "xt/id": entity.id}
5555

56+
xtdb_session.client.sync()
57+
5658
xtdb_session.delete(entity)
5759
xtdb_session.commit()
5860

@@ -199,6 +201,19 @@ def test_deep_queries(xtdb_session: XTDBSession):
199201
"SecondEntity/test_entity": test.id,
200202
}
201203

204+
attribute_stats = xtdb_session.client.get_attribute_stats()
205+
assert attribute_stats == {
206+
"FourthEntity/third_entity": 1,
207+
"FourthEntity/value": 1,
208+
"SecondEntity/age": 4,
209+
"SecondEntity/test_entity": 4,
210+
"TestEntity/name": 8,
211+
"ThirdEntity/second_entity": 1,
212+
"ThirdEntity/test_entity": 1,
213+
"type": 14,
214+
"xt/id": 14,
215+
}
216+
202217
xtdb_session.delete(fourth)
203218
xtdb_session.delete(third)
204219
xtdb_session.delete(second2)
@@ -385,9 +400,61 @@ def test_get_entity_transactions(xtdb_session: XTDBSession):
385400
result = xtdb_session.client.get_entity_transactions(test.id, tx_id=result["txId"] - 1)
386401
assert result["validTime"] == "1000-10-10T00:00:00Z"
387402

388-
# TODO: check these:
403+
# TODO: check transaction time
389404

390405
result = xtdb_session.client.get_entity_transactions(test.id, valid_time=datetime(1000, 10, 10))
391406
assert result["validTime"] == "1000-10-10T00:00:00Z"
392407

393408
xtdb_session.delete(test)
409+
410+
411+
def test_transaction_api(xtdb_session: XTDBSession):
412+
test = TestEntity(name="test")
413+
second = SecondEntity(test_entity=test, age=1)
414+
second2 = SecondEntity(test_entity=test, age=4)
415+
416+
xtdb_session.put(test)
417+
xtdb_session.put(second)
418+
xtdb_session.put(second2)
419+
xtdb_session.commit()
420+
421+
result = xtdb_session.client.get_transaction_log()
422+
assert len(result) == 28
423+
assert list(result[0].keys()) == ["txId", "txTime", "txEvents"]
424+
425+
result = xtdb_session.client.get_transaction_log(10)
426+
assert len(result) == 18
427+
428+
result = xtdb_session.client.get_transaction_log(10, True)
429+
assert len(result) == 18
430+
assert list(result[0].keys()) == ["txId", "txTime", "txOps"]
431+
432+
result = xtdb_session.client.get_transaction_committed(10)
433+
assert result == {"txCommitted?": True}
434+
435+
result = xtdb_session.client.get_latest_completed_transaction()
436+
assert result["txId"] == 28
437+
438+
result = xtdb_session.client.get_latest_submitted_transaction()
439+
assert result["txId"] == 28
440+
441+
result = xtdb_session.client.get_active_queries()
442+
assert result == []
443+
444+
query = Query(SecondEntity).where(SecondEntity, age=1)
445+
xtdb_session.query(query)
446+
447+
result = xtdb_session.client.get_recent_queries()
448+
assert result[0]["error"] is None
449+
assert (
450+
result[0]["query"] == "{:find [(pull SecondEntity [*])], :where [[SecondEntity :SecondEntity/age 1] "
451+
'[SecondEntity :type "SecondEntity"]]}'
452+
)
453+
454+
result = xtdb_session.client.get_slowest_queries()
455+
assert result == []
456+
457+
xtdb_session.delete(second2)
458+
xtdb_session.delete(second)
459+
xtdb_session.delete(test)
460+
xtdb_session.commit()

xtdb/session.py

+82-3
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,23 @@ def get_entity_history(
202202
self._verify_response(res)
203203
return res.json()
204204

205+
def get_attribute_stats(self):
206+
res = self._session.get(f"{self.base_url}/attribute-stats")
207+
self._verify_response(res)
208+
209+
return res.json()
210+
211+
def sync(self, timeout: Optional[int] = None):
212+
params = {}
213+
214+
if timeout is not None:
215+
params["timeout"] = timeout
216+
217+
res = self._session.get(f"{self.base_url}/sync", params=params)
218+
self._verify_response(res)
219+
220+
return res.json()
221+
205222
def query(
206223
self,
207224
query: Union[str, Query],
@@ -230,9 +247,35 @@ def query(
230247
self._verify_response(res)
231248
return res.json()
232249

233-
def await_transaction(self, transaction_id: int) -> None:
234-
self._session.get(f"{self.base_url}/await-tx", params={"txId": transaction_id})
235-
logger.info("Transaction completed [txId=%s]", transaction_id)
250+
def await_transaction(self, tx_id: int, timeout: Optional[int] = None) -> None:
251+
params = {"txId": tx_id}
252+
253+
if timeout is not None:
254+
params["timeout"] = timeout
255+
256+
self._session.get(f"{self.base_url}/await-tx", params=params)
257+
258+
def await_transaction_time(self, tx_time: datetime, timeout: Optional[int] = None) -> None:
259+
params = {"tx-time": tx_time.isoformat()}
260+
261+
if timeout is not None:
262+
params["timeout"] = str(timeout)
263+
264+
self._session.get(f"{self.base_url}/await-tx-time", params=params)
265+
266+
def get_transaction_log(self, after_tx_id: Optional[int] = None, with_ops: Optional[bool] = None):
267+
params = {}
268+
269+
if after_tx_id is not None:
270+
params["after-tx-id"] = str(after_tx_id)
271+
272+
if with_ops is not None:
273+
params["with-ops?"] = str(with_ops).lower()
274+
275+
res = self._session.get(f"{self.base_url}/tx-log", params=params)
276+
self._verify_response(res)
277+
278+
return res.json()
236279

237280
def submit_transaction(self, transaction: Union[Transaction, List]) -> None:
238281
if isinstance(transaction, list):
@@ -247,6 +290,42 @@ def submit_transaction(self, transaction: Union[Transaction, List]) -> None:
247290
self._verify_response(res)
248291
self.await_transaction(res.json()["txId"])
249292

293+
def get_transaction_committed(self, tx_id: int):
294+
res = self._session.get(f"{self.base_url}/tx-committed", params={"tx-id": tx_id})
295+
296+
self._verify_response(res)
297+
return res.json()
298+
299+
def get_latest_completed_transaction(self):
300+
res = self._session.get(f"{self.base_url}/latest-completed-tx")
301+
302+
self._verify_response(res)
303+
return res.json()
304+
305+
def get_latest_submitted_transaction(self):
306+
res = self._session.get(f"{self.base_url}/latest-submitted-tx")
307+
308+
self._verify_response(res)
309+
return res.json()
310+
311+
def get_active_queries(self):
312+
res = self._session.get(f"{self.base_url}/active-queries")
313+
314+
self._verify_response(res)
315+
return res.json()
316+
317+
def get_recent_queries(self):
318+
res = self._session.get(f"{self.base_url}/recent-queries")
319+
320+
self._verify_response(res)
321+
return res.json()
322+
323+
def get_slowest_queries(self):
324+
res = self._session.get(f"{self.base_url}/slowest-queries")
325+
326+
self._verify_response(res)
327+
return res.json()
328+
250329

251330
class XTDBSession:
252331
def __init__(self, base_url: str):

0 commit comments

Comments
 (0)