summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Kossakowski <grek@google.com>2009-08-25 16:00:12 -0700
committerGrzegorz Kossakowski <grek@google.com>2009-08-25 16:00:12 -0700
commitddb286a8b25318eca6e66ee6d221c39812213f54 (patch)
tree5b689c01cbd06a16d08a1f884846f6f33bcca686
parent0e5183c51be27cb04d7c2c28afe4e42f69056158 (diff)
downloadgimd-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>
-rw-r--r--src/main/scala/com/google/gimd/query/Handle.scala50
-rw-r--r--src/main/scala/com/google/gimd/query/MessageQuery.scala8
-rw-r--r--src/test/scala/com/google/gimd/query/MessageQueryTestCase.scala15
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)
}