# HG changeset patch # User one # Date 1416541596 -32400 # Node ID af67dd0b5ba26651a1b6decdb8ee7b1b65163792 # Parent 371b6ddb78f2bec42c205e6563788db155ef2dbe add DefaultIndexEditor diff -r 371b6ddb78f2 -r af67dd0b5ba2 src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DefaultIndexEditor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DefaultIndexEditor.java Fri Nov 21 12:46:36 2014 +0900 @@ -0,0 +1,97 @@ +package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeAttributes; +import fj.Ord; +import fj.data.List; +import fj.data.Option; +import fj.data.TreeMap; + +public class DefaultIndexEditor implements IndexEditor { + + TreeMap>> indexTreeMap; + + public DefaultIndexEditor(TreeMap>> indexTreeMap) { + this.indexTreeMap = indexTreeMap; + } + + @Override + public IndexEditor delete(TreeNode node) { + TreeNodeAttributes attribute = node.getAttributes(); + List keys = attribute.getKeys(); + TreeMap>> newIndexTreeMap = indexTreeMap; + for (String key : keys) { + Option>> indexOp = indexTreeMap.get(key); + if (indexOp.isSome()) { + TreeMap> index = indexOp.some(); + String value = attribute.getString(key); + Option> nodeListOp = index.get(value); + if (nodeListOp.isSome()) { + List nodeList = nodeListOp.some(); + List newNodeList = List.nil(); + for (TreeNode indexingNode : nodeList) { + if (indexingNode != node) + newNodeList = newNodeList.cons(indexingNode); + } + TreeMap> newIndex; +// if (newNodeList.isEmpty()) +// newIndex = index.delete(value); +// else + newIndex = index.set(value, newNodeList); + newIndexTreeMap = newIndexTreeMap.set(key, newIndex); + } + + } + } + + return new DefaultIndexEditor(newIndexTreeMap); + } + + @Override + public IndexEditor add(TreeNode node) { + TreeNodeAttributes attribute = node.getAttributes(); + List keys = attribute.getKeys(); + TreeMap>> newIndexTreeMap = indexTreeMap; + for (String key : keys) { + Option>> indexOp = indexTreeMap.get(key); + if (indexOp.isSome()) { + TreeMap> index = indexOp.some(); + String value = attribute.getString(key); + Option> nodeListOp = index.get(value); + if (nodeListOp.isSome()) { + List nodeList = nodeListOp.some(); + List newNodeList = nodeList.cons(node); + TreeMap> newIndex = index.set(value, newNodeList); + newIndexTreeMap = newIndexTreeMap.set(key, newIndex); + } else { // test + List nodeList = List.nil(); + value = attribute.getString(key); + List newNodeList = nodeList.cons(node); + TreeMap> newIndex = index.set(value, newNodeList); + newIndexTreeMap = newIndexTreeMap.set(key, newIndex); + } + + } else { // test + TreeMap> index = TreeMap.empty(Ord.stringOrd); + List nodeList = List.nil(); + String value = attribute.getString(key); + List newNodeList = nodeList.cons(node); + TreeMap> newIndex = index.set(value, newNodeList); + newIndexTreeMap = newIndexTreeMap.set(key, newIndex); + } + } + + return new DefaultIndexEditor(newIndexTreeMap); + } + + @Override + public TreeMap>> getIndex() { + return indexTreeMap; + } + + @Override + public IndexEditor edit(TreeNode node) { + return this; + } + +}