norian: (Default)
[personal profile] norian
Гибридная Графовая База Данных (отвертка с моторчиком для моделирования моделей)

День 5. Линки: как связать узлы данных и сохранять спокойствие

Для связи узлов данных фиксированных типов достаточно двух ID. В общем случае могут связываться узлы разных типов, то есть нужно дополнительно два ID типов/блюпринтов ("free link").

Также в линке могут быть дополнительные данные, таким образом в плане реализации тип линков является надстройкой над типом узлов данных.

Функциональность линка включает заполнение контейнеров динамических ссылок в узлах данных для ускорения операций с данными графа.

source egLinksType.h

#pragma once
#include "../metainfo/egDatabaseType.h"

class EgLinksType {
public:
    EgDataNodesType linksDataStorage;
    EgDataNodesMapType& dataMap; // shortcut to container nodes map,  for (auto iter : dataMap)
    // bool                        isConnected         { false };      // ? TODO nodes data status ( connected, no file, no server)
    EgBlueprintIDType   linkBlueprintID         { 0 };
    std::string         linkTypeName;

    EgDataNodeBlueprintType*  dataNodeBlueprint { nullptr }; // storage shortcut
    EgDatabaseType*           metaInfoDatabase  { nullptr };
    EgDataNodesContainerType* fromDataNodes     { nullptr };
    EgDataNodesContainerType* toDataNodes       { nullptr };

    EgLinksType(): dataMap(linksDataStorage.dataMap) {}
    ~EgLinksType() { linksDataStorage.clear(); }
    
    void clear();

    int  ConnectLinks(const std::string& linkNameStr, EgDatabaseType& myDB); // check links in database metainfo

    void AddRawLink(EgDataNodeIDType fromID, EgDataNodeIDType toID);
    int  AddNodeContainersLink(EgDataNodeIDType fromID, EgDataNodeIDType toID);

    EgLinksType& operator << (EgDataNode* newNode) { linksDataStorage.AddDataNode(newNode); return *this; }
    EgLinksType& operator << (EgDataNode& newNode) { linksDataStorage.AddDataNode(newNode); return *this; }

    EgDataNodeIDType getAddedNodeID() {return linksDataStorage.getAddedNodeID();}

    int LoadLinks();
    int StoreLinks();

    int AddLinkPtrsToNodes(EgDataNode& link, EgDataNode& from, EgDataNode& to);
    int ResolveNodesIDsToPtrs(EgDataNodesType& from, EgDataNodesType& to);

    int  MarkUpdatedLink(EgDataNodeIDType linkNodeID) {return linksDataStorage.MarkUpdatedDataNode(linkNodeID);}
    
    void DeleteArrowLink(EgDataLinkIDType linkID);
    void DeleteInLink(EgDataLinkIDType linkID);    
    void DeleteOutLink(EgDataLinkIDType linkID);
};

void PrintResolvedLinks(const EgDataNode& node);

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

norian: (Default)
Norian

January 2026

S M T W T F S
    1 2 3
456 78 910
11121314 151617
18 19 20 21 22 2324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 23rd, 2026 05:52 pm
Powered by Dreamwidth Studios