Ассоциативный Эксель и Сквозная валидация
Понятия и определения
Прежде чем мы заглянем под капот, начнём издалека, с общностей. Для специалистов это может показаться само собой разумеющейся информацией, но начинающим будет полезно. Чем же по сути являются все эти пакеты?
Для начала, Связь, краеугольное понятие на котором всё зиждется — это минимальная единица смысла, которую использует Deep, строительный кирпичик, из которого мы собираем смыслы и образы любой сложности.
Техническим языком: связь — это то, у чего есть начало (from_id), тип (type_id) и конец (to_id), а также свой идентификатор (id). Все эти идентификаторы — это идентификаторы связей (самой этой связи или же других связей). В данный момент type_id является обязательным для каждой связи. Отсутствие идентификатора и идентификатор по умолчанию это 0.
Хэндлер — обработчик, это связь, содержащая поведение/код, который выполняется, когда происходит событие, к которому привязан этот обработчик (примеры события над связями — вставка, обновление, удаление и другие).
А‑Sync хэндлеры — т. е., то что срабатывают после того, как событие произошло (нажимаешь в клиенте кнопку — Выполняется запрос к Deep на создание связи — получаешь ответ, что связь вставилась —, а действие начнёт исполняться только после того, как это произошло, в фоне в docker или в контейнере, где оркестратор это запустит. Sync Хэндлеры исполняются прямо внутри операции, являются сверхпроизводительными, но у них обрезанный доступ к функционалу языка. т. е. он прямо внутри БД исполняет маленький кусочек JS, с ограничением прав и разрешением оперировать только отдельными связями. Исполнение происходит максимально близко к базе данных.
Docker — это открытая платформа для разработки, доставки и запуска приложений. Docker позволяет вам разделять приложения от инфраструктуры, так что вы можете быстро доставлять программное обеспечение. С помощью Docker вы можете управлять инфраструктурой так же, как управляете приложениями. Центральной концепцией в Docker является контейнер.
Контейнер — это стандартизированная единица программного обеспечения, которая упаковывает код и все его зависимости, так что приложение работает быстро и надежно от одной вычислительной среды к другой.
Контейнер Docker — это легковесный, автономный, исполняемый пакет ПО, который включает все, что нужно для запуска приложения: код, исполняющую среду времени выполнения, системные инструменты, системные библиотеки и настройки.
Краткое погружение в Глубину
Пакет MathJS
Первый пакет на сегодняшней повестке дня — в Deep теперь можно интегрировать инструментарий аналитической обработки цифровых данных со способностью создавать связи со значением формулы, использующей цифровые значения других связей (встроить функционал Экселя). Каждый раз при изменении используемых данных — значения перевычисляются, т. е. это не статическое вычисление (как в Python). Если ты сослался на какой‑то диапазон данных (потенциально огромный) результат агрегации будет подсчитываться постоянно при каждом изменении. Сейчас стоит таймер на обновление раз в минуту (в разработке уже таймер покороче), потому что при большом объёме изменяемых данных не эффективно их пересчитывать в реальном времени.
Пара слов про пакет Logger
Вторым выступает пакет logger, помнящий все изменения, происходящие в определённых типах (в одном контейне с каким‑либо творческим спэйсом или же во всём индивидуальном Deep). При активации логгера будут обрабатываться события операций над связями экземпляров типа (с которым связан обработчик), и будет создаваться рядом структура связей отражающую всю информацию о каждом произошедшем изменении (кто, что, когда). Даже если связь исчезнет, то logs по ней сохранятся, и у пользователя будет возможность воссоздать структуру из любого момента времени развития проекта.
То есть, если у нас формулы регулярно пересчитывают результат на основании реальных данных, а результаты вычислений тоже сохраняются в виде связей, то при каждом вычислении logs будут буквально пульсировать от каждого изменения создавая нам подробнейшую историю колебаний.
Технические пояснения.
Оба пакета написаны как sync хэндлеры. При создании формулы автоматически перевычисляются все зависимости. Не асинхронно потом, а прямо в момент изменения. Если включить дата логгирование, то прямо внутри операции этот кусочек кода вычисляет какие logs должны быть и генерирует необходимые связи.
В docker мы имеем доступ к npm пакетам, что открывает нам множество a‑sync способов обращения к сети. В sync хэндлерах сам JS не имеет возможности обращаться к сети, так как он буквально синхронен, он так подвязан к PostgreSQL, что позволяет выполнять операции прямо внутри движка. Внутри sync хандлеров, используется plv8 движок, у него нет доступа к асинхронным вызовам, а также к способам обратиться в интернет нет.
DeepClient (доступен в любой JavaScript среде) — класс, позволяющий гибко оперировать связями, но внутри нашего sync хэндлера стоит обрезанная версия, она не может ориентироваться по большому числу связей. Она работает по специфическим связям с конкретными указателями (id, type_id, from_id, to_id). То есть она может выдать подмножество, но только отдельными запросами. А когда мы обращаемся к базе извне (из клиента, из docker) отправляется a‑sync запрос (после отправки скрипт ничего больше не делает, работают другие, а этот ждёт ответа базы).
Синхронные скрипты работают прямо рядом с ядром PostgreSQL, без обходного скрипта к GraphQL. То есть, прямо поверх SQL реализована симуляция Deep.Client, который при маленьких атомарных операциях напрямую обращается к PostgreSQL, совершает действие и возвращается в JavaScript, без асинхронности, как будто это происходит последовательно на одном ядре, что даёт нам дикую скорость исполнения операций внутри.
Пакет JsonSchema
JsonSchema является стандартным валидатором структур, и все понимают, что поверх ассоциативности его внедрять не имеет смысла, но внутри value одной связи (строка, объект, число) его можно включить. Если есть тип, у которого привязан value, мы можем добавить к нему свойство в стандарте JsonSchema (любой сложности). То есть, мы встроили эту массивную библиотеку в sync хэндлеры.
При создании запроса на создание или изменение связи, которая находится под влиянием этого пакета, вводимые данные будут валидироваться. Не прошедшие проверку данные нельзя будет ввести — связь не сохранится, и будет выдаваться ошибка в стандарте JsonSchema из нашего API. Эти же данные используются клиентом для генерации формочки (пакет ChakraReact JsonSchema Form — генерирует формы по стандартам JsonSchema).
В мире сейчас только SAP и 1С, в какой‑то мере, способны обеспечить сквозную вылидацию: в них в одном редакторе создаются сущности на уровне схемы, потом их размещаешь в определённых интерфейсах с запросом на генерацию формы или заполняешь сам оставляя какие‑либо поля. Но у них это работает на своём закрытом внутреннем движке и, естественно, оно не совместимо со всеми остальными решениями вокруг.
Нам же JsonSchema открыл широчайшие просторы возможностей. Мы можем создавать любые сущности, привязывать к ним валидацию, генерировать формы как по списку сущностей, так и для каждой сущности по отдельности, а зная правила валидации, можно делать очень удобный универсальный поисковик (в обозримом будущем будет выпущен генератор форм на основании переданных сущностей с перечислением возможных способов поиска).
Итог. На простом языке, для тех, кто не просёк всю прелесть этой убойной тройки: какой бы массивный пласт данных у вас не был (экономических, статистических, маркетинговых, игровых), и у вас составлен валидатор идеально под ваши нужды, у вас попросту не будут вноситься ошибочные данные. Например, с опубликованной на npm структурой passport с системой валидации полей паспорта, для всевозможных регистраций, и это лишь верхушка айсберга.
Выпущены три отдельных пакетика. В каждом пакетике всего один кусочек кода, обеспечивающий готовую, рабочую, фрактальную, жаждущую имплементации систему, который мы свободно выпускаем на ваши критику и умозрение. Устанавливайте, пробуйте, обсуждайте, критикуйте, задавайте вопросы! И не забывайте нырять Глубже!
P.S.
А еще мы ищем тебя, если ты любишь интерфейсы, понимаешь разницу между grid и flex, если для тебя изменение позиции и цвета кнопки, это не ненужная перекраска и перестановка, а полезная и удобная фича для пользователя, если ты понимаешь, что люди с ограниченные возможностями тоже пользуются интернетом и ты хочешь им помочь с доступностью контента на странице, если ты ценишь важность того, чтобы пользователю было комфортен и понятен UX, а браузеров есть больше чем один, мы приглашаем тебя Кадетство Глубины делать вместе с нами проекты, заказы, стартапы и сумасшедшие эксперименты.