Условные обновления и удаления выполняются путем отправки любого Java , Scala , Kotlin или любой собственный JVM-код/функция . Там нет языка запросов .
Будучи просто функциями/кодом JVM, мы мочь
- Будьте более выразительны при написании нашей логики запросов, поскольку мы не ограничены правилами языка запросов.
- Используйте внешние библиотеки Java в наших запросах, таких как Joda-Time для управления временем, Jackson или Circe для синтаксического анализа JSON и т.д.
- Напишите тестовые примеры , используя знакомые библиотеки тестирования, такие как JUnit, kotlin.test, ScalaTest и т.д.
- Типобезопасный – перехват ошибок во время компиляции.
- Быстрый – Отсутствие затрат на синтаксический анализ и компиляцию во время выполнения. Посмотрите эти контрольные показатели , которые показывают более 482 000 записей в секунду . Обновления функций выполняются по тому же пути записи, что и любая базовая запись, и не требуют никаких дополнительных затрат.
Пример
Простой пример, который создает Map Double>
, который хранит Double> , который хранит название продукта в качестве ключа и цена в качестве значения. Вы можете использовать пользовательские классы (
Product.java для значений) здесь, но для простоты
Строка и
Используется двойной
Логика обновления : Если до истечения срока годности товара осталось менее 2 дней, предоставьте щедрую скидку в размере 50%!
//Our function that implements the update logic. //You can also use PureFunction.OnValue or PureFunction.OnKey. PureFunction.OnKeyValue> discount = (String product, Double price, Optional deadline) -> { //if there are less than 2 days to expiry then apply discount. if (deadline.isPresent() && deadline.get().timeLeft().minusDays(2).isNegative()) { double discountedPrice = price * 0.50; //50% discount. if (discountedPrice <= 10) { //If the price is below $10 //return Return.expire(Duration.ZERO); //expire it return Return.remove(); //or remove the product } else { return Return.update(discountedPrice); //else update with the discounted price } } else { return Return.nothing(); //else do nothing. } }; //create our map with functions enabled. Map >> products = MapConfig.functionsOn(stringSerializer(), doubleSerializer()) .registerFunction(discount) //register the discount function .get(); //insert two products that expire after a day. products.put("MacBook Pro", 2799.00, Duration.ofDays(1)); products.put("Tesla", 69275.0, Duration.ofDays(1)); //apply the discount function. products.applyFunction("MacBook Pro", "Tesla", discount);
Мы можем распечатать содержимое карты со следующим
products.stream().forEach(System.out::println);
Перед применением скидки будет выведена
Keyval(MacBook Pro, 2799.0) Keyval(Tesla, 69275.0)
После применения скидки печатает
Кейвал(MacBook Pro, 1399,5) Кейвал(Tesla, 34637,5)
Смотрите приведенный выше пример на GitHub – DiscountApp.java .
Что такое идентификатор функции?
Каждая Чистая функция
типа также реализует Идентификатор строки
значение, которое сохраняется в базе данных. В настоящее время id
по умолчанию равен this.getClass().getName();
который может быть переопределен вашей функцией.
Примечания и задачи
- Сама функция не сериализуется. Только функция
i d
сериализуется и сохраняется в базе данных. TODO – Сериализуемые функции. ..может Содержать Функцию
может использоваться для проверки того, используется ли функция. ЧТО ДЕЛАТЬ – Автоматическое удаление функции.- TODO – более сильные типы при
регистрации
иприменяя
функцию.
Полезные ссылки
- SwayDB на GitHub.
- Java примеры репозитория.
- Kotlin примеры репо.
- Scala примеры репозитория.
- Веб-сайт документации – SwayDB.io .
Оригинал: “https://dev.to/simerplaha/functions-as-queries-swaydb-538n”