changeset 154:b8cef4b640a3

update index for commit
author one
date Wed, 26 Nov 2014 06:23:07 +0900
parents 20af7f25ef32
children 54b13df9cd87 89ed172137ab
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/DefaultTransactionManager.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java
diffstat 3 files changed, 101 insertions(+), 123 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java	Tue Nov 25 17:52:41 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java	Wed Nov 26 06:23:07 2014 +0900
@@ -3,7 +3,6 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor;
-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.transaction.AtomicReservableReference;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultJungleTreeEditor;
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java	Tue Nov 25 17:52:41 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java	Wed Nov 26 06:23:07 2014 +0900
@@ -10,81 +10,85 @@
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference.Reservation;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError;
 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.tatsuki.jungle.store.index.Index;
+import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexManager;
 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex;
 
-public class DefaultTransactionManager implements TransactionManager
-{
-	private final AtomicReservableReference<TreeContext> repository;
-	private final TreeContext tip;
-	private final ChangeListWriter writer;
-	private final String uuid;
-	
-	public DefaultTransactionManager(ChangeListWriter _writer,TreeContext _tip,	AtomicReservableReference<TreeContext> _repository,String _uuid)
-	{
-		repository = _repository;
-		tip = _tip;
-		writer = _writer;
-		uuid = _uuid;
-	}
-	
-	@Override
-	public Either<Error,TransactionManager> commit(TreeNode _newRoot,final TreeOperationLog _log)
-	{
-		ChangeSet cs = tip.getChangeSet();
-		long currentRevision = cs.revision();
-		long nextRevision = currentRevision + 1;
-		
-		final String _treeName = cs.getTreeName();
-		ChangeList list = new ChangeList(){
-			@Override
-			public Iterator<TreeOperation> iterator(){
-				return _log.iterator();
-			}
-			@Override
-			public String getTreeName(){
-				return _treeName;
-			}
-			@Override
-			public String uuid(){
-				return uuid;
-			}
+public class DefaultTransactionManager implements TransactionManager {
+  private final AtomicReservableReference<TreeContext> repository;
+  private final TreeContext tip;
+  private final ChangeListWriter writer;
+  private final String uuid;
+
+  public DefaultTransactionManager(ChangeListWriter _writer, TreeContext _tip,
+      AtomicReservableReference<TreeContext> _repository, String _uuid) {
+    repository = _repository;
+    tip = _tip;
+    writer = _writer;
+    uuid = _uuid;
+  }
+
+  @Override
+  public Either<Error, TransactionManager> commit(TreeNode _newRoot, final TreeOperationLog _log) {
+    ChangeSet cs = tip.getChangeSet();
+    long currentRevision = cs.revision();
+    long nextRevision = currentRevision + 1;
+
+    final String _treeName = cs.getTreeName();
+    ChangeList list = new ChangeList() {
+      @Override
+      public Iterator<TreeOperation> iterator() {
+        return _log.iterator();
+      }
+
+      @Override
+      public String getTreeName() {
+        return _treeName;
+      }
+
+      @Override
+      public String uuid() {
+        return uuid;
+      }
 
-		};
-		
-		Index nulIndex = new Index();
-		ParentIndex nulParentIndex = new ParentIndex();
-		DefaultChangeSet newCs = new DefaultChangeSet(_newRoot,cs,list,uuid, _treeName, nextRevision, nulIndex, nulParentIndex);
-		DefaultTreeContext newContext = new DefaultTreeContext(_newRoot,newCs);
-		
-		@SuppressWarnings("rawtypes")
-		Reservation reservation = repository.makeReservation(tip,newContext);
-		if(reservation == null){
-			return DefaultEither.newA((Error)new DefaultError());
-		}
-		Result r = writer.write(list);
-		if(r == Result.SUCCESS){
-			reservation.confirm();
-			TransactionManager txManager = new DefaultTransactionManager(writer,newContext,repository,uuid);
-			return DefaultEither.newB(txManager);
-		}
-		return DefaultEither.newA((Error)new DefaultError());
-	}
+    };
+
+    IndexManager indexManager = new IndexManager(repository.getReservation());
+    InterfaceTraverser traverser = new InterfaceTraverser(_newRoot, indexManager, true);
+    traverser.createIndex();
+    Index nulIndex = traverser.getIndex();
+    ParentIndex nulParentIndex = traverser.getParentIndex();
+    DefaultChangeSet newCs = new DefaultChangeSet(_newRoot, cs, list, uuid, _treeName, nextRevision, nulIndex,
+        nulParentIndex);
+    DefaultTreeContext newContext = new DefaultTreeContext(_newRoot, newCs);
 
-	@Override
-	public String getUUID()
-	{
-		return uuid;
-	}
+    @SuppressWarnings("rawtypes")
+    Reservation reservation = repository.makeReservation(tip, newContext);
+    if (reservation == null) {
+      return DefaultEither.newA((Error) new DefaultError());
+    }
+    Result r = writer.write(list);
+    if (r == Result.SUCCESS) {
+      reservation.confirm();
+      TransactionManager txManager = new DefaultTransactionManager(writer, newContext, repository, uuid);
+      return DefaultEither.newB(txManager);
+    }
+    return DefaultEither.newA((Error) new DefaultError());
+  }
 
-	@Override
-	public long getRevision()
-	{
-		ChangeSet cs = tip.getChangeSet();
-		return cs.revision();
-	}
+  @Override
+  public String getUUID() {
+    return uuid;
+  }
+
+  @Override
+  public long getRevision() {
+    ChangeSet cs = tip.getChangeSet();
+    return cs.revision();
+  }
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java	Tue Nov 25 17:52:41 2014 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java	Wed Nov 26 06:23:07 2014 +0900
@@ -18,11 +18,15 @@
   ParentIndex parentIndex;
   boolean parentUpdateFlag;
   IndexManager indexManager;
-  boolean indexFlag;
+  boolean useIndex;
 
-  public InterfaceTraverser(TreeNode _root, Index index, ParentIndex parentIndex, IndexManager indexManager,
-      boolean indexFlag) {
-    this.node = _root;
+  public InterfaceTraverser(TreeNode root, IndexManager indexManager, boolean indexFlag) {
+    this(root, new Index(), new ParentIndex(), indexManager, indexFlag);
+  }
+
+  public InterfaceTraverser(TreeNode root, Index index, ParentIndex parentIndex, IndexManager indexManager,
+      boolean useIndex) {
+    this.node = root;
     this.index = index;
     this.indexManager = indexManager;
     this.parentIndex = parentIndex;
@@ -30,7 +34,7 @@
       parentUpdateFlag = true;
     else
       parentUpdateFlag = false;
-    this.indexFlag = indexFlag;
+    this.useIndex = useIndex;
   }
 
   public Index getIndex() {
@@ -50,51 +54,20 @@
     this.index = index;
   }
 
-  public Iterator<TreeNode> emptyQuery() {
+  public void createIndex() {
 
     final PathNodeIterator itNode = new PathNodeIterator(node);
-    return new Iterator<TreeNode>() {
-
-      private TreeNode matchNode = nextmatch(itNode);
-
-      private TreeNode nextmatch(PathNodeIterator itNode) {
-
-        for (; itNode.hasNext();) {
-          TreeNode targetNode = itNode.next();
-          List<String> keys = targetNode.getAttributes().getKeys();
-          for (String key : keys) {
-            String value = targetNode.getAttributes().getString(key);
-            if (value != null)
-              index = index.set(key, value, targetNode);
-            if (parentUpdateFlag)
-              parentIndex = parentIndex.set(targetNode);
-          }
-        }
-        commit();
-        return null;
+    for (; itNode.hasNext();) {
+      TreeNode targetNode = itNode.next();
+      if (parentUpdateFlag)
+        parentIndex = parentIndex.set(targetNode);
+      List<String> keys = targetNode.getAttributes().getKeys();
+      for (String key : keys) {
+        String value = targetNode.getAttributes().getString(key);
+        if (value != null)
+          index = index.set(key, value, targetNode);
       }
-
-      @Override
-      public boolean hasNext() {
-        if (matchNode == null) {
-          return false;
-        }
-        return true;
-      }
-
-      @Override
-      public TreeNode next() {
-        TreeNode currentPair = matchNode;
-        matchNode = nextmatch(itNode);
-        return currentPair;
-      }
-
-      @Override
-      public void remove() {
-      }
-
-    };
-
+    }
   }
 
   /**
@@ -112,7 +85,7 @@
      * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す
      */
     List<TreeNode> nodeList = index.get(key, searchValue);
-    if (nodeList != null) {
+    if (nodeList != null && useIndex) {
 
       if (nodeList.isEmpty())
         return new NulIterator<TreeNode>();// 空のIteratorを返す
@@ -187,7 +160,7 @@
      * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す
      */
     Iterator<TreeNode> NodeIterator = index.getAll(key);
-    if (NodeIterator != null) {
+    if (NodeIterator != null && useIndex) {
       List<TreeNode> filteredList = List.nil();
       for (; NodeIterator.hasNext();) {
         TreeNode targetNode = NodeIterator.next();
@@ -243,7 +216,7 @@
   public Iterator<TreeNode> find(Query query, String key, String searchValue) {
 
     List<TreeNode> nodeList = index.get(key, searchValue);
-    if (nodeList != null) {
+    if (nodeList != null && useIndex) {
       return nodeList.iterator();
     } else {
 
@@ -257,7 +230,7 @@
           for (; itNode.hasNext();) {
             TreeNode targetNode = itNode.next();
             String value = targetNode.getAttributes().getString(key);
-            if (indexFlag) {
+            if (useIndex) {
               if (value != null)
                 index = index.set(key, value, targetNode);
             }
@@ -266,7 +239,8 @@
             if (query.condition(targetNode))
               return targetNode;
           }
-          commit();
+          if (useIndex || parentUpdateFlag)
+            commit();
           return null;
         }
 
@@ -296,7 +270,7 @@
   public Iterator<TreeNode> findAll(Query query, String key) {
 
     Iterator<TreeNode> nodeList = index.getAll(key);
-    if (nodeList != null) {
+    if (nodeList != null && useIndex) {
 
       return nodeList;
 
@@ -312,7 +286,7 @@
           for (; itNode.hasNext();) {
             TreeNode targetNode = itNode.next();
             String value = targetNode.getAttributes().getString(key);
-            if (indexFlag) {
+            if (useIndex) {
               if (value != null)
                 index = index.set(key, value, targetNode);
             }
@@ -321,7 +295,8 @@
             if (query.condition(targetNode))
               return targetNode;
           }
-          commit();
+          if (useIndex || parentUpdateFlag)
+            commit();
           return null;
         }