File size: 2,289 Bytes
86c402d
 
 
 
744a170
86c402d
744a170
86c402d
 
 
 
744a170
86c402d
 
744a170
 
86c402d
 
 
744a170
 
 
 
 
86c402d
744a170
86c402d
 
744a170
86c402d
 
744a170
86c402d
 
 
744a170
 
 
86c402d
744a170
 
 
 
 
 
 
86c402d
 
744a170
86c402d
 
 
 
 
 
 
 
 
744a170
 
 
 
86c402d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
"""
Класс для представления документа как сущности.
"""

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,
        )