changeset 132:ba5370090393

index commit Prototype
author one
date Sun, 19 Oct 2014 09:15:38 +0900
parents 1c3c3300716c
children c4846688f635
files src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/AtomicReservableReference.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/IndexPushThread.java src/test/java/ip/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/IndexCommitTest.java
diffstat 5 files changed, 99 insertions(+), 68 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java	Fri Oct 17 17:21:03 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java	Sun Oct 19 09:15:38 2014 +0900
@@ -1,5 +1,7 @@
 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle;
 
+import java.util.concurrent.atomic.AtomicReference;
+
 import org.omg.CORBA.TCKind;
 
 import fj.data.List;
@@ -71,12 +73,11 @@
 
 	@Override
 	public InterfaceTraverser getTraverser() {
-		TreeContext tc = repository.get();
-		ChangeSet cs = tc.getChangeSet();
-		TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index = cs.getIndex();
+		AtomicReservableReference<TreeContext>.Reservation reservation = repository.getReservation();
+		TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index = getIndex();
 		if (index != null)
-			return new InterfaceTraverser(getRootNode(), index, getIndexTreeEditor());
-		return new InterfaceTraverser(getRootNode(),getIndexTreeEditor());
+			return new InterfaceTraverser(getRootNode(), index, reservation);
+		return new InterfaceTraverser(getRootNode(),reservation);
 	}
 	
 	@Override
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/AtomicReservableReference.java	Fri Oct 17 17:21:03 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/AtomicReservableReference.java	Sun Oct 19 09:15:38 2014 +0900
@@ -46,6 +46,10 @@
 		reservation.set(new Reservation(_value,null,true));
 	}
 	
+	public Reservation getReservation(){
+		return reservation.get();
+	}
+	
 	public V get()
 	{
 		Reservation r = reservation.get();
@@ -65,6 +69,10 @@
 			flagConfirmed = new AtomicBoolean(_confirmed);
 		}
 		
