Mercurial > hg > Members > tatsuki > bench > jungle-core
diff src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DeleteChildIndexEditor.java @ 146:371b6ddb78f2
repair putAttributeIndex and deleteAttributeIndex
author | one |
---|---|
date | Fri, 21 Nov 2014 12:46:06 +0900 |
parents | 72f454eb04ec |
children | a2c374a2686b d9fbddf77bf6 |
line wrap: on
line diff
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DeleteChildIndexEditor.java Fri Nov 21 08:11:24 2014 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DeleteChildIndexEditor.java Fri Nov 21 12:46:06 2014 +0900 @@ -1,116 +1,127 @@ package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; - 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.NodePath; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.IndexTreeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeAttributes; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; +import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.PathNodeIterator; public class DeleteChildIndexEditor implements IndexEditor { - NodePath editNodePath; - - public DeleteChildIndexEditor(int pos, NodePath path) { - this.editNodePath = path.add(pos); - } - - @Override - public Either<Error, IndexJungleTreeEditor> edit(TreeNode root,TransactionManager txManager, IndexTreeEditor editor,TreeOperationLog log,TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index, TreeMap<TreeNode,TreeNode> parentIndex) { + TreeMap<String, TreeMap<String, List<TreeNode>>> indexTreeMap; + int pos; - TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> newIndex = editIndex(index); - IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root, txManager, editor, newIndex, parentIndex); - return DefaultEither.newB(newEditor); - } - - public TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> editIndex( - TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index) { - - if (!index.isEmpty()) { - List<String> keyList = index.keys(); - TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> newIndex = TreeMap.empty(Ord.stringOrd); - TreeMap<String, List<Pair<TreeNode, NodePath>>> newInnerIndex = TreeMap.empty(Ord.stringOrd); + public DeleteChildIndexEditor(int pos, TreeMap<String, TreeMap<String, List<TreeNode>>> indexTreeMap) { + this.indexTreeMap = indexTreeMap; + this.pos = pos; + } - for (String indexKey : keyList) { - TreeMap<String, List<Pair<TreeNode, NodePath>>> innerIndex = index.get(indexKey).some(); - List<String> innerIndexKeyList = innerIndex.keys(); + @Override + public IndexEditor delete(TreeNode node) { + TreeNodeAttributes attribute = node.getAttributes(); + List<String> keys = attribute.getKeys(); + TreeMap<String, TreeMap<String, List<TreeNode>>> newIndexTreeMap = indexTreeMap; + for (String key : keys) { + Option<TreeMap<String, List<TreeNode>>> indexOp = indexTreeMap.get(key); + if (indexOp.isSome()) { + TreeMap<String, List<TreeNode>> index = indexOp.some(); + String value = attribute.getString(key); + 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 != node) + newNodeList = newNodeList.cons(indexingNode); + } + TreeMap<String, List<TreeNode>> newIndex; + newIndex = index.set(value, newNodeList); + newIndexTreeMap = newIndexTreeMap.set(key, newIndex); + } - for (String innerIndexKey : innerIndexKeyList) { - List<Pair<TreeNode, NodePath>> pairList = innerIndex.get(innerIndexKey).some(); - List<Pair<TreeNode, NodePath>> list = checkPath(pairList); - if (!list.isEmpty()){ - System.out.println(new String(list.head().left().getAttributes().get("KEY").array())); - newInnerIndex = newInnerIndex.set(innerIndexKey, list); - } - } - newIndex = newIndex.set(indexKey, newInnerIndex); - } - return newIndex; - } else { - return index; - } - } + } + } - public List<Pair<TreeNode, NodePath>> checkPath(List<Pair<TreeNode, NodePath>> pairList){ - - List<Pair<TreeNode, NodePath>> list = List.nil(); - for (Pair<TreeNode, NodePath> pair : pairList) { + return new DefaultIndexEditor(newIndexTreeMap); + } - NodePath path = pair.right(); - System.out.println("oldPath = " + path.toString()); - NodePath newPath = new DefaultNodePath(); - - if (path.toString().equals(editNodePath.toString())) { - continue; - } - - if (editNodePath.size() > path.size()) { - list = list.cons(pair); - continue; - } + @Override + public IndexEditor add(TreeNode node) { + TreeNodeAttributes attribute = node.getAttributes(); + List<String> keys = attribute.getKeys(); + TreeMap<String, TreeMap<String, List<TreeNode>>> newIndexTreeMap = indexTreeMap; + for (String key : keys) { + Option<TreeMap<String, List<TreeNode>>> indexOp = indexTreeMap.get(key); + if (indexOp.isSome()) { + TreeMap<String, List<TreeNode>> index = indexOp.some(); + String value = attribute.getString(key); + Option<List<TreeNode>> nodeListOp = index.get(value); + if (nodeListOp.isSome()) { + List<TreeNode> nodeList = nodeListOp.some(); + List<TreeNode> newNodeList = nodeList.cons(node); + TreeMap<String, List<TreeNode>> newIndex = index.set(value, newNodeList); + newIndexTreeMap = newIndexTreeMap.set(key, newIndex); + } else { // test + List<TreeNode> nodeList = List.nil(); + value = attribute.getString(key); + List<TreeNode> newNodeList = nodeList.cons(node); + TreeMap<String, List<TreeNode>> newIndex = index.set(value, newNodeList); + newIndexTreeMap = newIndexTreeMap.set(key, newIndex); + } - Pair<Integer, NodePath> editNodePathCopy = editNodePath.pop(); - int loopCount = 0; + } else { // test + TreeMap<String, List<TreeNode>> index = TreeMap.empty(Ord.stringOrd); + List<TreeNode> nodeList = List.nil(); + String value = attribute.getString(key); + List<TreeNode> newNodeList = nodeList.cons(node); + TreeMap<String, List<TreeNode>> newIndex = index.set(value, newNodeList); + newIndexTreeMap = newIndexTreeMap.set(key, newIndex); + } + } - for (Integer pathInt : path) { - loopCount++; + return new DefaultIndexEditor(newIndexTreeMap); + } - if (pathInt == -1) - continue; - if (editNodePathCopy.right().size() > 0) { - - editNodePathCopy = editNodePathCopy.right().pop(); - if (loopCount == editNodePath.size() && editNodePathCopy.left() < pathInt) { - newPath = newPath.add(pathInt - 1); - continue; - } + @Override + public TreeMap<String, TreeMap<String, List<TreeNode>>> getIndex() { + return indexTreeMap; + } + + @Override + public IndexEditor edit(TreeNode node) { + PathNodeIterator nodeSearcher = new PathNodeIterator(new Pair<TreeNode, NodePath>(node, new DefaultNodePath())); + TreeMap<String, TreeMap<String, List<TreeNode>>> newIndexTreeMap = indexTreeMap; - if (!(editNodePathCopy.left() == pathInt)) { - newPath = path; - break; - } - } - - newPath = newPath.add(pathInt); + for (; nodeSearcher.hasNext();) { + TreeNode deleteNode = nodeSearcher.next().left(); + TreeNodeAttributes attribute = deleteNode.getAttributes(); + List<String> keys = attribute.getKeys(); + for (String key : keys) { + Option<TreeMap<String, List<TreeNode>>> indexOp = newIndexTreeMap.get(key); + if (indexOp.isSome()) { + TreeMap<String, List<TreeNode>> index = indexOp.some(); + String value = attribute.getString(key); + 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 != deleteNode) + newNodeList = newNodeList.cons(indexingNode); + } + TreeMap<String, List<TreeNode>> newIndex = index.set(value, newNodeList); + newIndexTreeMap = newIndexTreeMap.set(key, newIndex); + } - } - - System.out.println("newPath = " + newPath.toString()); - Pair<TreeNode, NodePath> newPair = new Pair<TreeNode, NodePath>( - pair.left(), newPath); - list = list.cons(newPair); - } - - return list; - } + } + } + } + return null; + } }