futriix-json/README.md
Григорий Сафронов 476c87cbdc
Some checks are pending
CI / build-ubuntu-latest (8.0) (push) Waiting to run
CI / build-ubuntu-latest (unstable) (push) Waiting to run
CI / build-asan-ubuntu-latest (8.0) (push) Waiting to run
CI / build-asan-ubuntu-latest (unstable) (push) Waiting to run
Update README.md
2025-03-22 19:59:32 +00:00

266 lines
8.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## Краткая документация Futriix-JSON
<!-- PROJECT LOGO -->
<br />
<div align="center">
<!-- <a href="https://github.com/othneildrew/Best-README-Template"> -->
<img src="Logo-Futriix.png" height=100></img>
</a>
</div>
<!-- TABLE OF CONTENTS -->
<br>
<details>
<summary><b>Содержание</b></summary>
<ol>
<li>
<a href="#о-проекте">О проекте</a>
</li>
<li><a href="#компиляция">Компиляция</a></li>
<li><a href="#использование">Использование</a></li>
<li><a href="#ограничения">Ограничения</a></li>
<li><a href="#команды">Команды</a></li>
<li><a href="#ключи">Ключи</a></li>
</ol>
</details>
# 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=<test-function-or-file> 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
```