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 }
}
Нажмите кнопку воспроизведения. В результате вы получите плейлист, в котором группы представлены в случайном порядке:
 
Выполняя эту команду, вы каждый раз будете получать новый плейлист.