+		public void set(V object){
+			ref.set(object);
+		}
+		
 		public V get()
 		{
 			return ref.get();
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java	Fri Oct 17 17:21:03 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java	Sun Oct 19 09:15:38 2014 +0900
@@ -1,6 +1,7 @@
 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser;
 
 import java.util.Iterator;
+import java.util.concurrent.atomic.AtomicReference;
 
 import fj.Ord;
 import fj.data.List;
@@ -8,9 +9,15 @@
 import fj.data.TreeMap;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultChangeSet;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair;
 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.PathNodeIterator;
 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.Query;
@@ -20,25 +27,35 @@
 	//InterfaceTraverser traverser;
 	TreeNode node;
 	TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index;
-	IndexJungleTreeEditor editor;
+	AtomicReservableReference<TreeContext>.Reservation reservation;
 
-	public InterfaceTraverser(TreeNode _root, IndexJungleTreeEditor editor) {
+	public InterfaceTraverser(TreeNode _root, AtomicReservableReference<TreeContext>.Reservation reservation) {
 		this.node = _root;
 		this.index = TreeMap.empty(Ord.stringOrd);
-		this.editor = editor;
+		this.reservation = reservation;
 	}
 
 	public InterfaceTraverser(
 			TreeNode _root,
 			TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index,
-			IndexJungleTreeEditor editor) {
+			AtomicReservableReference<TreeContext>.Reservation reservation) {
 		this.node = _root;
 		this.index = index;
-		this.editor = editor;
+		this.reservation = reservation;
 	}
 
-	public IndexJungleTreeEditor getEditor() {
-		return editor;
+	public void commitIndex(){
+		TreeContext tc = reservation.get();
+		ChangeSet cs = tc.getChangeSet();
+		TreeNode root = cs.getRoot();
+		ChangeSet prev = cs.prev();
+		ChangeList cl = cs.getChangeList();
+		String uuid = cs.uuid();
+		String treeName = cs.getTreeName();
+		long revision = cs.revision();
+		ChangeSet newCs = new DefaultChangeSet(root, prev,cl, uuid, treeName, revision, index);
+		TreeContext newTc = new DefaultTreeContext(root, newCs);
+		reservation.set(newTc);
 	}
 	
 	public TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> getIndex() {
@@ -52,10 +69,10 @@
 
 	
 	
-	public InterfaceTraverser getTraverser(JungleTree tree) {
+/*	public InterfaceTraverser getTraverser(JungleTree tree) {
 		return new InterfaceTraverser(tree.getRootNode(), tree.getIndex(),
 				tree.getIndexTreeEditor());
-	}
+	}*/
 
 	public void set(TreeNode root) {
 		this.node = root;
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexPushThread.java	Fri Oct 17 17:21:03 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexPushThread.java	Sun Oct 19 09:15:38 2014 +0900
@@ -21,62 +21,60 @@
 
 	TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index;
 	JungleTree tree;
-	IndexJungleTreeEditor editor;
 	int logSize;
 
-	public IndexPushThread(
-			TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index,
-			JungleTree tree,IndexJungleTreeEditor editor, int logSize) {
+	public IndexPushThread(TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index, int logSize) {
 		this.index = index;
 		this.tree = tree;
-		this.editor = editor;
 		this.logSize = logSize;
 	}
 
 	public void run() {
-		while (true) {
-			
-			if (logSize == tree.getLogSize()) {
-				editor.setIndex(index);
-				if (editor.success().isB())
-					break;
-			} else {
-				editor =  tree.getIndexTreeEditor();
-				 Iterable<TreeOperation> Changeset = tree.getLog();
-				 int loopCount = 0;
-				 
-				 for(TreeOperation treeOp : Changeset) {
-					loopCount++;
-					if (loopCount >= logSize) {
-						NodePath path = treeOp.getNodePath();
-						NodeOperation NodeOperation = treeOp.getNodeOperation();
-						Command c = NodeOperation.getCommand();
-
-						switch (c) {
-						case PUT_ATTRIBUTE://ここ以下でIndexEditorを使ってindexの更新を行う
-							String key = NodeOperation.getKey();
-							ByteBuffer value = NodeOperation.getValue();
-							
-							//return editor.putAttribute(path, key, value);
-						case DELETE_ATTRIBUTE:
-							key = NodeOperation.getKey();
-							//return editor.deleteAttribute(path, key);
-						case APPEND_CHILD:
-							//return editor.addNewChildAt(path, pos);
-						case DELETE_CHILD:
-							//return editor.deleteChildAt(path, 0);
-						}
-					}
-				 }
-				 
-				 logSize = loopCount;
-				 editor.setIndex(index);
-				 if (editor.success().isB())
-						break;
-				 
-			}
-			editor = tree.getIndexTreeEditor();
-		}
+		//editor.setIndex(index);
+		//editor.success().isB();
+//		while (true) {
+//			
+//			if (logSize == tree.getLogSize()) {
+//				editor.setIndex(index);
+//				if (editor.success().isB())
+//					break;
+//			} else {
+//				editor =  tree.getIndexTreeEditor();
+//				 Iterable<TreeOperation> Changeset = tree.getLog();
+//				 int loopCount = 0;
+//				 
+//				 for(TreeOperation treeOp : Changeset) {
+//					loopCount++;
+//					if (loopCount >= logSize) {
+//						NodePath path = treeOp.getNodePath();
+//						NodeOperation NodeOperation = treeOp.getNodeOperation();
+//						Command c = NodeOperation.getCommand();
+//
+//						switch (c) {
+//						case PUT_ATTRIBUTE://ここ以下でIndexEditorを使ってindexの更新を行う
+//							String key = NodeOperation.getKey();
+//							ByteBuffer value = NodeOperation.getValue();
+//							
+//							//return editor.putAttribute(path, key, value);
+//						case DELETE_ATTRIBUTE:
+//							key = NodeOperation.getKey();
+//							//return editor.deleteAttribute(path, key);
+//						case APPEND_CHILD:
+//							//return editor.addNewChildAt(path, pos);
+//						case DELETE_CHILD:
+//							//return editor.deleteChildAt(path, 0);
+//						}
+//					}
+//				 }
+//				 
+//				 logSize = loopCount;
+//				 editor.setIndex(index);
+//				 if (editor.success().isB())
+//						break;
+//				 
+//			}
+//			editor = tree.getIndexTreeEditor();
+//		}
 	}
 	
 }
--- a/src/test/java/ip/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/IndexCommitTest.java	Fri Oct 17 17:21:03 2014 +0900
+++ b/src/test/java/ip/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/IndexCommitTest.java	Sun Oct 19 09:15:38 2014 +0900
@@ -11,6 +11,7 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.IndexJungleTreeEditor;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
@@ -21,6 +22,8 @@
 
 import java.nio.ByteBuffer;
 
+import javax.swing.tree.DefaultTreeCellEditor.EditorContainer;
+
 import org.junit.Test;
 import org.junit.experimental.theories.suppliers.TestedOn;
 
@@ -41,8 +44,7 @@
 		tree.getRootNode();
 		InterfaceTraverser ifTraverser = tree.getTraverser();
 
-		Iterator<Pair<TreeNode, NodePath>> searchNode = ifTraverser.find((
-				TreeNode node) -> {
+		 ifTraverser.find((TreeNode node) -> {
 			ByteBuffer attribute = node.getAttributes().get(key);
 			if (attribute != null) {
 				byte[] byteAttribute = attribute.array();
@@ -60,13 +62,18 @@
 		TreeMap<String, List<Pair<TreeNode, NodePath>>> innerIndex = opIndex.some();
 		Assert.assertTrue(!innerIndex.get("<-1,0,0>").isNone());
 
-		IndexPushThread wt = new IndexPushThread(index, tree,ifTraverser.getEditor(), 0);
-		wt.start();
-		wt.join();
+		JungleTreeEditor editor = tree.getTreeEditor();
+		Either<Error, JungleTreeEditor> either = editor.addNewChildAt(new DefaultNodePath(), 0);
+		editor = either.b();
+		editor.success();
+		
+		ifTraverser.commitIndex();
 		JungleTree newTree = jungle.getTreeByName("tree");
 		InterfaceTraverser newIfTraverser = newTree.getTraverser();
 		TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> newIndex = newIfTraverser.getIndex();
-		Assert.assertFalse(newIndex.isEmpty());
+		Assert.assertTrue(newIndex.isEmpty());
+		
+		
 
 	}