Jan. 23rd, 2026

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

День 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);

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

Page Summary

Style Credit

Expand Cut Tags

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