Рубрики
Без рубрики

Функции как запросы @ Sway DB

Обновление данных в Sway DB с использованием чистых функций. Помеченный java, kotlin, scala, storage.

Условные обновления и удаления выполняются путем отправки любого 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”