diff src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexCreater.java @ 175:e26462a38ce0

add push pop
author tatsuki
date Fri, 06 Mar 2015 10:44:50 +0900
parents 383b08d1711c
children 066d9c5758dc
line wrap: on
line diff
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexCreater.java	Mon Feb 16 11:36:45 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexCreater.java	Fri Mar 06 10:44:50 2015 +0900
@@ -2,9 +2,13 @@
 
 import java.util.Stack;
 
+import fj.Ord;
 import fj.data.List;
+import fj.data.Option;
+import fj.data.TreeMap;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeChildren;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.TreeMapOrd;
 
 public class IndexCreater {
 
@@ -15,7 +19,7 @@
   private Stack<TreeNode> nodeStack = new Stack<TreeNode>();
   private Stack<Integer> searchStack = new Stack<Integer>();
   ParentIndex parentIndex = new ParentIndex();
-  Index index = new Index();
+  TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexList = TreeMap.empty(Ord.stringOrd);
 
   public IndexCreater(TreeNode rootNode) {
     this.root = rootNode;
@@ -26,7 +30,7 @@
       for (String key : keys) {
         String value = targetNode.getAttributes().getString(key);
         if (value != null)
-          index = index.set(key, value, targetNode);
+          indexList = set(key, value, targetNode);
       }
       if (node.getChildren().size() > 0) {
         nodeStack.push(node);
@@ -39,7 +43,7 @@
       } else if (node == root) {
         node = null; // no more node
         children = null;
-        return ;
+        return;
       } else if (children != null && children.size() > childNumber) {
         childNumber = searchStack.pop();
         TreeNode parent = nodeStack.pop();
@@ -55,7 +59,7 @@
           if (node == root) {
             node = null; // no more node
             children = null;
-            return ;
+            return;
           }
           node = nodeStack.pop();
           children = node.getChildren();
@@ -72,8 +76,37 @@
     }
   }
 
-  public Index getIndex() {
-    return index;
+  public TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> set(String key, String value, TreeNode node) {
+
+    Option<TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexOp = indexList.get(key);
+    if (indexOp.isNone()) {
+      TreeMap<String, TreeMap<TreeNode, TreeNode>> index = TreeMap.empty(Ord.stringOrd);
+      TreeMap<TreeNode, TreeNode> nodeMap = TreeMap.empty(TreeMapOrd.treeNodeOrd);
+      nodeMap = nodeMap.set(node, node);
+      TreeMap<String, TreeMap<TreeNode, TreeNode>> newIndex = index.set(value, nodeMap);
+      indexList = indexList.set(key, newIndex);
+      return indexList;
+    }
+
+    TreeMap<String, TreeMap<TreeNode, TreeNode>> index = indexOp.some();
+    Option<TreeMap<TreeNode, TreeNode>> nodeMapOp = index.get(value);
+
+    TreeMap<TreeNode, TreeNode> newNodeMap;
+    if (nodeMapOp.isSome()) {
+      TreeMap<TreeNode, TreeNode> nodeMap = nodeMapOp.some();
+      newNodeMap = nodeMap.set(node, node);
+    } else {
+      TreeMap<TreeNode, TreeNode> nodeMap = TreeMap.empty(TreeMapOrd.treeNodeOrd);
+      newNodeMap = nodeMap.set(node, node);
+    }
+    TreeMap<String, TreeMap<TreeNode, TreeNode>> newIndex = index.set(value, newNodeMap);
+    indexList = indexList.set(key, newIndex);
+
+    return indexList;
+  }
+
+  public TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> getIndex() {
+    return indexList;
   }
 
   public ParentIndex getParentIndex() {