## Краткая документация Futriix-JSON

Содержание
  1. О проекте
  2. Компиляция
  3. Использование
  4. Ограничения
  5. Команды
  6. Ключи
# Futriix JSON Futriix-json is a C++ Futriix-Модуль,который обеспечивает встроенную поддержку JSON (JavaScript Object Notation) для Futriix. Реализация соответствует стандартам обмена данными RFC7159 и ECMA-404 JSON. Пользователи могут хранить, запрашивать и изменять структуры данных JSON с помощью языка запросов JSONPath. Выражения запроса поддерживают расширенные возможности, включая выбор с подстановочными знаками, выражения фильтров, срезы массива, операции объединения и рекурсивный поиск. Futriix-json использует [RapidJSON](https://rapidjson.org/), высокопроизводительный JSON-парсер и генератор для C++, выбранный за его компактность и исключительную производительность и эффективность памяти. Будучи библиотекой только для заголовков без внешних зависимостей, RapidJSON обеспечивает надежную поддержку Unicode, сохраняя при этом компактный профиль памяти всего 16 байт на значение JSON на большинстве 32/64-разрядных машин. ## Компиляция #### Компиляция модуля и запуск тестов ```text # Компилирет futriix-server (нестабильную-ветку) и запускает интеграционные тесты ./build.sh ``` По умолчанию версия futriix является "нестабильной". Для того чтобы изменить ветку выполните команду: ```text # Компилирет futriix-server () и запускает интеграционные тесты SERVER_VERSION=8.0 ./build.sh ``` Пользовательские флаги компилятора могут быть переданы в скрипт сборки через переменную окружения CFLAGS. Например: ```text CFLAGS="-O0 -Wno-unused-function" ./build.sh ``` #### Сборка модуля с помощью [ASAN](https://github.com/google/sanitizers/wiki/AddressSanitizer) ```text export ASAN_BUILD=true ./build.sh ``` #### Чтобы собрать только модуль ```text mkdir build cd build cmake .. make ``` Версия futriix по умолчанию — «нестабильная». Чтобы переопределить его, выполните следующие действия: ```text mkdir build cd build cmake .. -DVALKEY_VERSION=8.0 make ``` Пользовательские флаги компилятора могут быть переданы в cmake через переменную CFLAGS. Например: ```text mkdir build cd build cmake .. -DCFLAGS="-O0 -Wno-unused-function" make ``` #### Запуск всех Юнит-тестов: ```text cd build make -j unit ``` #### Запуск всех интеграционных тестов: ```text make -j test ``` #### Запуск одного интеграционного теста: ```text TEST_PATTERN= make -j test ``` e.g., ```text TEST_PATTERN=test_sanity make -j test TEST_PATTERN=test_rdb.py make -j test ``` ## Загрузка модуля Чтобы протестировать модуль с помощью Futriix, вы можете загрузить модуль любым из следующих способов: #### С ипользованием файла конфигурации futriix.conf: ``` 1. Добавьте следующее строки в файл конфигураии futriix.conf: loadmodule /path/to/libjson.so 2. Запускаем futriix-сервер: futriix-server /path/to/futriix.conf ``` #### Запуск Futriix с помощью опции --loadmodule option: ```text futriix-server --loadmodule /path/to/libjson.so ``` #### Использование команды Futriix MODULE LOAD: ``` 1. Connect to a running Valkey instance using valkey-cli 2. Execute Valkey command: MODULE LOAD /path/to/libjson.so ``` ## Использование Первая команда JSON, которую следует попробовать, — это JSON. SET, который задает ключ Futriix со значением JSON. JSON. SET принимает все типы значений JSON. В этом примере создается строка JSON: ``` > JSON.SET bike $ '"Hyperion"' OK > JSON.GET bike $ "[\"Hyperion\"]" > JSON.TYPE bike $ 1) "string" ``` Обратите внимание, что команды включают символ доллара $. Это путь к значению в документе JSON (в данном случае это просто корень). Вот еще несколько строковых операций. JSON. STRLEN сообщает вам длину строки, и вы можете добавить к ней еще одну строку с помощью JSON. STRAPPEND. ``` > JSON.STRLEN bike $ 1) (integer) 8 > JSON.STRAPPEND bike $ '" (Enduro bikes)"' 1) (integer) 23 > JSON.GET bike $ "[\"Hyperion (Enduro bikes)\"]" ``` Числа можно увеличивать и умножать: ``` > JSON.SET crashes $ 0 OK > JSON.NUMINCRBY crashes $ 1 "[1]" > JSON.NUMINCRBY crashes $ 1.5 "[2.5]" > JSON.NUMINCRBY crashes $ -0.75 "[1.75]" > JSON.NUMMULTBY crashes $ 24 "[42]" ``` Вот более интересный пример, который включает массивы и объекты JSON: ``` > JSON.SET newbike $ '["Deimos", {"crashes": 0}, null]' OK > JSON.GET newbike $ "[[\"Deimos\",{\"crashes\":0},null]]" > JSON.GET newbike $[1].crashes "[0]" > JSON.DEL newbike $[-1] (integer) 1 > JSON.GET newbike $ "[[\"Deimos\",{\"crashes\":0}]]" ``` Команда JSON.DEL удаляет любое значение JSON которое вы указываете с помощью параметра path. Вы можете манипулировать массивами с помощью выделенного подмножества команд JSON: ``` > JSON.SET riders $ [] OK > JSON.ARRAPPEND riders $ '"Norem"' 1) (integer) 1 > JSON.GET riders $ "[[\"Norem\"]]" > JSON.ARRINSERT riders $ 1 '"Prickett"' '"Royce"' '"Castilla"' 1) (integer) 4 > JSON.GET riders $ "[[\"Norem\",\"Prickett\",\"Royce\",\"Castilla\"]]" > JSON.ARRTRIM riders $ 1 1 1) (integer) 1 > JSON.GET riders $ "[[\"Prickett\"]]" > JSON.ARRPOP riders $ 1) "\"Prickett\"" > JSON.ARRPOP riders $ 1) (nil) ``` JSON объекты также имеют свои собственные команды: ``` > JSON.SET bike:1 $ '{"model": "Deimos", "brand": "Ergonom", "price": 4972}' OK > JSON.OBJLEN bike:1 $ 1) (integer) 3 > JSON.OBJKEYS bike:1 $ 1) 1) "model" 2) "brand" 3) "price" ``` ## Ключи ``` $ futriix-cli --raw > JSON.GET obj INDENT "\t" NEWLINE "\n" SPACE " " $ [ { "name": "Leonard Cohen", "lastSeen": 1478476800, "loggedOut": true } ] ``` ## Ограничения Значение JSON, передаваемое команде, может иметь глубину до 128. Если передать команде значение JSON, содержащее объект или массив с уровнем вложенности больше 128, команда вернет ошибку. ## Команды ```text JSON.ARRAPPEND JSON.ARRINDEX JSON.ARRINSERT JSON.ARRLEN JSON.ARRPOP JSON.ARRTRIM JSON.CLEAR JSON.DEBUG JSON.DEL JSON.FORGET JSON.GET JSON.MGET JSON.MSET (#16) JSON.NUMINCRBY JSON.NUMMULTBY JSON.OBJLEN JSON.OBJKEYS JSON.RESP JSON.SET JSON.STRAPPEND JSON.STRLEN JSON.TOGGLE JSON.TYPE ```