Skip to content

Instantly share code, notes, and snippets.

@ArtDu
Created April 21, 2025 15:40
Show Gist options
  • Select an option

  • Save ArtDu/8f696153150f67d4ca49d28e15f86b1e to your computer and use it in GitHub Desktop.

Select an option

Save ArtDu/8f696153150f67d4ca49d28e15f86b1e to your computer and use it in GitHub Desktop.
TDB2 practice

Создать Java Maven проект

Чтобы создать новый Maven проект с нуля и добавить в него зависимость от tarantool-spring-data-32, выполните следующие шаги:

1. Создайте новый Maven проект

Используйте Maven Archetype Plugin для создания нового проекта. В этом примере мы создадим простой Java проект:

mvn archetype:generate -DgroupId=com.example -DartifactId=my-tarantool-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
  • -DgroupId=com.example: Укажите идентификатор группы для вашего проекта.
  • -DartifactId=my-tarantool-app: Укажите идентификатор артефакта (имя проекта).
  • -DarchetypeArtifactId=maven-archetype-quickstart: Используйте архетип maven-archetype-quickstart для создания простого Java проекта.
  • -DinteractiveMode=false: Отключает интерактивный режим, чтобы не запрашивать подтверждение для каждого параметра.

2. Перейдите в директорию проекта

После выполнения команды Maven создаст новый проект в директории my-tarantool-app. Перейдите в эту директорию:

cd my-tarantool-app

3. Добавьте зависимость в pom.xml

Откройте файл pom.xml в текстовом редакторе и добавьте зависимость от tarantool-spring-data-32 в секцию <dependencies>:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>my-tarantool-app</artifactId>
  <version>1.0-SNAPSHOT</version>

  <dependencies>
    <dependency>
      <groupId>io.tarantool</groupId>
      <artifactId>tarantool-spring-data-32</artifactId>
      <version>1.2.0</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

4. Соберите проект

Чтобы собрать проект и загрузить все зависимости, выполните команду:

mvn package

Эта команда скомпилирует проект и создаст JAR файл в директории target.

Теперь у вас есть новый Maven проект с зависимостью от tarantool-spring-data-32. Вы можете начать разработку, добавляя код в директорию src/main/java.

5. Запустите проект

Если вы хотите запустить проект как исполняемый JAR файл, выполните следующую команду:

java -cp target/my-tarantool-app-1.0-SNAPSHOT.jar com.example.App
  • -cp target/my-tarantool-app-1.0-SNAPSHOT.jar: Указывает путь к JAR файлу.
  • com.example.App: Указывает полный путь к классу с методом main.

Если вы хотите запустить проект через Maven (например, для удобства управления зависимостями), выполните:

mvn exec:java -Dexec.mainClass="com.example.App"
  • -Dexec.mainClass="com.example.App": Указывает Maven, какой класс использовать в качестве точки входа.

Если все успешно, то вы увидете "Hello world" в ответе.

Запуск Tarantool

Перед тем как начать работать с кодом, необходимо запустить Tarantool DB с заранее подготовленным примером.

Откройте второй терминал и выполните следующие команды:

cd ~/lessons/tarantooldb_2x/examples/go_crud/tt
make start

Это запустит стенд Tarantool DB, который будет использоваться в ходе практики.

Напишем запись в объекта List в Tarantool DB

  1. Добавьте код в класс App

    Откройте файл App.java в директории src/main/java/com/example и замените его содержимое на следующий код:

    package com.example;
    
    import io.tarantool.client.crud.TarantoolCrudClient;
    import io.tarantool.client.crud.TarantoolCrudSpace;
    import io.tarantool.client.factory.TarantoolFactory;
    
    import java.util.Arrays;
    
    public class App {
        public static void main(String[] args) throws Exception {
            // Создание клиента для подключения к Tarantool
            TarantoolCrudClient client = TarantoolFactory.crud()
                    .withUser("admin")
                    .withPort(3501)
                    .withPassword("secret-cluster-cookie")
                    .build();
    
            // Получение доступа к пространству данных "test"
            TarantoolCrudSpace space = client.space("test");
    
            // Выполнение операции замены данных в пространстве
            System.out.println(
                    space.replace(
                            Arrays.asList(1, null, 1, "artyom")
                    ).join()
            );
    
            // Закрытие клиента
            client.close();
        }
    }
  • replace: Эта операция заменяет объект в пространстве данных Tarantool, Она используется, чтобы можно было перезапускать проект несколько раз и получать одинаковый результат.
  1. Соберите проект

    Выполните команду Maven для сборки проекта и загрузки всех зависимостей:

    mvn package
  2. Запустите проект

    • Через Maven:

      mvn exec:java -Dexec.mainClass="com.example.App"

Ответ должен быть каким то таким Tuple(formatId = null, data = [1, 12477, 1, artyom], format = [])"

Добавим запись объекта Map в Tarantool DB

Чтобы добавить новый код сразу после предыдущего System.out.println, откройте файл App.java и добавьте новый блок кода:

        // Выполнение операции замены объекта в пространстве
        System.out.println(
                space.replaceObject(
                        Map.of(
                            "id", 2,
                            "too", 2,
                            "foo", "dima"
                        )
                ).join()
        );

