muryshev's picture
update
744a170
raw
history blame
2.29 kB
"""
Класс для представления документа как сущности.
"""
from dataclasses import dataclass, field
from .linker_entity import Entity, register_entity
@register_entity
@dataclass
class DocumentAsEntity(Entity):
"""
Класс для представления документа как сущности в системе извлечения и сборки.
Содержит ссылки на классы стратегии чанкинга и обработчика таблиц,
использовавшихся при деструктуризации.
"""
doc_type: str = "unknown"
chunking_strategy_ref: str | None = None
type: str = field(default="DocumentAsEntity")
@classmethod
def _deserialize_to_me(cls, data: Entity) -> 'DocumentAsEntity':
"""
Десериализует DocumentAsEntity из объекта LinkerEntity.
Args:
data: Объект LinkerEntity для преобразования в DocumentAsEntity
Returns:
Десериализованный объект DocumentAsEntity
"""
if not isinstance(data, Entity):
raise TypeError(f"Ожидался LinkerEntity, получен {type(data)}")
metadata = data.metadata or {}
# Получаем поля из атрибутов или метаданных
doc_type = getattr(data, 'doc_type', metadata.get('_doc_type', 'unknown'))
strategy_ref = getattr(
data, 'chunking_strategy_ref', metadata.get('_chunking_strategy_ref', None)
)
# Создаем чистые метаданные без служебных полей
clean_metadata = {k: v for k, v in metadata.items() if not k.startswith('_')}
return cls(
id=data.id,
name=data.name,
text=data.text,
in_search_text=data.in_search_text,
metadata=clean_metadata,
source_id=data.source_id,
target_id=data.target_id,
number_in_relation=data.number_in_relation,
groupper=data.groupper,
type=cls.__name__,
doc_type=doc_type,
chunking_strategy_ref=strategy_ref,
)