changeset 152:8a0aa8fc137c

Merge with a2c374a2686b82b0ad30f520412e191b84288fa9
author one
date Sat, 22 Nov 2014 15:25:09 +0900
parents d9fbddf77bf6 (current diff) a2c374a2686b (diff)
children 20af7f25ef32
files src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTree.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/App.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/Attributes.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/ChangeSet.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNodeAttributes.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingAttributes.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultChangeSet.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNode.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeAttribute.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeChildren.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/IndexJungleTreeEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/TransactionManager.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DefaultIndexEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DeleteChildIndexEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexManager.java src/test/java/DefaultJungleTreeTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/AttributesTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/GetOldTreeTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/impl/treeeditor/DefaultTreeEditorTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/DeleteAttributeAtTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/PutAttributeTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeAttributesTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/node/DefaultAttributesTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/node/DefaultChildrenTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/node/DefaultNodeTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverse/TraverserTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/query/SearchQueryTest.java
diffstat 4 files changed, 342 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/AddNewChildrenIndexEditor.java	Sat Nov 22 15:25:09 2014 +0900
@@ -0,0 +1,117 @@
+package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index;
+
+
+import fj.Ord;
+import fj.data.List;
+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.TreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
+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.util.Pair;
+
+public class AddNewChildrenIndexEditor implements IndexEditor {
+
+	NodePath editNodePath;
+
+	public AddNewChildrenIndexEditor(int pos, NodePath path) {
+		this.editNodePath = path.add(pos);
+	}
+
+	@Override
+	public Either<Error, IndexJungleTreeEditor> edit(
+			TreeNode root,
+			TransactionManager txManager,
+			TreeEditor editor,
+			TreeOperationLog log,
+			TreeMap<String, TreeMap<String, List<NodePath>>> index) {
+
+		TreeMap<String, TreeMap<String, List<NodePath>>> newIndex = editIndex(index);
+		IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root, txManager, editor, newIndex);
+		return DefaultEither.newB(newEditor);
+	}
+
+	public TreeMap<String, TreeMap<String, List<NodePath>>> editIndex(
+			TreeMap<String, TreeMap<String, List<NodePath>>> index) {
+
+		if (!index.isEmpty()) {
+			List<String> keyList = index.keys();
+			TreeMap<String, TreeMap<String, List<NodePath>>> newIndex = TreeMap.empty(Ord.stringOrd);
+			TreeMap<String, List<NodePath>> newInnerIndex = TreeMap.empty(Ord.stringOrd);
+
+			for (String indexKey : keyList) {
+				TreeMap<String, List<NodePath>> innerIndex = index.get(indexKey).some();
+				List<String> innerIndexKeyList = innerIndex.keys();
+
+				for (String innerIndexKey : innerIndexKeyList) {
+					List<NodePath> pairList = innerIndex.get(innerIndexKey).some();
+					List<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<NodePath> checkPath(List<NodePath> pairList){
+
+		List<NodePath> list = List.nil();
+		for (NodePath path : pairList) {
+
+	
+			//System.out.println("oldPath = " + path.toString());
+			NodePath newPath = new DefaultNodePath();
+			
+			
+			if (editNodePath.size() > path.size()) {
+				list = list.cons(path);
+				continue;
+			}
+
+			Pair<Integer, NodePath> editNodePathCopy = editNodePath.pop();
+			int loopCount = 0;
+
+			for (Integer pathInt : path) {
+				loopCount++;
+
+				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;
+					}
+
+					if (!(editNodePathCopy.left() == pathInt)) {
+						newPath = path;
+						break;
+					}
+				}
+
+				newPath = newPath.add(pathInt);
+
+			}
+
+			//System.out.println("newPath = " + newPath.toString());
+			list = list.cons(path);
+		}
+
+		return list;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/DeleteIndexEditor.java	Sat Nov 22 15:25:09 2014 +0900
@@ -0,0 +1,107 @@
+package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index;
+
+import java.nio.ByteBuffer;
+import java.util.Iterator;
+
+import fj.data.List;
+import fj.data.Option;
+import fj.data.TreeMap;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor;
+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.util.Pair;
+
+public class DeleteIndexEditor implements IndexEditor {
+
+	String key;
+	String pathString;
+	NodePath path;
+	TreeNode node;
+	
+	public DeleteIndexEditor(String key, NodePath path, TreeNode node) {
+		this.key = key;
+		this.pathString = path.toString();
+		this.path = path; 
+		this.node = node;
+	}
+	
+	@Override
+	public Either<Error, IndexJungleTreeEditor> edit(TreeNode root,TransactionManager txManager,TreeEditor editor,TreeOperationLog log,TreeMap<String, TreeMap<String, List<NodePath>>> index) {
+		NodePath newPath = path.pop().right();
+		TreeNode target = getTarget(node, newPath);
+		TreeMap<String, TreeMap<String, List<NodePath>>> newIndex = index;
+		Iterator<String> attributeIterator = target.getAttributes().getString(key);
+		for (;attributeIterator.hasNext();){
+		  String attribute = attributeIterator.next();
+		  newIndex = editIndex(attribute, newIndex);
+		}
+		IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root,txManager,editor,log, newIndex);
+		Either<Error, IndexJungleTreeEditor> either = DefaultEither.newB(newEditor);
+		return either;
+	}
+	
+	public TreeMap<String, TreeMap<String, List<NodePath>>> editIndex(String attribute, TreeMap<String, TreeMap<String, List<NodePath>>> index){
+	
+		Option<TreeMap<String, List<NodePath>>> innerIndexOp = index.get(key);
+		
+		if (innerIndexOp.isSome()) {
+			TreeMap<String, List<NodePath>> innerIndex = innerIndexOp.some();
+			Option<List<NodePath>> listOp = innerIndex.get(attribute);
+			
+			if (listOp.isSome()) {
+				List<NodePath> list = listOp.some();
+				List<NodePath> newList = List.nil();
+				
+				for (NodePath path : list){
+					if (!path.toString().equals(pathString)) {
+						newList = newList.cons(path);
+					}
+				}
+				
+				if (newList.isEmpty()) {
+					TreeMap<String, List<NodePath>> newInnerIndex = innerIndex.delete(attribute);
+					
+					if (newInnerIndex.isEmpty()) {
+						TreeMap<String, TreeMap<String, List<NodePath>>> newIndex = index.delete(key);
+						return newIndex;	
+					}
+					
+					TreeMap<String, TreeMap<String, List<NodePath>>> newIndex = index.set(key, newInnerIndex);
+					return newIndex;
+				}
+					
+				TreeMap<String, List<NodePath>> newInnerIndex = innerIndex.set(attribute,newList);
+				TreeMap<String, TreeMap<String, List<NodePath>>> newIndex = index.set(key, newInnerIndex);
+				return newIndex;
+				
+			} else {
+				return index;
+			}
+		} else {
+			return index;
+		}
+	}
+
+	public TreeNode getTarget(TreeNode node , NodePath path){
+		Pair<Integer, NodePath> pathNode = path.pop();
+		Either<Error, TreeNode> either = node.getChildren().at(pathNode.left());
+		if (either.isA())
+			return node;
+		
+		TreeNode child = either.b();
+		if (pathNode.right().size() == 0)
+			return child;
+		
+		TreeNode target = getTarget(child,pathNode.right());
+		return target;
+	}
+
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/PutIndexEditor.java	Sat Nov 22 15:25:09 2014 +0900
@@ -0,0 +1,98 @@
+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.TreeEditor;
+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 java.nio.ByteBuffer;
+
+public class PutIndexEditor implements IndexEditor {
+
+	String key; 
+	String attribute;
+	NodePath path;
+	TransactionManager txManager;
+	TreeNode root;
+	TreeEditor editor;
+	TreeOperationLog log;
+	
+	public PutIndexEditor(String key, ByteBuffer attribute,NodePath path) {
+	    this.key = key;
+	    this.attribute = new String(attribute.array());
+	    this.path = path;
+	}
+
+	@Override
+	public Either<Error, IndexJungleTreeEditor> edit(TreeNode root,TransactionManager txManager,TreeEditor editor,TreeOperationLog log,TreeMap<String, TreeMap<String, List<NodePath>>> index) {
+		TreeMap<String, TreeMap<String, List<NodePath>>> newIndex = editIndex(path, key, attribute,index);
+		IndexJungleTreeEditor newEditor = new IndexJungleTreeEditor(root,txManager,editor,log, newIndex);
+		Either<Error, IndexJungleTreeEditor> either = DefaultEither.newB(newEditor);
+		return either;
+	}
+	
+	public TreeMap<String, TreeMap<String, List<NodePath>>> editIndex(NodePath path, String key, String attribute,TreeMap<String, TreeMap<String, List<NodePath>>> index){
+
+		Option<TreeMap<String, List<NodePath>>> innerIndexOp = index.get(key); 
+		
+		if (attribute != null) {
+			if (innerIndexOp.isNone()) {
+
+				TreeMap<String, List<NodePath>> innerIndex = TreeMap.empty(Ord.stringOrd);
+				List<NodePath> list = List.nil();
+				list = list.cons(path);
+				innerIndex = innerIndex.set(attribute, list);
+				TreeMap<String, TreeMap<String, List<NodePath>>> newIndex = index.set(key, innerIndex);
+				return newIndex;
+			} else {
+
+				TreeMap<String, List<NodePath>> innerIndex = innerIndexOp.some();
+				
+				Option<List<NodePath>> opList = innerIndex.get(attribute);
+
+				if (opList.isNone()) {
+
+					List<NodePath> list = List.nil();
+					list = list.cons(path);
+					innerIndex = innerIndex.set(attribute, list);
+
+				} else {
+
+					List<NodePath> list = opList.some();
+					list = list.cons(path);
+					innerIndex = innerIndex.set(attribute, list);
+
+				}
+				TreeMap<String, TreeMap<String, List<NodePath>>> newIndex = index.set(key, innerIndex);
+				return newIndex;
+			}
+		}
+		return index;
+	}
+	
+//	public TreeNode getTarget(TreeNode node , NodePath path){
+//		Pair<Integer, NodePath> path = path.pop();
+//		Either<Error, TreeNode> either = node.getChildren().at(path.left());
+//		if (either.isA())
+//			return node;
+//		
+//		TreeNode child = either.b();
+//		if (path.right().size() == 0)
+//			return child;
+//		
+//		TreeNode target = getTarget(child,path.right());
+//		return target;
+//	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/functionaljava/FjListTest.java	Sat Nov 22 15:25:09 2014 +0900
@@ -0,0 +1,20 @@
+package jp.ac.u_ryukyu.ie.cr.tatsuki.functionaljava;
+
+import java.nio.ByteBuffer;
+
+import fj.F;
+import fj.data.List;
+
+public class FjListTest {
+
+  static public void main(String args[]){
+    
+    List<String> list = List.nil();
+    list = list.cons("wei");
+    String aaa = list.head();
+    boolean t1 = list.isEmpty();
+    list = list.tail();
+    boolean t2 = list.isEmpty();
+    System.out.println(aaa);
+  }
+}