Hello world на Lua¶
Из этого руководства вы узнаете, как настраивать модель данных, выполнять запросы и создавать хранимые процедуры на языке Lua.
Для начала вам понадобится запущенный экземпляр TDG. Можно запустить TDG в Docker-контейнере или же развернуть его на локальной машине вручную или с помощью Ansible.
Затем вы сможете:
Настройка модели данных¶
В этом руководстве используется модель данных, содержащая два типа объектов: музыкальные группы и исполнители. У каждой музыкальной группы есть название, жанр и год ее создания. Для исполнителей указываются имена, страны происхождения и инструменты, на которых они играют.
Вот пример такой модели:
[
{
"name": "MusicBand",
"type": "record",
"fields": [
{"name": "name", "type": "string"},
{"name": "genre", "type": {"type":"array", "items":"string"}},
{"name": "wasformed", "type":"long"}
],
"indexes": ["name", "genre", "wasformed"]
},
{
"name": "Artist",
"type": "record",
"fields": [
{"name": "fullname", "type": "string"},
{"name": "country", "type": "string"},
{"name": "instruments", "type": {"type":"array", "items":"string"}}
],
"indexes": ["fullname"]
}
]
В меню слева есть вкладка Model. Откройте ее и вставьте модель в поле Request. Нажмите Submit:
Вы настроили модель данных. Теперь можно выполнять загрузку, выборку и удаление данных.
Загрузка данных в TDG¶
В меню слева есть вкладка под названием Graphql. Откройте эту вкладку, выберите необходимую схему default и удалите всё из поля запроса:
В поле запроса вставьте такие данные:
mutation all {
rammstein:MusicBand(insert: {
name: "Rammstein",
genre: ["metal", "industrial", "gothic"],
wasformed: 1994}) {
name
genre
wasformed
}
linkinpark:MusicBand(insert: {
name: "Linkin Park",
genre: ["alternative", "metal"],
wasformed: 1996}) {
name
genre
wasformed
}
blacksabbath:MusicBand(insert: {
name: "Black Sabbath",
genre: ["gothic", "metal"],
wasformed: 1968}) {
name
genre
wasformed
}
deeppurple:MusicBand(insert:{
name: "Deep Purple",
genre: ["metal", "rock"],
wasformed: 1968}) {
name
genre
wasformed
}
maxkorzh:MusicBand(insert:{
name:"Max Korzh",
genre:["rap", "electro"],
wasformed: 2006}) {
name
genre
wasformed
}
}
Нажмите кнопку воспроизведения, чтобы выполнить запрос:
Данные загружены.
Выполнение запросов к данным¶
Чтение данных¶
Читать данные можно на вкладке Graphql. Убедитесь, что выбрана схема default, удалите всё из поля слева и напишите запрос на выборку всех музыкальных групп:
query {
MusicBand {
name
wasformed
genre
}
}
Нажмите кнопку воспроизведения. В поле справа вы увидите результат:
Выполните выборку данных по первичному ключу:
query {
MusicBand(name:"Black Sabbath") {
name
wasformed
genre
}
}
Нажав на кнопку воспроизведения, вы получите всю сохраненную информацию о группе Black Sabbath:
Изменение данных¶
Добавьте еще один музыкальный жанр для одной из групп. Для этого на вкладке Graphql внесите информацию о двух жанрах для группы:
mutation {
MusicBand(insert:{
name: "Deep Purple",
genre: ["metal", "rock"],
wasformed: 1968}) {
name
genre
wasformed
}
}
Нажмите кнопку воспроизведения. Информация о группе Deep Purple обновилась.
Удаление данных¶
На вкладке Graphql напишите запрос на удаление всех данных об одной из музыкальных групп:
mutation {
MusicBand(name:"Linkin Park" delete:true) {
name
genre
wasformed
}
}
Нажмите кнопку воспроизведения. Все данные о музыкальной группе Linkin Park удалены.
Написание хранимых процедур¶
Hello World¶
В меню слева есть вкладка Code. Откройте эту вкладку и создайте
директорию src
. В директории src
создайте файл hello.lua
,
представляющий собой Lua-модуль для экспорта функций:
function hello()
return "Hello World"
end
return {
hello = hello
}
Нажмите Apply:
Для этого Lua-модуля необходим GraphQL-интерфейс.
На вкладке Code создайте файл под названием services.yml
и задайте сигнатуру GraphQL-вызова:
hello_world:
doc: "Hello World script"
function: hello.hello
return_type: string
Нажмите Apply:
Код проверяется и загружается в кластер. Если произойдет ошибка, в правом нижнем углу вы увидите уведомление с ее описанием.
Откройте вкладку Graphql, выберите необходимую схему default и вызовите хранимую процедуру:
{
hello_world
}
В поле справа вы получите результат:
Плейлист со случайным порядком воспроизведения¶
В наборе данных есть разные музыкальные группы. Создайте хранимую процедуру для создания плейлиста, который будет воспроизводить песни в случайном порядке.
На вкладке Code откройте директорию src
и создайте файл под
названием playlist.lua
. В этом файле задайте логику для создания
плейлиста со случайным порядком воспроизведения:
local repository = require('repository')
function shuffle(tbl)
for i = #tbl, 2, -1 do
local j = math.random(i)
tbl[i], tbl[j] = tbl[j], tbl[i]
end
return tbl
end
function playlist()
local result = repository.find("MusicBand", {})
result = result or {}
shuffle(result)
return result
end
return {
playlist=playlist
}
В файле services.yml
задайте сигнатуру GraphQL-вызова:
playlist:
doc: "Return randomized playlist"
function: playlist.playlist
return_type: {"type":"array", "items":"MusicBand"}
Перейдите на вкладку Graphql и выполните такую команду:
{
playlist { name }
}
Нажмите кнопку воспроизведения. В результате вы получите плейлист, в котором группы представлены в случайном порядке:
Выполняя эту команду, вы каждый раз будете получать новый плейлист.