platypush/platypush/entities/_engine/repo/__init__.py

50 lines
1.4 KiB
Python
Raw Normal View History

2022-12-17 21:41:23 +01:00
import logging
from typing import Dict, Iterable, Tuple
from sqlalchemy.orm import Session
2022-12-17 21:41:23 +01:00
from platypush.entities import Entity
2023-02-19 22:56:45 +01:00
# pylint: disable=no-name-in-module
2022-12-17 21:41:23 +01:00
from platypush.entities._engine.repo.db import EntitiesDb
from platypush.entities._engine.repo.merger import EntitiesMerger
logger = logging.getLogger('entities')
class EntitiesRepository:
"""
This object is used to get and save entities. It wraps the database
connection.
2022-12-17 21:41:23 +01:00
"""
def __init__(self):
self._db = EntitiesDb()
self._merger = EntitiesMerger(self)
def get(
self, session: Session, entities: Iterable[Entity]
2022-12-17 21:41:23 +01:00
) -> Dict[Tuple[str, str], Entity]:
"""
Given a set of entity objects, it returns those that already exist
(or have the same ``entity_key``).
2022-12-17 21:41:23 +01:00
"""
return self._db.fetch(session, entities)
2022-12-17 21:41:23 +01:00
def save(self, *entities: Entity) -> Iterable[Entity]:
"""
Perform an upsert of entities after merging duplicates and rebuilding
the taxonomies.
2022-12-17 21:41:23 +01:00
"""
with self._db.get_session(
locked=True,
autoflush=False,
autocommit=False,
expire_on_commit=False,
) as session:
2022-12-17 21:41:23 +01:00
merged_entities = self._merger.merge(session, entities)
merged_entities = self._db.upsert(session, merged_entities)
return merged_entities