Какой самый эффективный способ построить дерево зависимостей в C ++ при выполнении вызовов REST API - PullRequest
0 голосов
/ 31 октября 2018

Мне нужно построить какое-то дерево зависимостей в C ++ при выполнении вызовов REST API к внутренней службе.

У меня есть служба API (поддерживается не мной), которая может предоставить мне некоторые данные. Он предоставляет пользователям, у каждого пользователя есть набор категорий, они могут быть вложенными. У каждой категории есть Предметы. Элементы не могут быть вложенными. Это похоже на обычную иерархию файловой системы:

User-1
....Category-1
........Item-1
........Category-2
............Item-2
............Item-3
....Category-3
User-2
....Category-4
........Item-4
....Category-5
........Item-5
........Item-6

У меня есть доступ только к этим методам API, и я не могу их изменить:

std::vector<User> GetUsers();
std::vector<Category> GetCategories(std::string userId, std::string categoryId = ""); // Empty categoryId = root Category. Returns only 1-level child categories.
std::vector<Item> GetItems(std::string categoryId);

Я должен представлять все элементы как узлы, используя эти 3 вызова API. Существует структура, которая представляет Node - User, Category, Item и все остальное. Я должен использовать эту структуру и не имею возможности ее изменить:

enum NodeType
{
    UNDEFINED = -1,

    USER,
    CATEGORY,
    ITEM,

    COUNT
};

struct Node
{
    std::size_t id;
    std::size_t parentId;
    std::string name;
    NodeType type;
};

Я решил поместить все узлы в std::unordered_multimap<std::size_t, Node>. ID узла - это ключ, а все дочерние элементы этого узла - значения.

Итак, каков наиболее эффективный и элегантный способ заполнения unordered_multimap созданными узлами при выполнении запросов к службе API?

Я придумал это:

std::unordered_multimap<std::size_t, Node> EnumerateNodes()
{
    size_t nodeId = 0;

    std::unordered_multimap<std::size_t, Node> result;

    Node rootNode = {nodeId + 1, nodeId, "RootNode", NodeType::ROOT};
    result.insert(std::make_pair(nodeId, rootNode));

    auto users = GetUsers();

    for (const auto& user : users)
    {
        // Create node for each user and recursively get his categories and items?
        // How to deal with parent ids while going through all categories?
    }

    return result;
}

Итак, у меня проблема: как эффективно управлять parentId и текущим идентификатором узла при переборе ответа API? Как выбрать все категории и элементы и правильно разместить их на мультикарте? Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...