SizeRequest - laforge49/Asynchronous-Functional-Programming GitHub Wiki
SizeRequest returns the length of a IncDesNavMap, IncDesNavSet or IncDesList collection.
##SizeTest
val systemServices = SystemServices(new ServicesRootComponentFactory)
val dbName = "SizeNoLog.db"
val file = new java.io.File(dbName)
file.delete
val properties = new Properties
properties.put("dbPathname", dbName)
val db = Subsystem(
systemServices,
new SmallNoLogComponentFactory,
properties = properties,
actorId = ActorId("db"))
val chain = new Chain
chain.op(systemServices, Register(db))
chain.op(db, SetRequest(db, "/$", IncDesLongIncDesMap(null, db)))
chain.op(db, SetRequest(db, "/$/-111111111111111111",
IncDesIncDes(null)))
chain.op(db, SetRequest(db, "/$/-111111111111111111/$",
IncDesStringSet(null, db)))
chain.op(db, SetRequest(db, "/$/0",
IncDesIncDes(null)))
chain.op(db, SetRequest(db, "/$/0/$",
IncDesBytesList(null, db)))
chain.op(db, SizeRequest(db, "/$"), "mapSize")
chain.op(db, SizeRequest(db, "/$/-111111111111111111/$"), "setSize")
chain.op(db, SizeRequest(db, "/$/0/$"), "listSize")
Future(systemServices, chain)
println(chain.results)
systemServices.close
Output.
{listSize=0, mapSize=2, setSize=0}
##SizeRequest
Sample invocation.
chain.op(db, SizeRequest(db, "/$/0/$"), "listSize")
Implementation.
object SizeRequest {
def apply(db: Actor, pathname: String) = {
var pn = pathname
if (pn.startsWith("/")) pn = pn.substring(1)
if (!pn.endsWith("/") && pn.length > 0) pn = pn + "/"
val je = (new SizeRequestFactory).newActor(null).asInstanceOf[IncDes]
val chain = new Chain
chain.op(je, Set(null, pn))
chain.op(db, TransactionRequest(je))
chain
}
}
class SizeRequestFactory extends IncDesStringFactory(DBT_SIZE) {
override protected def instantiate = {
val req = super.instantiate
addComponent(new QueryRequestComponent(req))
addComponent(new SizeRequestComponent(req))
req
}
}
class SizeRequestComponent(actor: Actor)
extends Component(actor) {
bindSafe(classOf[Process], new ChainFactory(process))
private def process(msg: AnyRef, chain: Chain) {
chain.op(actor, Value(), "pathname")
chain.op(systemServices, DbRoot(), "dbRoot")
chain.op(Unit => chain("dbRoot"),
Unit => Resolve(chain("pathname").asInstanceOf[String]), "tuple")
chain.op(Unit => {
val (value, key) = chain("tuple").asInstanceOf[(IncDes, String)]
value
}, Size())
}
}