Conditional updates & deletes are performed by submitting any Java, Scala, Kotlin or any native JVM code/function. There is no query language.
Being just JVM functions/code we can
- Be more expressive in writing our query logic as we are not restricted by rules of a query language.
- Use external Java libraries within our queries like Joda-Time for time management, Jackson or Circe for JSON parsing etc.
- Write test-cases using familiar testing libraries like JUnit, kotlin.test, ScalaTest etc.
- Type-safe - catch errors during compile time.
- Fast - No runtime parsing & compiling performance cost. See these benchmarks that show 482,000+ writes per second. Function updates follow the same write path as any basic write and do not incur any extra cost.
Example
A simple example which creates a Map<String, Double>
that stores productName as key and price as value. You can use custom classes (Product.java
for values) here but for simplicity String
and Double
is used.
Update logic: If a product has less than 2 days left to expiration, give a generous 50% discount!
//Our function that implements the update logic. //You can also use PureFunction.OnValue or PureFunction.OnKey. PureFunction.OnKeyValue<String, Double, Return.Map<Double>> discount = (String product, Double price, Optional<Deadline> 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<String, Double, PureFunction<String, Double, Return.Map<Double>>> 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);
We can print the content of the Map with the following
products.stream().forEach(System.out::println);
Before the discount is applied will print
KeyVal(MacBook Pro, 2799.0)
KeyVal(Tesla, 69275.0)
After the discount is applied prints
KeyVal(MacBook Pro, 1399.5)
KeyVal(Tesla, 34637.5)
See the above example on GitHub - DiscountApp.java.
What is function ID?
Each PureFunction
type also implement a String id
value which gets stored in the database. Currently the id
is defaulted to this.getClass().getName();
which can be overridden by your function.
Note & TODOs
- The function itself is not serialised. Only the function's
id
gets serialised and stored in the database. TODO - Serialisable functions. -
.mightContainFunction
can be used to check if a function is in use. TODO - Automatic function removal. - TODO - stronger types when
registering
andapplying
function.
Useful links
- SwayDB on GitHub.
- Java examples repo.
- Kotlin examples repo.
- Scala examples repo.
- Documentation.
Top comments (0)