package getAsync
Asynchronous getter methods to retrieve data from Datomic.
For convenience, all synchronous getter methods from the get package are here wrapped in Futures.
The Datomic On-Prem(ises) server model provides a Peer that returns data synchronously. The Peer which lives in application memory caches data aggressively and for data fitting in memory latency can be extremely low and queries return very fast. And even when access to disk is needed, clever branching is used. Memcached is also an option.
The Datomic Cloud model data returns data asynchronously. If Datomic creates a Java API for the Cloud model, Molecule could relatively easy adapt to this model too. In the meanwhile, Future-wrapped methods in this package can be used.
Molecule has 5 groups of asynchronous getters, each returning Futures of data in various formats:
- GetAsyncArray - fastest retrieved typed data set. Can be traversed with a fast
whileloop - GetAsyncIterable - for lazily traversing row by row
- GetAsyncJson - data formatted as Json string
- GetAsyncList - default getter returning Lists of tuples. Convenient typed data, suitable for smaller data sets
- GetAsyncRaw - fastest retrieved raw un-typed data from Datomic
Getters in each of the 5 groups come with 5 time-dependent variations:
- getAsync [current data]
- getAsyncAsOf
- getAsyncSince
- getAsyncWith
- getAsyncHistory
Each time variation has various overloads taking different parameters (see each group for more info).
- Source
- getAsync.scala
- See also
equivalent synchronous getters in the get package.
Type Members
-
trait
GetAsyncArray[Tpl] extends AnyRef
Asynchronous data getter methods on molecules returning
Future[Array[Tpl]].Asynchronous data getter methods on molecules returning
Future[Array[Tpl]].
The fastest way of getting a large typed data set since data is applied to a super fast pre-allocated Array. The Array can then be traversed with a fastwhileloop.// Map over the Future Ns.int.getAsyncArray.map { result => result === Array(1, 2, 3) // Fast while loop var i = 0 val length = result.length while(i < length) { println(result(i)) // Do stuff with row... i += 1 } }
Each asynchronous getter in this package simply wraps the result of its equivalent synchronous getter (in the
getpackage) in a Future.getAsyncArrayAsOfthus wraps the result ofgetArrayAsOfin a Future and so on. -
trait
GetAsyncIterable[Tpl] extends AnyRef
Asynchronous data getter methods on molecules returning
Future[Iterable[Tpl]].Asynchronous data getter methods on molecules returning
Future[Iterable[Tpl]].
Suitable for data sets that are lazily consumed.val iterableFuture: Future[Iterable[(String, Int)]] = Person.name.age.getAsyncIterable for { iterable <- iterableFuture } yield { iterable.iterator.next === ("Ben" 42) }
Each asynchronous getter in this package simply wraps the result of its equivalent synchronous getter (in the
getpackage) in a Future.getAsyncIterableAsOfthus wraps the result ofgetIterableAsOfin a Future and so on. -
trait
GetAsyncJson extends AnyRef
Asynchronous data getter methods on molecules returning Future-wrapped Json String.
Asynchronous data getter methods on molecules returning Future-wrapped Json String.
Molecule builds a Json String directly from the untyped raw Datomic data.
Attributes names are used as Json field names. In order to distinguish fields from each other, all attribute names are prepended with the namespace name (in lowercase). For a namespacePersonwith an attributenamewe get:- "person.name"
To distinguis fields of multiple relationships to the same namespace like
friendsandenemiespointing to otherPerson's require us to add a relationship name prefix too:- "friends.person.name"
- "enemies.person.name"
Furthermore, if the attribute is part of a transaction meta-data molecule, we prefix that with
txtoo:- "tx.person.name"
- "tx.friends.person.name"
Example:
val jsonFuture: Future[String] = Person.name.age.getAsyncJson for { json <- jsonFuture } yield { json === """[ |{"person.name": "Ben", "person.age": 42}, |{"person.name": "Liz", "person.age": 37} |]""".stripMargin }
Each asynchronous getter in this package simply wraps the result of its equivalent synchronous getter (in the
getpackage) in a Future.getAsyncIterableAsOfthus wraps the result ofgetIterableAsOfin a Future and so on.- See also
-
trait
GetAsyncList[Tpl] extends AnyRef
Default asynchronous data getter methods on molecules returning
Future[List[Tpl]].Default asynchronous data getter methods on molecules returning
Future[List[Tpl]].
For expected smaller result sets it's convenient to return Lists of tuples of data. Considered as the default getter, no postfix has been added (getAsyncinstead ofgetAsyncList).val futureList: Future[List[(String, Int)]] = Person.name.age.getAsync for { list <- futureList } yield { list === List( ("Ben", 42), ("Liz", 37) ) }
Each asynchronous getter in this package simply wraps the result of its equivalent synchronous getter (in the
getpackage) in a Future.getAsyncAsOfthus wraps the result ofgetAsOfin a Future and so on. -
trait
GetAsyncRaw extends AnyRef
Asynchronous data getter methods on molecules returning raw untyped Datomic data.
Asynchronous data getter methods on molecules returning raw untyped Datomic data.
Returns aFuturewith raw untypedjava.util.Collection[java.util.List[Object]]directly from Datomic and is therefore the fastest (but untyped) way of retrieving data. Can be useful where typed data is not needed.val rawDataFuture: Future[java.util.Colleciton[java.util.List[Object]] = Person.name.age.getAsyncRaw for { rawData <- rawDataFuture } yield { rawData.toString === """[["Ben" 42]["Liz" 37]]""" }
Each asynchronous getter in this package simply wraps the result of its equivalent synchronous getter (in the
getpackage) in a Future.getAsyncRawAsOfthus wraps the result ofgetRawAsOfin a Future and so on.

Documentation/API for the Molecule library - a meta DSL for the Datomic database.
Manual | scalamolecule.org | Github | Forum