muryshev's picture
update
86c402d
raw
history blame
4.14 kB
from uuid import UUID
from ntr_text_fragmentation.models.linker_entity import (LinkerEntity,
register_entity)
@register_entity
class CustomEntity(LinkerEntity):
"""Пользовательский класс-наследник LinkerEntity для тестирования сериализации и десериализации."""
def __init__(
self,
id: UUID,
name: str,
text: str,
metadata: dict,
custom_field1: str,
custom_field2: int,
in_search_text: str | None = None,
source_id: UUID | None = None,
target_id: UUID | None = None,
number_in_relation: int | None = None,
type: str = "CustomEntity"
):
super().__init__(
id=id,
name=name,
text=text,
metadata=metadata,
in_search_text=in_search_text,
source_id=source_id,
target_id=target_id,
number_in_relation=number_in_relation,
type=type
)
self.custom_field1 = custom_field1
self.custom_field2 = custom_field2
def deserialize(self, entity: LinkerEntity) -> 'CustomEntity':
"""Реализация метода десериализации для кастомного класса."""
custom_field1 = entity.metadata.get('_custom_field1', '')
custom_field2 = entity.metadata.get('_custom_field2', 0)
# Создаем чистые метаданные без служебных полей
clean_metadata = {k: v for k, v in entity.metadata.items()
if not k.startswith('_')}
return CustomEntity(
id=entity.id,
name=entity.name,
text=entity.text,
in_search_text=entity.in_search_text,
metadata=clean_metadata,
source_id=entity.source_id,
target_id=entity.target_id,
number_in_relation=entity.number_in_relation,
custom_field1=custom_field1,
custom_field2=custom_field2
)
@classmethod
def deserialize(cls, entity: LinkerEntity) -> 'CustomEntity':
"""
Классовый метод для десериализации.
Необходим для работы с реестром классов.
Args:
entity: Сериализованная сущность
Returns:
Десериализованный экземпляр CustomEntity
"""
custom_field1 = entity.metadata.get('_custom_field1', '')
custom_field2 = entity.metadata.get('_custom_field2', 0)
# Создаем чистые метаданные без служебных полей
clean_metadata = {k: v for k, v in entity.metadata.items()
if not k.startswith('_')}
return CustomEntity(
id=entity.id,
name=entity.name,
text=entity.text,
in_search_text=entity.in_search_text,
metadata=clean_metadata,
source_id=entity.source_id,
target_id=entity.target_id,
number_in_relation=entity.number_in_relation,
custom_field1=custom_field1,
custom_field2=custom_field2
)
def __eq__(self, other):
"""Переопределяем метод сравнения для проверки равенства объектов."""
if not isinstance(other, CustomEntity):
return False
# Используем базовое сравнение из LinkerEntity, которое уже учитывает поля связи
base_equality = super().__eq__(other)
# Дополнительно проверяем кастомные поля
return (
base_equality
and self.custom_field1 == other.custom_field1
and self.custom_field2 == other.custom_field2
)