Как разработать функцию импорта / экспорта для моего приложения узла - PullRequest
0 голосов
/ 28 января 2020

У меня есть приложение для настройки в Nodejs. Он имеет Component с name и uuid. A Component может иметь много Schemas. A Schema имеет uuid, name, componentId, json. A Schema может иметь много Configurations. A Configuration имеет name, schemaId, json и uuid. Schema может содержать ссылку на многие другие Schemas в нем. Теперь я хочу создать функциональность экспорта всех данных из одного экземпляра приложения и импорта их в другой. Какой должен быть самый простой способ сделать это? Вот несколько вопросов:

  1. Как указать приложению, что экспортировать. сейчас я думаю, что должны быть отдельные массивы для компонентов, схем и конфигураций. Как и
{
    components: ['id1', 'id2'],
    schemas: ['s1', 's2'],
    configuration: ['c1', 'c2'],
}

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

  1. Настоящий вопрос как должен выглядеть мой файл экспорта, имея в виду, что зависимости также задействованы и зависимости могут также перекрываться. например, схема может иметь много других схем, на которые ссылается ее поле json. Например, schema1 имеет schema2 и schema4 в качестве зависимостей. так что есть другая схема schema5, которая также требует schema2. поэтому при импорте мы должны убедиться, что schema2 должны быть сохранены перед сохранением schema1 и schema5. как представить такой файл, который требует порядка, а также перекрывающихся зависимостей, убедившись, что schema2 не сохраняется дважды при импорте. json из schema1 показано ниже в качестве примера
{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "p1": {
        "$ref": "link-to-schema2"
    },
    "p2": {
        "$ref": "link-to-schema4"
    },

}

Какой должен быть пошаговый алгоритм sudo, которому я должен следовать при импорте.

1 Ответ

1 голос
/ 29 января 2020

Это прекрасный повод для топологической сортировки .

Удаление терминологии компонентов, схем и конфигураций, что у вас есть объекты (различного рода), которые зависят от других существующих объектов первый. Топологическая сортировка создаст порядок, который имеет только прямые зависимости (при условии, что у вас нет циклических зависимостей, в этом случае это невозможно).

Но сложность заключается в том, что у вас есть информация о зависимостях в разных направлениях. , Компонент должен быть создан до его схемы. Схема должна быть создана после схем, от которых она зависит. Не исключено, что эти схемы могут принадлежать и другим компонентам, которые также должны быть созданы.

Первый шаг - написать функцию, которая принимает объект и возвращает набор отношений зависимости, обнаруживаемых самим объектом. , Поэтому мы хотим, чтобы dependencyRelations(object1 дал что-то вроде [[object1, object2], [object3, object1], [object1, object4]]. Где object1 зависит от object2 существующего. (Обратите внимание, что object1 будет в каждой паре, но может быть первым или вторым.)

Если у каждого объекта есть метод с именем uniqueName, который однозначно идентифицирует его, то мы можем написать метод, который работает примерно так: (извините, весь код был набран здесь и не тестировался, возможно, есть синтаксические ошибки, но идея верна):

function dependencyInfo (startingObject) {
    const nameToObject = {};
    const dependencyOf = {};
    const todo = [startingObject];
    const visited = {};

    while (0 < todo.length) {
        let obj = todo.pop();
        let objName = obj.uniqueName();
        if (! visited[ objName ]) {
            visited[ objName ] = true;
            nameToObject[objName] = obj;
            dependencyRelations(obj).forEach((pair) => {
                const [from, to] = pair;
                // It is OK to put things in todo that are visited, we just don't process again.
                todo.push(from);
                todo.push(to);
                if (! dependencyOf[from.uniqueName()]) {
                    dependencyOf[from.uniqueName()] = {}
                }
                dependencyOf[from.uniqueName()] = to.uniqueName();
            });
        }
    }
    return [nameToObject, dependencyOf];
}

Эта функция построит граф зависимостей. Но нам все еще нужно выполнить топологическую сортировку, чтобы сначала получить зависимости.

function objectsInOrder (nameToObject, dependencyOf) {
    const answer = [];
    visited = {};

    // Trick for a recursive function local to my environment.
    let addObject = undefined;
    addObject = function (objName) {
        if (! visited[objName]) {
            visited[objName] = true; // Only process once.
            // Add dependencies
            Object.keys(dependencyOf[objName]).forEach(addObject);
            answer.push(nameToObject[objName]);
        }
    };
    Object.keys(dependencyOf).forEach(addObject);
    return answer;
}

И теперь у нас есть массив объектов, каждый из которых зависит только от предыдущих. Отправьте это, и на другом конце вы просто раздуваете каждый объект по очереди.

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