Объяснение:

  • replaceObject: Эта операция заменяет объект в пространстве данных Tarantool, используя карту (Map) для передачи значений полей. В данном случае используется Map.of для создания неизменяемой карты с полями id, too и foo.
  • join(): Метод join() используется для ожидания завершения асинхронной операции и получения результата.
  • Не забудьте добавить import нужных классов

Прочитаем второй тапл как List

Чтобы добавить новый код после второго System.out.println, откройте файл App.java и добавьте новый блок кода:

        // Создание условия для выборки и выполнение операции выборки
        Condition condition = Condition.create("==", "id", 2);
        System.out.println(
                space.select(condition).join()
        );

Объяснение:

  • Condition.create("==", "id", 2): Создает условие для выборки записей из пространства, где поле id равно 2.
  • space.select(condition): Выполняет операцию выборки записей, соответствующих указанному условию.
  • join(): Метод join() используется для ожидания завершения асинхронной операции и получения результата.
  • Не забудьте добавить import нужных классов

После добавления кода, выполните сборку и запуск проекта, чтобы убедиться, что все работает корректно.

Прочитаем первый тапл как Map

Чтобы добавить новый код после третьего System.out.println, откройте файл App.java и добавьте новый блок кода:

        // Выполнение Lua-кода с использованием eval
        String evalString = "local res, err = crud.select(...)";
        evalString = evalString + "; return crud.unflatten_rows(res.rows, res.metadata)";
        System.out.println(
                client.eval(
                        evalString,
                        // аргументы, передающиеся в lua код в ...
                        Arrays.asList(
                                "test",
                                Arrays.asList(
                                        Arrays.asList("==", "id", 1)
                                )
                        ),
                        //
                        // первый List обозначает multireturn lua ответа
                        // пример "return 1,2,3" , тогда этот первый список будет состоять из этих 3 элементов
                        new TypeReference<List<List<Map<?,?>>>>(){}
                ).join()
        );

Объяснение:

  • evalString: Содержит Lua-код, который будет выполнен на сервере Tarantool. Код выполняет выборку с использованием crud.select и затем "разворачивает" строки с помощью crud.unflatten_rows.
  • client.eval(...): Выполняет Lua-код на сервере Tarantool. Аргументы передаются в виде списка, который соответствует параметрам, ожидаемым Lua-функцией.
  • TypeReference: Используется для указания типа данных, ожидаемых в ответе от Lua-кода. В данном случае ожидается список списков карт.

После добавления кода, выполните сборку и запуск проекта, чтобы убедиться, что все работает корректно.

Файл App.java после всех добавлений

Вот как будет выглядеть обновленный класс App:

package com.example;

import io.tarantool.client.crud.TarantoolCrudClient;
import io.tarantool.client.crud.TarantoolCrudSpace;
import io.tarantool.client.factory.TarantoolFactory;
import io.tarantool.client.crud.conditions.Condition;
import com.fasterxml.jackson.core.type.TypeReference;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

public class App {
    public static void main(String[] args) throws Exception {
        // Создание клиента для подключения к Tarantool
        TarantoolCrudClient client = TarantoolFactory.crud()
                .withUser("admin")
                .withPort(3501)
                .withPassword("secret-cluster-cookie")
                .build();

        // Получение доступа к пространству данных "test"
        TarantoolCrudSpace space = client.space("test");

        // Выполнение операции замены данных в пространстве
        System.out.println(
                space.replace(
                        Arrays.asList(1, null, 1, "artyom")
                ).join()
        );

        // Выполнение операции замены объекта в пространстве
        System.out.println(
                space.replaceObject(
                        Map.of(
                            "id", 2,
                            "too", 2,
                            "foo", "dima"
                        )
                ).join()
        );

        // Создание условия для выборки и выполнение операции выборки
        Condition condition = Condition.create("==", "id", 2);
        System.out.println(
                space.select(condition).join()
        );

        // Выполнение Lua-кода с использованием eval
        String evalString = "local res, err = crud.select(...)";
        evalString = evalString + "; return crud.unflatten_rows(res.rows, res.metadata)";
        System.out.println(
                client.eval(
                        evalString,
                        // аргументы, передающиеся в lua код в ...
                        Arrays.asList(
                                "test",
                                Arrays.asList(
                                        Arrays.asList("==", "id", 1)
                                )
                        ),
                        //
                        // первый List обозначает multireturn lua ответа
                        // пример "return 1,2,3" , тогда этот первый список будет состоять из этих 3 элементов
                        new TypeReference<List<List<Map<?,?>>>>(){}
                ).join()
        );

        // Закрытие клиента
        client.close();
    }
}

Самостоятельная работа

Для самостоятельной работы предполагается добавить ещё 2 записи объектов:

  • Добавить объект POJO как List
  • Добавить объект POJO как Map В качестве референса можно использовать примеры записи POJO в спейс person из лонгрида.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment