OSDN Git Service

git-svn-id: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core@3294 ae02f08e...
authorleo <leo@ae02f08e-27ec-0310-ae8c-8ba02fe2eafd>
Mon, 18 May 2009 07:31:07 +0000 (07:31 +0000)
committerleo <leo@ae02f08e-27ec-0310-ae8c-8ba02fe2eafd>
Mon, 18 May 2009 07:31:07 +0000 (07:31 +0000)
src/main/java/org/xerial/relation/query/AmoebaJoinHandler.java [moved from src/main/java/org/xerial/relation/query/RelationEventHandler.java with 87% similarity]
src/main/java/org/xerial/relation/query/RelationFragmentHolder.java
src/main/java/org/xerial/relation/query/StreamAmoebaJoin.java
src/test/java/org/xerial/relation/query/StreamAmoebaJoinTest.java

@@ -27,11 +27,11 @@ package org.xerial.relation.query;
 import org.xerial.relation.Node;
 import org.xerial.relation.schema.Schema;
 
-public interface RelationEventHandler
+public interface AmoebaJoinHandler
 {
-    public void newRelationFragment(Schema schema, Node n1, Node n2);
+    public void newAmoeba(Schema schema, Node n1, Node n2);
 
     public void leaveNode(Schema schema, Node node);
 
-    public void text(String nodeName, String text);
+    public void text(Schema schema, String nodeName, String text);
 }
index f3803a5..611c164 100644 (file)
@@ -62,7 +62,7 @@ public class RelationFragmentHolder
 
     private final int relationSize;
 
-    private RelationEventHandler handler;
+    private AmoebaJoinHandler handler;
 
     private class RelationFragment
     {
@@ -154,7 +154,7 @@ public class RelationFragmentHolder
 
     }
 
-    public RelationFragmentHolder(Schema targetRelation, RelationEventHandler handler)
+    public RelationFragmentHolder(Schema targetRelation, AmoebaJoinHandler handler)
     {
         this.relation = targetRelation;
 
index 83d1d6a..6637043 100644 (file)
@@ -73,7 +73,7 @@ public class StreamAmoebaJoin implements TreeVisitor
     private static Logger _logger2 = Logger.getLogger(StreamAmoebaJoin.class, "lattice");
 
     final QuerySet query;
-    final RelationEventHandler handler;
+    final AmoebaJoinHandler handler;
 
     // for running amoeba join
     int nodeCount = 0;
@@ -89,7 +89,9 @@ public class StreamAmoebaJoin implements TreeVisitor
     HashMap<Edge, List<Operation>> operationSetOnForward = new HashMap<Edge, List<Operation>>();
     HashMap<Edge, List<Operation>> operationSetOnBack = new HashMap<Edge, List<Operation>>();
 
-    public StreamAmoebaJoin(QuerySet query, RelationEventHandler handler) throws IOException
+    List<Operation> forwardActionList = null;
+
+    public StreamAmoebaJoin(QuerySet query, AmoebaJoinHandler handler) throws IOException
     {
         this.query = query;
         this.handler = handler;
@@ -128,7 +130,7 @@ public class StreamAmoebaJoin implements TreeVisitor
             if (_logger.isTraceEnabled())
                 _logger.trace(String.format("push:(%s, %s)", knownNode, newNode));
 
-            handler.newRelationFragment(schema, knownNode, newNode);
+            handler.newAmoeba(schema, knownNode, newNode);
 
         }
 
@@ -254,11 +256,16 @@ public class StreamAmoebaJoin implements TreeVisitor
             Node previouslyFoundNode = reverseCursor.next();
 
             _logger.debug(String.format("loop back: %s and %s", previouslyFoundNode, newlyFoundNode));
-            handler.newRelationFragment(schema, previouslyFoundNode, newlyFoundNode);
+            handler.newAmoeba(schema, previouslyFoundNode, newlyFoundNode);
         }
 
     }
 
+    class ReportText
+    {
+
+    }
+
     public void finish(TreeWalker walker) throws XerialException
     {
         _logger.debug("sweep finished");
@@ -302,6 +309,15 @@ public class StreamAmoebaJoin implements TreeVisitor
 
     public void text(String nodeName, String textDataFragment, TreeWalker walker) throws XerialException
     {
+        if (forwardActionList == null)
+            throw new XerialError(XerialErrorCode.INVALID_STATE, "null action list: for text node " + nodeName);
+
+        Iterator<LatticeNode<String>> it = stateStack.descendingIterator();
+        LatticeNode<String> currentState = it.next();
+        LatticeNode<String> prevState = it.next();
+
+        Edge currentEdge = new Edge(prevState.getID(), currentState.getID());
+
         handler.text(nodeName, textDataFragment);
     }
 
@@ -318,16 +334,16 @@ public class StreamAmoebaJoin implements TreeVisitor
 
     void forward(Node node)
     {
-        List<Operation> actionList = getActionList(node);
-        assert actionList != null;
+        forwardActionList = getForwardActionList(node);
+        assert forwardActionList != null;
 
-        for (Operation each : actionList)
+        for (Operation each : forwardActionList)
         {
             each.execute();
         }
     }
 
-    private List<Operation> getActionList(Node nextNode)
+    private List<Operation> getForwardActionList(Node nextNode)
     {
         LatticeNode<String> prevState = latticeCursor.getNode();
         LatticeNode<String> nextState = latticeCursor.next(nextNode.nodeName);
@@ -381,19 +397,20 @@ public class StreamAmoebaJoin implements TreeVisitor
                                 .trace(String.format("new pair: %s, %s (in %s)", previouslyFoundNode, newlyFoundTag, r));
 
                     foundAction.add(new PushRelation(r, previouslyFoundNode, newlyFoundTag));
-                    //actionList.add(new PushRelation(r, previouslyFoundNode, newlyFoundTag));
-                    //backActionList.add(new PopRelation(r, newlyFoundTag));
                     break;
                 }
             }
 
+            // set the action list
             if (foundAction.size() > 1)
             {
+                // context-dependent actions
                 actionList.add(new ScopedPushRelation(foundAction));
                 backActionList.add(new ScopedPopRelation(foundAction));
             }
             else
             {
+                // a single action
                 for (PushRelation each : foundAction)
                 {
                     actionList.add(each);
@@ -418,8 +435,6 @@ public class StreamAmoebaJoin implements TreeVisitor
             }
         }
 
-        // TODO handling cross edge (adding ClearRelation operation) 
-
         return actionList;
 
     }
index d9bda0f..a634a29 100644 (file)
@@ -57,9 +57,9 @@ public class StreamAmoebaJoinTest
         qs.addQueryTarget(new SchemaBuilder().add("coordinate").add("gene", DataType.STRUCT, FD.ONE_OR_MORE).build());\r
         qs.addQueryTarget(new SchemaBuilder().add("gene").add("id").add("name").add("start").add("end").build());\r
 \r
-        StreamAmoebaJoin aj = new StreamAmoebaJoin(qs, new RelationEventHandler() {\r
+        StreamAmoebaJoin aj = new StreamAmoebaJoin(qs, new AmoebaJoinHandler() {\r
 \r
-            public void newRelationFragment(Schema schema, Node n1, Node n2)\r
+            public void newAmoeba(Schema schema, Node n1, Node n2)\r
             {\r
                 _logger.info(String.format("relation (%s, %s)", n1, n2));\r
             }\r