Exemple #1
0
    async def get_by_ids(self,
                         person_ids: List[UUID]) -> Optional[List[Person]]:
        """
        Возвращает персоны по списку id.
        """
        persons = OrderedDict.fromkeys(person_ids, None)

        # проверяем есть ли полученные жанры в кеше по их ID
        for person_id in persons.keys():
            data = await self.cache.get(person_id)
            if data:
                persons[person_id] = Person.parse_raw(data)

        # не найденные в кеше персоны запрашиваем в эластике и кладём в кеш
        not_found = [
            person_id for person_id in persons.keys()
            if persons[person_id] is None
        ]
        if not_found:
            docs = await self.storage.get_by_ids(self._index, not_found)
            for doc in docs:
                person = Person(**doc)
                await self.cache.put(person.id, person.json())
                persons[person.id] = person
        return list(persons.values())
Exemple #2
0
    async def get_by_id(self, person_id: UUID) -> List[Person]:
        """
        Возвращает объект персоны. Он опционален, так как
        персона может отсутствовать в базе
        """

        data = await self.cache.get(person_id)
        if data:
            return Person.parse_raw(data)

        docs = await self.storage.get_by_ids(self._index, [
            person_id,
        ])
        if not docs:
            return None
        person = Person(**docs[0])
        await self.cache.put(person.id, person.json())
        return person