266 lines
8.6 KiB
Markdown
266 lines
8.6 KiB
Markdown
## Краткая документация 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
|
||
```
|