Hello world на Lua | Tdg

Версия:

2.x

Hello world на Lua

Из этого руководства вы узнаете, как настраивать модель данных, выполнять запросы и создавать хранимые процедуры на языке Lua.

Для начала вам понадобится запущенный экземпляр TDG. Можно запустить TDG в Docker-контейнере или же развернуть его на локальной машине вручную или с помощью Ansible.

Затем вы сможете:

  1. настроить модель данных;

  2. выполнить запрос данных;

  3. написать хранимые процедуры.

Настройка модели данных

В этом руководстве используется модель данных, содержащая два типа объектов: музыкальные группы и исполнители. У каждой музыкальной группы есть название, жанр и год ее создания. Для исполнителей указываются имена, страны происхождения и инструменты, на которых они играют.

Вот пример такой модели:

[
    {
        "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 и удалите всё из поля запроса:

Вкладка Graphql

В поле запроса вставьте такие данные:

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:

Создание файла hello.lua

Для этого Lua-модуля необходим GraphQL-интерфейс. На вкладке Code создайте файл под названием services.yml и задайте сигнатуру GraphQL-вызова:

hello_world:
  doc: "Hello World script"
  function: hello.hello
  return_type: string

Нажмите Apply:

Создание GraphQL-интерфейса

Код проверяется и загружается в кластер. Если произойдет ошибка, в правом нижнем углу вы увидите уведомление с ее описанием.

Откройте вкладку Graphql, выберите необходимую схему default и вызовите хранимую процедуру:

{
  hello_world
}

В поле справа вы получите результат:

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 }
}

Нажмите кнопку воспроизведения. В результате вы получите плейлист, в котором группы представлены в случайном порядке:

Плейлист со случайным порядком воспроизведения

Выполняя эту команду, вы каждый раз будете получать новый плейлист.

Нашли ответ на свой вопрос?
Обратная связь