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}

SizeTest

##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())
  }
}

SizeRequest


tutorial