Этот пост продолжает серию статей, в которых представлен драйвер Aerospike SQL.
В предыдущем посте объяснялись встроенные функции, предоставляемые драйвером Aerospike JDBC. Здесь я собираюсь объяснить, как расширить функциональность драйвера путем реализации пользовательских функций (UDF).
Прямо сейчас агрегатные функции не могут быть настроены, однако вы можете реализовать скалярные и коллекционные функции с помощью языка программирования Java.
Функция – это именованный блок повторно используемого кода, который используется для выполнения одного действия. Обычно функции возвращают результат. Функции могут принимать аргументы.
Java 8 и выше предоставляет интерфейсы Поставщик
, Функция
, Бифункция
. Реализации этих интерфейсов могут быть определены как UDF для драйвера Aerospike JDBC. Например, вот определение функции now()
, которая возвращает эпоху в миллисекундах:
public class Now implements new Supplier() { @Override public Long get() { return System.currentTimeMillis(); } };
Это пример функции, которая получает один аргумент:
public class Lower implements new Function() { @Override public String apply(String s) { return s == null ? null : s.toLowerCase(); } };
Реализация функции, которая принимает 2 аргумента, аналогична. Создайте класс, который реализует Bi-функцию
. К сожалению, JDK не определяет интерфейс для функции, которая принимает 3, 4 или более аргументов, а также для функции, которая принимает любое количество аргументов. Такой интерфейс определяется драйвером:
package com.nosqldriver.util; @FunctionalInterface public interface VarargsFunction{ R apply(T ... t); }
Если вы хотите реализовать UDF, который принимает более 2 аргументов, вам необходимо реализовать этот интерфейс. В этом случае вам необходимо добавить драйвер в путь к классу компиляции. Реализация других типов функций не требует этой зависимости. Реализация функции Varargs
имеет еще одну сложность: программист отвечает за приведение и проверку принятых аргументов.
Как только UDF будет реализован и проверен, он должен быть упакован в jar-файл, который следует добавить в путь к классу драйвера. Различные инструменты позволяют это сделать. Например Бобр и Белка разрешить определение драйвера, упакованного в несколько файлов jar. Как только это будет сделано, функция должна быть зарегистрирована с помощью параметра подключения:
custom.function.NAME=FULLY_QUALIFIED_CLASS_NAME
напр.
custom.function.now=com.mycompany.Now
Параметр подключения может быть указан как параметр URL-адреса JDBC или как свойство подключения.
jdbc:aeropspike:myhost?custom.function.now=com.mycompany.Now
Как только функция зарегистрирована, ее можно использовать в SQL-запросе:
select first_name, now() from people
Драйвер Aerospike JDBC предоставляет полный набор встроенных функций. Кроме того, он может быть расширен с помощью определяемых пользователем функций, которые могут быть легко реализованы с помощью языка программирования Java.
Проект доступен в GitHub .
В следующей статье из этой серии будет объяснено, как работать со сложными типами.
Оригинал: “https://dev.to/alexradzin/extending-the-aerospike-jdbc-driver-with-udfs-5gei”