Mercurial > hg > Members > tatsuki > bench > jungle-core
view src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/Index.java @ 170:383b08d1711c
change Index form TreeMap<String TreeMap<String , List<TreeNode>>> → TreeMap<String TreeMap<String , TreeMap<TreeNode,TreeNode>>>
author | one |
---|---|
date | Fri, 26 Dec 2014 03:58:47 +0900 |
parents | 89ed172137ab |
children | a2598139df64 |
line wrap: on
line source
package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; import java.util.Iterator; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NulIterator; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.TreeMapOrd; import fj.Ord; import fj.P2; import fj.data.Option; import fj.data.TreeMap; public class Index { TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexList; public Index() { indexList = TreeMap.empty(Ord.stringOrd); } public Index(TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexList) { this.indexList = indexList; } public Index 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 this; } 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 this; } // public Index delete(String key, String value, TreeNode node) { // Option<TreeMap<String, List<TreeNode>>> indexOp = indexList.get(key); // if (indexOp.isNone()) // return this; // // TreeMap<String, List<TreeNode>> index = indexOp.some(); // TreeMap<String, List<TreeNode>> newIndex = index; // Option<List<TreeNode>> nodeListOp = index.get(value); // if (nodeListOp.isSome()) { // List<TreeNode> nodeList = nodeListOp.some(); // List<TreeNode> newNodeList = List.nil(); // for (TreeNode indexingNode : nodeList) { // if (indexingNode.equals(node)) // newNodeList = newNodeList.cons(indexingNode); // } // // newIndex = index.set(value, newNodeList); // } else { // return this; // } // TreeMap<String, TreeMap<String, List<TreeNode>>> newIndexList = // indexList.set(key, newIndex); // return new Index(newIndexList); // } public Iterator<TreeNode> get(String key, String value) { Option<TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexOp = indexList.get(key); if (indexOp.isNone()) return new NulIterator<TreeNode>(); TreeMap<String, TreeMap<TreeNode, TreeNode>> index = indexOp.some(); Option<TreeMap<TreeNode, TreeNode>> nodeMapOp = index.get(value); if (nodeMapOp.isNone()) return new NulIterator<TreeNode>(); Iterator<P2<TreeNode, TreeNode>> mapIterator = nodeMapOp.some().iterator(); return new Iterator<TreeNode>() { @Override public boolean hasNext() { return mapIterator.hasNext(); } @Override public TreeNode next() { return mapIterator.next()._1(); } }; } public Iterator<TreeNode> getAll(String key) { Option<TreeMap<String, TreeMap<TreeNode, TreeNode>>> indexOp = indexList.get(key); if (indexOp.isNone()) return null; final TreeMap<String, TreeMap<TreeNode, TreeNode>> index = indexOp.some(); if (!index.isEmpty()) return new NulIterator<TreeNode>(); return new Iterator<TreeNode>() { Iterator<P2<String, TreeMap<TreeNode, TreeNode>>> treeMapIterator = index.iterator(); Iterator<P2<TreeNode, TreeNode>> nodeIterator = new NulIterator<P2<TreeNode, TreeNode>>(); TreeNode node; @Override public boolean hasNext() { if (nodeIterator.hasNext()) { node = nodeIterator.next()._1(); return true; } for (; treeMapIterator.hasNext();) { TreeMap<TreeNode, TreeNode> nodeMap = treeMapIterator.next()._2(); nodeIterator = nodeMap.iterator(); if (nodeIterator.hasNext()) { node = nodeIterator.next()._1(); return true; } } return false; } @Override public TreeNode next() { return node; } }; } public TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> getIndex() { return indexList; } }