diff options
author | Grzegorz Kossakowski <grek@google.com> | 2009-08-25 16:00:12 -0700 |
---|---|---|
committer | Grzegorz Kossakowski <grek@google.com> | 2009-08-25 16:00:12 -0700 |
commit | ddb286a8b25318eca6e66ee6d221c39812213f54 (patch) | |
tree | 5b689c01cbd06a16d08a1f884846f6f33bcca686 | |
parent | 0e5183c51be27cb04d7c2c28afe4e42f69056158 (diff) | |
download | gimd-ddb286a8b25318eca6e66ee6d221c39812213f54.tar.gz |
Reworked Handles to have only two classes: FileHandle and PathHandle.
FileHandle points at the File stored in Gimd's database and at the same
time at top-level message. It contains PathHandle which determines path to
a nested message in top-level message. PathHandle can store empty path
which means the whole Handle points just at top-level message.
Signed-off-by: Grzegorz Kossakowski <grek@google.com>
3 files changed, 28 insertions, 45 deletions
diff --git a/src/main/scala/com/google/gimd/query/Handle.scala b/src/main/scala/com/google/gimd/query/Handle.scala index de42d5c..49a83b9 100644 --- a/src/main/scala/com/google/gimd/query/Handle.scala +++ b/src/main/scala/com/google/gimd/query/Handle.scala @@ -19,33 +19,23 @@ import com.google.gimd.file.File /** Any handle to a stored message. */ abstract sealed class Handle -/** Handle to a message contained within something else. */ -abstract case class InnerHandle() extends Handle - -/** Handle to a top-level message, that is not nested. */ -abstract case class RootHandle() extends Handle - -/** Handle to a message by itself. */ -final case class MessageHandle( - message: Message, - /** userType for Message that this handle is pointing at */ - userType: UserType[_] -) extends InnerHandle - -/** Handle to a message stored within a field. */ -final case class FieldHandle( - // TODO We may be able to do a more efficient binding to the field - // in the parent by taking advantage of position of field in the - // parent, rather than using the object. - // - field: MessageField, - child: InnerHandle, - /** userType defined for message which contains given field */ - userType: UserType[_] -) extends InnerHandle - -/** Handle to a top level message. */ -final case class FileHandle[T]( - file: File[T], - child: InnerHandle -) extends RootHandle +/** + * <p>Handle to mested message determined by path given by list of + * MessageFields.</p> + * + * <p>In order to get message this handle is pointing at one should use + * <code>path.last.value</code></p> + * + * <p>Path stores also all UserTypes corresponding each to Message that contains + * given MessageField.</p> + */ +final case class PathHandle(path: List[(UserType[_], MessageField)]) + +/** + * <p>Handle to a file that stores top level message.</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 diff --git a/src/main/scala/com/google/gimd/query/MessageQuery.scala b/src/main/scala/com/google/gimd/query/MessageQuery.scala index 9dfac04..7fceb4e 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[(InnerHandle,U)] = { + Iterator[(PathHandle,U)] = { val children = queryChildren(ut, m, p) val self = querySelf(ut, m, p) if (self.hasNext) @@ -29,7 +29,7 @@ object MessageQuery { if (p.isType(ut.userTypeClass)) { val obj = ut.toUserObject(m).asInstanceOf[U] if (p.isMatch(obj)) - Iterator.single( (MessageHandle(m, ut), obj) ) + Iterator.single( (PathHandle(Nil), obj) ) else Iterator.empty } else @@ -44,6 +44,6 @@ object MessageQuery { field <- m.all(member.name).elements if field.isInstanceOf[MessageField] f = field.asInstanceOf[MessageField] - (handle, userObject) <- simpleQuery(member.userType, f.value, p) - } yield (FieldHandle(f, handle, ut), userObject) + (PathHandle(xs), userObject) <- simpleQuery(member.userType, f.value, p) + } yield (PathHandle((ut, f) :: xs), userObject) } diff --git a/src/test/scala/com/google/gimd/query/MessageQueryTestCase.scala b/src/test/scala/com/google/gimd/query/MessageQueryTestCase.scala index df1c5d6..f46d77d 100644 --- a/src/test/scala/com/google/gimd/query/MessageQueryTestCase.scala +++ b/src/test/scala/com/google/gimd/query/MessageQueryTestCase.scala @@ -52,7 +52,7 @@ class MessageQueryTestCase { val queryResult = query((n: TreeNode) => n.name == "a") val expectedResult = Set( - (handle(message), root), + (PathHandle(Nil), root), (handle(("node", child_msg0)), child_0), (handle(("node", child_msg2)), child_2) ) @@ -75,7 +75,7 @@ class MessageQueryTestCase { val queryResult = query((n: TreeNode) => n.name == "a" && n.id < 0) val expectedResult = Set( - (handle(message), root) + (PathHandle(Nil), root) ) assertEquals(expectedResult, Set(queryResult.toList: _*)) } @@ -85,13 +85,6 @@ class MessageQueryTestCase { MessageQuery.simpleQuery(TreeNodeType, message, p) } - private def handle(message: Message): InnerHandle = MessageHandle(message, TreeNodeType) - private def handle(p: (String, Message)*): InnerHandle = { - val (name, message) = p(0) - val field = MessageField(name, message) - if (p.size == 1) { - FieldHandle(field, handle(message), TreeNodeType) - } else - FieldHandle(field, handle(p.drop(1): _*), TreeNodeType) - } + private def handle(p: (String, Message)*) = + PathHandle(p.map { case (name, msg) => (TreeNodeType, MessageField(name, msg)) } toList) } |