summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Kossakowski <grek@google.com>2009-08-27 11:28:06 -0700
committerGrzegorz Kossakowski <grek@google.com>2009-08-27 11:28:06 -0700
commitb106952081363e56bee7795bf6d9a8d59ae4774d (patch)
treed6923b89d78aab45f1a85ee3b047f4323e6c8778
parentbaa74a9f4d35e2fc8896d4b90ae983ebbca6fa91 (diff)
downloadgimd-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>
-rw-r--r--src/main/scala/com/google/gimd/DatabaseSpi.scala2
-rw-r--r--src/main/scala/com/google/gimd/file/File.scala6
-rw-r--r--src/main/scala/com/google/gimd/query/Handle.scala20
-rw-r--r--src/main/scala/com/google/gimd/query/MessageQuery.scala4
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)
}