diff options
author | Grzegorz Kossakowski <grek@google.com> | 2009-08-27 11:28:06 -0700 |
---|---|---|
committer | Grzegorz Kossakowski <grek@google.com> | 2009-08-27 11:28:06 -0700 |
commit | b106952081363e56bee7795bf6d9a8d59ae4774d (patch) | |
tree | d6923b89d78aab45f1a85ee3b047f4323e6c8778 | |
parent | baa74a9f4d35e2fc8896d4b90ae983ebbca6fa91 (diff) | |
download | gimd-b106952081363e56bee7795bf6d9a8d59ae4774d.tar.gz |
Introduced CompleteHandle and type parameter for abstract Handle type.
Handle[T] carries information about corresponding user object of type T.
CompleteHandle defined which aggregates both File and PathHandle.
PathHandle points at the message stored inside of top-level message that
File.message is pointing.
CompleteHandle the only class inheriting from abstract Handle class.
Signed-off-by: Grzegorz Kossakowski <grek@google.com>
4 files changed, 19 insertions, 13 deletions
diff --git a/src/main/scala/com/google/gimd/DatabaseSpi.scala b/src/main/scala/com/google/gimd/DatabaseSpi.scala index 8523346..05cd146 100644 --- a/src/main/scala/com/google/gimd/DatabaseSpi.scala +++ b/src/main/scala/com/google/gimd/DatabaseSpi.scala @@ -32,7 +32,7 @@ trait DatabaseSpi { * Query database for all user objects of type U stored in files of * type FileType[W] satisfying predicate p. */ - def query[U,W](ft: FileType[W], p: Predicate[U]): Iterator[(Handle,U)] = { + def query[U,W](ft: FileType[W], p: Predicate[U]): Iterator[(Handle[U],U)] = { for { f <- all(ft) r <- f.query(p) diff --git a/src/main/scala/com/google/gimd/file/File.scala b/src/main/scala/com/google/gimd/file/File.scala index 7996e28..9c92ea2 100644 --- a/src/main/scala/com/google/gimd/file/File.scala +++ b/src/main/scala/com/google/gimd/file/File.scala @@ -33,8 +33,8 @@ trait File[T] { val message: Message val userObject: T - def query[U](p: Predicate[U]): Iterator[(FileHandle[T], U)] = + def query[U](p: Predicate[U]): Iterator[(CompleteHandle[U], U)] = for { - (handle, obj) <- MessageQuery.simpleQuery(fileType.userType, message, p) - } yield (FileHandle(this, handle), obj) + (pathHandle, obj) <- MessageQuery.simpleQuery(fileType.userType, message, p) + } yield (CompleteHandle(this, pathHandle), obj) } diff --git a/src/main/scala/com/google/gimd/query/Handle.scala b/src/main/scala/com/google/gimd/query/Handle.scala index 49a83b9..4993e68 100644 --- a/src/main/scala/com/google/gimd/query/Handle.scala +++ b/src/main/scala/com/google/gimd/query/Handle.scala @@ -16,8 +16,8 @@ package com.google.gimd.query import com.google.gimd.file.File -/** Any handle to a stored message. */ -abstract sealed class Handle +/** Any handle to a stored message which corresponds to user object of type T. */ +abstract sealed class Handle[T] /** * <p>Handle to mested message determined by path given by list of @@ -28,14 +28,20 @@ abstract sealed class Handle * * <p>Path stores also all UserTypes corresponding each to Message that contains * given MessageField.</p> + * + * <p>For any non-empty path condition T == U should yield true for T,U defined by expression: + * PathHandle[T].path.last.userType[U]</p> */ -final case class PathHandle(path: List[(UserType[_], MessageField)]) +final case class PathHandle[+T](path: List[(UserType[_], MessageField)]) + +object PathHandle { + val empty = PathHandle(Nil) +} /** - * <p>Handle to a file that stores top level message.</p> + * <p>Complete handle consisting of file and pathHandle</p> * * <p>The top level message can be accessed using <code>file.message</code>.</p> - * - * <p>This handle stores also path to a nested message within the top level message.</p> */ -final case class FileHandle[T](file: File[T], path: PathHandle) extends Handle +final case class CompleteHandle[T](file: File[_], + pathHandle: PathHandle[T]) extends Handle[T] diff --git a/src/main/scala/com/google/gimd/query/MessageQuery.scala b/src/main/scala/com/google/gimd/query/MessageQuery.scala index 7fceb4e..5105af4 100644 --- a/src/main/scala/com/google/gimd/query/MessageQuery.scala +++ b/src/main/scala/com/google/gimd/query/MessageQuery.scala @@ -16,7 +16,7 @@ package com.google.gimd.query object MessageQuery { def simpleQuery[U, W](ut: UserType[W], m: Message, p: Predicate[U]): - Iterator[(PathHandle,U)] = { + Iterator[(PathHandle[U],U)] = { val children = queryChildren(ut, m, p) val self = querySelf(ut, m, p) if (self.hasNext) @@ -45,5 +45,5 @@ object MessageQuery { if field.isInstanceOf[MessageField] f = field.asInstanceOf[MessageField] (PathHandle(xs), userObject) <- simpleQuery(member.userType, f.value, p) - } yield (PathHandle((ut, f) :: xs), userObject) + } yield (PathHandle[U]((ut, f) :: xs), userObject) } |