Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[resotocore][fix] Deferred Outer Edge handling (#1744)
- Loading branch information
1 parent
9171a14
commit b49e238
Showing
9 changed files
with
184 additions
and
106 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
from attrs import define | ||
from datetime import datetime | ||
from resotocore.db.async_arangodb import AsyncArangoDB | ||
from resotocore.db.entitydb import ArangoEntityDb | ||
from resotocore.model.graph_access import DeferredEdge | ||
from resotocore.ids import TaskId | ||
from typing import List, cast | ||
import logging | ||
|
||
from resotocore.model.typed_model import from_js | ||
from resotocore.types import Json | ||
from resotocore.ids import GraphName | ||
|
||
|
||
@define | ||
class DeferredOuterEdges: | ||
id: str | ||
change_id: str | ||
task_id: TaskId | ||
created_at: datetime # update the corresponding TTL index when changing this name | ||
graph: GraphName | ||
edges: List[DeferredEdge] | ||
|
||
|
||
TWO_HOURS = 7200 | ||
|
||
|
||
log = logging.getLogger(__name__) | ||
|
||
|
||
class DeferredOuterEdgeDb(ArangoEntityDb[str, DeferredOuterEdges]): | ||
async def all_for_task(self, task_id: TaskId) -> List[DeferredOuterEdges]: | ||
result = [] | ||
async with await self.db.aql_cursor( | ||
f"FOR e IN `{self.collection_name}` FILTER e.task_id == @task_id RETURN e", bind_vars={"task_id": task_id} | ||
) as cursor: | ||
async for doc in cursor: | ||
edges = from_js(doc, DeferredOuterEdges) | ||
result.append(edges) | ||
return result | ||
|
||
async def delete_for_task(self, task_id: TaskId) -> None: | ||
async with await self.db.aql_cursor( | ||
f"FOR e IN `{self.collection_name}` FILTER e.task_id == @task_id REMOVE e IN `{self.collection_name}`", | ||
bind_vars={"task_id": task_id}, | ||
) as cursor: | ||
async for _ in cursor: | ||
pass | ||
|
||
async def create_update_schema(self) -> None: | ||
await super().create_update_schema() | ||
ttl_index_name = "deferred_edges_expiration_index" | ||
collection = self.db.collection(self.collection_name) | ||
if ttl_index_name not in {idx["name"] for idx in cast(List[Json], collection.indexes())}: | ||
log.info(f"Add index {ttl_index_name} on {collection.name}") | ||
collection.add_ttl_index(["created_at"], TWO_HOURS, "deferred_edges_expiration_index") | ||
|
||
|
||
def deferred_outer_edge_db(db: AsyncArangoDB, collection: str) -> DeferredOuterEdgeDb: | ||
return DeferredOuterEdgeDb(db, collection, DeferredOuterEdges, lambda k: k.id) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
64 changes: 64 additions & 0 deletions
64
resotocore/tests/resotocore/db/deferredouteredgedb_test.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
from datetime import datetime | ||
|
||
import pytest | ||
from pytest import fixture | ||
from typing import List | ||
|
||
from resotocore.db.deferredouteredgedb import DeferredOuterEdges, DeferredOuterEdgeDb | ||
from resotocore.ids import TaskId, GraphName, NodeId | ||
from resotocore.model.graph_access import DeferredEdge, ByNodeId, EdgeTypes | ||
|
||
|
||
@fixture | ||
def instances() -> List[DeferredOuterEdges]: | ||
return [ | ||
DeferredOuterEdges( | ||
id="1", | ||
change_id="c1", | ||
task_id=TaskId("t1"), | ||
created_at=datetime(2021, 1, 1), | ||
graph=GraphName("test"), | ||
edges=[DeferredEdge(ByNodeId(NodeId("e1")), ByNodeId(NodeId("e2")), EdgeTypes.default)], | ||
), | ||
DeferredOuterEdges( | ||
id="2", | ||
change_id="c1", | ||
task_id=TaskId("t1"), | ||
created_at=datetime(2021, 1, 1), | ||
graph=GraphName("test"), | ||
edges=[DeferredEdge(ByNodeId(NodeId("e2")), ByNodeId(NodeId("e3")), EdgeTypes.default)], | ||
), | ||
DeferredOuterEdges( | ||
id="3", | ||
change_id="c2", | ||
task_id=TaskId("t2"), | ||
created_at=datetime(2021, 1, 1), | ||
graph=GraphName("test"), | ||
edges=[DeferredEdge(ByNodeId(NodeId("e2")), ByNodeId(NodeId("e3")), EdgeTypes.default)], | ||
), | ||
] | ||
|
||
|
||
@pytest.mark.asyncio | ||
async def test_all_by_task_id( | ||
pending_deferred_edge_db: DeferredOuterEdgeDb, instances: List[DeferredOuterEdges] | ||
) -> None: | ||
await pending_deferred_edge_db.update_many(instances) | ||
assert len(await pending_deferred_edge_db.all_for_task(TaskId("t1"))) == 2 | ||
assert len(await pending_deferred_edge_db.all_for_task(TaskId("t2"))) == 1 | ||
|
||
|
||
@pytest.mark.asyncio | ||
async def test_remove_by_task_id( | ||
pending_deferred_edge_db: DeferredOuterEdgeDb, instances: List[DeferredOuterEdges] | ||
) -> None: | ||
await pending_deferred_edge_db.wipe() | ||
# insert all | ||
await pending_deferred_edge_db.update_many(instances) | ||
# delete t1 | ||
await pending_deferred_edge_db.delete_for_task(TaskId("t1")) | ||
assert len(await pending_deferred_edge_db.all_for_task(TaskId("t1"))) == 0 | ||
assert len(await pending_deferred_edge_db.all_for_task(TaskId("t2"))) == 1 | ||
# delete t2 | ||
await pending_deferred_edge_db.delete_for_task(TaskId("t2")) | ||
assert len([n async for n in pending_deferred_edge_db.all()]) == 0 |
Oops, something went wrong.