Mercurial > hg > Members > shoshi > jungle > jungle-core
changeset 209:e5275a599048
reverseList → List
author | tatsuki |
---|---|
date | Tue, 28 Jul 2015 08:32:58 +0900 |
parents | be08961d4c84 |
children | 9166735b34c9 |
files | src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/DefaultJungle.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/DefaultJungleTree.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/Jungle.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/JungleTree.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/JungleTreeEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/benchMark/JungleBenchMark.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/core/App.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/core/Attributes.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/core/AttributesContainer.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/core/Children.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/list/DefaultNode.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/list/List.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/list/Node.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/list/TailNode.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/list/headNode.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/BlackNode.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/EmptyNode.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/Node.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/RedNode.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/Rotate.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/RotateParent.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/TreeMap.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/error/BasicErrors.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/ChangeList.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/ChangeListReader.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/ChangeListWriter.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultChangeListReader.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultChangeListWriter.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultJournal.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultJournalWriter.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/Journal.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/NullJournal.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/Result.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/query/PathNodeIterator.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/query/Query.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/Command.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/Constants.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/NodePath.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/NulIterator.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/Transaction.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/TreeContext.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/TreeEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/TreeEditorError.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/DefaultNodePath.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/DefaultTreeEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/IndexTreeEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/TreeNode.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/TreeNodeAttributes.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/TreeNodeChildren.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/DefaultOperationLog.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/DefaultTreeOperationLog.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/LoggingAttributes.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/LoggingChildren.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/LoggingNode.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/OperationLog.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/TreeOperationLog.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/index/IndexCreater.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/index/ParentIndex.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/AppendChildAtOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/DefaultTreeOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/DeleteAttributeOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/DeleteChildAtOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/NodeOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/PutAttributeOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/ReplaceRootNodeOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/TreeOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/AppendChildAt.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/DeleteAttribute.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/DeleteChildAt.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/NodeEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/NodeEditorError.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/PutAttribute.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/replaceRootNodeAt.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/AbstractTreeMapThread.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/DataBaseBenchMark.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/DataBaseBenchMarkThread.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/JungleWriteThread.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/TatsukiTreeMapGetThread.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/TreeMapBenchMark.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/UtilTreeMapGetThread.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/findMongoAttributeThread.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/findTreeAttributeThread.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/readTreeAttributeThread.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultJungleTreeEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTransactionManager.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeContext.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeNode.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeNodeAttribute.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeNodeChildren.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/TransactionManager.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultEvaluation.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultEvaluator.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultTraverser.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Direction.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Evaluation.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Evaluator.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/InterfaceTraverser.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Result.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Traversal.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Traverser.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/TraverserError.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/DefaultEither.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/DefaultError.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/Either.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/Error.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/GetOldTreeError.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/IterableConverter.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/Pair.java src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/Triple.java src/main/java/jp/ac/u_ryukyu/ie/cr/list/DefaultNode.java src/main/java/jp/ac/u_ryukyu/ie/cr/list/List.java src/main/java/jp/ac/u_ryukyu/ie/cr/list/Node.java src/main/java/jp/ac/u_ryukyu/ie/cr/list/TailNode.java src/main/java/jp/ac/u_ryukyu/ie/cr/list/headNode.java 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/Jungle.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/JungleTreeEditor.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/core/AttributesContainer.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/Children.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/error/BasicErrors.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/ChangeList.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/ChangeListReader.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/ChangeListWriter.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/DefaultChangeListReader.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/DefaultChangeListWriter.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/DefaultJournal.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/DefaultJournalWriter.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/Journal.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/NullJournal.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/Result.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/Command.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/Constants.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/NodePath.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/NulIterator.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/Transaction.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/TreeContext.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/TreeEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/TreeEditorError.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultNodePath.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/IndexTreeEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNode.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/TreeNodeChildren.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/DefaultOperationLog.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/DefaultTreeOperationLog.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/store/impl/logger/LoggingChildren.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingNode.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/OperationLog.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/TreeOperationLog.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/AppendChildAtOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DefaultTreeOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteAttributeOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteChildAtOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/NodeOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/PutAttributeOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/ReplaceRootNodeOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/TreeOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/AppendChildAt.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DeleteAttribute.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DeleteChildAt.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/NodeEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/NodeEditorError.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/PutAttribute.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/replaceRootNodeAt.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/DefaultTreeContext.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/TransactionManager.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultEvaluation.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultEvaluator.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultTraverser.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Direction.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Evaluation.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Evaluator.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Result.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Traversal.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Traverser.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/TraverserError.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/DefaultEither.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/DefaultError.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/Either.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/Error.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/GetOldTreeError.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/IterableConverter.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/Pair.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/Triple.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/benchMark/JungleBenchMark.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/query/PathNodeIterator.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/query/Query.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexCreater.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/ParentIndex.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/test/AbstractTreeMapThread.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/test/DataBaseBenchMark.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/test/DataBaseBenchMarkThread.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/test/JungleWriteThread.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/test/TatsukiTreeMapGetThread.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/test/TreeMapBenchMark.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/test/UtilTreeMapGetThread.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/test/findMongoAttributeThread.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/test/findTreeAttributeThread.java src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/test/readTreeAttributeThread.java src/main/java/jp/ac/u_ryukyu/ie/cr/treemap/BlackNode.java src/main/java/jp/ac/u_ryukyu/ie/cr/treemap/EmptyNode.java src/main/java/jp/ac/u_ryukyu/ie/cr/treemap/Node.java src/main/java/jp/ac/u_ryukyu/ie/cr/treemap/RedNode.java src/main/java/jp/ac/u_ryukyu/ie/cr/treemap/Rotate.java src/main/java/jp/ac/u_ryukyu/ie/cr/treemap/RotateParent.java src/main/java/jp/ac/u_ryukyu/ie/cr/treemap/TreeMap.java src/test/java/DefaultJungleTreeTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/AttributesContainerTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/AttributesTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/ChildrenTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/GetNodeOfPathTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/GetOldTreeTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/ParentTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/impl/treeeditor/DefaultTreeEditorTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/AppendChildAtTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/DeleteAttributeAtTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/DeleteChildAtTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/EditableAttributesTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/EditableChildrenTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/PutAttributeTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/ReplaceRootNodeAt.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/treeeditor/TreeNodeChildrenTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/impl/clonable/DefaultTreeNodeAttributesTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/impl/clonable/DefaultTreeNodeChildrenTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/impl/clonable/DefaultTreeNodeTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/impl/node/DefaultAttributesTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/impl/node/DefaultChildrenTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/impl/node/DefaultNodeTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/index/parentIndexTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/tests/util/TestUtil.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/traverse/BruteForceTraverserTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/traverse/TraverserTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/AttributesContainerTest.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/ChildrenTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/GetNodeOfPathTest.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/ParentTest.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/AppendChildAtTest.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/DeleteChildAtTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/EditableAttributesTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/EditableChildrenTest.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/core/nodeeditor/ReplaceRootNodeAt.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/treeeditor/TreeNodeChildrenTest.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/clonable/DefaultTreeNodeChildrenTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeTest.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/tests/util/TestUtil.java src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverse/BruteForceTraverserTest.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/jungle/index/parentIndexTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/list/appendTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/list/deleteTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/list/listAdd.java src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/list/listIterator.java src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/list/replaceTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/treemap/TreeMapDelete.java src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/treemap/TreeMapTest.java src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/treemap/TreeNodeIteratorTest.java |
diffstat | 277 files changed, 6698 insertions(+), 6686 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/jungle/DefaultJungle.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,85 @@ +package jp.ac.u_ryukyu.ie.cr.jungle; + + +import jp.ac.u_ryukyu.ie.cr.jungle.persistent.Journal; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeList; +import jp.ac.u_ryukyu.ie.cr.jungle.persistent.NullJournal; +import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeContext; +import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeContext; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +import java.util.Iterator; +import java.util.concurrent.ConcurrentHashMap; + +public class DefaultJungle implements Jungle { + private Journal journal; + private ConcurrentHashMap<String, JungleTree> trees; + private String uuid; + private TreeEditor editor; + + public static void main(String args[]) { + DefaultJungle j = new DefaultJungle(null, "hoge", new DefaultTreeEditor(new DefaultTraverser())); + JungleTree t = j.createNewTree("fuga"); + + JungleTreeEditor e1 = t.getTreeEditor(); + + DefaultNodePath root = new DefaultNodePath(); + + Either<Error, JungleTreeEditor> either = e1.addNewChildAt(root, 0); + e1 = either.b(); + either = e1.addNewChildAt(root.add(0), 0); + e1 = either.b(); + e1.success(); + } + + public DefaultJungle(Journal journal, String uuid, TreeEditor editor) { + this.journal = new NullJournal(); + this.trees = new ConcurrentHashMap<String, JungleTree>(); + this.uuid = uuid; + this.editor = editor; + } + + @Override + public JungleTree getTreeByName(String name) { + return trees.get(name); + } + + @Override + public JungleTree createNewTree(final String name) { + ChangeList list = new ChangeList() { + @Override + public Iterator<TreeOperation> iterator() { + List<TreeOperation> nil = new List(); + return nil.iterator(); + } + + @Override + public String uuid() { + return uuid; + } + + @Override + public String getTreeName() { + return name; + } + + }; + DefaultTreeNode root = new DefaultTreeNode(); + InterfaceTraverser traverser = new InterfaceTraverser(root, true); + TreeContext tc = new DefaultTreeContext(root, null, list, uuid, name, 0, traverser); + JungleTree newTree = new DefaultJungleTree(tc, uuid, journal.getWriter(), editor); + if (trees.putIfAbsent(name, newTree) != null) { + return null; + } + return newTree; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/DefaultJungleTree.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,108 @@ +package jp.ac.u_ryukyu.ie.cr.jungle; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeListWriter; +import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeContext; +import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultJungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTransactionManager; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.GetOldTreeError; +import jp.ac.u_ryukyu.ie.cr.jungle.store.index.ParentIndex; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.util.concurrent.atomic.AtomicReference; + +public class DefaultJungleTree implements JungleTree { + + private final AtomicReference<TreeContext> repository; + private final String uuid; + private final ChangeListWriter writer; + private final TreeEditor treeEditor; + + public DefaultJungleTree(TreeContext tc, String uuid, ChangeListWriter writer, TreeEditor editor) { + this.repository = new AtomicReference<TreeContext>(tc); + this.uuid = uuid; + this.writer = writer; + this.treeEditor = editor; + } + + @Override + public JungleTreeEditor getTreeEditor() { + TreeContext tc = repository.get(); + DefaultTransactionManager txManager = new DefaultTransactionManager(writer, tc, repository, uuid); + TreeNode root = tc.getRoot(); + return new DefaultJungleTreeEditor(root, txManager, treeEditor); + } + + @Override + public JungleTreeEditor getLocalTreeEditor() { + return getTreeEditor(); + } + + @Override + public TreeNode getRootNode() { + TreeContext tc = repository.get(); + return tc.getRoot(); + } + + @Override + public InterfaceTraverser getTraverser(boolean useIndex) { + TreeContext tc = repository.get(); + return tc.getTraverser(); + } + + @Override + public ParentIndex getParentIndex() { + TreeContext tc = repository.get(); + return tc.getParentIndex(); + } + + @Override + public TreeMap<String, TreeMap<String, List<TreeNode>>> getIndex() { + TreeContext tc = repository.get(); + return tc.getIndex(); + } + + @Override + public long revision() { + TreeContext tc = repository.get(); + return tc.revision(); + } + + @Override + public Either<Error, JungleTree> getOldTree(long revision) { + TreeContext tc = repository.get(); + + for (; tc.revision() != revision; ) { + tc = tc.prev(); + if (tc == null) + return DefaultEither.newA(GetOldTreeError.OLD_TREE_NOT_FOUND); + } + + + String oldTreeUuid = uuid + revision; + JungleTree oldTree = new DefaultJungleTree(tc, oldTreeUuid, writer, treeEditor); + return DefaultEither.newB(oldTree); + } + + @Override + public Either<jp.ac.u_ryukyu.ie.cr.jungle.util.Error, TreeNode> getNodeOfPath(NodePath path) { + TreeNode node = repository.get().getRoot(); + for (int num : path) { + if (num == -1) + continue; + Either<Error, TreeNode> either = node.getChildren().at(num); + if (either.isA()) + return either; + node = either.b(); + } + return DefaultEither.newB(node); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/Jungle.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,8 @@ +package jp.ac.u_ryukyu.ie.cr.jungle; + + +public interface Jungle +{ + public JungleTree getTreeByName(String name); + public JungleTree createNewTree(String name); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/JungleTree.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,31 @@ +package jp.ac.u_ryukyu.ie.cr.jungle; + + +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.store.index.ParentIndex; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +public interface JungleTree { + public JungleTreeEditor getTreeEditor(); + + public JungleTreeEditor getLocalTreeEditor(); + + public TreeNode getRootNode(); + + public long revision(); + + public Either<Error, JungleTree> getOldTree(long revision); + + public TreeMap<String, TreeMap<String, List<TreeNode>>> getIndex(); + + public ParentIndex getParentIndex(); + + public InterfaceTraverser getTraverser(boolean useIndex); + + public Either<Error, TreeNode> getNodeOfPath(NodePath path); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/JungleTreeEditor.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,20 @@ +package jp.ac.u_ryukyu.ie.cr.jungle; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public interface JungleTreeEditor +{ + + public Either<Error,JungleTreeEditor> addNewChildAt(NodePath path,int pos); + public Either<Error,JungleTreeEditor> deleteChildAt(NodePath path,int pos); + public Either<Error,JungleTreeEditor> putAttribute(NodePath path,String key,ByteBuffer value); + public Either<Error,JungleTreeEditor> deleteAttribute(NodePath path,String key); + public Either<Error,JungleTreeEditor> edit(NodePath path,NodeEditor editor); + public Either<Error,JungleTreeEditor> success(); + public Either<Error, JungleTreeEditor> replaceNewRootNode(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/benchMark/JungleBenchMark.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,54 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.benchMark; + +import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.jungle.Jungle; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser; + +import java.nio.ByteBuffer; +import java.util.Iterator; + + +/** + * Created by e115731 on 15/05/07. + */ +public class JungleBenchMark { + public static void main(String args[]) { + Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTreeEditor(new DefaultTraverser())); + jungle.createNewTree("tree"); + JungleTree tree = jungle.getTreeByName("tree"); + JungleTreeEditor editor = tree.getTreeEditor(); + NodePath path = new DefaultNodePath().add(0); + for (int count = 1; count <= 10; count++) { + for (int personCount = 0; personCount < 1000 * count; personCount++) { + editor = editor.replaceNewRootNode().b(); + editor = editor.putAttribute(path, "personId", ByteBuffer.wrap(("p:" + personCount).getBytes())).b(); + editor = editor.putAttribute(path, "roleId", ByteBuffer.wrap(("r:" + personCount).getBytes())).b(); + } + editor.success(); + long t1 = System.currentTimeMillis(); + for (int findCount = 0; findCount < 50000; ) { + InterfaceTraverser traverser = tree.getTraverser(true); + Iterator<TreeNode> it = traverser.find(null, "personId", "p:100"); + if (it.hasNext()) { + TreeNode targetNode = it.next(); + String targetRoleId = targetNode.getAttributes().getString("roleId"); + if (targetRoleId.equals("r:100")) + findCount++; + } else { + System.out.println("find miss"); + System.exit(1); + } + } + long t2 = System.currentTimeMillis(); + System.out.println("time = " + (t2 - t1)); + } + + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/core/App.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,42 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + DefaultJungle jungle = new DefaultJungle(null,"sample", new DefaultTreeEditor(new DefaultTraverser())); + jungle.createNewTree("hoge"); + JungleTree tree = jungle.getTreeByName("hoge"); + JungleTreeEditor editor = tree.getTreeEditor(); + DefaultNodePath path = new DefaultNodePath(); + + String key = "key"; + ByteBuffer value = ByteBuffer.wrap(key.getBytes()); + + Either<Error,JungleTreeEditor> either = editor.putAttribute(path,"key",value); + JungleTreeEditor e = either.b(); + e.success(); + + + TreeNode root = tree.getRootNode(); + ByteBuffer v = root.getAttributes().get(key); + String str = new String(v.array()); + System.out.println(str); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/core/Attributes.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,9 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core; + +import java.nio.ByteBuffer; + +public interface Attributes +{ + public ByteBuffer get(String key); + public String getString(String key); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/core/AttributesContainer.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,6 @@ +//package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core; +// +//public interface AttributesContainer +//{ +// public Attributes getAttributes(); +//}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/core/Children.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,11 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public interface Children extends Iterable<TreeNode> +{ + public Either<Error,TreeNode> at(int pos); + public int size(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/list/DefaultNode.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,79 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.list; + +/** + * Created by e115731 on 15/05/16. + */ +public class DefaultNode<T> implements Node<T> { + private final T attribute; + private final Node next; + + //最終的に消す + int num = 0; + + public DefaultNode(T attribute, int num, Node next) { + this.attribute = attribute; + this.next = next; + } +//ここまで + + public DefaultNode(T attribute, Node next) { + this.attribute = attribute; + this.next = next; + } + + public int getNum() { + return num; + } + + public Node getNext() { + return next; + } + + public T getAttribute() { + return attribute; + } + + public Node<T> addLast(T attribute) { + Node<T> node = next.addLast(attribute); + return new DefaultNode<T>(this.attribute, node); + } + + public Node<T> add(int currentNum, int num, T attribute) { + if (currentNum == num) { + Node<T> newNode = new DefaultNode(attribute, num, this.next); + return new DefaultNode<T>(this.attribute, this.num + 1, newNode); + } + + Node<T> newNode = next.add(currentNum + 1, num, attribute); + if (newNode == null) + return null; + + return new DefaultNode(this.attribute, newNode); + } + + @Override + public Node<T> delete(int deleteNum) { + if (this.num - 1 == deleteNum) { + return new DefaultNode(this.attribute, deleteNum, this.next.getNext()); + } + + Node<T> newNode = next.delete(deleteNum); + if (newNode == null) + return null; + + return new DefaultNode(this.attribute, this.num - 1, newNode); + } + + @Override + public Node<T> replaceNode(int num, T attribute) { + if (this.num == num) { + return new DefaultNode(attribute, num, this.getNext()); + } + + Node<T> newNode = next.replaceNode(num, attribute); + if (newNode == null) + return null; + + return new DefaultNode(this.attribute, this.num, newNode); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/list/List.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,163 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.list; + +import java.util.Iterator; +import java.util.Stack; + +/** + * Created by e115731 on 15/05/16. + * 非破壊であるためこのListは逆順になっています + */ +public class List<T> implements Iterable<T> { + final private Node<T> head; + final private int listLength; + + public List() { + this.head = new headNode(); + this.listLength = 0; + } + + public List(T... attributes) { + List<T> list = new List(); + for (T attribute : attributes) { + list = list.addLast(attribute); + } + this.head = list.getHead(); + this.listLength = head.getNext().getNum() + 1; + } + + private List(Node<T> head) { + this.head = head; + this.listLength = head.getNext().getNum() + 1; + } + + public Node<T> getHead() { + return head; + } + + public List<T> add(int num, T attribute) { + Node<T> newHead = head.add(0,num, attribute); + if (newHead == null) + return this; + return new List<T>(newHead); + } + + public List<T> addLast(T attribute) { + Node<T> newHead = head.addLast(attribute); + return new List<T>(newHead); + } + + + public T index(int num) { + int count = 0; + Node<T> currentNode = head.getNext(); + while (currentNode != null) { + if (count == num) + return currentNode.getAttribute(); + currentNode = currentNode.getNext(); + count ++; + } + return null; + } + + public Iterator<T> iterator() { + return new Iterator<T>() { + Node<T> currentNode = head.getNext(); + + @Override + public boolean hasNext() { + return currentNode.getNum() != -1; + } + + @Override + public T next() { + T attribute = currentNode.getAttribute(); + currentNode = currentNode.getNext(); + return attribute; + } + }; + } + + public Iterator<T> reverseIterator() { + Node<T> currentNode = head.getNext(); + Stack<T> stack = new Stack(); + while (currentNode.getNum() != -1) { + stack.push(currentNode.getAttribute()); + currentNode = currentNode.getNext(); + } + return new Iterator<T>() { + + @Override + public boolean hasNext() { + return !stack.isEmpty(); + } + + @Override + public T next() { + return stack.pop(); + } + }; + } + + + public List<T> delete(int num) { + Node<T> newNode = head.delete(num); + if (newNode == null) + return this; + Node<T> newHead = new headNode<>(newNode); + return new List<T>(newNode); + } + + public List<T> replace(int num, T attribute) { + Node<T> newHead = head.replaceNode(num, attribute); + if (newHead == null) + return this; + return new List<T>(newHead); + } + + public T last() { + return head.getNext().getAttribute(); + } + + public T head() { + return index(0); + } + + public List<T> deleteLast() { + return delete(listLength - 1); + } + + public List<T> deleteHead() { + return delete(0); + } + + public int length() { + return listLength; + } + + @Override + public String toString() { + String pathString = "<"; + Iterator<T> iterator = reverseIterator(); + while (true) { + pathString += iterator.next(); + if (iterator.hasNext()) + pathString += ","; + else + break; + } + pathString += ">"; + return pathString; + } + + public List<T> append(List<T> list) { + Iterator<T> iterator = list.reverseIterator(); + List<T> newList = this; + while (iterator.hasNext()) { + T attribute = iterator.next(); + newList = newList.addLast(attribute); + } + return newList; + } + + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/list/Node.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,20 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.list; + +/** + * Created by e115731 on 15/05/18. + */ +public interface Node<T> { + public int getNum(); + + public Node<T> getNext(); + + public T getAttribute(); + + public Node<T> add(int currentNum, int num, T attribute); + + public Node<T> addLast(T attribute); + + public Node<T> delete(int num); + + Node<T> replaceNode(int num, T attribute); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/list/TailNode.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,43 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.list; + +/** + * Created by e115731 on 15/05/19. + */ +public class TailNode<T> implements Node<T> { + + @Override + public int getNum() { + return -1; + } + + @Override + public Node<T> getNext() { + return null; + } + + @Override + public T getAttribute() { + return null; + } + + @Override + public Node<T> add(int currentNum, int num, T attribute) { + return null; + } + + @Override + public Node<T> delete(int num) { + return null; + } + + @Override + public Node<T> replaceNode(int num, T attribute) { + return null; + } + + @Override + public Node<T> addLast(T attribute) { + return new DefaultNode<T>(attribute, this); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/list/headNode.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,70 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.list; + +/** + * Created by e115731 on 15/05/18. + */ +public class headNode<T> implements Node<T> { + private final Node next; + + + public headNode() { + this.next = new TailNode<T>(); + } + + public headNode(Node next) { + this.next = next; + } + + public int getNum() { + return -1; + } + + public Node getNext() { + return next; + } + + public T getAttribute() { + return null; + } + + public Node<T> add(int currentNum, int num, T attribute) { + if (num == 0) { + Node<T> newNode = new DefaultNode<>(attribute, next); + return new headNode<T>(newNode); + } + Node<T> newNode = next.add(currentNum + 1, num, attribute); + if (newNode == null) + return this; + return new headNode(newNode); + } + + public Node<T> addLast(T attribute) { + Node<T> node = next.addLast(attribute); + return new headNode<T>(node); + } + + public Node<T> delete(int deleteNum) { + if (getNext().getNum() == deleteNum) { + return new headNode(this.next.getNext()); + } + + Node<T> newNode = next.delete(deleteNum); + if (newNode == null) + return this; + return new headNode(newNode); + } + + @Override + public Node<T> replaceNode(int num, T attribute) { + Node<T> nextNode = getNext(); + if (nextNode.getNum() == num) { + Node<T> newNode = new DefaultNode(attribute, num, nextNode.getNext()); + return new headNode(newNode); + } + + Node<T> newNode = nextNode.replaceNode(num, attribute); + if (newNode == null) + return this; + return new headNode(newNode); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/BlackNode.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,135 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.treemap; + +import org.junit.Test; + + +public class BlackNode<K, V> extends Node<K, V> { + + + public BlackNode(K key, V value, Node<K, V> left, Node<K, V> right) { + super(key, value, left, right); + } + + + @Override + public Node deleteNode() throws RotateParent { + EmptyNode<K, V> emptyNode = new EmptyNode<K, V>(key); + throw new RotateParent(emptyNode); + } + + @Override + @Test + protected int checkDepth(int count, int minCount) { // test method + count++; + minCount = left().checkDepth(count, minCount); + minCount = right().checkDepth(count, minCount); + count--; + return minCount; + } + + + @Override + protected boolean isNotEmpty() { + return true; + } + + @Override + public Node<K, V> createNode(K key, V value, Node<K, V> left, Node<K, V> right) { + return new BlackNode<K, V>(key, value, left, right); + } + + + @Override + Node insBalance() { + Rotate spin = left.checkRotate(Rotate.L); + + if (spin == Rotate.R) { + Node<K, V> leftChild = new BlackNode<K, V>(left.left().getKey(), left.left().getValue(), left.left().left(), left.left().right()); + Node<K, V> rightChild = new BlackNode<K, V>(getKey(), getValue(), left.right(), right); + return new RedNode<K, V>(left.getKey(), left.getValue(), leftChild, rightChild); + + } else if (spin == Rotate.LR) { + Node<K, V> leftChild = new BlackNode<K, V>(left.getKey(), left.getValue(), left.left(), left.right().left()); + Node<K, V> rightChild = new BlackNode<K, V>(getKey(), getValue(), left.right().right(), right); + return new RedNode<K, V>(left.right().getKey(), left.right().getValue(), leftChild, rightChild); + + } + + spin = right.checkRotate(Rotate.R); + if (spin == Rotate.L) { + Node<K, V> leftChild = new BlackNode<K, V>(getKey(), getValue(), left, right.left()); + Node<K, V> rightChild = new BlackNode<K, V>(right.right().getKey(), (V) right.right().getValue(), right.right().left(), right.right().right()); + return new RedNode<K, V>(right.getKey(), right.getValue(), leftChild, rightChild); + + } else if (spin == Rotate.RL) { + Node leftChild = new BlackNode(getKey(), getValue(), left, right.left().left()); + Node rightChild = new BlackNode(right.getKey(), right.getValue(), right.left().right(), right.right()); + return new RedNode(right.left().getKey(), right.left().getValue(), leftChild, rightChild); + + } + + return this; + } + + + @Override + Rotate checkRotate(Rotate side) { + return Rotate.N; + } + + @Override + boolean isRed() { + return false; + } + + + /** + * @param parent + * @return + */ + @Override + public Node replaceNode(Node<K, V> parent) throws RotateParent { + Node<K, V> newNode = null; + if (!this.left().isNotEmpty() && !this.right().isNotEmpty()) { //自身を削除する + return deleteNode();//黒が1つ減るので木のバランスを取る + } else if (this.left().isNotEmpty() && !this.right().isNotEmpty()) { //左の部分木を昇格させる + newNode = createNode(left().getKey(), left().getValue(), left().left(), left().right()); + if (!this.left().isRed()) //昇格させる木のrootが黒だったらバランスを取る + throw new RotateParent(newNode); + return newNode; + } else if (!this.left().isNotEmpty() && this.right().isNotEmpty()) { //右の部分木を昇格させる + newNode = createNode(right().getKey(), right().getValue(), right().left(), right().right()); + if (!this.right().isRed()) //昇格させる木のrootが黒だったらバランスを取る + throw new RotateParent(newNode); + return newNode; + } else {//子ノードが左右にある場合 二回目はここには入らない + //左の部分木の最大の値を持つNodeと自身を置き換える + Node<K, V> cur = this.left(); + while (cur.right().isNotEmpty()) { //左の部分期の最大値を持つNodeを取得する + cur = cur.right(); + } + if (this.left().right().isNotEmpty()) { //左の部分木が右の子を持っているか + try { + Node leftSubTreeNode = this.left().deleteSubTreeMaxNode(null, Rotate.L);//最大値を削除した左の部分木を返す。rootはthisと同じ。 + Node<K, V> newParent = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.right()); //rootをcurと入れ替えることでNodeの削除は完了する + return newParent; + } catch (RotateParent e) { + Node leftSubTreeNode = e.getParent(); + Node<K, V> newParent = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.right()); + return leftSubTreeNode.deleteBalance(newParent); + } + } else { + Node leftSubTreeNode = null; + try { + leftSubTreeNode = this.left().replaceNode(this);//右の子がいなかった場合、左の子を昇格させるだけで良い。 + Node newParent = createNode(this.left().getKey(), this.left().getValue(), leftSubTreeNode, this.right()); + return newParent; + } catch (RotateParent e) { + Node node = e.getParent(); + Node newParent = createNode(this.left().getKey(), this.left().getValue(), leftSubTreeNode, this.right()); + return node.deleteBalance(newParent); + } + } + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/EmptyNode.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,82 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.treemap; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by e115731 on 15/03/25. + */ +public class EmptyNode<K, V> extends Node<K, V> { + + public EmptyNode() { + super(null, null); + } + + public EmptyNode(K key) { //keyは削除時の回転処理に使用する + super(key, null); + } + + @Override // 回転処理時にEmptyNodeの子を見ることがあるのでleft rightでEmptyNodeを返すようにする + public Node<K, V> left() { + return new EmptyNode<>(); + } + + @Override + public Node<K, V> right() { + return new EmptyNode<>(); + } + + + @Override + protected boolean isNotEmpty() { + return false; + } + + + @Override + public Node<K, V> createNode(K key, V value, Node<K, V> left, Node<K, V> right) { + return new RedNode<K, V>(key, value, new EmptyNode<K, V>(), new EmptyNode<K, V>()); + } + + + public Node<K, V> put(K k, V value) { + return new RedNode(k, value, new EmptyNode<K, V>(), new EmptyNode<K, V>()); + } + + @Override + public Node replaceNode(Node<K, V> parent) { // not use method + return this; + } + + @Override + protected Node deleteNode() { //not use method + return this; + } + + @Override + Node insBalance() { + return this; + } + + @Override + Rotate checkRotate(Rotate side) { + return Rotate.N; + } + + @Override + boolean isRed() { + return false; + } + + @Override + @Test + protected int checkDepth(int count,int minCount) { // test method + if (count < minCount | minCount == 0) + minCount = count; + System.out.println("depth = " + count); + + Assert.assertTrue(count <= 2 * minCount); + return minCount; + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/Node.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,295 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.treemap; + +import org.junit.Test; + +import java.util.Optional; + + +/** + * Created by e115731 on 15/03/23. + */ +public abstract class Node<K, V> { + + protected K key; + protected V value; + protected Node<K, V> right; + protected Node<K, V> left; + + public Node(K key, V value) { + this.key = key; + this.value = value; + } + + public Node(K key, V value, Node<K, V> left, Node<K, V> right) { + this.key = key; + this.value = value; + this.right = right; + this.left = left; + } + + public Node<K, V> left() { + return left; + } + + public int compare(Comparable<? super K> compareKey) { + return compareKey.compareTo(getKey()); + + } + + public Optional<V> get(K key) { + Node<K, V> cur = this; + Comparable<? super K> k = (Comparable<? super K>) key; + while (cur.isNotEmpty()) { + int result = cur.compare(k); + if (result > 0) + cur = cur.right(); + else if (result < 0) + cur = cur.left(); + else if (result == 0) + return Optional.ofNullable(cur.getValue()); + } + return Optional.ofNullable(null); + } + + + public Node<K, V> right() { + return right; + } + + public K getKey() { + return key; + } + + public V getValue() { + return value; + } + + + public Node<K, V> put(Comparable<? super K> k, V value) { + if (!isNotEmpty()) { + return createNode((K)k, value, left, right); + } + int result = compare(k); + if (result > 0) { + Node<K, V> node = right.put(k, value); + node = createNode(key, this.value, left, node); + return node.insBalance(); + } else if (result < 0) { + Node node = left.put(k, value); + return createNode(key, this.value, node, right).insBalance(); + } + return createNode(key, value, left, right); // equals + + } + + public Node<K, V> delete(Comparable<? super K> key, Node<K, V> parent, Rotate side) throws RotateParent { + if (this.isNotEmpty()) { + int result = compare(key); + + try { + Node<K, V> node = null; + if (result > 0) { + node = right.delete(key, this, Rotate.R); + if (node == null) + return null; + if (parent == null) + return node; + } else if (result < 0) { + node = left.delete(key, this, Rotate.L); + if (node == null) + return null; + if (parent == null) + return node; + } else if (result == 0) { + node = replaceNode(parent); + if (parent == null)// equals + return node; + if (side == Rotate.R) + return parent.createNode(parent.getKey(), parent.getValue(), parent.left(), node); + else + return parent.createNode(parent.getKey(), parent.getValue(), node, parent.right()); + } + if (side == Rotate.L) + return parent.createNode(parent.getKey(), parent.getValue(), node, parent.right()); + else + return parent.createNode(parent.getKey(), parent.getValue(), parent.left(), node); + } catch (RotateParent e) { + Node node = e.getParent(); + if (parent != null) + return node.deleteBalance(parent); + return node; + } + } + return null; // no key + } + + + public Node<K, V> deleteSubTreeMaxNode(Node<K, V> parent, Rotate side) throws RotateParent { + Node<K, V> node; + try { + if (right().isNotEmpty()) {//最大値のノードが取得できるまで潜る + node = right().deleteSubTreeMaxNode(this, Rotate.R); + } else { + node = this.replaceNode(parent); + } + } catch (RotateParent e) { + node = e.getParent(); + if (parent == null) + throw e; + return node.deleteBalance(parent); + } + if (parent == null) + return node; + if (side == Rotate.R) + return parent.createNode(parent.getKey(), parent.getValue(), parent.left(), node); + else + return parent.createNode(parent.getKey(), parent.getValue(), node, parent.right()); + + } + + public Node deleteBalance(Node<K, V> parent) throws RotateParent { + if (!isRed()) { + if (0 > compare((Comparable<? super K>) parent.getKey())) { //自身がどちらの子かを調べる + boolean rightChild = parent.left().right().isRed(); + boolean leftChild = parent.left().left().isRed(); + + if (!parent.isRed()) { //親が黒 + if (!parent.left().isRed()) { //左の子が黒 + if (!rightChild && !leftChild) + throw new RotateParent(rebuildThree(parent, Rotate.R)); + if (rightChild) + return rebuildfive(parent, Rotate.R); + else if (leftChild) + return rebuildsix(parent, Rotate.R); + } else { //左の子が赤 + return rebuildTwo(parent, Rotate.R); + } + } else { //親が赤 + if (!rightChild && !leftChild) + return rebuildFour(parent, Rotate.R); + if (rightChild) + return rebuildfive(parent, Rotate.R); + else if (leftChild) + return rebuildsix(parent, Rotate.R); + } + } else { + boolean rightChild = parent.right().right().isRed(); + boolean leftChild = parent.right().left().isRed(); + + if (!parent.isRed()) { //親が黒 + if (!parent.right().isRed()) { //左の子が黒 + if (!rightChild && !leftChild) + throw new RotateParent(rebuildThree(parent, Rotate.L)); + if (rightChild) + return rebuildsix(parent, Rotate.L); + else if (leftChild) + return rebuildfive(parent, Rotate.L); + } else { //左の子が赤 + return rebuildTwo(parent, Rotate.L); + } + } else { //親が赤 + if (!rightChild && !leftChild) + return rebuildFour(parent, Rotate.L); + if (rightChild) + return rebuildsix(parent, Rotate.L); + else if (leftChild) + return rebuildfive(parent, Rotate.L); + } + } + } + if (0 > (compare((Comparable<? super K>) parent.getKey()))) + return parent.createNode(parent.getKey(), parent.getValue(), parent.left(), this); + else + return parent.createNode(parent.getKey(), parent.getValue(), this, parent.right()); + } + + protected Node<K, V> rebuildTwo(Node<K, V> parent, Rotate side) throws RotateParent { // case2 + if (side == Rotate.L) { // rotate Left + Node<K, V> node = parent.right(); + Node<K, V> leftSubTreeRoot = node.createNode(parent.getKey(), parent.getValue(), this, node.left()); // check + Node<K, V> leftNode = this.deleteBalance(leftSubTreeRoot); + Node<K, V> rightNode = node.right(); + return parent.createNode(node.getKey(), node.getValue(), leftNode, rightNode); + } else { // rotate Right + Node<K, V> node = parent.left(); + Node<K, V> rightSubTreeRoot = node.createNode(parent.getKey(), parent.getValue(), node.right(), this); + Node<K, V> rightNode = this.deleteBalance(rightSubTreeRoot); + Node<K, V> leftNode = node.left(); + return parent.createNode(node.getKey(), node.getValue(), leftNode, rightNode); + } + } + + protected Node rebuildThree(Node<K, V> parent, Rotate side) { // case3 再帰 + if (side == Rotate.L) { + Node<K, V> rightNode; + if (parent.right().isNotEmpty()) + rightNode = new RedNode<K, V>(parent.right().getKey(), parent.right().getValue(), parent.right().left(), parent.right().right()); // check + else + rightNode = new EmptyNode<>(); + return parent.createNode(parent.getKey(), parent.getValue(), this, rightNode); + } else { + Node<K, V> leftNode; + if (parent.left().isNotEmpty()) + leftNode = new RedNode<K, V>(parent.left().getKey(), parent.left().getValue(), parent.left().left(), parent.left().right()); // check + else + leftNode = new EmptyNode<>(); + return parent.createNode(parent.getKey(), parent.getValue(), leftNode, this); + } + } + + protected Node rebuildFour(Node<K, V> parent, Rotate side) { //case 4 + if (side == Rotate.R) { + Node<K, V> leftNode = new RedNode<K, V>(parent.left().getKey(), parent.left().getValue(), parent.left().left(), parent.left().right()); + return new BlackNode<K, V>(parent.getKey(), parent.getValue(), leftNode, this); + } else { + Node<K, V> rightNode = new RedNode<K, V>(parent.right().getKey(), parent.right().getValue(), parent.right().left(), parent.right().right()); + return new BlackNode<K, V>(parent.getKey(), parent.getValue(), this, rightNode); + } + } + + protected Node rebuildfive(Node<K, V> parent, Rotate side) { //case5 + if (side == Rotate.R) { // rotate Left + Node<K, V> leftChild = new RedNode<K, V>(parent.left().getKey(), parent.left().getValue(), parent.left().left(), parent.left().right().left()); + Node<K, V> rightChild = parent.left().right().right(); + Node<K, V> leftSubTreeRoot = new BlackNode<K, V>(parent.left().right().getKey(), parent.left().right().getValue(), leftChild, rightChild); + Node<K, V> newParent = parent.createNode(parent.getKey(), parent.getValue(), leftSubTreeRoot, this); + return this.rebuildsix(newParent, Rotate.R); + } else { // rotate Right 修正済み + Node<K, V> leftChild = parent.right().left().left(); + Node<K, V> rightChild = new RedNode<K, V>(parent.right().getKey(), parent.right().getValue(), parent.right().left().right(), parent.right().right()); + Node<K, V> rightSubTreeRoot = new BlackNode<K, V>(parent.right().left().getKey(), parent.right().left().getValue(), leftChild, rightChild); + Node<K, V> newParent = parent.createNode(parent.getKey(), parent.getValue(), this, rightSubTreeRoot); + return this.rebuildsix(newParent, Rotate.L); + } + } + + protected Node rebuildsix(Node<K, V> parent, Rotate side) { //case6 + if (side == Rotate.L) { // rotate Left + Node<K, V> leftChild = parent.right().createNode(parent.getKey(), parent.getValue(), this, parent.right().left()); //check + Node<K, V> rightChild = new BlackNode<K, V>(parent.right().right().getKey(), parent.right().right().getValue(), parent.right().right().left(), parent.right().right().right()); + return parent.createNode(parent.right().getKey(), parent.right().getValue(), leftChild, rightChild); + } else { // rotate Right + Node<K, V> leftChild = new BlackNode<K, V>(parent.left().left().getKey(), parent.left().left().getValue(), parent.left().left().left(), parent.left().left().right()); + Node<K, V> rightChild = parent.left().createNode(parent.getKey(), parent.getValue(), parent.left().right(), this); + return parent.createNode(parent.left().getKey(), parent.left().getValue(), leftChild, rightChild); + } + } + + + protected abstract boolean isNotEmpty(); + + public abstract Node<K, V> createNode(K key, V value, Node<K, V> left, Node<K, V> right); + + abstract Node<K, V> insBalance(); + + abstract Rotate checkRotate(Rotate side); + + abstract boolean isRed(); + + public abstract Node replaceNode(Node<K, V> parent) throws RotateParent; + + protected abstract Node deleteNode() throws RotateParent; + + @Test + protected abstract int checkDepth (int count , int minCount); // test method +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/RedNode.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,113 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.treemap; + +import org.junit.Test; + +/** + * Created by e115731 on 15/03/25. + */ +public class RedNode<K, V> extends Node<K, V> { + + + public RedNode(K key, V value, Node<K, V> left, Node<K, V> right) { + super(key, value, left, right); + } + + + @Override + protected boolean isNotEmpty() { + return true; + } + + @Override + public Node<K, V> createNode(K key, V value, Node<K, V> left, Node<K, V> right) { + return new RedNode<K, V>(key, value, left, right); + } + + @Override + protected Node<K, V> insBalance() { + return this; + } + + @Override + protected Node deleteNode() throws RotateParent { + EmptyNode emptyNode = new EmptyNode(this.getKey()); + return emptyNode; + } + + @Override + Rotate checkRotate(Rotate side) { + if (side == Rotate.L) { + if (left.isRed()) + return Rotate.R; + else if (right.isRed()) + return Rotate.LR; + return Rotate.N; + } else { + if (left.isRed()) + return Rotate.RL; + else if (right.isRed()) + return Rotate.L; + return Rotate.N; + } + } + + @Override + boolean isRed() { + return true; + } + + @Override + public Node replaceNode(Node<K, V> parent) throws RotateParent { + Node<K, V> newNode = null; + if (!this.left().isNotEmpty() && !this.right().isNotEmpty()) { //自身を削除する + return deleteNode(); + } else if (this.left().isNotEmpty() && !this.right().isNotEmpty()) { //左の部分木を昇格させる + newNode = left().createNode(left().getKey(), left().getValue(), left().left(), left().right()); + return newNode; + } else if (!this.left().isNotEmpty() && this.right().isNotEmpty()) { //右の部分木を昇格させる + newNode = right().createNode(right().getKey(), right().getValue(), right().left(), right().right()); + return newNode; + } else {//子ノードが左右にある場合 + //左の部分木の最大の値を持つNodeと自身を置き換える + Node<K, V> cur = this.left(); + + while (cur.right().isNotEmpty()) { + cur = cur.right(); + } + Node leftSubTreeNode = null; + if (this.left().right().isNotEmpty()) { + try { + leftSubTreeNode = this.left().deleteSubTreeMaxNode(null,Rotate.L); + newNode = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.right()); + return newNode; + } catch (RotateParent e) { + leftSubTreeNode = e.getParent(); + Node<K, V> newParent = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.right()); + return leftSubTreeNode.deleteBalance(newParent); + } + } else { + try { + leftSubTreeNode = this.left().replaceNode(this); + newNode = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.right()); + return newNode; + } catch (RotateParent e) { + Node node = e.getParent(); + Node newParent = createNode(this.left().getKey(), this.left().getValue(), leftSubTreeNode, this.right()); + return node.deleteBalance(newParent); + } + } + + } + } + + + @Override + @Test + protected int checkDepth(int count,int minCount) { // test method + count ++; + minCount = left().checkDepth(count, minCount); + minCount = right().checkDepth(count, minCount); + count --; + return minCount; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/Rotate.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,8 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.treemap; + +/** + * Created by e115731 on 15/03/23. + */ +public enum Rotate { + R, L, RL, LR, N; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/RotateParent.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,15 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.treemap; + +/** + * Created by e115731 on 15/04/17. + */ +public class RotateParent extends Exception { + Node parent ; + public RotateParent(Node node) { + this.parent = node; + } + + public Node getParent(){ + return parent; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/TreeMap.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,114 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.treemap; + + +import org.junit.Test; + +import java.util.Iterator; +import java.util.Optional; +import java.util.Stack; + + +/** + * Created by e115731 on 15/03/23. + */ +public class TreeMap<K, V> { + final Node<K, V> root; + final int size; + + public TreeMap() { + this.root = new EmptyNode(); + this.size = 0; + } + + + public Node getRoot() { + return root; + } + + public TreeMap(Node<K, V> root, int size) { + this.root = root; + this.size = size; + } + + public Optional<V> get(final K key) { + return root.get(key); + } + + public TreeMap put(K key, V value) { + + if (key == null || value == null) // null check + throw new NullPointerException(); + + if (isEmpty()) { + Node<K, V> newRoot = new BlackNode(key, value, new EmptyNode(), new EmptyNode()); + return new TreeMap<K, V>(newRoot, size + 1); + } + + Node<K, V> newEntry = root.put((Comparable<? super K>) key, value); + Node<K, V> newRoot = new BlackNode(newEntry.getKey(), newEntry.getValue(), newEntry.left(), newEntry.right()); + return new TreeMap(newRoot, 0); + } + + + public boolean isEmpty() { + return !root.isNotEmpty(); + } + + + public TreeMap<K, V> delete(K key) { + Node node = null; + try { + node = root.delete((Comparable<? super K>) key, null, Rotate.N); + } catch (RotateParent rotateParent) { + } + if (node == null) + return this; // not key + if (!node.isNotEmpty()) + return new TreeMap(new EmptyNode<>(), 0); + Node newRoot = new BlackNode(node.getKey(), node.getValue(), node.left(), node.right()); + return new TreeMap(newRoot, 0); + } + + public Iterator<K> keys() { + return new Iterator<K>() { + Stack<Node> nodeStack = new Stack(); + Node currentNode = root; + + @Override + public boolean hasNext() { + return currentNode != null; + } + + @Override + public K next() { + K key = (K) currentNode.getKey(); + + if (currentNode.left().isNotEmpty()) { + nodeStack.push(currentNode); + currentNode = currentNode.left(); + return key; + } else if (currentNode.right().isNotEmpty()) { + currentNode = currentNode.right(); + return key; + } else if (nodeStack.isEmpty()) { + currentNode = null; + return key; + } + + do { + currentNode = nodeStack.pop().right(); + if (currentNode.isNotEmpty()) + return key; + + } while (!nodeStack.isEmpty()); + return key; + } + }; + } + + @Test + public void checkDepth() { + root.checkDepth(0, 0); + System.out.println("-----------------------------------"); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/error/BasicErrors.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,10 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.error; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultError; + +public class BasicErrors +{ + public static final jp.ac.u_ryukyu.ie.cr.jungle.util.Error NULL_VALUE_NOT_ALLOWED = new DefaultError(); + public static final Error INDEX_OUT_OF_BOUNDS = new DefaultError(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/ChangeList.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,9 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.persistent; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation; + +public interface ChangeList extends Iterable<TreeOperation> +{ + public String uuid(); + public String getTreeName(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/ChangeListReader.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,8 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.persistent; + +public interface ChangeListReader extends Iterable<ChangeList> +{ + public ChangeListReader newReader(); + public ChangeList read(); + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/ChangeListWriter.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,6 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.persistent; + +public interface ChangeListWriter +{ + public Result write(ChangeList operations); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultChangeListReader.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,49 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.persistent; + +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.util.Iterator; +import java.util.LinkedList; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation; + +// not thread safe +public class DefaultChangeListReader implements ChangeListReader +{ + private long pos; + private ByteBuffer buf; + private FileChannel ch; + + DefaultChangeListReader(FileChannel ch,ByteBuffer buf,long pos) + { + this.pos = pos; + this.buf = buf; + this.ch = ch; + } + + @Override + public ChangeListReader newReader() + { + return new DefaultChangeListReader(ch,buf.asReadOnlyBuffer(),pos); + } + + @Override + public ChangeList read() + { + LinkedList<TreeOperation> list = new LinkedList<TreeOperation>(); + + int size = buf.getInt(); + if(size == 0){ + + } + + return null; + } + + @Override + public Iterator<ChangeList> iterator() { + return null; + } + + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultChangeListWriter.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,29 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.persistent; + +import java.nio.ByteBuffer; + + +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation; + +public class DefaultChangeListWriter implements ChangeListWriter +{ + public DefaultChangeListWriter(ByteBuffer buf) + { + + } + + @Override + public synchronized Result write(ChangeList operations) + { + for(TreeOperation op : operations){ + ByteBuffer treeOpBuf = serializeTreeOperation(op); + } + return null; + } + + private ByteBuffer serializeTreeOperation(TreeOperation op) + { + + return null; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultJournal.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,114 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.persistent; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.nio.MappedByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.channels.FileChannel.MapMode; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +/* + * text based journal. + * + * non terminal symbols + * + * JOURNAL => CHANGELISTS + * CHANGE_LISTS => CHANGE_LIST | CHANGE_LISTS + * CHANGE_LISTS => *EMPTY* + * + * CHANGE_LIST => OPERATIONS + * OPERATIONS => OPERATION CR | OPERATIONS + * OPERATIONS => *EMPTY* + + * OPERATION => APPEND_CHILD | DELETE_CHILD | PUT_ATTRIBUTE | DELETE_ATTRIBUTE | COMMIT + * APPEND_CHILD => APPEND_CHILD_ID NODE_PATH INSERT_POSITION + * DELETE_CHILD => DELETE_CHILD_ID NODE_PATH DELETE_POSITION + * PUT_ATTRIBUTE => PUT_ATTRIBUTE_ID NODE_PATH KEY VALUE + * DELETE_ATTRIBUTE => DELTE_ATTRIBUTE_ID NODE_PATH KEY + * COMMIT => COMMIT_ID + * + * NODE_PATH => POSITION "." NODE_PATH | POSITION + * + * terminal symbols + * + * APPEND_CHILD_ID = "APPEND_CHILD" + * DELETE_CHILD_ID = "DELETE_CHILD" + * PUT_ATTRIBUTE_ID = "PUT_ATTRIBUTE" + * SET_ATTRIBUTE_ID = "SET_ATTRIBUTE" + * COMMIT_ID => "COMMIT" + * CR => \n + * INSERT_POSITION => INTEGER + * DELETE_POSITION => INTEGER + * KEY => "*" + * VALUE => "*" + * + */ + +public class DefaultJournal implements Journal +{ + private final ChangeListWriter writer; + + public static void main(String args[]) throws Exception + { + RandomAccessFile f = new RandomAccessFile("./miscs/1.dat","rw"); + MappedByteBuffer a = f.getChannel().map(MapMode.READ_WRITE,10,10); + MappedByteBuffer b = f.getChannel().map(MapMode.READ_WRITE,10,10); + MappedByteBuffer c = f.getChannel().map(MapMode.READ_WRITE,20,10); + + a.putInt(5); + System.out.println(b.getInt()); + c.putInt(2); + a.force(); + b.force(); + c.force(); + + System.out.println(b.capacity()); + MappedByteBuffer d = f.getChannel().map(MapMode.READ_WRITE,50,10); + d.putInt(2); + d.force(); + System.out.println(d.getInt()); + } + + public static final int READ_BUFFER_SIZE = 1000000; // 1MB + public static final int WRITE_BUFFER_SIZE = 1000000; // 1MB + + private DefaultJournal() + { + writer = null; + } + + public static Either<Error,DefaultJournal> newInstance(String fileName) + { + RandomAccessFile journal = null; + try{ + journal = new RandomAccessFile(fileName,"rw"); + FileChannel ch = journal.getChannel(); + long length = journal.length(); + ByteBuffer readBuf = ch.map(MapMode.READ_ONLY,0,READ_BUFFER_SIZE); + ByteBuffer writeBuf = ch.map(MapMode.READ_WRITE,length,WRITE_BUFFER_SIZE); + + }catch(FileNotFoundException _e){ + _e.printStackTrace(); + return null; // should return Error here. + }catch(IOException _e){ + _e.printStackTrace(); + } + return null; + } + + @Override + public ChangeListReader getReader() + { + return null; + } + + @Override + public ChangeListWriter getWriter() + { + return writer; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultJournalWriter.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,31 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.persistent; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; + +public class DefaultJournalWriter +{ + public DefaultJournalWriter(String _fileName) + { + + } + + public static Either<Error,DefaultJournalWriter> newInstance(String fileName) + { + RandomAccessFile journal = null; + try{ + journal = new RandomAccessFile(fileName,"rw"); + //FileChannel ch = journal.getChannel(); + long length = journal.length(); + }catch(FileNotFoundException e){ + + }catch(IOException e){ + + } + + return null; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/Journal.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,7 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.persistent; + +public interface Journal +{ + public ChangeListReader getReader(); + public ChangeListWriter getWriter(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/NullJournal.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,82 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.persistent; + + +import java.util.Iterator; + + + +public class NullJournal implements Journal +{ + private static final NullChangeListWriter NULL_WRITER = new NullChangeListWriter(); + private static final NullChangeListReader NULL_READER = new NullChangeListReader(); + + @Override + public ChangeListReader getReader() + { + return NULL_READER; + } + + @Override + public ChangeListWriter getWriter() + { + return NULL_WRITER; + } + + private static class NullChangeListWriter implements ChangeListWriter + { + @Override + public Result write(ChangeList operations) + { + /* + for(TreeOperation op : _operations){ + NodePath p = op.getNodePath(); + NodeOperation nodeOp = op.getNodeOperation(); + Command c = nodeOp.getCommand(); + String args = ""; + switch(c){ + case PUT_ATTRIBUTE: + String key = nodeOp.getKey(); + ByteBuffer value = nodeOp.getValue(); + if(value.limit() < 100){ + args = String.format("key:%s,value:%s",key,new String(value.array())); + }else{ + args = String.format("key:%s,value:%d",key,value.limit()); + } + break; + case DELETE_ATTRIBUTE: + args = String.format("key:%s",nodeOp.getKey()); + break; + case APPEND_CHILD: + args = String.format("pos:%d",nodeOp.getPosition()); + break; + case DELETE_CHILD: + args = String.format("pos:%d",nodeOp.getPosition()); + break; + } + System.out.println(String.format("[%s:%s:%s]",c,p,args)); + } + */ + return Result.SUCCESS; + } + } + + private static class NullChangeListReader implements ChangeListReader + { + @Override + public ChangeListReader newReader() + { + return this; + } + + @Override + public ChangeList read() + { + return null; + } + + @Override + public Iterator<ChangeList> iterator() { + return null; + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/Result.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,6 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.persistent; + +public class Result +{ + public static Result SUCCESS = new Result(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/query/PathNodeIterator.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,80 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.query; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeChildren; + +import java.util.Iterator; +import java.util.Stack; + +public class PathNodeIterator implements Iterator<TreeNode> { + + TreeNode root; + TreeNode node; + int childNumber; + private TreeNodeChildren children; + private Stack<TreeNode> nodeStack = new Stack<TreeNode>(); + private Stack<Integer> searchStack = new Stack<Integer>(); + + /* + * get queryIndexCondition from query + * if already index exists, use index + * otherwise traverse tree and create index + * + * */ + public PathNodeIterator(TreeNode root) { + this.root = root; + this.node = root; + } + + @Override + public boolean hasNext() { + return node != null; + } + + @Override + public TreeNode next() { + TreeNode now = node; + if (node.getChildren().size() > 0) { + nodeStack.push(node); + children = node.getChildren(); + node = children.at(0).b(); + childNumber = 1; + searchStack.push(childNumber); + } else if (node == root) { + node = null; // no more node + children = null; + return now; + }else if (children != null && children.size() > childNumber) { + childNumber = searchStack.pop(); + node = children.at(childNumber).b(); + searchStack.push(++childNumber); + } else { + node = nodeStack.pop(); + children = node.getChildren(); + childNumber = searchStack.pop(); + for (; children.size() == childNumber;) { + if (node == root) { + node = null; // no more node + children = null; + return now; + } + node = nodeStack.pop(); + children = node.getChildren(); + childNumber = searchStack.pop(); + } + if (node != null && childNumber < children.size()) { + nodeStack.push(node); + node = children.at(childNumber).b(); + searchStack.push(++childNumber); + } + } + return now; + } + + @Override + public void remove() { + // TODO Auto-generated method stub + + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/query/Query.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,7 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.query; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; + +public interface Query { + boolean condition(TreeNode _node); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/Command.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,10 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store; + +public enum Command +{ + APPEND_CHILD, + DELETE_CHILD, + PUT_ATTRIBUTE, + DELETE_ATTRIBUTE, + REPLACE_ROOT; +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/Constants.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,7 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store; + +public class Constants +{ + public static final String DEFAULT_OWNER = "default"; + public static final long DEFAULT_REVISION_START_NUMBER = 0; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/NodePath.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,12 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Pair; + +public interface NodePath extends Iterable<Integer> +{ + public NodePath add(int pos); + public Pair<Integer,NodePath> pop(); + public NodePath tail(); + public int size(); + public Pair<Integer,NodePath> last(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/NulIterator.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,19 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store; + +import java.util.Iterator; + +public class NulIterator<T> implements Iterator<T> { + + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + return false; + } + + @Override + public T next() { + // TODO Auto-generated method stub + return null; + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/Transaction.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,9 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public interface Transaction<T> +{ + public Either<Error,T> success(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/TreeContext.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,32 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store; + + +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeList; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.store.index.ParentIndex; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +public interface TreeContext { + public TreeNode getRoot(); + + public TreeContext prev(); + + public ChangeList getChangeList(); + + public String uuid(); + + public String getTreeName(); + + public long revision(); + + public TreeMap<String, TreeMap<String, List<TreeNode>>> getIndex(); + + public Iterable<TreeOperation> getOperations(); + + public ParentIndex getParentIndex(); + + public InterfaceTraverser getTraverser(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/TreeEditor.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,12 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public interface TreeEditor +{ + public Either<Error,LoggingNode> edit(TreeNode root,NodePath path,NodeEditor transformer); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/TreeEditorError.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,9 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultError; + +public class TreeEditorError +{ + public static final Error NODEPATH_NOTFOUND = new DefaultError(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/DefaultNodePath.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,83 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl; + + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Pair; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; + +import java.util.Iterator; + +public class DefaultNodePath implements NodePath { + private final List<Integer> path; + + public static void main(String args[]) { + DefaultNodePath p = new DefaultNodePath(); + p = p.add(1).add(2).add(3).add(4); + System.out.println(p.toString()); + } + + public DefaultNodePath() { + path = new List<Integer>().addLast(-1); + } + + private DefaultNodePath(List<Integer> path) { + this.path = path; + } + + @Override + public Iterator<Integer> iterator() { + return path.iterator(); + } + + @Override + public DefaultNodePath add(int pos) { + List<Integer> newPath = path.addLast(pos); + return new DefaultNodePath(newPath); + } + + @Override + public Pair<Integer, NodePath> pop() { + Integer head = path.head(); + List<Integer> tail = path.deleteHead(); + + return new Pair<Integer, NodePath>(head, new DefaultNodePath(tail)); + } + + @Override + public Pair<Integer, NodePath> last() { + Integer last = path.head(); + List<Integer> list = path.deleteHead(); + return new Pair<Integer, NodePath>(last, new DefaultNodePath(list)); + } + + @Override + public String toString() { + return path.toString(); + } + + @Override + public int size() { + return path.length(); + } + + + //PATHの一番後ろを取り除いたPATHを新しく作って返す +// EXAMPLE <0,0,3> → <0,0> + @Override + public NodePath tail() { + List<Integer> tail = path.deleteLast(); + return new DefaultNodePath(tail); + } + + public List<DefaultNodePath> inits() { + List<DefaultNodePath> paths = new List(); + List<Integer> coursePath = new List(); + Iterator<Integer> iterator = path.reverseIterator(); + while (iterator.hasNext()) { + List<Integer> tmp = coursePath.addLast(iterator.next()); + paths = paths.add(1,new DefaultNodePath(tmp)); + coursePath = tmp; + } + return paths; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/DefaultTreeEditor.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,84 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl; + + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultEvaluator; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Direction; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Traversal; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Traverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; + +public class DefaultTreeEditor implements TreeEditor +{ + private final Traverser traverser; + public DefaultTreeEditor(Traverser traverser) + { + this.traverser = traverser; + } + + @Override + public Either<Error,LoggingNode> edit(TreeNode root,NodePath path,NodeEditor editor) + { + DefaultEvaluator e = new DefaultEvaluator(path); + Either<jp.ac.u_ryukyu.ie.cr.jungle.util.Error, Traversal> either = traverser.traverse(root,e); + + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + Traversal t = either.b(); + Either<Error,LoggingNode> ret = clone(t,editor); + + return ret; + } + + private Either<Error,LoggingNode> clone(Traversal t,NodeEditor editor) + { + // copying nodes from bottom to root + + List<Direction<TreeNode>> path = new List(); + for(Direction<TreeNode> direction : t){ + path = path.addLast(direction); + } + + // target + Direction<TreeNode> targetDirection = path.last(); + TreeNode target = targetDirection.getTarget(); + Either<Error,LoggingNode> either = editor.edit(target); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + LoggingNode newWrap = either.b(); + + // top + int pos = targetDirection.getPosition(); + TreeNode child = newWrap.getWrap(); + + + for(Direction<TreeNode> parentDirection : path.deleteLast()){ + + TreeNodeChildren chs = parentDirection.getTarget().getChildren(); + + Either<Error,TreeNode> ret = chs.replaceNode(pos,child); + if(ret.isA()){ + return DefaultEither.newA(ret.a()); + } + + TreeNode newParent = ret.b(); + child = newParent; + pos = parentDirection.getPosition(); + } + + TreeNode newRoot = child; + LoggingNode logNode = editor.wrap(newRoot,newWrap.getOperationLog()); + return DefaultEither.newB(logNode); + } + +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/IndexTreeEditor.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,89 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl; + + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultEvaluator; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Direction; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Traversal; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Traverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; + +public class IndexTreeEditor { + + private final Traverser traverser; + + + public IndexTreeEditor(Traverser traverser) + { + this.traverser = traverser; + } + + + public Either<Error,LoggingNode> edit(TreeNode root,NodePath path,NodeEditor editor) + { + DefaultEvaluator e = new DefaultEvaluator(path); + Either<jp.ac.u_ryukyu.ie.cr.jungle.util.Error, Traversal> either = traverser.traverse(root,e); + + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + Traversal t = either.b(); + Either<Error,LoggingNode> ret = clone(t,editor); + + return ret; + } + + private Either<Error,LoggingNode> clone(Traversal t,NodeEditor editor) + { + // copying nodes from bottom to root + List<Direction<TreeNode>> path = new List(); + for (Direction<TreeNode> direction : t) { + path = path.addLast(direction); + } + + // target + Direction<TreeNode> targetDirection = path.head(); + TreeNode target = targetDirection.getTarget(); + + Either<Error, LoggingNode> either = editor.edit(target); + if (either.isA()) { + return DefaultEither.newA(either.a()); + } + + LoggingNode newWrap = either.b(); + + // top + int pos = targetDirection.getPosition(); + TreeNode child = newWrap.getWrap(); + + for (Direction<TreeNode> parentDirection : path.deleteLast()) { + TreeNode updateTargetNode = parentDirection.getTarget(); + TreeNodeChildren chs = updateTargetNode.getChildren(); + + + + Either<Error, TreeNode> ret = chs.replaceNode(pos, child); + if (ret.isA()) { + return DefaultEither.newA(ret.a()); + } + + TreeNode newParent = ret.b(); + + child = newParent; + pos = parentDirection.getPosition(); + } + + TreeNode newRoot = child; + LoggingNode logNode = editor.wrap(newRoot, newWrap.getOperationLog()); + + + return DefaultEither.newB(logNode); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/TreeNode.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,17 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + + +public interface TreeNode extends Comparable<TreeNode> { + public TreeNodeChildren getChildren(); + + public TreeNodeAttributes getAttributes(); + + public TreeNode createNewNode(); + + public Either<Error, TreeNode> appendRootNode(); + + public String getNodeId(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/TreeNodeAttributes.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,17 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl; + +import jp.ac.u_ryukyu.ie.cr.jungle.core.Attributes; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.nio.ByteBuffer; +import java.util.Iterator; + +public interface TreeNodeAttributes extends Attributes +{ + public Either<Error,TreeNode> delete(String key); + public Either<jp.ac.u_ryukyu.ie.cr.jungle.util.Error,TreeNode> put(String key,ByteBuffer value); + public TreeMap<String,ByteBuffer> getAttributesAsRawMap(); + public Iterator<String> getKeys(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/TreeNodeChildren.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,15 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl; + +import jp.ac.u_ryukyu.ie.cr.jungle.core.Children; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; + +public interface TreeNodeChildren extends Children +{ + public Either<Error,TreeNode> addNewChildAt(int pos); + public Either<jp.ac.u_ryukyu.ie.cr.jungle.util.Error,TreeNode> deleteChildAt(int pos); + public Either<Error,TreeNode> addNewChildAt(int pos,TreeNode newChild); + public Either<Error,TreeNode> replaceNode(int pos,TreeNode replacement); + public List<TreeNode> getChildrenAsRawList(); +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/DefaultOperationLog.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,43 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger; + + +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; + +import java.util.Iterator; + +public class DefaultOperationLog implements OperationLog +{ + private final List<NodeOperation> log; + + private static final List<NodeOperation> EMPTY =new List<>(); + + public DefaultOperationLog() + { + this(EMPTY); + } + + private DefaultOperationLog(List<NodeOperation> _log) + { + log = _log; + } + + @Override + public Iterator<NodeOperation> iterator() + { + return log.iterator(); + } + + + @Override + public DefaultOperationLog add(NodeOperation _op) + { + return new DefaultOperationLog(log.addLast(_op)); + } + + @Override + public int length() + { + return log.length(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/DefaultTreeOperationLog.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,60 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger; + +import com.google.common.collect.Iterables; +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.DefaultTreeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; + +import java.util.Iterator; + +public class DefaultTreeOperationLog implements TreeOperationLog +{ + private final Iterable<TreeOperation> list; + private final int size; + + public DefaultTreeOperationLog() + { + list = new List<>(); + size = 0; + } + + public DefaultTreeOperationLog(Iterable<TreeOperation> _list,int _size) + { + list = _list; + size = _size; + } + + @Override + public Iterator<TreeOperation> iterator() + { + return list.iterator(); + } + + @Override + public TreeOperationLog add(NodePath _p, NodeOperation _op) + { + TreeOperation op = new DefaultTreeOperation(_p,_op); + List<TreeOperation> newList = new List(op); + Iterable<TreeOperation> concat = Iterables.concat(list,newList); + + return new DefaultTreeOperationLog(concat,size + 1); + } + + @Override + public TreeOperationLog append(TreeOperationLog _log) + { + int argumentLogSize = _log.length(); + Iterable<TreeOperation> concat = Iterables.concat(list,_log); + + return new DefaultTreeOperationLog(concat,argumentLogSize + size); + } + + @Override + public int length() + { + return size; + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/LoggingAttributes.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,57 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.DeleteAttributeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.PutAttributeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeAttributes; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; + +public class LoggingAttributes //implements EditableAttributes +{ + private final TreeNode wrap; + private final OperationLog log; + + public LoggingAttributes(TreeNode _wrap,OperationLog _log) + { + wrap = _wrap; + log = _log; + } + + public ByteBuffer get(String _key) + { + TreeNodeAttributes attributes = wrap.getAttributes(); + return attributes.get(_key); + } + + private Either<Error,LoggingNode> edit(NodeOperation _op) + { + Either<jp.ac.u_ryukyu.ie.cr.jungle.util.Error,TreeNode> either = _op.invoke(wrap); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + TreeNode newNode = either.b(); + OperationLog newLog = log.add(_op); + LoggingNode newLogNode = new LoggingNode(newNode,newLog); + + return DefaultEither.newB(newLogNode); + } + + public Either<Error,LoggingNode> delete(final String _key) + { + + DeleteAttributeOperation deleteAttribute = new DeleteAttributeOperation(_key); + return edit(deleteAttribute); + } + + public Either<Error,LoggingNode> put(final String _key,final ByteBuffer _value) + { + PutAttributeOperation putAttribute = new PutAttributeOperation(_key,_value); + return edit(putAttribute); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/LoggingChildren.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,67 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger; + + +import jp.ac.u_ryukyu.ie.cr.jungle.core.Children; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.AppendChildAtOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.DeleteChildAtOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; + +public class LoggingChildren +{ + private final TreeNode wrap; + private final OperationLog log; + + public LoggingChildren(TreeNode _wrap,OperationLog _log) + { + wrap = _wrap; + log = _log; + } + + public int size() + { + Children children = wrap.getChildren(); + return children.size(); + } + + public Either<Error,LoggingNode> edit(NodeOperation _op) + { + Either<jp.ac.u_ryukyu.ie.cr.jungle.util.Error,TreeNode> either = _op.invoke(wrap); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + TreeNode newWrap = either.b(); + OperationLog newLog = log.add(_op); + LoggingNode newLoggingNode = new LoggingNode(newWrap,newLog); + return DefaultEither.newB(newLoggingNode); + } + + public Either<Error,LoggingNode> addNewChildAt(final int _pos) + { + NodeOperation addNewChildAt = new AppendChildAtOperation(_pos); + return edit(addNewChildAt); + } + + public Either<Error,LoggingNode> deleteChildAt(final int _pos) + { + NodeOperation deleteChildAt = new DeleteChildAtOperation(_pos); + return edit(deleteChildAt); + } + + public Either<Error,LoggingNode> at(int _pos) + { + Children children = wrap.getChildren(); + Either<Error,TreeNode> either = children.at(_pos); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + TreeNode node = either.b(); + LoggingNode logNode = new LoggingNode(node); + return DefaultEither.newB(logNode); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/LoggingNode.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,66 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.ReplaceRootNodeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; + + +public class LoggingNode +{ + + private final TreeNode wrap; + private final OperationLog log; + + public LoggingNode(TreeNode _wrap) + { + this(_wrap,new DefaultOperationLog()); + } + + public LoggingNode(TreeNode _wrap,OperationLog _log) + { + wrap = _wrap; + log = _log; + } + + public LoggingAttributes getAttributes() + { + return new LoggingAttributes(wrap,log); + } + + public LoggingChildren getChildren() + { + return new LoggingChildren(wrap,log); + } + + + public OperationLog getOperationLog() + { + return log; + } + + + public Either<Error, LoggingNode> replaceNewRootNode() { + NodeOperation replaceRootNode = new ReplaceRootNodeOperation(); + return edit(replaceRootNode); + } + + public Either<jp.ac.u_ryukyu.ie.cr.jungle.util.Error, LoggingNode> edit(NodeOperation op){ + Either<Error,TreeNode> either = op.invoke(wrap); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + TreeNode newWrap = either.b(); + OperationLog newLog = log.add(op); + LoggingNode newLoggingNode = new LoggingNode(newWrap,newLog); + return DefaultEither.newB(newLoggingNode); + } + + public TreeNode getWrap() + { + return wrap; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/OperationLog.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,10 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.NodeOperation; + + +public interface OperationLog extends Iterable<NodeOperation> +{ + public OperationLog add(NodeOperation _op); + public int length(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/TreeOperationLog.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,12 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation; + +public interface TreeOperationLog extends Iterable<TreeOperation> +{ + public TreeOperationLog add(NodePath _p,NodeOperation _op); + public TreeOperationLog append(TreeOperationLog _log); + public int length(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/index/IndexCreater.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,119 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.index; + + +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeChildren; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.util.Iterator; +import java.util.Optional; +import java.util.Stack; + +public class IndexCreater { + + TreeNode root; + TreeNode node; + int childNumber; + private TreeNodeChildren children; + private Stack<TreeNode> nodeStack = new Stack<TreeNode>(); + private Stack<Integer> searchStack = new Stack<Integer>(); + ParentIndex parentIndex = new ParentIndex(); + TreeMap<String, TreeMap<String, List<TreeNode>>> indexList = new TreeMap(); + + public IndexCreater(TreeNode rootNode) { + this.root = rootNode; + this.node = rootNode; + while (node != null) { + TreeNode targetNode = node; + Iterator<String> keys = targetNode.getAttributes().getKeys(); + for (;keys.hasNext();) { + String key = keys.next(); + String value = targetNode.getAttributes().getString(key); + if (value != null) + indexList = set(key, value, targetNode); + } + if (node.getChildren().size() > 0) { + nodeStack.push(node); + TreeNode parent = node; + children = node.getChildren(); + node = children.at(0).b(); + parentIndex.set(parent, node); + childNumber = 1; + searchStack.push(childNumber); + } else if (node == root) { + node = null; // no more node + children = null; + return; + } else if (children != null && children.size() > childNumber) { + childNumber = searchStack.pop(); + TreeNode parent = nodeStack.pop(); + nodeStack.push(parent); + node = children.at(childNumber).b(); + parentIndex.set(parent, node); + searchStack.push(++childNumber); + } else { + node = nodeStack.pop(); + children = node.getChildren(); + childNumber = searchStack.pop(); + for (; children.size() == childNumber; ) { + if (node == root) { + node = null; // no more node + children = null; + return; + } + node = nodeStack.pop(); + children = node.getChildren(); + childNumber = searchStack.pop(); + } + if (node != null && childNumber < children.size()) { + nodeStack.push(node); + TreeNode parent = node; + node = children.at(childNumber).b(); + parentIndex.set(parent, node); + searchStack.push(++childNumber); + } + } + } + } + + public TreeMap<String, TreeMap<String, List<TreeNode>>> set(String key, String value, TreeNode node) { + if (key == null ) + System.out.println(""); + Optional<TreeMap<String, List<TreeNode>>> indexOp = indexList.get(key); + if (!indexOp.isPresent()) { + TreeMap<String, List<TreeNode>> index = new TreeMap(); + List<TreeNode> nodeList = new List(); + nodeList = nodeList.addLast(node); + TreeMap<String, List<TreeNode>> newIndex = index.put(value, nodeList); + indexList = indexList.put(key, newIndex); + return indexList; + } + + TreeMap<String, List<TreeNode>> index = indexOp.get(); + Optional<List<TreeNode>> nodeListOp = index.get(value); + + List<TreeNode> newNodeList; + + if (nodeListOp.isPresent()) { + newNodeList = nodeListOp.get().addLast(node); + + } else { + List<TreeNode> nodeList = new List(); + newNodeList = nodeList.addLast(node); + + } + TreeMap<String, List<TreeNode>> newIndex = index.put(value, newNodeList); + indexList = indexList.put(key, newIndex); + + return indexList; + } + + public TreeMap<String, TreeMap<String, List<TreeNode>>> getIndex() { + return indexList; + } + + public ParentIndex getParentIndex() { + return parentIndex; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/index/ParentIndex.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,55 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.index; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeChildren; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.util.Iterator; + +public class ParentIndex { + + private TreeMap<TreeNode, TreeNode> parentIndex; + + public ParentIndex() { + parentIndex = new TreeMap(); + } + + public boolean isEmpty(){ + return parentIndex.isEmpty(); + } + + public TreeNode get(TreeNode child) { + return parentIndex.get(child).get(); + } + + public ParentIndex set(TreeNode parent ,TreeNode child) { + parentIndex = parentIndex.put(child, parent); + return this; + } + + public ParentIndex delete(TreeNode child) { + parentIndex = parentIndex.delete(child); + return this; + } + + public ParentIndex deleteAllChildren(TreeNode parentNode) { + TreeNodeChildren children = parentNode.getChildren(); + Iterator<TreeNode> childrenIterator = children.iterator(); + for (; childrenIterator.hasNext();) { + TreeNode child = childrenIterator.next(); + parentIndex = parentIndex.delete(child); + } + return this; + } + + public ParentIndex addAllChildren(TreeNode parentNode) { + TreeNodeChildren children = parentNode.getChildren(); + Iterator<TreeNode> childrenIterator = children.iterator(); + for (; childrenIterator.hasNext();) { + TreeNode child = childrenIterator.next(); + parentIndex = parentIndex.put(child, parentNode); + } + return this; + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/AppendChildAtOperation.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,48 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.operations; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + + +public final class AppendChildAtOperation implements NodeOperation +{ + private final int pos; + + public AppendChildAtOperation(int _pos) + { + pos = _pos; + } + + public Command getCommand() + { + return Command.APPEND_CHILD; + } + + @Override + public Either<Error,TreeNode> invoke(TreeNode _target) + { + return _target.getChildren().addNewChildAt(pos); + } + + @Override + public int getPosition() + { + return pos; + } + + @Override + public String getKey() + { + return null; + } + + @Override + public ByteBuffer getValue() + { + return null; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/DefaultTreeOperation.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,27 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.operations; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; + +public class DefaultTreeOperation implements TreeOperation +{ + private final NodePath path; + private final NodeOperation operation; + + public DefaultTreeOperation(NodePath _path,NodeOperation _operation) + { + path = _path; + operation = _operation; + } + + @Override + public NodePath getNodePath() + { + return path; + } + + @Override + public NodeOperation getNodeOperation() + { + return operation; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/DeleteAttributeOperation.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,48 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.operations; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public final class DeleteAttributeOperation implements NodeOperation +{ + private final String key; + + public DeleteAttributeOperation(String _key) + { + key = _key; + } + + @Override + public Command getCommand() + { + return Command.DELETE_ATTRIBUTE; + } + + @Override + public Either<Error, TreeNode> invoke(TreeNode _target) + { + return _target.getAttributes().delete(key); + } + + @Override + public int getPosition() + { + return -1; + } + + @Override + public String getKey() + { + return key; + } + + @Override + public ByteBuffer getValue() + { + return null; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/DeleteChildAtOperation.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,48 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.operations; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public class DeleteChildAtOperation implements NodeOperation +{ + private final int pos; + + public DeleteChildAtOperation(int _pos) + { + pos = _pos; + } + + @Override + public Command getCommand() + { + return Command.DELETE_CHILD; + } + + @Override + public Either<Error, TreeNode> invoke(TreeNode _target) + { + return _target.getChildren().deleteChildAt(pos); + } + + @Override + public int getPosition() + { + return pos; + } + + @Override + public String getKey() + { + return null; + } + + @Override + public ByteBuffer getValue() + { + return null; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/NodeOperation.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,20 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.operations; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public interface NodeOperation +{ + public Command getCommand(); + public Either<Error,TreeNode> invoke(TreeNode _target); + + public int getPosition(); + public String getKey(); + public ByteBuffer getValue(); +} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/PutAttributeOperation.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,50 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.operations; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + + +public class PutAttributeOperation implements NodeOperation +{ + private final String key; + private final ByteBuffer value; + + public PutAttributeOperation(String _key,ByteBuffer _value) + { + key = _key; + value = _value; + } + + @Override + public Command getCommand() + { + return Command.PUT_ATTRIBUTE; + } + + @Override + public Either<Error,TreeNode> invoke(TreeNode _target) + { + return _target.getAttributes().put(key,value); + } + @Override + public int getPosition() + { + return -1; + } + + @Override + public String getKey() + { + return key; + } + + @Override + public ByteBuffer getValue() + { + return value; + } +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/ReplaceRootNodeOperation.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,37 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.operations; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public class ReplaceRootNodeOperation implements NodeOperation { + + @Override + public Command getCommand() { + return Command.REPLACE_ROOT; + } + + @Override + public Either<Error, TreeNode> invoke(TreeNode target) { + return target.appendRootNode(); + } + + @Override + public int getPosition() { + return -1; + } + + @Override + public String getKey() { + return null; + } + + @Override + public ByteBuffer getValue() { + return null; + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/TreeOperation.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,9 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.operations; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; + +public interface TreeOperation +{ + public NodePath getNodePath(); + public NodeOperation getNodeOperation(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/AppendChildAt.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,44 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.OperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public class AppendChildAt implements NodeEditor +{ + private final int pos; + + public AppendChildAt(int _pos) + { + pos = _pos; + } + + public Either<Error, LoggingNode> _edit(LoggingNode _e) + { + Either<Error,LoggingNode> either = _e.getChildren().addNewChildAt(pos); + if(either.isA()){ + // error + return either; + } + return DefaultEither.newB(either.b()); + } + + @Override + public Either<Error, LoggingNode> edit(TreeNode _e) { + LoggingNode logNode = wrap(_e); + return _edit(logNode); + } + + public LoggingNode wrap(TreeNode node) { + return new LoggingNode(node); + } + + @Override + public LoggingNode wrap(TreeNode node, OperationLog op) { + return new LoggingNode(node, op); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/DeleteAttribute.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,43 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer; + + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.OperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; + +public class DeleteAttribute implements NodeEditor +{ + private final String key; + public DeleteAttribute(String _key) + { + key = _key; + } + + public Either<Error,LoggingNode> _edit(LoggingNode logNode) + { + Either<jp.ac.u_ryukyu.ie.cr.jungle.util.Error,LoggingNode> either = logNode.getAttributes().delete(key); + if(either.isA()){ + // error + return either; + } + return DefaultEither.newB(either.b()); + } + + @Override + public Either<Error, LoggingNode> edit(TreeNode _e) { + LoggingNode logNode = wrap(_e); + return _edit(logNode); + } + + public LoggingNode wrap(TreeNode node) { + return new LoggingNode(node); + } + + @Override + public LoggingNode wrap(TreeNode node, OperationLog op) { + return new LoggingNode(node, op); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/DeleteChildAt.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,44 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer; + + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.OperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; + +public class DeleteChildAt implements NodeEditor +{ + private final int pos; + public DeleteChildAt(int _pos) + { + pos = _pos; + } + + public Either<Error,LoggingNode> _edit(LoggingNode logNode) + { + Either<jp.ac.u_ryukyu.ie.cr.jungle.util.Error,LoggingNode> either = logNode.getChildren().deleteChildAt(pos); + if(either.isA()){ + // error + return either; + } + return DefaultEither.newB(either.b()); + } + + @Override + public Either<Error, LoggingNode> edit(TreeNode _e) { + LoggingNode logNode = wrap(_e); + return _edit(logNode); + } + + public LoggingNode wrap(TreeNode node) { + return new LoggingNode(node); + } + + @Override + public LoggingNode wrap(TreeNode node, OperationLog op) { + return new LoggingNode(node, op); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/NodeEditor.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,14 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer; + + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.OperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public interface NodeEditor +{ + public Either<Error,LoggingNode> edit(TreeNode _e); + public LoggingNode wrap(TreeNode node, OperationLog op); +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/NodeEditorError.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,11 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultError; + +public class NodeEditorError +{ + public static final Error INDEX_OUT_OF_BOUNDS = new DefaultError(); + public static final Error DELETE_KEY_NOT_FOUND = new DefaultError(); + public static final Error NULL_VALUE_NOT_ALLOWED = new DefaultError(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/PutAttribute.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,48 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.OperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public class PutAttribute implements NodeEditor +{ + private final String key; + private final ByteBuffer value; + + public PutAttribute(String _key,ByteBuffer _value) + { + key = _key; + value = _value; + } + + public Either<Error,LoggingNode> _edit(LoggingNode _e) + { + Either<Error,LoggingNode> either = _e.getAttributes().put(key,value); + if(either.isA()){ + // error + return either; + } + return DefaultEither.newB(either.b()); + } + + @Override + public Either<Error, LoggingNode> edit(TreeNode _e) { + LoggingNode logNode = wrap(_e); + return _edit(logNode); + } + + public LoggingNode wrap(TreeNode node) { + return new LoggingNode(node); + } + + @Override + public LoggingNode wrap(TreeNode node, OperationLog op) { + return new LoggingNode(node, op); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/replaceRootNodeAt.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,40 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.OperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; + +public class replaceRootNodeAt implements NodeEditor { + + + public Either<Error, LoggingNode> _edit(LoggingNode _e) + { + Either<jp.ac.u_ryukyu.ie.cr.jungle.util.Error,LoggingNode> either = _e.replaceNewRootNode(); + if(either.isA()){ + // error + return either; + } + return DefaultEither.newB(either.b()); + } + + + @Override + public Either<Error, LoggingNode> edit(TreeNode _e) { + LoggingNode logNode = wrap(_e); + return _edit(logNode); + } + + public LoggingNode wrap(TreeNode node) { + return new LoggingNode(node); + } + + + @Override + public LoggingNode wrap(TreeNode node, OperationLog op) { + return new LoggingNode(node, op); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/AbstractTreeMapThread.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,9 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.test; + +/** + * Created by e115731 on 15/03/17. + */ +public abstract class AbstractTreeMapThread extends Thread{ + public abstract void set(boolean flag); + public abstract long getFindCount(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/DataBaseBenchMark.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,164 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.test; + + +import com.mongodb.MongoClient; +import com.mongodb.WriteConcern; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; +import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.jungle.Jungle; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import org.bson.Document; +import org.xml.sax.SAXException; + +import javax.xml.parsers.ParserConfigurationException; +import java.io.*; +import java.nio.ByteBuffer; +import java.util.Random; + +/** + * Created by e115731 on 15/03/20. + */ +public class DataBaseBenchMark { + public static void main(String[] args) throws InterruptedException, IOException, ParserConfigurationException, SAXException { + + if (args.length < 2) { + System.out.println("args[0] = jungle or mongo, args[1] = read or write" ); + System.exit(0); + } + + Runtime rt = Runtime.getRuntime(); + int cpuNum = rt.availableProcessors(); + + if (args[0].equals("jungle")) + jungleBench(args, cpuNum); + else if (args[0].equals("mongo")) + mongoBench(args, cpuNum); + } + + private static void mongoBench(String[] args, int cpuNum) throws IOException, InterruptedException { + MongoClient client = new MongoClient("localhost", 27017); + client.setWriteConcern(WriteConcern.JOURNALED); + client.dropDatabase("mydb"); + MongoDatabase database = client.getDatabase("mydb"); + MongoCollection<Document> coll = database.getCollection("mycoll"); + for (int i = 0; i < 10000; i++) { + if (i % 100 == 0) + System.out.println(i / 100); + coll.insertOne(new Document("key",String.valueOf(i))); + } + coll.createIndex(new Document("key", 1)); + //coll.dropIndex(new Document("key", 1)); + for (final Document index : coll.listIndexes()) { + System.out.println(index.toJson()); + } + File file = new File("./time/" + args[0] + args[1] + "Time"); + PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); + DataBaseBenchMarkThread readThread[] = null; + for (int THREAD_COUNT = 1; THREAD_COUNT <= cpuNum; THREAD_COUNT++) { + readThread = new DataBaseBenchMarkThread[THREAD_COUNT]; + for (int count = 0; THREAD_COUNT > count; count++) { + readThread[count] = new findMongoAttributeThread(coll); + } + for (int count = 0; THREAD_COUNT > count; count++) { + readThread[count].start(); + } + System.out.println("StartThread"); + Thread.sleep(1000); + long readCount = 0; + for (int count = 0; THREAD_COUNT > count; count++) { + readCount = readCount + readThread[count].getFindCount(); + readThread[count].set(false); + readThread[count] = null; + } + pw.println(THREAD_COUNT + " " + readCount); + System.out.println(THREAD_COUNT + "readCount = " + readCount); + System.gc(); + System.out.println("-------------GC--------------"); + Thread.sleep(1000); + } + client.close(); + pw.close(); + } + + private static void jungleBench(String[] args, int cpuNum) throws IOException, InterruptedException { + JungleTree tree = createJungleTree(cpuNum); + File file = new File("./time/" + args[0] + args[0] + "Time"); + PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); + DataBaseBenchMarkThread readThread[] = null; + + for (int THREAD_COUNT = 1; THREAD_COUNT <= cpuNum; THREAD_COUNT++) { + readThread = new DataBaseBenchMarkThread[THREAD_COUNT]; + for (int count = 0; THREAD_COUNT > count; count++) { + readThread[count] = new findTreeAttributeThread(tree); + } + JungleWriteThread writeThread = null; + if (args[1].equals("write")) { + writeThread = new JungleWriteThread(tree); + writeThread.start(); + } + for (int count = 0; THREAD_COUNT > count; count++) { + readThread[count].start(); + } + System.out.println("StartThread"); + Thread.sleep(1000); + if (args[1].equals("write")) { + writeThread.set(false); + writeThread.get(); + } + long readCount = 0; + for (int count = 0; THREAD_COUNT > count; count++) { + readCount = readCount + readThread[count].getFindCount(); + readThread[count].set(false); + readThread[count] = null; + } + pw.println(THREAD_COUNT + " " + readCount); + System.out.println(THREAD_COUNT + "readCount = " + readCount); + System.gc(); + System.out.println("-------------GC--------------"); + Thread.sleep(1000); + } + pw.close(); + } + + private static JungleTree createJungleTree(int cpuNum) { + Jungle jungle = new DefaultJungle(null, "hoge", new DefaultTreeEditor(new DefaultTraverser())); + JungleTree trees[] = new JungleTree[cpuNum]; + JungleTree tree = jungle.createNewTree("tree"); + JungleTreeEditor editor = tree.getTreeEditor(); + editor = editor.putAttribute(new DefaultNodePath(), "key", ByteBuffer.wrap(String.valueOf(0).getBytes())).b(); + JungleTreeEditor newEditor = createTree(0, new DefaultNodePath(), editor); + if (newEditor.success().isA()) { + System.out.println("success faild"); + System.exit(1); + } + trees[0] = tree; + return tree; + } + + static Integer nodeNum = 1; + + public static JungleTreeEditor createTree(int deep, NodePath path, JungleTreeEditor editor) { + + Random rnd = new Random(); + String value1 = String.valueOf(nodeNum); + nodeNum++; + String value2 = String.valueOf(nodeNum); + nodeNum++; + editor = editor.addNewChildAt(path, 0).b(); + editor = editor.putAttribute(path.add(0), "key", ByteBuffer.wrap(value1.getBytes())).b(); + editor = editor.addNewChildAt(path, 1).b(); + editor = editor.putAttribute(path.add(1), "key", ByteBuffer.wrap(value2.getBytes())).b(); + deep++; + if (deep < 10) { + editor = createTree(deep, path.add(0), editor); + editor = createTree(deep, path.add(1), editor); + } + return editor; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/DataBaseBenchMarkThread.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,9 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.test; + +/** + * Created by e115731 on 15/03/17. + */ +public abstract class DataBaseBenchMarkThread extends Thread{ + public abstract long getFindCount(); + public abstract void set(boolean flag); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/JungleWriteThread.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,48 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.test; + +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; + +import java.nio.ByteBuffer; + +/** + * Created by e115731 on 15/04/18. + */ +public class JungleWriteThread extends Thread { + + JungleTree tree; + boolean loop = true; + private int writeCount; + + public JungleWriteThread(JungleTree tree) { + this.tree = tree; + } + + public void set(boolean flag) { + loop = flag; + } + + public void get() { + System.out.println("writeCount = " + writeCount); + } + + ; + + @Override + public void run() { + while (loop) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + JungleTreeEditor editor = tree.getTreeEditor(); + editor = editor.putAttribute(new DefaultNodePath(), "key", ByteBuffer.wrap(String.valueOf(0).getBytes())).b(); + if (editor.success().isA()) + System.out.println("faild"); + else + writeCount++; + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/TatsukiTreeMapGetThread.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,42 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.test; + +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.util.Optional; + + +/** + * Created by e115731 on 15/03/17. + */ +public class TatsukiTreeMapGetThread extends AbstractTreeMapThread { + TreeMap<Long, String> map; + private long findCount; + boolean loop = true; + + public TatsukiTreeMapGetThread(TreeMap map) { + this.map = map; + } + + @Override + public long getFindCount() { + System.out.println("thread count = " + findCount); + return findCount; + } + + @Override + public void set(boolean loop) { + this.loop = loop; + } + + @Override + public void run() { + while (loop) { + for (long count = 0 ; count < 1000; count++) { + Optional<String> value = map.get(count); + if (!value.isPresent()) + System.out.println("error"); + } + findCount++; + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/TreeMapBenchMark.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,77 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.test; + +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.io.*; + +/** + * Created by e115731 on 15/03/17. + */ +public class TreeMapBenchMark { + public static void main(String[] args) throws InterruptedException, IOException { + + if (args.length == 0) { + System.out.println("args get or getLoop or list"); + System.exit(0); + } + + Runtime rt = Runtime.getRuntime(); + int cpuNum = rt.availableProcessors(); + + File file = new File("./time/" + args[0] + "Time"); + + PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); + + AbstractTreeMapThread readThread[] = null; + + for (int THREAD_COUNT = 1; THREAD_COUNT <= cpuNum; THREAD_COUNT++) { + + readThread = new AbstractTreeMapThread[THREAD_COUNT]; + + if (args[0].equals("util")) { + java.util.TreeMap map = new java.util.TreeMap(); + for (long count = 0; count < 1000; count++) { + map.put(count, String.valueOf(count)); + } + + for (int count = 0; THREAD_COUNT > count; count++) { + readThread[count] = new UtilTreeMapGetThread(map); + } + } else if (args[0].equals("tatsuki")) { + TreeMap map = new TreeMap(); + for (long count = 0; count < 1000; count++) { + map = map.put(count, String.valueOf(count)); + } + + for (int count = 0; THREAD_COUNT > count; count++) { + readThread[count] = new TatsukiTreeMapGetThread(map); + } + } else { + System.out.println("not allow args"); + System.exit(0); + } + + for (int count = 0; THREAD_COUNT > count; count++) { + readThread[count].start(); + } + + System.out.println("StartThread"); + + Thread.sleep(1000); + long readCount = 0; + + for (int count = 0; THREAD_COUNT > count; count++) { + readThread[count].set(false); + readCount = readCount + readThread[count].getFindCount(); + readThread[count].stop(); + } + + pw.println(THREAD_COUNT + " " + readCount); + System.out.println(THREAD_COUNT + "readCount = " + readCount); + Thread.sleep(1000); + } + + pw.close(); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/UtilTreeMapGetThread.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,39 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.test; + +import java.util.TreeMap; + +/** + * Created by e115731 on 15/04/18. + */ +public class UtilTreeMapGetThread extends AbstractTreeMapThread { + TreeMap<Long, String> map; + private long findCount; + boolean loop = true; + + public UtilTreeMapGetThread(TreeMap map) { + this.map = map; + } + + @Override + public long getFindCount() { + System.out.println("thread count = " + findCount); + return findCount; + } + + @Override + public void set(boolean loop) { + this.loop = loop; + } + + @Override + public void run() { + while (loop) { + for (long count = 0 ; count < 1000; count++) { + String value = map.get(count); + if (value == null) + System.out.println("error"); + } + findCount++; + } + } +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/findMongoAttributeThread.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,41 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.test; + +import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import org.bson.Document; + +/** + * Created by e115731 on 15/04/30. + */ +public class findMongoAttributeThread extends DataBaseBenchMarkThread { + private long findCount; + boolean loop = true; + MongoCollection<Document> coll; + + public findMongoAttributeThread( MongoCollection<Document> coll) { + this.coll = coll; + this.findCount = 0; + } + + @Override + public long getFindCount() { + System.out.println("thread count = " + findCount); + return findCount; + } + + public void set(boolean loop) { + this.loop = loop; + } + + @Override + public void run() { + while (loop) { + FindIterable<Document> searchResultList = coll.find(new Document("key","1")); + MongoCursor<Document> iterator = searchResultList.iterator(); + if (iterator.hasNext()) { + findCount++; + } + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/findTreeAttributeThread.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,43 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.test; + +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser; +import java.util.Iterator; + +/** + * Created by e115731 on 15/03/20. + */ +public class findTreeAttributeThread extends DataBaseBenchMarkThread { + + JungleTree tree; + private long findCount; + + boolean loop = true; + + public findTreeAttributeThread(JungleTree tree) { + this.tree = tree; + this.findCount = 0; + } + + @Override + public long getFindCount() { + System.out.println("thread count = " + findCount); + return findCount; + } + + public void set(boolean loop) { + this.loop = loop; + } + + @Override + public void run() { + while (loop) { + InterfaceTraverser traverser = tree.getTraverser(true); + Iterator<TreeNode> it = traverser.find(null, "key", "0"); + if (it.hasNext()) { + findCount++; + } + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/readTreeAttributeThread.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,44 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.test; + +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; + +/** + * Created by e115731 on 15/03/17. + */ +public class readTreeAttributeThread extends DataBaseBenchMarkThread { + + JungleTree tree; + private long findCount; + + boolean loop = true; + + public readTreeAttributeThread(JungleTree tree) { + this.tree = tree; + this.findCount = 0; + } + + @Override + public long getFindCount() { + System.out.println("thread couny = " + findCount); + return findCount; + } + + public void set(boolean loop) { + this.loop = loop; + } + + @Override + public void run() { + while (loop) { + TreeNode root = tree.getRootNode(); + if (root != null) { + String attribute = root.getAttributes().getString("key"); + if (attribute.equals("0")) + findCount++; + else + System.out.println("faild"); + } + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultJungleTreeEditor.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,133 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.transaction; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.TreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.DefaultTreeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.AppendChildAt; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.PutAttribute; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.DefaultTreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.OperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.replaceRootNodeAt; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.DeleteAttribute; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.DeleteChildAt; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.IterableConverter; + +public class DefaultJungleTreeEditor implements JungleTreeEditor +{ + private final TransactionManager txManager; + private final TreeNode root; + private final TreeEditor editor; + private final TreeOperationLog log; + + + public DefaultJungleTreeEditor(TreeNode _root,TransactionManager _txManager,TreeEditor _editor) + { + this(_root,_txManager,_editor,new DefaultTreeOperationLog()); + } + + + + public DefaultJungleTreeEditor(TreeNode newNode,TransactionManager _txManager,TreeEditor _editor,TreeOperationLog _log) + { + this.root = newNode; + this.txManager = _txManager; + this.editor = _editor; + this.log = _log; + } + + private Either<Error,JungleTreeEditor> _edit(final NodePath _path,NodeEditor _e) + { + Either<jp.ac.u_ryukyu.ie.cr.jungle.util.Error,LoggingNode> either = editor.edit(root,_path,_e); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + LoggingNode newLogging = either.b(); + OperationLog newLog = newLogging.getOperationLog(); + TreeNode newNode = newLogging.getWrap(); + + IterableConverter.Converter<TreeOperation,NodeOperation> converter = new IterableConverter.Converter<TreeOperation,NodeOperation>(){ + @Override + public TreeOperation conv(NodeOperation _b){ + return new DefaultTreeOperation(_path,_b); + } + }; + + Iterable<TreeOperation> iterable = new IterableConverter<TreeOperation,NodeOperation>(newLog,converter); + DefaultTreeOperationLog treeOperationLog = new DefaultTreeOperationLog(iterable,newLog.length()); + TreeOperationLog newTreeOpLog = log.append(treeOperationLog); + + JungleTreeEditor newEditor = new DefaultJungleTreeEditor(newNode,txManager,editor,newTreeOpLog); + return DefaultEither.newB(newEditor); + } + + @Override + public Either<Error,JungleTreeEditor> replaceNewRootNode() + { + replaceRootNodeAt appendChildAt = new replaceRootNodeAt(); + return _edit(new DefaultNodePath(),appendChildAt); + } + + @Override + public Either<Error,JungleTreeEditor> addNewChildAt(NodePath _path, int _pos) + { + AppendChildAt appendChildAt = new AppendChildAt(_pos); + return _edit(_path,appendChildAt); + } + + @Override + public Either<Error,JungleTreeEditor> deleteChildAt(NodePath _path, int _pos) + { + DeleteChildAt deleteChildAt = new DeleteChildAt(_pos); + return _edit(_path,deleteChildAt); + } + + @Override + public Either<Error,JungleTreeEditor> putAttribute(NodePath _path,String _key,ByteBuffer _value) + { + PutAttribute putAttribute = new PutAttribute(_key,_value); + return _edit(_path,putAttribute); + } + + @Override + public Either<Error,JungleTreeEditor> deleteAttribute(NodePath _path, String _key) + { + DeleteAttribute deleteAttribute = new DeleteAttribute(_key); + return _edit(_path,deleteAttribute); + } + + @Override + public Either<Error,JungleTreeEditor> edit(NodePath _path,NodeEditor _editor) + { + return _edit(_path,_editor); + } + + @Override + public Either<Error,JungleTreeEditor> success() + { + Either<Error,TransactionManager> either = txManager.commit(root,log); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + TransactionManager newTxManager = either.b(); + JungleTreeEditor newTreeEditor = new DefaultJungleTreeEditor(root,newTxManager,editor); + + return DefaultEither.newB(newTreeEditor); + } + + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTransactionManager.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,78 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.transaction; + + +import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeListWriter; +import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeContext; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.TreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeList; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultError; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +import java.util.Iterator; +import java.util.concurrent.atomic.AtomicReference; + +public class DefaultTransactionManager implements TransactionManager { + private final AtomicReference<TreeContext> repository; + private final TreeContext tip; + private final ChangeListWriter writer; + private final String uuid; + + public DefaultTransactionManager(ChangeListWriter _writer, TreeContext _tip, + AtomicReference<TreeContext> _repository, String _uuid) { + repository = _repository; + tip = _tip; + writer = _writer; + uuid = _uuid; + } + + @Override + public Either<Error, TransactionManager> commit(TreeNode newRoot, final TreeOperationLog _log) { + long currentRevision = tip.revision(); + long nextRevision = currentRevision + 1; + + final String _treeName = tip.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; + } + + }; + + InterfaceTraverser traverser = new InterfaceTraverser(newRoot, true); + traverser.createIndex(); + TreeContext newTreeContext = new DefaultTreeContext(newRoot , tip, list, uuid, _treeName, nextRevision,traverser); + + if (repository.compareAndSet(newTreeContext.prev(),newTreeContext)) { + TransactionManager txManager = new DefaultTransactionManager(writer, newTreeContext, repository, uuid); + return DefaultEither.newB(txManager); + } + + return DefaultEither.newA((jp.ac.u_ryukyu.ie.cr.jungle.util.Error) new DefaultError()); + } + + @Override + public String getUUID() { + return uuid; + } + + @Override + public long getRevision() { + return tip.revision(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeContext.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,82 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.transaction; + + +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeList; +import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeContext; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.store.index.ParentIndex; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +public class DefaultTreeContext implements TreeContext { + private final TreeNode root; + private final TreeContext previous; + private final ChangeList changeList; + private final String uuid; + private final String treeName; + private final long revision; + private final InterfaceTraverser traverser; + + public DefaultTreeContext(TreeNode _node, TreeContext _prev, ChangeList _log, String _uuid, String _treeName, long _revision, InterfaceTraverser traverser) { + this.root = _node; + this.previous = _prev; + this.changeList = _log; + this.uuid = _uuid; + this.treeName = _treeName; + this.revision = _revision; + this.traverser = traverser; + } + + + @Override + public TreeNode getRoot() { + return root; + } + + @Override + public TreeContext prev() { + return previous; + } + + @Override + public ChangeList getChangeList() { + return changeList; + } + + @Override + public String uuid() { + return uuid; + } + + @Override + public String getTreeName() { + return treeName; + } + + @Override + public long revision() { + return revision; + } + + @Override + public Iterable<TreeOperation> getOperations() { + return changeList; + } + + @Override + public TreeMap<String, TreeMap<String, List<TreeNode>>> getIndex() { + return traverser.getIndex(); + } + + @Override + public ParentIndex getParentIndex() { + return traverser.getParentIndex(); + } + + @Override + public InterfaceTraverser getTraverser() { + return traverser; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeNode.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,65 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.transaction; + + +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeChildren; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.nio.ByteBuffer; +import java.rmi.dgc.VMID; + +public class DefaultTreeNode implements TreeNode { + private List<TreeNode> children; + private TreeMap<String, ByteBuffer> attrs; + final String nodeId = new VMID().toString(); + + private static final List<TreeNode> NIL_LIST = new List(); + + public DefaultTreeNode() { + this(NIL_LIST, new TreeMap()); + } + + public DefaultTreeNode(List<TreeNode> _children, TreeMap<String, ByteBuffer> _attrs) { + attrs = _attrs; + children = _children; + } + + @Override + public DefaultTreeNodeChildren getChildren() { + return new DefaultTreeNodeChildren(children, attrs); + } + + @Override + public DefaultTreeNodeAttribute getAttributes() { + return new DefaultTreeNodeAttribute(children, attrs); + } + + @Override + public DefaultTreeNode createNewNode() { + return new DefaultTreeNode(); + } + + public DefaultTreeNode clone() { + return new DefaultTreeNode(children, attrs); + } + + @Override + public Either<Error, TreeNode> appendRootNode() { + TreeNodeChildren newRootChildren = new DefaultTreeNodeChildren(NIL_LIST, new TreeMap()); + Either<jp.ac.u_ryukyu.ie.cr.jungle.util.Error, TreeNode> either = newRootChildren.addNewChildAt(0,this); + return either; + } + + @Override + public String getNodeId() { + return nodeId; + } + + @Override + public int compareTo(TreeNode o) { + return this.hashCode() - o.hashCode(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeNodeAttribute.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,80 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.transaction; + +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeAttributes; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditorError; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.nio.ByteBuffer; +import java.util.Iterator; +import java.util.Optional; + +public class DefaultTreeNodeAttribute implements TreeNodeAttributes { + public List<TreeNode> children; + public TreeMap<String, ByteBuffer> attrs; + + + public DefaultTreeNodeAttribute(List<TreeNode> _children, TreeMap<String, ByteBuffer> _attrs) { + children = _children; + attrs = _attrs; + } + + @Override + public TreeMap<String, ByteBuffer> getAttributesAsRawMap() { + return attrs; + } + + @Override + public Either<Error, TreeNode> delete(String _key) { + if (_key == null) { + return DefaultEither.newA(NodeEditorError.NULL_VALUE_NOT_ALLOWED); + } + + if (null == attrs.get(_key)) { + return DefaultEither.newA(NodeEditorError.DELETE_KEY_NOT_FOUND); + } + + TreeMap<String, ByteBuffer> newMap = attrs.delete(_key); + TreeNode newNode = new DefaultTreeNode(children, newMap); + return DefaultEither.newB(newNode); + } + + @Override + public Either<Error, TreeNode> put(String _key, ByteBuffer _value) { + if (_key == null || _value == null) { + return DefaultEither.newA(NodeEditorError.NULL_VALUE_NOT_ALLOWED); + } + + TreeMap<String, ByteBuffer> newMap = attrs.put(_key, _value); + TreeNode newNode = new DefaultTreeNode(children, newMap); + return DefaultEither.newB(newNode); + } + + @Override + public ByteBuffer get(String _key) { + if (_key == null) { + return null; + } + Optional<ByteBuffer> op = attrs.get(_key); + if (op.isPresent()) + return op.get(); + return null; + } + + @Override + public String getString(String key) { + ByteBuffer attribute = get(key); + if (attribute != null) + return new String(attribute.array()); + return null; + } + + @Override + public Iterator<String> getKeys() { + return attrs.keys(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeNodeChildren.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,108 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.transaction; + + +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditorError; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeChildren; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.nio.ByteBuffer; +import java.util.Iterator; + +public class DefaultTreeNodeChildren implements TreeNodeChildren { + + public List<TreeNode> children; + public TreeMap<String, ByteBuffer> attrs; + + public DefaultTreeNodeChildren(List<TreeNode> _children, TreeMap<String, ByteBuffer> _attrs) { + children = _children; + attrs = _attrs; + } + + private boolean boundaryCheck(int _pos) { + int size = children.length(); + if (size < _pos) { + return false; + } + + return true; + } + + @Override + public List<TreeNode> getChildrenAsRawList() { + return children; + } + + @Override + public Either<Error, TreeNode> addNewChildAt(int _pos) { + if (!boundaryCheck(_pos) || _pos < 0) { + return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + List<TreeNode> newChildren = children.add(_pos, new DefaultTreeNode()); + TreeNode newNode = new DefaultTreeNode(newChildren, attrs); + return DefaultEither.newB(newNode); + } + + @Override + public Either<jp.ac.u_ryukyu.ie.cr.jungle.util.Error, TreeNode> deleteChildAt(int _pos) { + if (!boundaryCheck(_pos) || _pos < 0 || size() == 0) { + return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + List<TreeNode> newChildren = children.delete(_pos); + TreeNode newNode = new DefaultTreeNode(newChildren, attrs); + + return DefaultEither.newB(newNode); + } + + @Override + public int size() { + return children.length(); + } + + @Override + public Iterator<TreeNode> iterator() { + return children.iterator(); + } + + @Override + public Either<Error, TreeNode> replaceNode(int _pos, TreeNode _replacement) { + int size = children.length(); + if (!(0 <= _pos && _pos < size)) { + return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + TreeNode replacement = _replacement; + + List<TreeNode> newChildren = children.replace(_pos, replacement); + TreeNode node = new DefaultTreeNode(newChildren, attrs); + return DefaultEither.newB(node); + } + + @Override + public Either<Error, TreeNode> at(int _pos) { + if (children.length() < _pos + 1) { + return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + TreeNode Node = children.index(_pos); + + return DefaultEither.newB(Node); + } + + @Override + public Either<Error, TreeNode> addNewChildAt(int _pos, TreeNode _newChild) { + if (!boundaryCheck(_pos) || _pos < 0) { + return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + List<TreeNode> newChildren = children.add(_pos, _newChild); + TreeNode newNode = new DefaultTreeNode(newChildren, attrs); + + return DefaultEither.newB(newNode); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/TransactionManager.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,14 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.transaction; + + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.TreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public interface TransactionManager +{ + public Either<Error,TransactionManager> commit(TreeNode _newRoot,TreeOperationLog _log); + public String getUUID(); + public long getRevision(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultEvaluation.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,25 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +public class DefaultEvaluation implements Evaluation +{ + private final Result result; + private final Evaluator evaluator; + + public DefaultEvaluation(Result _result,Evaluator _evaluator) + { + result = _result; + evaluator = _evaluator; + } + + @Override + public Result result() + { + return result; + } + + @Override + public Evaluator evaluator() + { + return evaluator; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultEvaluator.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,40 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Pair; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; + +public class DefaultEvaluator implements Evaluator +{ + private final NodePath path; + + public DefaultEvaluator(NodePath _path) + { + path = _path; + } + + @Override + public Evaluation evaluate(TreeNode _current,int _pos) + { + Pair<Integer,NodePath> pop = path.pop(); + int head = pop.left(); + + if(path.size() == 1){ + if(head == _pos){ + return new DefaultEvaluation(Result.GOAL,null); + } + } + + DefaultEvaluator nextEvaluator; + Result result; + if(head == _pos){ + result = Result.ACCEPT; + nextEvaluator = new DefaultEvaluator(pop.right()); + }else{ + result = Result.CONTINUE; + nextEvaluator = null; + } + + return new DefaultEvaluation(result,nextEvaluator); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultTraverser.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,144 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.core.Children; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditorError; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +import java.util.Iterator; + + +public class DefaultTraverser implements Traverser +{ + @Override + public Either<Error,Traversal> traverse(final TreeNode _root,Evaluator _evaluator) + { + Children wrapper = new Children(){ + @Override + public Iterator<TreeNode> iterator(){ + List<TreeNode> list = new List(); + return list.addLast(_root).iterator(); + } + + @Override + public int size(){ + return 1; + } + + @Override + public Either<Error,TreeNode> at(int _pos){ + if(_pos != 0){ + return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + return DefaultEither.newB(_root); + } + }; + + //Children<T> chs = _root.getChildren(); + Children chs = wrapper; + + Either<Error,List<Direction<TreeNode>>> ret = _traverse(chs,_evaluator,-1); + + if(ret.isA()){ + return DefaultEither.newA(ret.a()); + } + + List<Direction<TreeNode>> list = ret.b(); + + final Iterable<Direction<TreeNode>> iterable = list; + final TreeNode destination = ret.b().last().getTarget(); + + Traversal traversal = new Traversal(){ + @Override + public Iterator<Direction<TreeNode>> iterator(){ + return iterable.iterator(); + } + + @Override + public TreeNode destination(){ + return destination; + } + }; + + return DefaultEither.newB(traversal); + } + + private Either<Error,List<Direction<TreeNode>>> _traverse(Children _chs,Evaluator _evaluator,int _pos) + { + int pos = _pos; + for(TreeNode ch : _chs){ + Evaluation e = _evaluator.evaluate(ch,pos); + Result r = e.result(); + if(r == Result.ACCEPT){ + return _accept(ch,pos,e.evaluator()); + } + + if(r == Result.GOAL){ + return DefaultEither.newB(_goal(ch,pos)); + } + + if(r == Result.BREAK){ + break; + } + + if(r == Result.CONTINUE){ + pos --; + continue; + } + + return DefaultEither.newA(TraverserError.UNDEFINED_OPERATOR); + } + + return DefaultEither.newA(TraverserError.PATH_NOT_FOUND); + } + + private List<Direction<TreeNode>> _goal(final TreeNode _current,final int _pos) + { + Direction<TreeNode> d = new Direction<TreeNode>(){ + @Override + public int getPosition() + { + return _pos; + } + @Override + public TreeNode getTarget() + { + return _current; + } + }; + + List<Direction<TreeNode>> list = new List(); + List<Direction<TreeNode>> newList = list.addLast(d); + + return newList; + } + + private <T extends TreeNode> Either<Error,List<Direction<TreeNode>>> _accept(final T _current,final int _pos,Evaluator _evaluator) + { + Children chs = _current.getChildren(); + Either<Error,List<Direction<TreeNode>>> either = _traverse(chs,_evaluator,chs.size() - 1); + if(either.isA()){ + return either; + } + + List<Direction<TreeNode>> list = either.b(); + Direction<TreeNode> d = new Direction<TreeNode>(){ + @Override + public int getPosition() + { + return _pos; + } + @Override + public T getTarget() + { + return _current; + } + }; + + List<Direction<TreeNode>> newList = list.addLast(d); + return DefaultEither.newB(newList); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Direction.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,7 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +public interface Direction<T> +{ + public int getPosition(); + public T getTarget(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Evaluation.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,7 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +public interface Evaluation +{ + public Result result(); + public Evaluator evaluator(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Evaluator.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,8 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; + +public interface Evaluator +{ + public Evaluation evaluate(TreeNode _current,int _pos); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/InterfaceTraverser.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,319 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NulIterator; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.query.PathNodeIterator; +import jp.ac.u_ryukyu.ie.cr.jungle.query.Query; +import jp.ac.u_ryukyu.ie.cr.jungle.store.index.IndexCreater; +import jp.ac.u_ryukyu.ie.cr.jungle.store.index.ParentIndex; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.util.Iterator; +import java.util.Optional; + +public class InterfaceTraverser { + + TreeNode root; + TreeMap<String, TreeMap<String, List<TreeNode>>> indexList; + ParentIndex parentIndex; + boolean parentUpdateFlag; + boolean useIndex; + + public InterfaceTraverser(TreeNode root, boolean indexFlag) { + this(root, new TreeMap<>(), new ParentIndex(), indexFlag); + } + + public InterfaceTraverser(TreeNode root, TreeMap<String, TreeMap<String, List<TreeNode>>> index, + ParentIndex parentIndex, boolean useIndex) { + this.root = root; + this.indexList = index; + this.parentIndex = parentIndex; + if (parentIndex.isEmpty()) + parentUpdateFlag = true; + else + parentUpdateFlag = false; + this.useIndex = useIndex; + } + + public TreeMap<String, TreeMap<String, List<TreeNode>>> getIndex() { + return indexList; + } + + public void commit() { + parentUpdateFlag = false; + } + + public ParentIndex getParentIndex() { + return parentIndex; + } + + public void createIndex() { + // long t1 = System.currentTimeMillis(); + IndexCreater creater = new IndexCreater(root); + // long t2 = System.currentTimeMillis(); + // System.out.println("createIndex time = " + (t2 - t1)); + indexList = creater.getIndex(); + parentIndex = creater.getParentIndex(); + } + + /** + * subTree以下のNodeに対してKey,Valueのペアでindexを使って探索を行う + * + * @param query + * @param subTree + * @param key + * @param searchValue + * @return + */ + // public Iterator<TreeNode> findInSubTree(final Query query, TreeNode + // subTree, String key, String searchValue) { + // /* + // * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 + // * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す + // */ + // Iterator<TreeNode> nodeIterator = index.get(key, searchValue); + // if (nodeIterator.hasNext() && useIndex) { + // + // // ここでNode以下にあるか調べる + // List<TreeNode> filteredList = List.nil(); + // + // for (;nodeIterator.hasNext();) { + // TreeNode targetNode = nodeIterator.next(); + // TreeNode parent = targetNode; + // while (parent != null) { + // parent = parentIndex.get(parent); + // if (parent.equals(subTree)) + // filteredList = filteredList.cons(targetNode); + // } + // } + // + // return filteredList.iterator(); + // + // } else { + // final PathNodeIterator itNode = new PathNodeIterator(subTree); + // return new Iterator<TreeNode>() { + // + // private TreeNode matchNode = nextmatch(itNode); + // + // private TreeNode nextmatch(PathNodeIterator itNode) { + // + // for (; itNode.hasNext();) { + // TreeNode targetNode = itNode.next(); + // if (query.condition(targetNode)) + // return targetNode; + // } + // return null; + // } + // + // @Override + // public boolean hasNext() { + // if (matchNode == null) { + // return false; + // } + // return true; + // } + // + // @Override + // public TreeNode next() { + // TreeNode currentNode = matchNode; + // matchNode = nextmatch(itNode); + // return currentNode; + // } + // + // @Override + // public void remove() { + // } + // + // }; + // } + // } + + /** + * subTree以下のNodeに対してKeyに対応する値をindexを使って探索する + */ + // public Iterator<TreeNode> findInSubTreeAllValue(final Query query, TreeNode + // subTree, String key) { + // /* + // * indexからinnerIndexを取得 取得したinnerIndexが保有するKeyを取得 + // * そのKeyを保有するNodeとNodeのPathを取得する + // * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 + // * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す + // */ + // Iterator<TreeNode> NodeIterator = index.getAll(key); + // if (NodeIterator != null && useIndex) { + // List<TreeNode> filteredList = List.nil(); + // for (; NodeIterator.hasNext();) { + // TreeNode targetNode = NodeIterator.next(); + // TreeNode parent = targetNode; + // while (parent != null) { + // parent = parentIndex.get(parent); + // if (parent.equals(subTree)) + // filteredList = filteredList.cons(targetNode); + // } + // } + // return filteredList.iterator(); + // + // } else { + // + // final PathNodeIterator itNode = new PathNodeIterator(subTree); + // return new Iterator<TreeNode>() { + // + // private TreeNode matchPair = nextmatch(itNode); + // + // private TreeNode nextmatch(PathNodeIterator itNode) { + // + // for (; itNode.hasNext();) { + // TreeNode targetNode = itNode.next(); + // if (query.condition(targetNode)) + // return targetNode; + // } + // return null; + // } + // + // @Override + // public boolean hasNext() { + // if (matchPair == null) { + // return false; + // } + // return true; + // } + // + // @Override + // public TreeNode next() { + // TreeNode currentNode = matchPair; + // matchPair = nextmatch(itNode); + // return currentNode; + // } + // + // @Override + // public void remove() { + // } + // + // }; + // } + // } + public Iterator<TreeNode> find(final Query query, final String key, String searchValue) { + + Iterator<TreeNode> nodeIterator = get(key, searchValue); + if (nodeIterator != null && useIndex) { + return nodeIterator; + } else { + + final PathNodeIterator itNode = new PathNodeIterator(root); + return new Iterator<TreeNode>() { + + private TreeNode matchNode = nextmatch(itNode); + + private TreeNode nextmatch(PathNodeIterator itNode) { + + for (; itNode.hasNext(); ) { + TreeNode targetNode = itNode.next(); + String value = targetNode.getAttributes().getString(key); + if (useIndex) { + if (value != null) + ; + // index = index.set(key, value, targetNode); + } + if (parentUpdateFlag) + ; + // parentIndex = parentIndex.set(targetNode); + if (query.condition(targetNode)) + return targetNode; + } + if (useIndex || parentUpdateFlag) + commit(); + return null; + } + + @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() { + } + + }; + } + } + + // public Iterator<TreeNode> findAll(final Query query, final String key) { + // + // Iterator<TreeNode> nodeList = index.getAll(key); + // if (nodeList != null && useIndex) { + // + // return nodeList; + // + // } else { + // + // 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(); + // String value = targetNode.getAttributes().getString(key); + // if (useIndex) { + // if (value != null) + // index = index.set(key, value, targetNode); + // } + // if (parentUpdateFlag); + // // parentIndex = parentIndex.set(targetNode); + // if (query.condition(targetNode)) + // return targetNode; + // } + // if (useIndex || parentUpdateFlag) + // commit(); + // return null; + // } + // + // @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() { + // } + // + // }; + // } + // } + + public Iterator<TreeNode> get(String key, String value) { + Optional<TreeMap<String, List<TreeNode>>> indexOp = indexList.get(key); + if (!indexOp.isPresent()) + return null; + + Optional<List<TreeNode>> nodeListOp = indexOp.get().get(value); + if (!nodeListOp.isPresent()) + return new NulIterator<TreeNode>(); + + return nodeListOp.get().iterator(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Result.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,22 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +public class Result +{ + + public static final Result ACCEPT = new Result("ACCEPT"); + public static final Result CONTINUE = new Result("CONTINUE"); + public static final Result BREAK = new Result("BREAK"); + public static final Result GOAL = new Result("GOAL"); + + private final String name; + + private Result(String _name) + { + name = _name; + } + + public String toString() + { + return name; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Traversal.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,8 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; + +public interface Traversal extends Iterable<Direction<TreeNode>> +{ + public TreeNode destination(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Traverser.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,12 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public interface Traverser +{ + public Either<Error,Traversal> traverse(final TreeNode _root,Evaluator _evaluator); + + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/TraverserError.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,10 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultError; + +public class TraverserError +{ + public static final jp.ac.u_ryukyu.ie.cr.jungle.util.Error UNDEFINED_OPERATOR = new DefaultError(); + public static final Error PATH_NOT_FOUND = new DefaultError(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/DefaultEither.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,47 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.util; + +public class DefaultEither<A,B> implements Either<A,B> +{ + private final A theA; + private final B theB; + + private DefaultEither(A _theA,B _theB) + { + theA = _theA; + theB = _theB; + } + + public static final <A,B> DefaultEither<A,B> newA(A _theA) + { + return new DefaultEither<A,B>(_theA,null); + } + + public static final <A,B> DefaultEither<A,B> newB(B _theB) + { + return new DefaultEither<A,B>(null,_theB); + } + + @Override + public A a() + { + return theA; + } + + @Override + public boolean isA() + { + return theA != null; + } + + @Override + public B b() + { + return theB; + } + + @Override + public boolean isB() + { + return theB != null; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/DefaultError.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,5 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.util; + +public class DefaultError implements Error +{ +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/Either.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,9 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.util; + +public interface Either<A,B> +{ + public A a(); + public boolean isA(); + public B b(); + public boolean isB(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/Error.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,5 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.util; + +public interface Error { + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/GetOldTreeError.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,5 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.util; + +public class GetOldTreeError implements Error { + public static final Error OLD_TREE_NOT_FOUND = new DefaultError(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/IterableConverter.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,56 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.util; + +import java.util.Iterator; + +public class IterableConverter<A,B> implements Iterable<A> +{ + private final Iterable<B> iterable; + private final Converter<A,B> converter; + + public IterableConverter(Iterable<B> _iterable,Converter<A,B> _converter) + { + iterable = _iterable; + converter = _converter; + } + + @Override + public Iterator<A> iterator() + { + return new IteratorConverter<A,B>(iterable.iterator(),converter); + } + + private static final class IteratorConverter<A,B> implements Iterator<A> + { + private final Iterator<B> iterator; + private final Converter<A,B> converter; + + public IteratorConverter(Iterator<B> _iterator,Converter<A,B> _converter) + { + iterator = _iterator; + converter = _converter; + } + + @Override + public boolean hasNext() + { + return iterator.hasNext(); + } + + @Override + public A next() + { + return converter.conv(iterator.next()); + } + + @Override + public void remove() + { + iterator.remove(); + } + } + + public static interface Converter<A,B> + { + public A conv(B _b); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/Pair.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,23 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.util; + +public class Pair<L,R> +{ + private L left; + private R right; + + public Pair(L _left,R _right) + { + left = _left; + right = _right; + } + + public L left() + { + return left; + } + + public R right() + { + return right; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/Triple.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,45 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.util; + +public class Triple<A,B,C> +{ + private A a; + private B b; + private C c; + + public Triple(A _a,B _b,C _c) + { + a = _a; + b = _b; + c = _c; + } + + public A getA() + { + return a; + } + + public B getB() + { + return b; + } + + public C getC() + { + return c; + } + + public void setA(A _a) + { + a = _a; + } + + public void setB(B _b) + { + b = _b; + } + + public void setC(C _c) + { + c = _c; + } +}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/list/DefaultNode.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.list; - -/** - * Created by e115731 on 15/05/16. - */ -public class DefaultNode<T> implements Node<T> { - private final T attribute; - private final int num; - private final Node next; - - public DefaultNode(T attribute, int num, Node next) { - this.attribute = attribute; - this.num = num; - this.next = next; - } - - public int getNum() { - return num; - } - - public Node getNext() { - return next; - } - - public T getAttribute() { - return attribute; - } - - public Node<T> add(int num, T attribute) { - if (this.num == num) { - Node<T> newNode = new DefaultNode(attribute, num, this.next); - return new DefaultNode<T>(this.attribute, this.num + 1, newNode); - } - - Node<T> newNode = next.add(num, attribute); - if (newNode == null) - return null; - - return new DefaultNode(this.attribute, this.num + 1, newNode); - } - - @Override - public Node<T> delete(int deleteNum) { - if (this.num - 1 == deleteNum) { - return new DefaultNode(this.attribute, deleteNum, this.next.getNext()); - } - - Node<T> newNode = next.delete(deleteNum); - if (newNode == null) - return null; - - return new DefaultNode(this.attribute, this.num - 1, newNode); - } - - @Override - public Node<T> replaceNode(int num, T attribute) { - if (this.num == num) { - return new DefaultNode(attribute, num, this.getNext()); - } - - Node<T> newNode = next.replaceNode(num, attribute); - if (newNode == null) - return null; - - return new DefaultNode(this.attribute, this.num, newNode); - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/list/List.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,161 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.list; - -import java.util.Iterator; -import java.util.Stack; - -/** - * Created by e115731 on 15/05/16. - * 非破壊であるためこのListは逆順になっています - */ -public class List<T> implements Iterable<T> { - final private Node<T> head; - final private int listLength; - - public List() { - this.head = new headNode(); - this.listLength = 0; - } - - public List(T... attributes) { - List<T> list = new List(); - for (T attribute : attributes) { - list = list.addLast(attribute); - } - this.head = list.getHead(); - this.listLength = head.getNext().getNum() + 1; - } - - private List(Node<T> head) { - this.head = head; - this.listLength = head.getNext().getNum() + 1; - } - - public Node<T> getHead() { - return head; - } - - public List<T> add(int num, T attribute) { - Node<T> newHead = head.add(num, attribute); - if (newHead == null) - return this; - return new List<T>(newHead); - } - - public List<T> addLast(T attribute) { - Node newNode = new DefaultNode(attribute, listLength, head.getNext()); - Node newHead = new headNode(newNode); - return new List(newHead); - } - - public T index(int num) { - Node<T> currentNode = head.getNext(); - while (currentNode.getNum() != -1) { - if (currentNode.getNum() == num) - return currentNode.getAttribute(); - currentNode = currentNode.getNext(); - } - return null; - } - - public Iterator<T> iterator() { - return new Iterator<T>() { - Node<T> currentNode = head.getNext(); - - @Override - public boolean hasNext() { - return currentNode.getNum() != -1; - } - - @Override - public T next() { - T attribute = currentNode.getAttribute(); - currentNode = currentNode.getNext(); - return attribute; - } - }; - } - - public Iterator<T> reverseIterator() { - Node<T> currentNode = head.getNext(); - Stack<T> stack = new Stack(); - while (currentNode.getNum() != -1) { - stack.push(currentNode.getAttribute()); - currentNode = currentNode.getNext(); - } - return new Iterator<T>() { - - @Override - public boolean hasNext() { - return !stack.isEmpty(); - } - - @Override - public T next() { - return stack.pop(); - } - }; - } - - - public List<T> delete(int num) { - Node<T> newNode = head.delete(num); - if (newNode == null) - return this; - Node<T> newHead = new headNode<>(newNode); - return new List<T>(newNode); - } - - public List<T> replace(int num, T attribute) { - Node<T> newHead = head.replaceNode(num, attribute); - if (newHead == null) - return this; - return new List<T>(newHead); - } - - public T last() { - return head.getNext().getAttribute(); - } - - public T head() { - return index(0); - } - - public List<T> deleteLast() { - return delete(listLength - 1); - } - - public List<T> deleteHead() { - return delete(0); - } - - public int length() { - return listLength; - } - - @Override - public String toString() { - String pathString = "<"; - Iterator<T> iterator = reverseIterator(); - while (true) { - pathString += iterator.next(); - if (iterator.hasNext()) - pathString += ","; - else - break; - } - pathString += ">"; - return pathString; - } - - public List<T> append(List<T> list) { - Iterator<T> iterator = list.reverseIterator(); - List<T> newList = this; - while (iterator.hasNext()) { - T attribute = iterator.next(); - newList = newList.addLast(attribute); - } - return newList; - } - - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/list/Node.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.list; - -/** - * Created by e115731 on 15/05/18. - */ -public interface Node<T> { - public int getNum(); - - public Node<T> getNext(); - - public T getAttribute(); - - public Node<T> add(int num, T attribute); - - public Node<T> delete(int num); - - Node<T> replaceNode(int num, T attribute); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/list/TailNode.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.list; - -/** - * Created by e115731 on 15/05/19. - */ -public class TailNode<T> implements Node<T> { - - @Override - public int getNum() { - return -1; - } - - @Override - public Node<T> getNext() { - return null; - } - - @Override - public T getAttribute() { - return null; - } - - @Override - public Node<T> add(int num, T attribute) { - return null; - } - - @Override - public Node<T> delete(int num) { - return null; - } - - @Override - public Node<T> replaceNode(int num, T attribute) { - return null; - } - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/list/headNode.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.list; - -/** - * Created by e115731 on 15/05/18. - */ -public class headNode<T> implements Node<T> { - private final Node next; - - - public headNode() { - this.next = new TailNode<T>(); - } - - public headNode(Node next) { - this.next = next; - } - - public int getNum() { - return -1; - } - - public Node getNext() { - return next; - } - - public T getAttribute() { - return null; - } - - public Node<T> add(int num, T attribute) { - if (next.getNum() == num - 1) { - Node<T> newNode = new DefaultNode<>(attribute, num, next); - return new headNode<T>(newNode); - } - - if (next.getNum() == num) { - Node<T> newNode = new DefaultNode(attribute, num, next.getNext()); - Node<T> newNext = new DefaultNode(next.getAttribute(), num++, newNode); - return new headNode(newNext); - } - - Node<T> newNode = next.add(num, attribute); - if (newNode == null) - return this; - return new headNode(newNode); - } - - public Node<T> delete(int deleteNum) { - if (getNext().getNum() == deleteNum) { - return new headNode(this.next.getNext()); - } - - Node<T> newNode = next.delete(deleteNum); - if (newNode == null) - return this; - return new headNode(newNode); - } - - @Override - public Node<T> replaceNode(int num, T attribute) { - Node<T> nextNode = getNext(); - if (nextNode.getNum() == num) { - Node<T> newNode = new DefaultNode(attribute, num, nextNode.getNext()); - return new headNode(newNode); - } - - Node<T> newNode = nextNode.replaceNode(num, attribute); - if (newNode == null) - return this; - return new headNode(newNode); - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungle.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle; - - -import jp.ac.u_ryukyu.ie.cr.list.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Journal; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.NullJournal; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeContext; -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.DefaultTreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; -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; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -import java.util.Iterator; -import java.util.concurrent.ConcurrentHashMap; - -public class DefaultJungle implements Jungle { - private Journal journal; - private ConcurrentHashMap<String, JungleTree> trees; - private String uuid; - private TreeEditor editor; - - public static void main(String args[]) { - DefaultJungle j = new DefaultJungle(null, "hoge", new DefaultTreeEditor(new DefaultTraverser())); - JungleTree t = j.createNewTree("fuga"); - - JungleTreeEditor e1 = t.getTreeEditor(); - - DefaultNodePath root = new DefaultNodePath(); - - Either<Error, JungleTreeEditor> either = e1.addNewChildAt(root, 0); - e1 = either.b(); - either = e1.addNewChildAt(root.add(0), 0); - e1 = either.b(); - e1.success(); - } - - public DefaultJungle(Journal journal, String uuid, TreeEditor editor) { - this.journal = new NullJournal(); - this.trees = new ConcurrentHashMap<String, JungleTree>(); - this.uuid = uuid; - this.editor = editor; - } - - @Override - public JungleTree getTreeByName(String name) { - return trees.get(name); - } - - @Override - public JungleTree createNewTree(final String name) { - ChangeList list = new ChangeList() { - @Override - public Iterator<TreeOperation> iterator() { - List<TreeOperation> nil = new List(); - return nil.iterator(); - } - - @Override - public String uuid() { - return uuid; - } - - @Override - public String getTreeName() { - return name; - } - - }; - DefaultTreeNode root = new DefaultTreeNode(); - InterfaceTraverser traverser = new InterfaceTraverser(root, true); - TreeContext tc = new DefaultTreeContext(root, null, list, uuid, name, 0, traverser); - JungleTree newTree = new DefaultJungleTree(tc, uuid, journal.getWriter(), editor); - if (trees.putIfAbsent(name, newTree) != null) { - return null; - } - return newTree; - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/DefaultJungleTree.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle; - -import jp.ac.u_ryukyu.ie.cr.list.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeContext; -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.transaction.DefaultJungleTreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTransactionManager; -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.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.GetOldTreeError; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; -import jp.ac.u_ryukyu.ie.cr.treemap.TreeMap; - -import java.util.concurrent.atomic.AtomicReference; - -public class DefaultJungleTree implements JungleTree { - - private final AtomicReference<TreeContext> repository; - private final String uuid; - private final ChangeListWriter writer; - private final TreeEditor treeEditor; - - public DefaultJungleTree(TreeContext tc, String uuid, ChangeListWriter writer, TreeEditor editor) { - this.repository = new AtomicReference<TreeContext>(tc); - this.uuid = uuid; - this.writer = writer; - this.treeEditor = editor; - } - - @Override - public JungleTreeEditor getTreeEditor() { - TreeContext tc = repository.get(); - DefaultTransactionManager txManager = new DefaultTransactionManager(writer, tc, repository, uuid); - TreeNode root = tc.getRoot(); - return new DefaultJungleTreeEditor(root, txManager, treeEditor); - } - - @Override - public JungleTreeEditor getLocalTreeEditor() { - return getTreeEditor(); - } - - @Override - public TreeNode getRootNode() { - TreeContext tc = repository.get(); - return tc.getRoot(); - } - - @Override - public InterfaceTraverser getTraverser(boolean useIndex) { - TreeContext tc = repository.get(); - return tc.getTraverser(); - } - - @Override - public ParentIndex getParentIndex() { - TreeContext tc = repository.get(); - return tc.getParentIndex(); - } - - @Override - public TreeMap<String, TreeMap<String, List<TreeNode>>> getIndex() { - TreeContext tc = repository.get(); - return tc.getIndex(); - } - - @Override - public long revision() { - TreeContext tc = repository.get(); - return tc.revision(); - } - - @Override - public Either<Error, JungleTree> getOldTree(long revision) { - TreeContext tc = repository.get(); - - for (; tc.revision() != revision; ) { - tc = tc.prev(); - if (tc == null) - return DefaultEither.newA(GetOldTreeError.OLD_TREE_NOT_FOUND); - } - - - String oldTreeUuid = uuid + revision; - JungleTree oldTree = new DefaultJungleTree(tc, oldTreeUuid, writer, treeEditor); - return DefaultEither.newB(oldTree); - } - - @Override - public Either<Error, TreeNode> getNodeOfPath(NodePath path) { - TreeNode node = repository.get().getRoot(); - for (int num : path) { - if (num == -1) - continue; - Either<Error, TreeNode> either = node.getChildren().at(num); - if (either.isA()) - return either; - node = either.b(); - } - return DefaultEither.newB(node); - } - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/Jungle.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle; - - -public interface Jungle -{ - public JungleTree getTreeByName(String name); - public JungleTree createNewTree(String name); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTree.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle; - - -import jp.ac.u_ryukyu.ie.cr.list.List; -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.traverser.InterfaceTraverser; -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.ParentIndex; -import jp.ac.u_ryukyu.ie.cr.treemap.TreeMap; - -public interface JungleTree { - public JungleTreeEditor getTreeEditor(); - - public JungleTreeEditor getLocalTreeEditor(); - - public TreeNode getRootNode(); - - public long revision(); - - public Either<Error, JungleTree> getOldTree(long revision); - - public TreeMap<String, TreeMap<String, List<TreeNode>>> getIndex(); - - public ParentIndex getParentIndex(); - - public InterfaceTraverser getTraverser(boolean useIndex); - - public Either<Error, TreeNode> getNodeOfPath(NodePath path); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/JungleTreeEditor.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle; - -import java.nio.ByteBuffer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -public interface JungleTreeEditor -{ - - public Either<Error,JungleTreeEditor> addNewChildAt(NodePath path,int pos); - public Either<Error,JungleTreeEditor> deleteChildAt(NodePath path,int pos); - public Either<Error,JungleTreeEditor> putAttribute(NodePath path,String key,ByteBuffer value); - public Either<Error,JungleTreeEditor> deleteAttribute(NodePath path,String key); - public Either<Error,JungleTreeEditor> edit(NodePath path,NodeEditor editor); - public Either<Error,JungleTreeEditor> success(); - public Either<Error, JungleTreeEditor> replaceNewRootNode(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/App.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core; - -import java.nio.ByteBuffer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle; -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.store.impl.DefaultNodePath; -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.traverser.DefaultTraverser; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -/** - * Hello world! - * - */ -public class App -{ - public static void main( String[] args ) - { - DefaultJungle jungle = new DefaultJungle(null,"sample", new DefaultTreeEditor(new DefaultTraverser())); - jungle.createNewTree("hoge"); - JungleTree tree = jungle.getTreeByName("hoge"); - JungleTreeEditor editor = tree.getTreeEditor(); - DefaultNodePath path = new DefaultNodePath(); - - String key = "key"; - ByteBuffer value = ByteBuffer.wrap(key.getBytes()); - - Either<Error,JungleTreeEditor> either = editor.putAttribute(path,"key",value); - JungleTreeEditor e = either.b(); - e.success(); - - - TreeNode root = tree.getRootNode(); - ByteBuffer v = root.getAttributes().get(key); - String str = new String(v.array()); - System.out.println(str); - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/Attributes.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core; - -import java.nio.ByteBuffer; - -public interface Attributes -{ - public ByteBuffer get(String key); - public String getString(String key); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/AttributesContainer.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -//package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core; -// -//public interface AttributesContainer -//{ -// public Attributes getAttributes(); -//}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/Children.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -public interface Children extends Iterable<TreeNode> -{ - public Either<Error,TreeNode> at(int pos); - public int size(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/error/BasicErrors.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.error; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError; - -public class BasicErrors -{ - public static final Error NULL_VALUE_NOT_ALLOWED = new DefaultError(); - public static final Error INDEX_OUT_OF_BOUNDS = new DefaultError(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/ChangeList.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; - -public interface ChangeList extends Iterable<TreeOperation> -{ - public String uuid(); - public String getTreeName(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/ChangeListReader.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent; - -public interface ChangeListReader extends Iterable<ChangeList> -{ - public ChangeListReader newReader(); - public ChangeList read(); - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/ChangeListWriter.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent; - -public interface ChangeListWriter -{ - public Result write(ChangeList operations); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/DefaultChangeListReader.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent; - -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; -import java.util.Iterator; -import java.util.LinkedList; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; - -// not thread safe -public class DefaultChangeListReader implements ChangeListReader -{ - private long pos; - private ByteBuffer buf; - private FileChannel ch; - - DefaultChangeListReader(FileChannel ch,ByteBuffer buf,long pos) - { - this.pos = pos; - this.buf = buf; - this.ch = ch; - } - - @Override - public ChangeListReader newReader() - { - return new DefaultChangeListReader(ch,buf.asReadOnlyBuffer(),pos); - } - - @Override - public ChangeList read() - { - LinkedList<TreeOperation> list = new LinkedList<TreeOperation>(); - - int size = buf.getInt(); - if(size == 0){ - - } - - return null; - } - - @Override - public Iterator<ChangeList> iterator() { - return null; - } - - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/DefaultChangeListWriter.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent; - -import java.nio.ByteBuffer; - - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; - -public class DefaultChangeListWriter implements ChangeListWriter -{ - public DefaultChangeListWriter(ByteBuffer buf) - { - - } - - @Override - public synchronized Result write(ChangeList operations) - { - for(TreeOperation op : operations){ - ByteBuffer treeOpBuf = serializeTreeOperation(op); - } - return null; - } - - private ByteBuffer serializeTreeOperation(TreeOperation op) - { - - return null; - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/DefaultJournal.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,113 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.nio.ByteBuffer; -import java.nio.MappedByteBuffer; -import java.nio.channels.FileChannel; -import java.nio.channels.FileChannel.MapMode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -/* - * text based journal. - * - * non terminal symbols - * - * JOURNAL => CHANGELISTS - * CHANGE_LISTS => CHANGE_LIST | CHANGE_LISTS - * CHANGE_LISTS => *EMPTY* - * - * CHANGE_LIST => OPERATIONS - * OPERATIONS => OPERATION CR | OPERATIONS - * OPERATIONS => *EMPTY* - - * OPERATION => APPEND_CHILD | DELETE_CHILD | PUT_ATTRIBUTE | DELETE_ATTRIBUTE | COMMIT - * APPEND_CHILD => APPEND_CHILD_ID NODE_PATH INSERT_POSITION - * DELETE_CHILD => DELETE_CHILD_ID NODE_PATH DELETE_POSITION - * PUT_ATTRIBUTE => PUT_ATTRIBUTE_ID NODE_PATH KEY VALUE - * DELETE_ATTRIBUTE => DELTE_ATTRIBUTE_ID NODE_PATH KEY - * COMMIT => COMMIT_ID - * - * NODE_PATH => POSITION "." NODE_PATH | POSITION - * - * terminal symbols - * - * APPEND_CHILD_ID = "APPEND_CHILD" - * DELETE_CHILD_ID = "DELETE_CHILD" - * PUT_ATTRIBUTE_ID = "PUT_ATTRIBUTE" - * SET_ATTRIBUTE_ID = "SET_ATTRIBUTE" - * COMMIT_ID => "COMMIT" - * CR => \n - * INSERT_POSITION => INTEGER - * DELETE_POSITION => INTEGER - * KEY => "*" - * VALUE => "*" - * - */ - -public class DefaultJournal implements Journal -{ - private final ChangeListWriter writer; - - public static void main(String args[]) throws Exception - { - RandomAccessFile f = new RandomAccessFile("./miscs/1.dat","rw"); - MappedByteBuffer a = f.getChannel().map(MapMode.READ_WRITE,10,10); - MappedByteBuffer b = f.getChannel().map(MapMode.READ_WRITE,10,10); - MappedByteBuffer c = f.getChannel().map(MapMode.READ_WRITE,20,10); - - a.putInt(5); - System.out.println(b.getInt()); - c.putInt(2); - a.force(); - b.force(); - c.force(); - - System.out.println(b.capacity()); - MappedByteBuffer d = f.getChannel().map(MapMode.READ_WRITE,50,10); - d.putInt(2); - d.force(); - System.out.println(d.getInt()); - } - - public static final int READ_BUFFER_SIZE = 1000000; // 1MB - public static final int WRITE_BUFFER_SIZE = 1000000; // 1MB - - private DefaultJournal() - { - writer = null; - } - - public static Either<Error,DefaultJournal> newInstance(String fileName) - { - RandomAccessFile journal = null; - try{ - journal = new RandomAccessFile(fileName,"rw"); - FileChannel ch = journal.getChannel(); - long length = journal.length(); - ByteBuffer readBuf = ch.map(MapMode.READ_ONLY,0,READ_BUFFER_SIZE); - ByteBuffer writeBuf = ch.map(MapMode.READ_WRITE,length,WRITE_BUFFER_SIZE); - - }catch(FileNotFoundException _e){ - _e.printStackTrace(); - return null; // should return Error here. - }catch(IOException _e){ - _e.printStackTrace(); - } - return null; - } - - @Override - public ChangeListReader getReader() - { - return null; - } - - @Override - public ChangeListWriter getWriter() - { - return writer; - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/DefaultJournalWriter.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.RandomAccessFile; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; - -public class DefaultJournalWriter -{ - public DefaultJournalWriter(String _fileName) - { - - } - - public static Either<Error,DefaultJournalWriter> newInstance(String fileName) - { - RandomAccessFile journal = null; - try{ - journal = new RandomAccessFile(fileName,"rw"); - //FileChannel ch = journal.getChannel(); - long length = journal.length(); - }catch(FileNotFoundException e){ - - }catch(IOException e){ - - } - - return null; - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/Journal.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent; - -public interface Journal -{ - public ChangeListReader getReader(); - public ChangeListWriter getWriter(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/NullJournal.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent; - - -import java.util.Iterator; - - - -public class NullJournal implements Journal -{ - private static final NullChangeListWriter NULL_WRITER = new NullChangeListWriter(); - private static final NullChangeListReader NULL_READER = new NullChangeListReader(); - - @Override - public ChangeListReader getReader() - { - return NULL_READER; - } - - @Override - public ChangeListWriter getWriter() - { - return NULL_WRITER; - } - - private static class NullChangeListWriter implements ChangeListWriter - { - @Override - public Result write(ChangeList operations) - { - /* - for(TreeOperation op : _operations){ - NodePath p = op.getNodePath(); - NodeOperation nodeOp = op.getNodeOperation(); - Command c = nodeOp.getCommand(); - String args = ""; - switch(c){ - case PUT_ATTRIBUTE: - String key = nodeOp.getKey(); - ByteBuffer value = nodeOp.getValue(); - if(value.limit() < 100){ - args = String.format("key:%s,value:%s",key,new String(value.array())); - }else{ - args = String.format("key:%s,value:%d",key,value.limit()); - } - break; - case DELETE_ATTRIBUTE: - args = String.format("key:%s",nodeOp.getKey()); - break; - case APPEND_CHILD: - args = String.format("pos:%d",nodeOp.getPosition()); - break; - case DELETE_CHILD: - args = String.format("pos:%d",nodeOp.getPosition()); - break; - } - System.out.println(String.format("[%s:%s:%s]",c,p,args)); - } - */ - return Result.SUCCESS; - } - } - - private static class NullChangeListReader implements ChangeListReader - { - @Override - public ChangeListReader newReader() - { - return this; - } - - @Override - public ChangeList read() - { - return null; - } - - @Override - public Iterator<ChangeList> iterator() { - return null; - } - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/persistent/Result.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent; - -public class Result -{ - public static Result SUCCESS = new Result(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/Command.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store; - -public enum Command -{ - APPEND_CHILD, - DELETE_CHILD, - PUT_ATTRIBUTE, - DELETE_ATTRIBUTE, - REPLACE_ROOT; -} \ No newline at end of file
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/Constants.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store; - -public class Constants -{ - public static final String DEFAULT_OWNER = "default"; - public static final long DEFAULT_REVISION_START_NUMBER = 0; -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/NodePath.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; - -public interface NodePath extends Iterable<Integer> -{ - public NodePath add(int pos); - public Pair<Integer,NodePath> pop(); - public NodePath tail(); - public int size(); - public Pair<Integer,NodePath> last(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/NulIterator.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store; - -import java.util.Iterator; - -public class NulIterator<T> implements Iterator<T> { - - @Override - public boolean hasNext() { - // TODO Auto-generated method stub - return false; - } - - @Override - public T next() { - // TODO Auto-generated method stub - return null; - } - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/Transaction.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -public interface Transaction<T> -{ - public Either<Error,T> success(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/TreeContext.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,32 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store; - - -import jp.ac.u_ryukyu.ie.cr.list.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; -import jp.ac.u_ryukyu.ie.cr.treemap.TreeMap; - -public interface TreeContext { - public TreeNode getRoot(); - - public TreeContext prev(); - - public ChangeList getChangeList(); - - public String uuid(); - - public String getTreeName(); - - public long revision(); - - public TreeMap<String, TreeMap<String, List<TreeNode>>> getIndex(); - - public Iterable<TreeOperation> getOperations(); - - public ParentIndex getParentIndex(); - - public InterfaceTraverser getTraverser(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/TreeEditor.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -public interface TreeEditor -{ - public Either<Error,LoggingNode> edit(TreeNode root,NodePath path,NodeEditor transformer); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/TreeEditorError.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError; - -public class TreeEditorError -{ - public static final Error NODEPATH_NOTFOUND = new DefaultError(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultNodePath.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; - - -import jp.ac.u_ryukyu.ie.cr.list.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; - -import java.util.Iterator; - -public class DefaultNodePath implements NodePath { - private final List<Integer> path; - - public static void main(String args[]) { - DefaultNodePath p = new DefaultNodePath(); - p = p.add(1).add(2).add(3).add(4); - System.out.println(p.toString()); - } - - public DefaultNodePath() { - path = new List<Integer>().addLast(-1); - } - - private DefaultNodePath(List<Integer> path) { - this.path = path; - } - - @Override - public Iterator<Integer> iterator() { - return path.iterator(); - } - - @Override - public DefaultNodePath add(int pos) { - List<Integer> newPath = path.addLast(pos); - return new DefaultNodePath(newPath); - } - - @Override - public Pair<Integer, NodePath> pop() { - Integer head = path.head(); - List<Integer> tail = path.deleteHead(); - - return new Pair<Integer, NodePath>(head, new DefaultNodePath(tail)); - } - - @Override - public Pair<Integer, NodePath> last() { - Integer last = path.head(); - List<Integer> list = path.deleteHead(); - return new Pair<Integer, NodePath>(last, new DefaultNodePath(list)); - } - - @Override - public String toString() { - return path.toString(); - } - - @Override - public int size() { - return path.length(); - } - - - //PATHの一番後ろを取り除いたPATHを新しく作って返す -// EXAMPLE <0,0,3> → <0,0> - @Override - public NodePath tail() { - List<Integer> tail = path.deleteLast(); - return new DefaultNodePath(tail); - } - - public List<DefaultNodePath> inits() { - List<DefaultNodePath> paths = new List(); - List<Integer> coursePath = new List(); - Iterator<Integer> iterator = path.reverseIterator(); - while (iterator.hasNext()) { - List<Integer> tmp = coursePath.addLast(iterator.next()); - paths = paths.add(1,new DefaultNodePath(tmp)); - coursePath = tmp; - } - return paths; - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; - - -import jp.ac.u_ryukyu.ie.cr.list.List; -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.logger.LoggingNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultEvaluator; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Direction; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traversal; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traverser; -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; - -public class DefaultTreeEditor implements TreeEditor -{ - private final Traverser traverser; - public DefaultTreeEditor(Traverser traverser) - { - this.traverser = traverser; - } - - @Override - public Either<Error,LoggingNode> edit(TreeNode root,NodePath path,NodeEditor editor) - { - DefaultEvaluator e = new DefaultEvaluator(path); - Either<Error, Traversal> either = traverser.traverse(root,e); - - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - - Traversal t = either.b(); - Either<Error,LoggingNode> ret = clone(t,editor); - - return ret; - } - - private Either<Error,LoggingNode> clone(Traversal t,NodeEditor editor) - { - // copying nodes from bottom to root - - List<Direction<TreeNode>> path = new List(); - for(Direction<TreeNode> direction : t){ - path = path.addLast(direction); - } - - // target - Direction<TreeNode> targetDirection = path.last(); - TreeNode target = targetDirection.getTarget(); - Either<Error,LoggingNode> either = editor.edit(target); - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - - LoggingNode newWrap = either.b(); - - // top - int pos = targetDirection.getPosition(); - TreeNode child = newWrap.getWrap(); - - - for(Direction<TreeNode> parentDirection : path.deleteLast()){ - - TreeNodeChildren chs = parentDirection.getTarget().getChildren(); - - Either<Error,TreeNode> ret = chs.replaceNode(pos,child); - if(ret.isA()){ - return DefaultEither.newA(ret.a()); - } - - TreeNode newParent = ret.b(); - child = newParent; - pos = parentDirection.getPosition(); - } - - TreeNode newRoot = child; - LoggingNode logNode = editor.wrap(newRoot,newWrap.getOperationLog()); - return DefaultEither.newB(logNode); - } - -} \ No newline at end of file
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/IndexTreeEditor.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; - - -import jp.ac.u_ryukyu.ie.cr.list.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultEvaluator; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Direction; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traversal; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traverser; -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; - -public class IndexTreeEditor { - - private final Traverser traverser; - - - public IndexTreeEditor(Traverser traverser) - { - this.traverser = traverser; - } - - - public Either<Error,LoggingNode> edit(TreeNode root,NodePath path,NodeEditor editor) - { - DefaultEvaluator e = new DefaultEvaluator(path); - Either<Error, Traversal> either = traverser.traverse(root,e); - - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - - Traversal t = either.b(); - Either<Error,LoggingNode> ret = clone(t,editor); - - return ret; - } - - private Either<Error,LoggingNode> clone(Traversal t,NodeEditor editor) - { - // copying nodes from bottom to root - List<Direction<TreeNode>> path = new List(); - for (Direction<TreeNode> direction : t) { - path = path.addLast(direction); - } - - // target - Direction<TreeNode> targetDirection = path.head(); - TreeNode target = targetDirection.getTarget(); - - Either<Error, LoggingNode> either = editor.edit(target); - if (either.isA()) { - return DefaultEither.newA(either.a()); - } - - LoggingNode newWrap = either.b(); - - // top - int pos = targetDirection.getPosition(); - TreeNode child = newWrap.getWrap(); - - for (Direction<TreeNode> parentDirection : path.deleteLast()) { - TreeNode updateTargetNode = parentDirection.getTarget(); - TreeNodeChildren chs = updateTargetNode.getChildren(); - - - - Either<Error, TreeNode> ret = chs.replaceNode(pos, child); - if (ret.isA()) { - return DefaultEither.newA(ret.a()); - } - - TreeNode newParent = ret.b(); - - child = newParent; - pos = parentDirection.getPosition(); - } - - TreeNode newRoot = child; - LoggingNode logNode = editor.wrap(newRoot, newWrap.getOperationLog()); - - - return DefaultEither.newB(logNode); - } - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNode.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - - -public interface TreeNode extends Comparable<TreeNode> { - public TreeNodeChildren getChildren(); - - public TreeNodeAttributes getAttributes(); - - public TreeNode createNewNode(); - - public Either<Error, TreeNode> appendRootNode(); - - public String getNodeId(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNodeAttributes.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Attributes; -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.treemap.TreeMap; - -import java.nio.ByteBuffer; -import java.util.Iterator; - -public interface TreeNodeAttributes extends Attributes -{ - public Either<Error,TreeNode> delete(String key); - public Either<Error,TreeNode> put(String key,ByteBuffer value); - public TreeMap<String,ByteBuffer> getAttributesAsRawMap(); - public Iterator<String> getKeys(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNodeChildren.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; - -import jp.ac.u_ryukyu.ie.cr.list.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -public interface TreeNodeChildren extends Children -{ - public Either<Error,TreeNode> addNewChildAt(int pos); - public Either<Error,TreeNode> deleteChildAt(int pos); - public Either<Error,TreeNode> addNewChildAt(int pos,TreeNode newChild); - public Either<Error,TreeNode> replaceNode(int pos,TreeNode replacement); - public List<TreeNode> getChildrenAsRawList(); -} \ No newline at end of file
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/DefaultOperationLog.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger; - - -import jp.ac.u_ryukyu.ie.cr.list.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; - -import java.util.Iterator; - -public class DefaultOperationLog implements OperationLog -{ - private final List<NodeOperation> log; - - private static final List<NodeOperation> EMPTY =new List<>(); - - public DefaultOperationLog() - { - this(EMPTY); - } - - private DefaultOperationLog(List<NodeOperation> _log) - { - log = _log; - } - - @Override - public Iterator<NodeOperation> iterator() - { - return log.iterator(); - } - - - @Override - public DefaultOperationLog add(NodeOperation _op) - { - return new DefaultOperationLog(log.addLast(_op)); - } - - @Override - public int length() - { - return log.length(); - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/DefaultTreeOperationLog.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger; - -import com.google.common.collect.Iterables; -import jp.ac.u_ryukyu.ie.cr.list.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DefaultTreeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; - -import java.util.Iterator; - -public class DefaultTreeOperationLog implements TreeOperationLog -{ - private final Iterable<TreeOperation> list; - private final int size; - - public DefaultTreeOperationLog() - { - list = new List<>(); - size = 0; - } - - public DefaultTreeOperationLog(Iterable<TreeOperation> _list,int _size) - { - list = _list; - size = _size; - } - - @Override - public Iterator<TreeOperation> iterator() - { - return list.iterator(); - } - - @Override - public TreeOperationLog add(NodePath _p, NodeOperation _op) - { - TreeOperation op = new DefaultTreeOperation(_p,_op); - List<TreeOperation> newList = new List(op); - Iterable<TreeOperation> concat = Iterables.concat(list,newList); - - return new DefaultTreeOperationLog(concat,size + 1); - } - - @Override - public TreeOperationLog append(TreeOperationLog _log) - { - int argumentLogSize = _log.length(); - Iterable<TreeOperation> concat = Iterables.concat(list,_log); - - return new DefaultTreeOperationLog(concat,argumentLogSize + size); - } - - @Override - public int length() - { - return size; - } - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingAttributes.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger; - -import java.nio.ByteBuffer; - -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 jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DeleteAttributeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.PutAttributeOperation; -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; - -public class LoggingAttributes //implements EditableAttributes -{ - private final TreeNode wrap; - private final OperationLog log; - - public LoggingAttributes(TreeNode _wrap,OperationLog _log) - { - wrap = _wrap; - log = _log; - } - - public ByteBuffer get(String _key) - { - TreeNodeAttributes attributes = wrap.getAttributes(); - return attributes.get(_key); - } - - private Either<Error,LoggingNode> edit(NodeOperation _op) - { - Either<Error,TreeNode> either = _op.invoke(wrap); - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - - TreeNode newNode = either.b(); - OperationLog newLog = log.add(_op); - LoggingNode newLogNode = new LoggingNode(newNode,newLog); - - return DefaultEither.newB(newLogNode); - } - - public Either<Error,LoggingNode> delete(final String _key) - { - - DeleteAttributeOperation deleteAttribute = new DeleteAttributeOperation(_key); - return edit(deleteAttribute); - } - - public Either<Error,LoggingNode> put(final String _key,final ByteBuffer _value) - { - PutAttributeOperation putAttribute = new PutAttributeOperation(_key,_value); - return edit(putAttribute); - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingChildren.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger; - - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.AppendChildAtOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DeleteChildAtOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -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; - -public class LoggingChildren -{ - private final TreeNode wrap; - private final OperationLog log; - - public LoggingChildren(TreeNode _wrap,OperationLog _log) - { - wrap = _wrap; - log = _log; - } - - public int size() - { - Children children = wrap.getChildren(); - return children.size(); - } - - public Either<Error,LoggingNode> edit(NodeOperation _op) - { - Either<Error,TreeNode> either = _op.invoke(wrap); - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - - TreeNode newWrap = either.b(); - OperationLog newLog = log.add(_op); - LoggingNode newLoggingNode = new LoggingNode(newWrap,newLog); - return DefaultEither.newB(newLoggingNode); - } - - public Either<Error,LoggingNode> addNewChildAt(final int _pos) - { - NodeOperation addNewChildAt = new AppendChildAtOperation(_pos); - return edit(addNewChildAt); - } - - public Either<Error,LoggingNode> deleteChildAt(final int _pos) - { - NodeOperation deleteChildAt = new DeleteChildAtOperation(_pos); - return edit(deleteChildAt); - } - - public Either<Error,LoggingNode> at(int _pos) - { - Children children = wrap.getChildren(); - Either<Error,TreeNode> either = children.at(_pos); - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - - TreeNode node = either.b(); - LoggingNode logNode = new LoggingNode(node); - return DefaultEither.newB(logNode); - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingNode.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.ReplaceRootNodeOperation; -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; - - -public class LoggingNode -{ - - private final TreeNode wrap; - private final OperationLog log; - - public LoggingNode(TreeNode _wrap) - { - this(_wrap,new DefaultOperationLog()); - } - - public LoggingNode(TreeNode _wrap,OperationLog _log) - { - wrap = _wrap; - log = _log; - } - - public LoggingAttributes getAttributes() - { - return new LoggingAttributes(wrap,log); - } - - public LoggingChildren getChildren() - { - return new LoggingChildren(wrap,log); - } - - - public OperationLog getOperationLog() - { - return log; - } - - - public Either<Error, LoggingNode> replaceNewRootNode() { - NodeOperation replaceRootNode = new ReplaceRootNodeOperation(); - return edit(replaceRootNode); - } - - public Either<Error, LoggingNode> edit(NodeOperation op){ - Either<Error,TreeNode> either = op.invoke(wrap); - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - - TreeNode newWrap = either.b(); - OperationLog newLog = log.add(op); - LoggingNode newLoggingNode = new LoggingNode(newWrap,newLog); - return DefaultEither.newB(newLoggingNode); - } - - public TreeNode getWrap() - { - return wrap; - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/OperationLog.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; - - -public interface OperationLog extends Iterable<NodeOperation> -{ - public OperationLog add(NodeOperation _op); - public int length(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/TreeOperationLog.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; - -public interface TreeOperationLog extends Iterable<TreeOperation> -{ - public TreeOperationLog add(NodePath _p,NodeOperation _op); - public TreeOperationLog append(TreeOperationLog _log); - public int length(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/AppendChildAtOperation.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations; - -import java.nio.ByteBuffer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - - -public final class AppendChildAtOperation implements NodeOperation -{ - private final int pos; - - public AppendChildAtOperation(int _pos) - { - pos = _pos; - } - - public Command getCommand() - { - return Command.APPEND_CHILD; - } - - @Override - public Either<Error,TreeNode> invoke(TreeNode _target) - { - return _target.getChildren().addNewChildAt(pos); - } - - @Override - public int getPosition() - { - return pos; - } - - @Override - public String getKey() - { - return null; - } - - @Override - public ByteBuffer getValue() - { - return null; - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DefaultTreeOperation.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; - -public class DefaultTreeOperation implements TreeOperation -{ - private final NodePath path; - private final NodeOperation operation; - - public DefaultTreeOperation(NodePath _path,NodeOperation _operation) - { - path = _path; - operation = _operation; - } - - @Override - public NodePath getNodePath() - { - return path; - } - - @Override - public NodeOperation getNodeOperation() - { - return operation; - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteAttributeOperation.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations; - -import java.nio.ByteBuffer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -public final class DeleteAttributeOperation implements NodeOperation -{ - private final String key; - - public DeleteAttributeOperation(String _key) - { - key = _key; - } - - @Override - public Command getCommand() - { - return Command.DELETE_ATTRIBUTE; - } - - @Override - public Either<Error, TreeNode> invoke(TreeNode _target) - { - return _target.getAttributes().delete(key); - } - - @Override - public int getPosition() - { - return -1; - } - - @Override - public String getKey() - { - return key; - } - - @Override - public ByteBuffer getValue() - { - return null; - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteChildAtOperation.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations; - -import java.nio.ByteBuffer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -public class DeleteChildAtOperation implements NodeOperation -{ - private final int pos; - - public DeleteChildAtOperation(int _pos) - { - pos = _pos; - } - - @Override - public Command getCommand() - { - return Command.DELETE_CHILD; - } - - @Override - public Either<Error, TreeNode> invoke(TreeNode _target) - { - return _target.getChildren().deleteChildAt(pos); - } - - @Override - public int getPosition() - { - return pos; - } - - @Override - public String getKey() - { - return null; - } - - @Override - public ByteBuffer getValue() - { - return null; - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/NodeOperation.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations; - -import java.nio.ByteBuffer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -public interface NodeOperation -{ - public Command getCommand(); - public Either<Error,TreeNode> invoke(TreeNode _target); - - public int getPosition(); - public String getKey(); - public ByteBuffer getValue(); -} - -
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/PutAttributeOperation.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations; - -import java.nio.ByteBuffer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - - -public class PutAttributeOperation implements NodeOperation -{ - private final String key; - private final ByteBuffer value; - - public PutAttributeOperation(String _key,ByteBuffer _value) - { - key = _key; - value = _value; - } - - @Override - public Command getCommand() - { - return Command.PUT_ATTRIBUTE; - } - - @Override - public Either<Error,TreeNode> invoke(TreeNode _target) - { - return _target.getAttributes().put(key,value); - } - @Override - public int getPosition() - { - return -1; - } - - @Override - public String getKey() - { - return key; - } - - @Override - public ByteBuffer getValue() - { - return value; - } -} \ No newline at end of file
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/ReplaceRootNodeOperation.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations; - -import java.nio.ByteBuffer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -public class ReplaceRootNodeOperation implements NodeOperation { - - @Override - public Command getCommand() { - return Command.REPLACE_ROOT; - } - - @Override - public Either<Error, TreeNode> invoke(TreeNode target) { - return target.appendRootNode(); - } - - @Override - public int getPosition() { - return -1; - } - - @Override - public String getKey() { - return null; - } - - @Override - public ByteBuffer getValue() { - return null; - } - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/TreeOperation.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; - -public interface TreeOperation -{ - public NodePath getNodePath(); - public NodeOperation getNodeOperation(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/AppendChildAt.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog; -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; - -public class AppendChildAt implements NodeEditor -{ - private final int pos; - - public AppendChildAt(int _pos) - { - pos = _pos; - } - - public Either<Error, LoggingNode> _edit(LoggingNode _e) - { - Either<Error,LoggingNode> either = _e.getChildren().addNewChildAt(pos); - if(either.isA()){ - // error - return either; - } - return DefaultEither.newB(either.b()); - } - - @Override - public Either<Error, LoggingNode> edit(TreeNode _e) { - LoggingNode logNode = wrap(_e); - return _edit(logNode); - } - - public LoggingNode wrap(TreeNode node) { - return new LoggingNode(node); - } - - @Override - public LoggingNode wrap(TreeNode node, OperationLog op) { - return new LoggingNode(node, op); - } - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DeleteAttribute.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; - - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog; -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; - -public class DeleteAttribute implements NodeEditor -{ - private final String key; - public DeleteAttribute(String _key) - { - key = _key; - } - - public Either<Error,LoggingNode> _edit(LoggingNode logNode) - { - Either<Error,LoggingNode> either = logNode.getAttributes().delete(key); - if(either.isA()){ - // error - return either; - } - return DefaultEither.newB(either.b()); - } - - @Override - public Either<Error, LoggingNode> edit(TreeNode _e) { - LoggingNode logNode = wrap(_e); - return _edit(logNode); - } - - public LoggingNode wrap(TreeNode node) { - return new LoggingNode(node); - } - - @Override - public LoggingNode wrap(TreeNode node, OperationLog op) { - return new LoggingNode(node, op); - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DeleteChildAt.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; - - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog; -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; - -public class DeleteChildAt implements NodeEditor -{ - private final int pos; - public DeleteChildAt(int _pos) - { - pos = _pos; - } - - public Either<Error,LoggingNode> _edit(LoggingNode logNode) - { - Either<Error,LoggingNode> either = logNode.getChildren().deleteChildAt(pos); - if(either.isA()){ - // error - return either; - } - return DefaultEither.newB(either.b()); - } - - @Override - public Either<Error, LoggingNode> edit(TreeNode _e) { - LoggingNode logNode = wrap(_e); - return _edit(logNode); - } - - public LoggingNode wrap(TreeNode node) { - return new LoggingNode(node); - } - - @Override - public LoggingNode wrap(TreeNode node, OperationLog op) { - return new LoggingNode(node, op); - } - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/NodeEditor.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; - - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -public interface NodeEditor -{ - public Either<Error,LoggingNode> edit(TreeNode _e); - public LoggingNode wrap(TreeNode node, OperationLog op); -} \ No newline at end of file
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/NodeEditorError.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError; - -public class NodeEditorError -{ - public static final Error INDEX_OUT_OF_BOUNDS = new DefaultError(); - public static final Error DELETE_KEY_NOT_FOUND = new DefaultError(); - public static final Error NULL_VALUE_NOT_ALLOWED = new DefaultError(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/PutAttribute.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; - -import java.nio.ByteBuffer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog; -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; - -public class PutAttribute implements NodeEditor -{ - private final String key; - private final ByteBuffer value; - - public PutAttribute(String _key,ByteBuffer _value) - { - key = _key; - value = _value; - } - - public Either<Error,LoggingNode> _edit(LoggingNode _e) - { - Either<Error,LoggingNode> either = _e.getAttributes().put(key,value); - if(either.isA()){ - // error - return either; - } - return DefaultEither.newB(either.b()); - } - - @Override - public Either<Error, LoggingNode> edit(TreeNode _e) { - LoggingNode logNode = wrap(_e); - return _edit(logNode); - } - - public LoggingNode wrap(TreeNode node) { - return new LoggingNode(node); - } - - @Override - public LoggingNode wrap(TreeNode node, OperationLog op) { - return new LoggingNode(node, op); - } - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/replaceRootNodeAt.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog; -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; - -public class replaceRootNodeAt implements NodeEditor { - - - public Either<Error, LoggingNode> _edit(LoggingNode _e) - { - Either<Error,LoggingNode> either = _e.replaceNewRootNode(); - if(either.isA()){ - // error - return either; - } - return DefaultEither.newB(either.b()); - } - - - @Override - public Either<Error, LoggingNode> edit(TreeNode _e) { - LoggingNode logNode = wrap(_e); - return _edit(logNode); - } - - public LoggingNode wrap(TreeNode node) { - return new LoggingNode(node); - } - - - @Override - public LoggingNode wrap(TreeNode node, OperationLog op) { - return new LoggingNode(node, op); - } - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultJungleTreeEditor.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,133 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction; - -import java.nio.ByteBuffer; - -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.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.DefaultTreeOperationLog; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DefaultTreeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.AppendChildAt; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.replaceRootNodeAt; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteAttribute; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteChildAt; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.PutAttribute; -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.IterableConverter; - -public class DefaultJungleTreeEditor implements JungleTreeEditor -{ - private final TransactionManager txManager; - private final TreeNode root; - private final TreeEditor editor; - private final TreeOperationLog log; - - - public DefaultJungleTreeEditor(TreeNode _root,TransactionManager _txManager,TreeEditor _editor) - { - this(_root,_txManager,_editor,new DefaultTreeOperationLog()); - } - - - - public DefaultJungleTreeEditor(TreeNode newNode,TransactionManager _txManager,TreeEditor _editor,TreeOperationLog _log) - { - this.root = newNode; - this.txManager = _txManager; - this.editor = _editor; - this.log = _log; - } - - private Either<Error,JungleTreeEditor> _edit(final NodePath _path,NodeEditor _e) - { - Either<Error,LoggingNode> either = editor.edit(root,_path,_e); - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - - LoggingNode newLogging = either.b(); - OperationLog newLog = newLogging.getOperationLog(); - TreeNode newNode = newLogging.getWrap(); - - IterableConverter.Converter<TreeOperation,NodeOperation> converter = new IterableConverter.Converter<TreeOperation,NodeOperation>(){ - @Override - public TreeOperation conv(NodeOperation _b){ - return new DefaultTreeOperation(_path,_b); - } - }; - - Iterable<TreeOperation> iterable = new IterableConverter<TreeOperation,NodeOperation>(newLog,converter); - DefaultTreeOperationLog treeOperationLog = new DefaultTreeOperationLog(iterable,newLog.length()); - TreeOperationLog newTreeOpLog = log.append(treeOperationLog); - - JungleTreeEditor newEditor = new DefaultJungleTreeEditor(newNode,txManager,editor,newTreeOpLog); - return DefaultEither.newB(newEditor); - } - - @Override - public Either<Error,JungleTreeEditor> replaceNewRootNode() - { - replaceRootNodeAt appendChildAt = new replaceRootNodeAt(); - return _edit(new DefaultNodePath(),appendChildAt); - } - - @Override - public Either<Error,JungleTreeEditor> addNewChildAt(NodePath _path, int _pos) - { - AppendChildAt appendChildAt = new AppendChildAt(_pos); - return _edit(_path,appendChildAt); - } - - @Override - public Either<Error,JungleTreeEditor> deleteChildAt(NodePath _path, int _pos) - { - DeleteChildAt deleteChildAt = new DeleteChildAt(_pos); - return _edit(_path,deleteChildAt); - } - - @Override - public Either<Error,JungleTreeEditor> putAttribute(NodePath _path,String _key,ByteBuffer _value) - { - PutAttribute putAttribute = new PutAttribute(_key,_value); - return _edit(_path,putAttribute); - } - - @Override - public Either<Error,JungleTreeEditor> deleteAttribute(NodePath _path, String _key) - { - DeleteAttribute deleteAttribute = new DeleteAttribute(_key); - return _edit(_path,deleteAttribute); - } - - @Override - public Either<Error,JungleTreeEditor> edit(NodePath _path,NodeEditor _editor) - { - return _edit(_path,_editor); - } - - @Override - public Either<Error,JungleTreeEditor> success() - { - Either<Error,TransactionManager> either = txManager.commit(root,log); - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - - TransactionManager newTxManager = either.b(); - JungleTreeEditor newTreeEditor = new DefaultJungleTreeEditor(root,newTxManager,editor); - - return DefaultEither.newB(newTreeEditor); - } - - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTransactionManager.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction; - - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeContext; -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.store.operations.TreeOperation; -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 java.util.Iterator; -import java.util.concurrent.atomic.AtomicReference; - -public class DefaultTransactionManager implements TransactionManager { - private final AtomicReference<TreeContext> repository; - private final TreeContext tip; - private final ChangeListWriter writer; - private final String uuid; - - public DefaultTransactionManager(ChangeListWriter _writer, TreeContext _tip, - AtomicReference<TreeContext> _repository, String _uuid) { - repository = _repository; - tip = _tip; - writer = _writer; - uuid = _uuid; - } - - @Override - public Either<Error, TransactionManager> commit(TreeNode newRoot, final TreeOperationLog _log) { - long currentRevision = tip.revision(); - long nextRevision = currentRevision + 1; - - final String _treeName = tip.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; - } - - }; - - InterfaceTraverser traverser = new InterfaceTraverser(newRoot, true); - traverser.createIndex(); - TreeContext newTreeContext = new DefaultTreeContext(newRoot , tip, list, uuid, _treeName, nextRevision,traverser); - - if (repository.compareAndSet(newTreeContext.prev(),newTreeContext)) { - TransactionManager txManager = new DefaultTransactionManager(writer, newTreeContext, repository, uuid); - return DefaultEither.newB(txManager); - } - - return DefaultEither.newA((Error) new DefaultError()); - } - - @Override - public String getUUID() { - return uuid; - } - - @Override - public long getRevision() { - return tip.revision(); - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeContext.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction; - - -import jp.ac.u_ryukyu.ie.cr.list.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeContext; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; -import jp.ac.u_ryukyu.ie.cr.treemap.TreeMap; - -public class DefaultTreeContext implements TreeContext { - private final TreeNode root; - private final TreeContext previous; - private final ChangeList changeList; - private final String uuid; - private final String treeName; - private final long revision; - private final InterfaceTraverser traverser; - - public DefaultTreeContext(TreeNode _node, TreeContext _prev, ChangeList _log, String _uuid, String _treeName, long _revision, InterfaceTraverser traverser) { - this.root = _node; - this.previous = _prev; - this.changeList = _log; - this.uuid = _uuid; - this.treeName = _treeName; - this.revision = _revision; - this.traverser = traverser; - } - - - @Override - public TreeNode getRoot() { - return root; - } - - @Override - public TreeContext prev() { - return previous; - } - - @Override - public ChangeList getChangeList() { - return changeList; - } - - @Override - public String uuid() { - return uuid; - } - - @Override - public String getTreeName() { - return treeName; - } - - @Override - public long revision() { - return revision; - } - - @Override - public Iterable<TreeOperation> getOperations() { - return changeList; - } - - @Override - public TreeMap<String, TreeMap<String, List<TreeNode>>> getIndex() { - return traverser.getIndex(); - } - - @Override - public ParentIndex getParentIndex() { - return traverser.getParentIndex(); - } - - @Override - public InterfaceTraverser getTraverser() { - return traverser; - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNode.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction; - - -import jp.ac.u_ryukyu.ie.cr.list.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeChildren; -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.treemap.TreeMap; - -import java.nio.ByteBuffer; -import java.rmi.dgc.VMID; - -public class DefaultTreeNode implements TreeNode { - private List<TreeNode> children; - private TreeMap<String, ByteBuffer> attrs; - final String nodeId = new VMID().toString(); - - private static final List<TreeNode> NIL_LIST = new List(); - - public DefaultTreeNode() { - this(NIL_LIST, new TreeMap()); - } - - public DefaultTreeNode(List<TreeNode> _children, TreeMap<String, ByteBuffer> _attrs) { - attrs = _attrs; - children = _children; - } - - @Override - public DefaultTreeNodeChildren getChildren() { - return new DefaultTreeNodeChildren(children, attrs); - } - - @Override - public DefaultTreeNodeAttribute getAttributes() { - return new DefaultTreeNodeAttribute(children, attrs); - } - - @Override - public DefaultTreeNode createNewNode() { - return new DefaultTreeNode(); - } - - public DefaultTreeNode clone() { - return new DefaultTreeNode(children, attrs); - } - - @Override - public Either<Error, TreeNode> appendRootNode() { - TreeNodeChildren newRootChildren = new DefaultTreeNodeChildren(NIL_LIST, new TreeMap()); - Either<Error, TreeNode> either = newRootChildren.addNewChildAt(0,this); - return either; - } - - @Override - public String getNodeId() { - return nodeId; - } - - @Override - public int compareTo(TreeNode o) { - return this.hashCode() - o.hashCode(); - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeAttribute.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction; - -import jp.ac.u_ryukyu.ie.cr.list.List; -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 jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditorError; -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.treemap.TreeMap; - -import java.nio.ByteBuffer; -import java.util.Iterator; -import java.util.Optional; - -public class DefaultTreeNodeAttribute implements TreeNodeAttributes { - public List<TreeNode> children; - public TreeMap<String, ByteBuffer> attrs; - - - public DefaultTreeNodeAttribute(List<TreeNode> _children, TreeMap<String, ByteBuffer> _attrs) { - children = _children; - attrs = _attrs; - } - - @Override - public TreeMap<String, ByteBuffer> getAttributesAsRawMap() { - return attrs; - } - - @Override - public Either<Error, TreeNode> delete(String _key) { - if (_key == null) { - return DefaultEither.newA(NodeEditorError.NULL_VALUE_NOT_ALLOWED); - } - - if (null == attrs.get(_key)) { - return DefaultEither.newA(NodeEditorError.DELETE_KEY_NOT_FOUND); - } - - TreeMap<String, ByteBuffer> newMap = attrs.delete(_key); - TreeNode newNode = new DefaultTreeNode(children, newMap); - return DefaultEither.newB(newNode); - } - - @Override - public Either<Error, TreeNode> put(String _key, ByteBuffer _value) { - if (_key == null || _value == null) { - return DefaultEither.newA(NodeEditorError.NULL_VALUE_NOT_ALLOWED); - } - - TreeMap<String, ByteBuffer> newMap = attrs.put(_key, _value); - TreeNode newNode = new DefaultTreeNode(children, newMap); - return DefaultEither.newB(newNode); - } - - @Override - public ByteBuffer get(String _key) { - if (_key == null) { - return null; - } - Optional<ByteBuffer> op = attrs.get(_key); - if (op.isPresent()) - return op.get(); - return null; - } - - @Override - public String getString(String key) { - ByteBuffer attribute = get(key); - if (attribute != null) - return new String(attribute.array()); - return null; - } - - @Override - public Iterator<String> getKeys() { - return attrs.keys(); - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeChildren.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction; - - -import jp.ac.u_ryukyu.ie.cr.list.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeChildren; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditorError; -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.treemap.TreeMap; - -import java.nio.ByteBuffer; -import java.util.Iterator; - -public class DefaultTreeNodeChildren implements TreeNodeChildren { - - public List<TreeNode> children; - public TreeMap<String, ByteBuffer> attrs; - - public DefaultTreeNodeChildren(List<TreeNode> _children, TreeMap<String, ByteBuffer> _attrs) { - children = _children; - attrs = _attrs; - } - - private boolean boundaryCheck(int _pos) { - int size = children.length(); - if (size < _pos) { - return false; - } - - return true; - } - - @Override - public List<TreeNode> getChildrenAsRawList() { - return children; - } - - @Override - public Either<Error, TreeNode> addNewChildAt(int _pos) { - if (!boundaryCheck(_pos) || _pos < 0) { - return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); - } - - List<TreeNode> newChildren = children.add(_pos, new DefaultTreeNode()); - TreeNode newNode = new DefaultTreeNode(newChildren, attrs); - return DefaultEither.newB(newNode); - } - - @Override - public Either<Error, TreeNode> deleteChildAt(int _pos) { - if (!boundaryCheck(_pos) || _pos < 0 || size() == 0) { - return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); - } - - List<TreeNode> newChildren = children.delete(_pos); - TreeNode newNode = new DefaultTreeNode(newChildren, attrs); - - return DefaultEither.newB(newNode); - } - - @Override - public int size() { - return children.length(); - } - - @Override - public Iterator<TreeNode> iterator() { - return children.iterator(); - } - - @Override - public Either<Error, TreeNode> replaceNode(int _pos, TreeNode _replacement) { - int size = children.length(); - if (!(0 <= _pos && _pos < size)) { - return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); - } - TreeNode replacement = _replacement; - - List<TreeNode> newChildren = children.replace(_pos, replacement); - TreeNode node = new DefaultTreeNode(newChildren, attrs); - return DefaultEither.newB(node); - } - - @Override - public Either<Error, TreeNode> at(int _pos) { - if (children.length() < _pos + 1) { - return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); - } - - TreeNode Node = children.index(_pos); - - return DefaultEither.newB(Node); - } - - @Override - public Either<Error, TreeNode> addNewChildAt(int _pos, TreeNode _newChild) { - if (!boundaryCheck(_pos) || _pos < 0) { - return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); - } - List<TreeNode> newChildren = children.add(_pos, _newChild); - TreeNode newNode = new DefaultTreeNode(newChildren, attrs); - - return DefaultEither.newB(newNode); - } - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/TransactionManager.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction; - - -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.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -public interface TransactionManager -{ - public Either<Error,TransactionManager> commit(TreeNode _newRoot,TreeOperationLog _log); - public String getUUID(); - public long getRevision(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultEvaluation.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; - -public class DefaultEvaluation implements Evaluation -{ - private final Result result; - private final Evaluator evaluator; - - public DefaultEvaluation(Result _result,Evaluator _evaluator) - { - result = _result; - evaluator = _evaluator; - } - - @Override - public Result result() - { - return result; - } - - @Override - public Evaluator evaluator() - { - return evaluator; - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultEvaluator.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; - -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.util.Pair; - -public class DefaultEvaluator implements Evaluator -{ - private final NodePath path; - - public DefaultEvaluator(NodePath _path) - { - path = _path; - } - - @Override - public Evaluation evaluate(TreeNode _current,int _pos) - { - Pair<Integer,NodePath> pop = path.pop(); - int head = pop.left(); - - if(path.size() == 1){ - if(head == _pos){ - return new DefaultEvaluation(Result.GOAL,null); - } - } - - DefaultEvaluator nextEvaluator; - Result result; - if(head == _pos){ - result = Result.ACCEPT; - nextEvaluator = new DefaultEvaluator(pop.right()); - }else{ - result = Result.CONTINUE; - nextEvaluator = null; - } - - return new DefaultEvaluation(result,nextEvaluator); - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultTraverser.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,144 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; - -import jp.ac.u_ryukyu.ie.cr.list.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditorError; -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.util.Iterator; - - -public class DefaultTraverser implements Traverser -{ - @Override - public Either<Error,Traversal> traverse(final TreeNode _root,Evaluator _evaluator) - { - Children wrapper = new Children(){ - @Override - public Iterator<TreeNode> iterator(){ - List<TreeNode> list = new List(); - return list.addLast(_root).iterator(); - } - - @Override - public int size(){ - return 1; - } - - @Override - public Either<Error,TreeNode> at(int _pos){ - if(_pos != 0){ - return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); - } - return DefaultEither.newB(_root); - } - }; - - //Children<T> chs = _root.getChildren(); - Children chs = wrapper; - - Either<Error,List<Direction<TreeNode>>> ret = _traverse(chs,_evaluator,-1); - - if(ret.isA()){ - return DefaultEither.newA(ret.a()); - } - - List<Direction<TreeNode>> list = ret.b(); - - final Iterable<Direction<TreeNode>> iterable = list; - final TreeNode destination = ret.b().last().getTarget(); - - Traversal traversal = new Traversal(){ - @Override - public Iterator<Direction<TreeNode>> iterator(){ - return iterable.iterator(); - } - - @Override - public TreeNode destination(){ - return destination; - } - }; - - return DefaultEither.newB(traversal); - } - - private Either<Error,List<Direction<TreeNode>>> _traverse(Children _chs,Evaluator _evaluator,int _pos) - { - int pos = _pos; - for(TreeNode ch : _chs){ - Evaluation e = _evaluator.evaluate(ch,pos); - Result r = e.result(); - if(r == Result.ACCEPT){ - return _accept(ch,pos,e.evaluator()); - } - - if(r == Result.GOAL){ - return DefaultEither.newB(_goal(ch,pos)); - } - - if(r == Result.BREAK){ - break; - } - - if(r == Result.CONTINUE){ - pos --; - continue; - } - - return DefaultEither.newA(TraverserError.UNDEFINED_OPERATOR); - } - - return DefaultEither.newA(TraverserError.PATH_NOT_FOUND); - } - - private List<Direction<TreeNode>> _goal(final TreeNode _current,final int _pos) - { - Direction<TreeNode> d = new Direction<TreeNode>(){ - @Override - public int getPosition() - { - return _pos; - } - @Override - public TreeNode getTarget() - { - return _current; - } - }; - - List<Direction<TreeNode>> list = new List(); - List<Direction<TreeNode>> newList = list.addLast(d); - - return newList; - } - - private <T extends TreeNode> Either<Error,List<Direction<TreeNode>>> _accept(final T _current,final int _pos,Evaluator _evaluator) - { - Children chs = _current.getChildren(); - Either<Error,List<Direction<TreeNode>>> either = _traverse(chs,_evaluator,chs.size() - 1); - if(either.isA()){ - return either; - } - - List<Direction<TreeNode>> list = either.b(); - Direction<TreeNode> d = new Direction<TreeNode>(){ - @Override - public int getPosition() - { - return _pos; - } - @Override - public T getTarget() - { - return _current; - } - }; - - List<Direction<TreeNode>> newList = list.addLast(d); - return DefaultEither.newB(newList); - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Direction.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; - -public interface Direction<T> -{ - public int getPosition(); - public T getTarget(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Evaluation.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; - -public interface Evaluation -{ - public Result result(); - public Evaluator evaluator(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Evaluator.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; - -public interface Evaluator -{ - public Evaluation evaluate(TreeNode _current,int _pos); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,319 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; - -import jp.ac.u_ryukyu.ie.cr.list.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NulIterator; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.PathNodeIterator; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.Query; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexCreater; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; -import jp.ac.u_ryukyu.ie.cr.treemap.TreeMap; - -import java.util.Iterator; -import java.util.Optional; - -public class InterfaceTraverser { - - TreeNode root; - TreeMap<String, TreeMap<String, List<TreeNode>>> indexList; - ParentIndex parentIndex; - boolean parentUpdateFlag; - boolean useIndex; - - public InterfaceTraverser(TreeNode root, boolean indexFlag) { - this(root, new TreeMap<>(), new ParentIndex(), indexFlag); - } - - public InterfaceTraverser(TreeNode root, TreeMap<String, TreeMap<String, List<TreeNode>>> index, - ParentIndex parentIndex, boolean useIndex) { - this.root = root; - this.indexList = index; - this.parentIndex = parentIndex; - if (parentIndex.isEmpty()) - parentUpdateFlag = true; - else - parentUpdateFlag = false; - this.useIndex = useIndex; - } - - public TreeMap<String, TreeMap<String, List<TreeNode>>> getIndex() { - return indexList; - } - - public void commit() { - parentUpdateFlag = false; - } - - public ParentIndex getParentIndex() { - return parentIndex; - } - - public void createIndex() { - // long t1 = System.currentTimeMillis(); - IndexCreater creater = new IndexCreater(root); - // long t2 = System.currentTimeMillis(); - // System.out.println("createIndex time = " + (t2 - t1)); - indexList = creater.getIndex(); - parentIndex = creater.getParentIndex(); - } - - /** - * subTree以下のNodeに対してKey,Valueのペアでindexを使って探索を行う - * - * @param query - * @param subTree - * @param key - * @param searchValue - * @return - */ - // public Iterator<TreeNode> findInSubTree(final Query query, TreeNode - // subTree, String key, String searchValue) { - // /* - // * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 - // * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す - // */ - // Iterator<TreeNode> nodeIterator = index.get(key, searchValue); - // if (nodeIterator.hasNext() && useIndex) { - // - // // ここでNode以下にあるか調べる - // List<TreeNode> filteredList = List.nil(); - // - // for (;nodeIterator.hasNext();) { - // TreeNode targetNode = nodeIterator.next(); - // TreeNode parent = targetNode; - // while (parent != null) { - // parent = parentIndex.get(parent); - // if (parent.equals(subTree)) - // filteredList = filteredList.cons(targetNode); - // } - // } - // - // return filteredList.iterator(); - // - // } else { - // final PathNodeIterator itNode = new PathNodeIterator(subTree); - // return new Iterator<TreeNode>() { - // - // private TreeNode matchNode = nextmatch(itNode); - // - // private TreeNode nextmatch(PathNodeIterator itNode) { - // - // for (; itNode.hasNext();) { - // TreeNode targetNode = itNode.next(); - // if (query.condition(targetNode)) - // return targetNode; - // } - // return null; - // } - // - // @Override - // public boolean hasNext() { - // if (matchNode == null) { - // return false; - // } - // return true; - // } - // - // @Override - // public TreeNode next() { - // TreeNode currentNode = matchNode; - // matchNode = nextmatch(itNode); - // return currentNode; - // } - // - // @Override - // public void remove() { - // } - // - // }; - // } - // } - - /** - * subTree以下のNodeに対してKeyに対応する値をindexを使って探索する - */ - // public Iterator<TreeNode> findInSubTreeAllValue(final Query query, TreeNode - // subTree, String key) { - // /* - // * indexからinnerIndexを取得 取得したinnerIndexが保有するKeyを取得 - // * そのKeyを保有するNodeとNodeのPathを取得する - // * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 - // * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す - // */ - // Iterator<TreeNode> NodeIterator = index.getAll(key); - // if (NodeIterator != null && useIndex) { - // List<TreeNode> filteredList = List.nil(); - // for (; NodeIterator.hasNext();) { - // TreeNode targetNode = NodeIterator.next(); - // TreeNode parent = targetNode; - // while (parent != null) { - // parent = parentIndex.get(parent); - // if (parent.equals(subTree)) - // filteredList = filteredList.cons(targetNode); - // } - // } - // return filteredList.iterator(); - // - // } else { - // - // final PathNodeIterator itNode = new PathNodeIterator(subTree); - // return new Iterator<TreeNode>() { - // - // private TreeNode matchPair = nextmatch(itNode); - // - // private TreeNode nextmatch(PathNodeIterator itNode) { - // - // for (; itNode.hasNext();) { - // TreeNode targetNode = itNode.next(); - // if (query.condition(targetNode)) - // return targetNode; - // } - // return null; - // } - // - // @Override - // public boolean hasNext() { - // if (matchPair == null) { - // return false; - // } - // return true; - // } - // - // @Override - // public TreeNode next() { - // TreeNode currentNode = matchPair; - // matchPair = nextmatch(itNode); - // return currentNode; - // } - // - // @Override - // public void remove() { - // } - // - // }; - // } - // } - public Iterator<TreeNode> find(final Query query, final String key, String searchValue) { - - Iterator<TreeNode> nodeIterator = get(key, searchValue); - if (nodeIterator != null && useIndex) { - return nodeIterator; - } else { - - final PathNodeIterator itNode = new PathNodeIterator(root); - return new Iterator<TreeNode>() { - - private TreeNode matchNode = nextmatch(itNode); - - private TreeNode nextmatch(PathNodeIterator itNode) { - - for (; itNode.hasNext(); ) { - TreeNode targetNode = itNode.next(); - String value = targetNode.getAttributes().getString(key); - if (useIndex) { - if (value != null) - ; - // index = index.set(key, value, targetNode); - } - if (parentUpdateFlag) - ; - // parentIndex = parentIndex.set(targetNode); - if (query.condition(targetNode)) - return targetNode; - } - if (useIndex || parentUpdateFlag) - commit(); - return null; - } - - @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() { - } - - }; - } - } - - // public Iterator<TreeNode> findAll(final Query query, final String key) { - // - // Iterator<TreeNode> nodeList = index.getAll(key); - // if (nodeList != null && useIndex) { - // - // return nodeList; - // - // } else { - // - // 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(); - // String value = targetNode.getAttributes().getString(key); - // if (useIndex) { - // if (value != null) - // index = index.set(key, value, targetNode); - // } - // if (parentUpdateFlag); - // // parentIndex = parentIndex.set(targetNode); - // if (query.condition(targetNode)) - // return targetNode; - // } - // if (useIndex || parentUpdateFlag) - // commit(); - // return null; - // } - // - // @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() { - // } - // - // }; - // } - // } - - public Iterator<TreeNode> get(String key, String value) { - Optional<TreeMap<String, List<TreeNode>>> indexOp = indexList.get(key); - if (!indexOp.isPresent()) - return null; - - Optional<List<TreeNode>> nodeListOp = indexOp.get().get(value); - if (!nodeListOp.isPresent()) - return new NulIterator<TreeNode>(); - - return nodeListOp.get().iterator(); - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Result.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; - -public class Result -{ - - public static final Result ACCEPT = new Result("ACCEPT"); - public static final Result CONTINUE = new Result("CONTINUE"); - public static final Result BREAK = new Result("BREAK"); - public static final Result GOAL = new Result("GOAL"); - - private final String name; - - private Result(String _name) - { - name = _name; - } - - public String toString() - { - return name; - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Traversal.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; - -public interface Traversal extends Iterable<Direction<TreeNode>> -{ - public TreeNode destination(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Traverser.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -public interface Traverser -{ - public Either<Error,Traversal> traverse(final TreeNode _root,Evaluator _evaluator); - - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/TraverserError.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -public class TraverserError -{ - public static final Error UNDEFINED_OPERATOR = new DefaultError(); - public static final Error PATH_NOT_FOUND = new DefaultError(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/DefaultEither.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util; - -public class DefaultEither<A,B> implements Either<A,B> -{ - private final A theA; - private final B theB; - - private DefaultEither(A _theA,B _theB) - { - theA = _theA; - theB = _theB; - } - - public static final <A,B> DefaultEither<A,B> newA(A _theA) - { - return new DefaultEither<A,B>(_theA,null); - } - - public static final <A,B> DefaultEither<A,B> newB(B _theB) - { - return new DefaultEither<A,B>(null,_theB); - } - - @Override - public A a() - { - return theA; - } - - @Override - public boolean isA() - { - return theA != null; - } - - @Override - public B b() - { - return theB; - } - - @Override - public boolean isB() - { - return theB != null; - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/DefaultError.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util; - -public class DefaultError implements Error -{ -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/Either.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util; - -public interface Either<A,B> -{ - public A a(); - public boolean isA(); - public B b(); - public boolean isB(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/Error.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util; - -public interface Error { - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/GetOldTreeError.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util; - -public class GetOldTreeError implements Error { - public static final Error OLD_TREE_NOT_FOUND = new DefaultError(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/IterableConverter.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util; - -import java.util.Iterator; - -public class IterableConverter<A,B> implements Iterable<A> -{ - private final Iterable<B> iterable; - private final Converter<A,B> converter; - - public IterableConverter(Iterable<B> _iterable,Converter<A,B> _converter) - { - iterable = _iterable; - converter = _converter; - } - - @Override - public Iterator<A> iterator() - { - return new IteratorConverter<A,B>(iterable.iterator(),converter); - } - - private static final class IteratorConverter<A,B> implements Iterator<A> - { - private final Iterator<B> iterator; - private final Converter<A,B> converter; - - public IteratorConverter(Iterator<B> _iterator,Converter<A,B> _converter) - { - iterator = _iterator; - converter = _converter; - } - - @Override - public boolean hasNext() - { - return iterator.hasNext(); - } - - @Override - public A next() - { - return converter.conv(iterator.next()); - } - - @Override - public void remove() - { - iterator.remove(); - } - } - - public static interface Converter<A,B> - { - public A conv(B _b); - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/Pair.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util; - -public class Pair<L,R> -{ - private L left; - private R right; - - public Pair(L _left,R _right) - { - left = _left; - right = _right; - } - - public L left() - { - return left; - } - - public R right() - { - return right; - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/Triple.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util; - -public class Triple<A,B,C> -{ - private A a; - private B b; - private C c; - - public Triple(A _a,B _b,C _c) - { - a = _a; - b = _b; - c = _c; - } - - public A getA() - { - return a; - } - - public B getB() - { - return b; - } - - public C getC() - { - return c; - } - - public void setA(A _a) - { - a = _a; - } - - public void setB(B _b) - { - b = _b; - } - - public void setC(C _c) - { - c = _c; - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/benchMark/JungleBenchMark.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.benchMark; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle; -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.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.DefaultTreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; - -import java.nio.ByteBuffer; -import java.util.Iterator; - - -/** - * Created by e115731 on 15/05/07. - */ -public class JungleBenchMark { - public static void main(String args[]) { - Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTreeEditor(new DefaultTraverser())); - jungle.createNewTree("tree"); - JungleTree tree = jungle.getTreeByName("tree"); - JungleTreeEditor editor = tree.getTreeEditor(); - NodePath path = new DefaultNodePath().add(0); - for (int count = 1; count <= 10; count++) { - for (int personCount = 0; personCount < 1000 * count; personCount++) { - editor = editor.replaceNewRootNode().b(); - editor = editor.putAttribute(path, "personId", ByteBuffer.wrap(("p:" + personCount).getBytes())).b(); - editor = editor.putAttribute(path, "roleId", ByteBuffer.wrap(("r:" + personCount).getBytes())).b(); - } - editor.success(); - long t1 = System.currentTimeMillis(); - for (int findCount = 0; findCount < 50000; ) { - InterfaceTraverser traverser = tree.getTraverser(true); - Iterator<TreeNode> it = traverser.find(null, "personId", "p:100"); - if (it.hasNext()) { - TreeNode targetNode = it.next(); - String targetRoleId = targetNode.getAttributes().getString("roleId"); - if (targetRoleId.equals("r:100")) - findCount++; - } else { - System.out.println("find miss"); - System.exit(1); - } - } - long t2 = System.currentTimeMillis(); - System.out.println("time = " + (t2 - t1)); - } - - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/query/PathNodeIterator.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeChildren; - -import java.util.Iterator; -import java.util.Stack; - -public class PathNodeIterator implements Iterator<TreeNode> { - - TreeNode root; - TreeNode node; - int childNumber; - private TreeNodeChildren children; - private Stack<TreeNode> nodeStack = new Stack<TreeNode>(); - private Stack<Integer> searchStack = new Stack<Integer>(); - - /* - * get queryIndexCondition from query - * if already index exists, use index - * otherwise traverse tree and create index - * - * */ - public PathNodeIterator(TreeNode root) { - this.root = root; - this.node = root; - } - - @Override - public boolean hasNext() { - return node != null; - } - - @Override - public TreeNode next() { - TreeNode now = node; - if (node.getChildren().size() > 0) { - nodeStack.push(node); - children = node.getChildren(); - node = children.at(0).b(); - childNumber = 1; - searchStack.push(childNumber); - } else if (node == root) { - node = null; // no more node - children = null; - return now; - }else if (children != null && children.size() > childNumber) { - childNumber = searchStack.pop(); - node = children.at(childNumber).b(); - searchStack.push(++childNumber); - } else { - node = nodeStack.pop(); - children = node.getChildren(); - childNumber = searchStack.pop(); - for (; children.size() == childNumber;) { - if (node == root) { - node = null; // no more node - children = null; - return now; - } - node = nodeStack.pop(); - children = node.getChildren(); - childNumber = searchStack.pop(); - } - if (node != null && childNumber < children.size()) { - nodeStack.push(node); - node = children.at(childNumber).b(); - searchStack.push(++childNumber); - } - } - return now; - } - - @Override - public void remove() { - // TODO Auto-generated method stub - - } - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/query/Query.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; - -public interface Query { - boolean condition(TreeNode _node); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/IndexCreater.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,119 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index; - - -import jp.ac.u_ryukyu.ie.cr.list.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeChildren; -import jp.ac.u_ryukyu.ie.cr.treemap.TreeMap; - -import java.util.Iterator; -import java.util.Optional; -import java.util.Stack; - -public class IndexCreater { - - TreeNode root; - TreeNode node; - int childNumber; - private TreeNodeChildren children; - private Stack<TreeNode> nodeStack = new Stack<TreeNode>(); - private Stack<Integer> searchStack = new Stack<Integer>(); - ParentIndex parentIndex = new ParentIndex(); - TreeMap<String, TreeMap<String, List<TreeNode>>> indexList = new TreeMap(); - - public IndexCreater(TreeNode rootNode) { - this.root = rootNode; - this.node = rootNode; - while (node != null) { - TreeNode targetNode = node; - Iterator<String> keys = targetNode.getAttributes().getKeys(); - for (;keys.hasNext();) { - String key = keys.next(); - String value = targetNode.getAttributes().getString(key); - if (value != null) - indexList = set(key, value, targetNode); - } - if (node.getChildren().size() > 0) { - nodeStack.push(node); - TreeNode parent = node; - children = node.getChildren(); - node = children.at(0).b(); - parentIndex.set(parent, node); - childNumber = 1; - searchStack.push(childNumber); - } else if (node == root) { - node = null; // no more node - children = null; - return; - } else if (children != null && children.size() > childNumber) { - childNumber = searchStack.pop(); - TreeNode parent = nodeStack.pop(); - nodeStack.push(parent); - node = children.at(childNumber).b(); - parentIndex.set(parent, node); - searchStack.push(++childNumber); - } else { - node = nodeStack.pop(); - children = node.getChildren(); - childNumber = searchStack.pop(); - for (; children.size() == childNumber; ) { - if (node == root) { - node = null; // no more node - children = null; - return; - } - node = nodeStack.pop(); - children = node.getChildren(); - childNumber = searchStack.pop(); - } - if (node != null && childNumber < children.size()) { - nodeStack.push(node); - TreeNode parent = node; - node = children.at(childNumber).b(); - parentIndex.set(parent, node); - searchStack.push(++childNumber); - } - } - } - } - - public TreeMap<String, TreeMap<String, List<TreeNode>>> set(String key, String value, TreeNode node) { - if (key == null ) - System.out.println(""); - Optional<TreeMap<String, List<TreeNode>>> indexOp = indexList.get(key); - if (!indexOp.isPresent()) { - TreeMap<String, List<TreeNode>> index = new TreeMap(); - List<TreeNode> nodeList = new List(); - nodeList = nodeList.addLast(node); - TreeMap<String, List<TreeNode>> newIndex = index.put(value, nodeList); - indexList = indexList.put(key, newIndex); - return indexList; - } - - TreeMap<String, List<TreeNode>> index = indexOp.get(); - Optional<List<TreeNode>> nodeListOp = index.get(value); - - List<TreeNode> newNodeList; - - if (nodeListOp.isPresent()) { - newNodeList = nodeListOp.get().addLast(node); - - } else { - List<TreeNode> nodeList = new List(); - newNodeList = nodeList.addLast(node); - - } - TreeMap<String, List<TreeNode>> newIndex = index.put(value, newNodeList); - indexList = indexList.put(key, newIndex); - - return indexList; - } - - public TreeMap<String, TreeMap<String, List<TreeNode>>> getIndex() { - return indexList; - } - - public ParentIndex getParentIndex() { - return parentIndex; - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/store/index/ParentIndex.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -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.TreeNodeChildren; -import jp.ac.u_ryukyu.ie.cr.treemap.TreeMap; - -import java.util.Iterator; - -public class ParentIndex { - - private TreeMap<TreeNode, TreeNode> parentIndex; - - public ParentIndex() { - parentIndex = new TreeMap(); - } - - public boolean isEmpty(){ - return parentIndex.isEmpty(); - } - - public TreeNode get(TreeNode child) { - return parentIndex.get(child).get(); - } - - public ParentIndex set(TreeNode parent ,TreeNode child) { - parentIndex = parentIndex.put(child, parent); - return this; - } - - public ParentIndex delete(TreeNode child) { - parentIndex = parentIndex.delete(child); - return this; - } - - public ParentIndex deleteAllChildren(TreeNode parentNode) { - TreeNodeChildren children = parentNode.getChildren(); - Iterator<TreeNode> childrenIterator = children.iterator(); - for (; childrenIterator.hasNext();) { - TreeNode child = childrenIterator.next(); - parentIndex = parentIndex.delete(child); - } - return this; - } - - public ParentIndex addAllChildren(TreeNode parentNode) { - TreeNodeChildren children = parentNode.getChildren(); - Iterator<TreeNode> childrenIterator = children.iterator(); - for (; childrenIterator.hasNext();) { - TreeNode child = childrenIterator.next(); - parentIndex = parentIndex.put(child, parentNode); - } - return this; - } - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/test/AbstractTreeMapThread.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.test; - -/** - * Created by e115731 on 15/03/17. - */ -public abstract class AbstractTreeMapThread extends Thread{ - public abstract void set(boolean flag); - public abstract long getFindCount(); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/test/DataBaseBenchMark.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,164 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.test; - - -import com.mongodb.MongoClient; -import com.mongodb.WriteConcern; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.MongoDatabase; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle; -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.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.DefaultTreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; -import org.bson.Document; -import org.xml.sax.SAXException; - -import javax.xml.parsers.ParserConfigurationException; -import java.io.*; -import java.nio.ByteBuffer; -import java.util.Random; - -/** - * Created by e115731 on 15/03/20. - */ -public class DataBaseBenchMark { - public static void main(String[] args) throws InterruptedException, IOException, ParserConfigurationException, SAXException { - - if (args.length < 2) { - System.out.println("args[0] = jungle or mongo, args[1] = read or write" ); - System.exit(0); - } - - Runtime rt = Runtime.getRuntime(); - int cpuNum = rt.availableProcessors(); - - if (args[0].equals("jungle")) - jungleBench(args, cpuNum); - else if (args[0].equals("mongo")) - mongoBench(args, cpuNum); - } - - private static void mongoBench(String[] args, int cpuNum) throws IOException, InterruptedException { - MongoClient client = new MongoClient("localhost", 27017); - client.setWriteConcern(WriteConcern.JOURNALED); - client.dropDatabase("mydb"); - MongoDatabase database = client.getDatabase("mydb"); - MongoCollection<Document> coll = database.getCollection("mycoll"); - for (int i = 0; i < 10000; i++) { - if (i % 100 == 0) - System.out.println(i / 100); - coll.insertOne(new Document("key",String.valueOf(i))); - } - coll.createIndex(new Document("key", 1)); - //coll.dropIndex(new Document("key", 1)); - for (final Document index : coll.listIndexes()) { - System.out.println(index.toJson()); - } - File file = new File("./time/" + args[0] + args[1] + "Time"); - PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); - DataBaseBenchMarkThread readThread[] = null; - for (int THREAD_COUNT = 1; THREAD_COUNT <= cpuNum; THREAD_COUNT++) { - readThread = new DataBaseBenchMarkThread[THREAD_COUNT]; - for (int count = 0; THREAD_COUNT > count; count++) { - readThread[count] = new findMongoAttributeThread(coll); - } - for (int count = 0; THREAD_COUNT > count; count++) { - readThread[count].start(); - } - System.out.println("StartThread"); - Thread.sleep(1000); - long readCount = 0; - for (int count = 0; THREAD_COUNT > count; count++) { - readCount = readCount + readThread[count].getFindCount(); - readThread[count].set(false); - readThread[count] = null; - } - pw.println(THREAD_COUNT + " " + readCount); - System.out.println(THREAD_COUNT + "readCount = " + readCount); - System.gc(); - System.out.println("-------------GC--------------"); - Thread.sleep(1000); - } - client.close(); - pw.close(); - } - - private static void jungleBench(String[] args, int cpuNum) throws IOException, InterruptedException { - JungleTree tree = createJungleTree(cpuNum); - File file = new File("./time/" + args[0] + args[0] + "Time"); - PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); - DataBaseBenchMarkThread readThread[] = null; - - for (int THREAD_COUNT = 1; THREAD_COUNT <= cpuNum; THREAD_COUNT++) { - readThread = new DataBaseBenchMarkThread[THREAD_COUNT]; - for (int count = 0; THREAD_COUNT > count; count++) { - readThread[count] = new findTreeAttributeThread(tree); - } - JungleWriteThread writeThread = null; - if (args[1].equals("write")) { - writeThread = new JungleWriteThread(tree); - writeThread.start(); - } - for (int count = 0; THREAD_COUNT > count; count++) { - readThread[count].start(); - } - System.out.println("StartThread"); - Thread.sleep(1000); - if (args[1].equals("write")) { - writeThread.set(false); - writeThread.get(); - } - long readCount = 0; - for (int count = 0; THREAD_COUNT > count; count++) { - readCount = readCount + readThread[count].getFindCount(); - readThread[count].set(false); - readThread[count] = null; - } - pw.println(THREAD_COUNT + " " + readCount); - System.out.println(THREAD_COUNT + "readCount = " + readCount); - System.gc(); - System.out.println("-------------GC--------------"); - Thread.sleep(1000); - } - pw.close(); - } - - private static JungleTree createJungleTree(int cpuNum) { - Jungle jungle = new DefaultJungle(null, "hoge", new DefaultTreeEditor(new DefaultTraverser())); - JungleTree trees[] = new JungleTree[cpuNum]; - JungleTree tree = jungle.createNewTree("tree"); - JungleTreeEditor editor = tree.getTreeEditor(); - editor = editor.putAttribute(new DefaultNodePath(), "key", ByteBuffer.wrap(String.valueOf(0).getBytes())).b(); - JungleTreeEditor newEditor = createTree(0, new DefaultNodePath(), editor); - if (newEditor.success().isA()) { - System.out.println("success faild"); - System.exit(1); - } - trees[0] = tree; - return tree; - } - - static Integer nodeNum = 1; - - public static JungleTreeEditor createTree(int deep, NodePath path, JungleTreeEditor editor) { - - Random rnd = new Random(); - String value1 = String.valueOf(nodeNum); - nodeNum++; - String value2 = String.valueOf(nodeNum); - nodeNum++; - editor = editor.addNewChildAt(path, 0).b(); - editor = editor.putAttribute(path.add(0), "key", ByteBuffer.wrap(value1.getBytes())).b(); - editor = editor.addNewChildAt(path, 1).b(); - editor = editor.putAttribute(path.add(1), "key", ByteBuffer.wrap(value2.getBytes())).b(); - deep++; - if (deep < 10) { - editor = createTree(deep, path.add(0), editor); - editor = createTree(deep, path.add(1), editor); - } - return editor; - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/test/DataBaseBenchMarkThread.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.test; - -/** - * Created by e115731 on 15/03/17. - */ -public abstract class DataBaseBenchMarkThread extends Thread{ - public abstract long getFindCount(); - public abstract void set(boolean flag); -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/test/JungleWriteThread.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.test; - -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.store.impl.DefaultNodePath; - -import java.nio.ByteBuffer; - -/** - * Created by e115731 on 15/04/18. - */ -public class JungleWriteThread extends Thread { - - JungleTree tree; - boolean loop = true; - private int writeCount; - - public JungleWriteThread(JungleTree tree) { - this.tree = tree; - } - - public void set(boolean flag) { - loop = flag; - } - - public void get() { - System.out.println("writeCount = " + writeCount); - } - - ; - - @Override - public void run() { - while (loop) { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - } - JungleTreeEditor editor = tree.getTreeEditor(); - editor = editor.putAttribute(new DefaultNodePath(), "key", ByteBuffer.wrap(String.valueOf(0).getBytes())).b(); - if (editor.success().isA()) - System.out.println("faild"); - else - writeCount++; - } - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/test/TatsukiTreeMapGetThread.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.test; - -import jp.ac.u_ryukyu.ie.cr.treemap.TreeMap; - -import java.util.Optional; - - -/** - * Created by e115731 on 15/03/17. - */ -public class TatsukiTreeMapGetThread extends AbstractTreeMapThread { - TreeMap<Long, String> map; - private long findCount; - boolean loop = true; - - public TatsukiTreeMapGetThread(TreeMap map) { - this.map = map; - } - - @Override - public long getFindCount() { - System.out.println("thread count = " + findCount); - return findCount; - } - - @Override - public void set(boolean loop) { - this.loop = loop; - } - - @Override - public void run() { - while (loop) { - for (long count = 0 ; count < 1000; count++) { - Optional<String> value = map.get(count); - if (!value.isPresent()) - System.out.println("error"); - } - findCount++; - } - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/test/TreeMapBenchMark.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.test; - -import jp.ac.u_ryukyu.ie.cr.treemap.TreeMap; - -import java.io.*; - -/** - * Created by e115731 on 15/03/17. - */ -public class TreeMapBenchMark { - public static void main(String[] args) throws InterruptedException, IOException { - - if (args.length == 0) { - System.out.println("args get or getLoop or list"); - System.exit(0); - } - - Runtime rt = Runtime.getRuntime(); - int cpuNum = rt.availableProcessors(); - - File file = new File("./time/" + args[0] + "Time"); - - PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); - - AbstractTreeMapThread readThread[] = null; - - for (int THREAD_COUNT = 1; THREAD_COUNT <= cpuNum; THREAD_COUNT++) { - - readThread = new AbstractTreeMapThread[THREAD_COUNT]; - - if (args[0].equals("util")) { - java.util.TreeMap map = new java.util.TreeMap(); - for (long count = 0; count < 1000; count++) { - map.put(count, String.valueOf(count)); - } - - for (int count = 0; THREAD_COUNT > count; count++) { - readThread[count] = new UtilTreeMapGetThread(map); - } - } else if (args[0].equals("tatsuki")) { - TreeMap map = new TreeMap(); - for (long count = 0; count < 1000; count++) { - map = map.put(count, String.valueOf(count)); - } - - for (int count = 0; THREAD_COUNT > count; count++) { - readThread[count] = new TatsukiTreeMapGetThread(map); - } - } else { - System.out.println("not allow args"); - System.exit(0); - } - - for (int count = 0; THREAD_COUNT > count; count++) { - readThread[count].start(); - } - - System.out.println("StartThread"); - - Thread.sleep(1000); - long readCount = 0; - - for (int count = 0; THREAD_COUNT > count; count++) { - readThread[count].set(false); - readCount = readCount + readThread[count].getFindCount(); - readThread[count].stop(); - } - - pw.println(THREAD_COUNT + " " + readCount); - System.out.println(THREAD_COUNT + "readCount = " + readCount); - Thread.sleep(1000); - } - - pw.close(); - } - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/test/UtilTreeMapGetThread.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.test; - -import java.util.TreeMap; - -/** - * Created by e115731 on 15/04/18. - */ -public class UtilTreeMapGetThread extends AbstractTreeMapThread { - TreeMap<Long, String> map; - private long findCount; - boolean loop = true; - - public UtilTreeMapGetThread(TreeMap map) { - this.map = map; - } - - @Override - public long getFindCount() { - System.out.println("thread count = " + findCount); - return findCount; - } - - @Override - public void set(boolean loop) { - this.loop = loop; - } - - @Override - public void run() { - while (loop) { - for (long count = 0 ; count < 1000; count++) { - String value = map.get(count); - if (value == null) - System.out.println("error"); - } - findCount++; - } - } -} \ No newline at end of file
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/test/findMongoAttributeThread.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.test; - -import com.mongodb.client.FindIterable; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.MongoCursor; -import org.bson.Document; - -/** - * Created by e115731 on 15/04/30. - */ -public class findMongoAttributeThread extends DataBaseBenchMarkThread { - private long findCount; - boolean loop = true; - MongoCollection<Document> coll; - - public findMongoAttributeThread( MongoCollection<Document> coll) { - this.coll = coll; - this.findCount = 0; - } - - @Override - public long getFindCount() { - System.out.println("thread count = " + findCount); - return findCount; - } - - public void set(boolean loop) { - this.loop = loop; - } - - @Override - public void run() { - while (loop) { - FindIterable<Document> searchResultList = coll.find(new Document("key","1")); - MongoCursor<Document> iterator = searchResultList.iterator(); - if (iterator.hasNext()) { - findCount++; - } - } - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/test/findTreeAttributeThread.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.test; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; -import java.util.Iterator; - -/** - * Created by e115731 on 15/03/20. - */ -public class findTreeAttributeThread extends DataBaseBenchMarkThread { - - JungleTree tree; - private long findCount; - - boolean loop = true; - - public findTreeAttributeThread(JungleTree tree) { - this.tree = tree; - this.findCount = 0; - } - - @Override - public long getFindCount() { - System.out.println("thread count = " + findCount); - return findCount; - } - - public void set(boolean loop) { - this.loop = loop; - } - - @Override - public void run() { - while (loop) { - InterfaceTraverser traverser = tree.getTraverser(true); - Iterator<TreeNode> it = traverser.find(null, "key", "0"); - if (it.hasNext()) { - findCount++; - } - } - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/test/readTreeAttributeThread.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.test; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; - -/** - * Created by e115731 on 15/03/17. - */ -public class readTreeAttributeThread extends DataBaseBenchMarkThread { - - JungleTree tree; - private long findCount; - - boolean loop = true; - - public readTreeAttributeThread(JungleTree tree) { - this.tree = tree; - this.findCount = 0; - } - - @Override - public long getFindCount() { - System.out.println("thread couny = " + findCount); - return findCount; - } - - public void set(boolean loop) { - this.loop = loop; - } - - @Override - public void run() { - while (loop) { - TreeNode root = tree.getRootNode(); - if (root != null) { - String attribute = root.getAttributes().getString("key"); - if (attribute.equals("0")) - findCount++; - else - System.out.println("faild"); - } - } - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/treemap/BlackNode.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,135 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.treemap; - -import org.junit.Test; - - -public class BlackNode<K, V> extends Node<K, V> { - - - public BlackNode(K key, V value, Node<K, V> left, Node<K, V> right) { - super(key, value, left, right); - } - - - @Override - public Node deleteNode() throws RotateParent { - EmptyNode<K, V> emptyNode = new EmptyNode<K, V>(key); - throw new RotateParent(emptyNode); - } - - @Override - @Test - protected int checkDepth(int count, int minCount) { // test method - count++; - minCount = left().checkDepth(count, minCount); - minCount = right().checkDepth(count, minCount); - count--; - return minCount; - } - - - @Override - protected boolean isNotEmpty() { - return true; - } - - @Override - public Node<K, V> createNode(K key, V value, Node<K, V> left, Node<K, V> right) { - return new BlackNode<K, V>(key, value, left, right); - } - - - @Override - Node insBalance() { - Rotate spin = left.checkRotate(Rotate.L); - - if (spin == Rotate.R) { - Node<K, V> leftChild = new BlackNode<K, V>(left.left().getKey(), left.left().getValue(), left.left().left(), left.left().right()); - Node<K, V> rightChild = new BlackNode<K, V>(getKey(), getValue(), left.right(), right); - return new RedNode<K, V>(left.getKey(), left.getValue(), leftChild, rightChild); - - } else if (spin == Rotate.LR) { - Node<K, V> leftChild = new BlackNode<K, V>(left.getKey(), left.getValue(), left.left(), left.right().left()); - Node<K, V> rightChild = new BlackNode<K, V>(getKey(), getValue(), left.right().right(), right); - return new RedNode<K, V>(left.right().getKey(), left.right().getValue(), leftChild, rightChild); - - } - - spin = right.checkRotate(Rotate.R); - if (spin == Rotate.L) { - Node<K, V> leftChild = new BlackNode<K, V>(getKey(), getValue(), left, right.left()); - Node<K, V> rightChild = new BlackNode<K, V>(right.right().getKey(), (V) right.right().getValue(), right.right().left(), right.right().right()); - return new RedNode<K, V>(right.getKey(), right.getValue(), leftChild, rightChild); - - } else if (spin == Rotate.RL) { - Node leftChild = new BlackNode(getKey(), getValue(), left, right.left().left()); - Node rightChild = new BlackNode(right.getKey(), right.getValue(), right.left().right(), right.right()); - return new RedNode(right.left().getKey(), right.left().getValue(), leftChild, rightChild); - - } - - return this; - } - - - @Override - Rotate checkRotate(Rotate side) { - return Rotate.N; - } - - @Override - boolean isRed() { - return false; - } - - - /** - * @param parent - * @return - */ - @Override - public Node replaceNode(Node<K, V> parent) throws RotateParent { - Node<K, V> newNode = null; - if (!this.left().isNotEmpty() && !this.right().isNotEmpty()) { //自身を削除する - return deleteNode();//黒が1つ減るので木のバランスを取る - } else if (this.left().isNotEmpty() && !this.right().isNotEmpty()) { //左の部分木を昇格させる - newNode = createNode(left().getKey(), left().getValue(), left().left(), left().right()); - if (!this.left().isRed()) //昇格させる木のrootが黒だったらバランスを取る - throw new RotateParent(newNode); - return newNode; - } else if (!this.left().isNotEmpty() && this.right().isNotEmpty()) { //右の部分木を昇格させる - newNode = createNode(right().getKey(), right().getValue(), right().left(), right().right()); - if (!this.right().isRed()) //昇格させる木のrootが黒だったらバランスを取る - throw new RotateParent(newNode); - return newNode; - } else {//子ノードが左右にある場合 二回目はここには入らない - //左の部分木の最大の値を持つNodeと自身を置き換える - Node<K, V> cur = this.left(); - while (cur.right().isNotEmpty()) { //左の部分期の最大値を持つNodeを取得する - cur = cur.right(); - } - if (this.left().right().isNotEmpty()) { //左の部分木が右の子を持っているか - try { - Node leftSubTreeNode = this.left().deleteSubTreeMaxNode(null, Rotate.L);//最大値を削除した左の部分木を返す。rootはthisと同じ。 - Node<K, V> newParent = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.right()); //rootをcurと入れ替えることでNodeの削除は完了する - return newParent; - } catch (RotateParent e) { - Node leftSubTreeNode = e.getParent(); - Node<K, V> newParent = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.right()); - return leftSubTreeNode.deleteBalance(newParent); - } - } else { - Node leftSubTreeNode = null; - try { - leftSubTreeNode = this.left().replaceNode(this);//右の子がいなかった場合、左の子を昇格させるだけで良い。 - Node newParent = createNode(this.left().getKey(), this.left().getValue(), leftSubTreeNode, this.right()); - return newParent; - } catch (RotateParent e) { - Node node = e.getParent(); - Node newParent = createNode(this.left().getKey(), this.left().getValue(), leftSubTreeNode, this.right()); - return node.deleteBalance(newParent); - } - } - } - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/treemap/EmptyNode.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.treemap; - -import org.junit.Assert; -import org.junit.Test; - -/** - * Created by e115731 on 15/03/25. - */ -public class EmptyNode<K, V> extends Node<K, V> { - - public EmptyNode() { - super(null, null); - } - - public EmptyNode(K key) { //keyは削除時の回転処理に使用する - super(key, null); - } - - @Override // 回転処理時にEmptyNodeの子を見ることがあるのでleft rightでEmptyNodeを返すようにする - public Node<K, V> left() { - return new EmptyNode<>(); - } - - @Override - public Node<K, V> right() { - return new EmptyNode<>(); - } - - - @Override - protected boolean isNotEmpty() { - return false; - } - - - @Override - public Node<K, V> createNode(K key, V value, Node<K, V> left, Node<K, V> right) { - return new RedNode<K, V>(key, value, new EmptyNode<K, V>(), new EmptyNode<K, V>()); - } - - - public Node<K, V> put(K k, V value) { - return new RedNode(k, value, new EmptyNode<K, V>(), new EmptyNode<K, V>()); - } - - @Override - public Node replaceNode(Node<K, V> parent) { // not use method - return this; - } - - @Override - protected Node deleteNode() { //not use method - return this; - } - - @Override - Node insBalance() { - return this; - } - - @Override - Rotate checkRotate(Rotate side) { - return Rotate.N; - } - - @Override - boolean isRed() { - return false; - } - - @Override - @Test - protected int checkDepth(int count,int minCount) { // test method - if (count < minCount | minCount == 0) - minCount = count; - System.out.println("depth = " + count); - - Assert.assertTrue(count <= 2 * minCount); - return minCount; - } - -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/treemap/Node.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,295 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.treemap; - -import org.junit.Test; - -import java.util.Optional; - - -/** - * Created by e115731 on 15/03/23. - */ -public abstract class Node<K, V> { - - protected K key; - protected V value; - protected Node<K, V> right; - protected Node<K, V> left; - - public Node(K key, V value) { - this.key = key; - this.value = value; - } - - public Node(K key, V value, Node<K, V> left, Node<K, V> right) { - this.key = key; - this.value = value; - this.right = right; - this.left = left; - } - - public Node<K, V> left() { - return left; - } - - public int compare(Comparable<? super K> compareKey) { - return compareKey.compareTo(getKey()); - - } - - public Optional<V> get(K key) { - Node<K, V> cur = this; - Comparable<? super K> k = (Comparable<? super K>) key; - while (cur.isNotEmpty()) { - int result = cur.compare(k); - if (result > 0) - cur = cur.right(); - else if (result < 0) - cur = cur.left(); - else if (result == 0) - return Optional.ofNullable(cur.getValue()); - } - return Optional.ofNullable(null); - } - - - public Node<K, V> right() { - return right; - } - - public K getKey() { - return key; - } - - public V getValue() { - return value; - } - - - public Node<K, V> put(Comparable<? super K> k, V value) { - if (!isNotEmpty()) { - return createNode((K)k, value, left, right); - } - int result = compare(k); - if (result > 0) { - Node<K, V> node = right.put(k, value); - node = createNode(key, this.value, left, node); - return node.insBalance(); - } else if (result < 0) { - Node node = left.put(k, value); - return createNode(key, this.value, node, right).insBalance(); - } - return createNode(key, value, left, right); // equals - - } - - public Node<K, V> delete(Comparable<? super K> key, Node<K, V> parent, Rotate side) throws RotateParent { - if (this.isNotEmpty()) { - int result = compare(key); - - try { - Node<K, V> node = null; - if (result > 0) { - node = right.delete(key, this, Rotate.R); - if (node == null) - return null; - if (parent == null) - return node; - } else if (result < 0) { - node = left.delete(key, this, Rotate.L); - if (node == null) - return null; - if (parent == null) - return node; - } else if (result == 0) { - node = replaceNode(parent); - if (parent == null)// equals - return node; - if (side == Rotate.R) - return parent.createNode(parent.getKey(), parent.getValue(), parent.left(), node); - else - return parent.createNode(parent.getKey(), parent.getValue(), node, parent.right()); - } - if (side == Rotate.L) - return parent.createNode(parent.getKey(), parent.getValue(), node, parent.right()); - else - return parent.createNode(parent.getKey(), parent.getValue(), parent.left(), node); - } catch (RotateParent e) { - Node node = e.getParent(); - if (parent != null) - return node.deleteBalance(parent); - return node; - } - } - return null; // no key - } - - - public Node<K, V> deleteSubTreeMaxNode(Node<K, V> parent, Rotate side) throws RotateParent { - Node<K, V> node; - try { - if (right().isNotEmpty()) {//最大値のノードが取得できるまで潜る - node = right().deleteSubTreeMaxNode(this, Rotate.R); - } else { - node = this.replaceNode(parent); - } - } catch (RotateParent e) { - node = e.getParent(); - if (parent == null) - throw e; - return node.deleteBalance(parent); - } - if (parent == null) - return node; - if (side == Rotate.R) - return parent.createNode(parent.getKey(), parent.getValue(), parent.left(), node); - else - return parent.createNode(parent.getKey(), parent.getValue(), node, parent.right()); - - } - - public Node deleteBalance(Node<K, V> parent) throws RotateParent { - if (!isRed()) { - if (0 > compare((Comparable<? super K>) parent.getKey())) { //自身がどちらの子かを調べる - boolean rightChild = parent.left().right().isRed(); - boolean leftChild = parent.left().left().isRed(); - - if (!parent.isRed()) { //親が黒 - if (!parent.left().isRed()) { //左の子が黒 - if (!rightChild && !leftChild) - throw new RotateParent(rebuildThree(parent, Rotate.R)); - if (rightChild) - return rebuildfive(parent, Rotate.R); - else if (leftChild) - return rebuildsix(parent, Rotate.R); - } else { //左の子が赤 - return rebuildTwo(parent, Rotate.R); - } - } else { //親が赤 - if (!rightChild && !leftChild) - return rebuildFour(parent, Rotate.R); - if (rightChild) - return rebuildfive(parent, Rotate.R); - else if (leftChild) - return rebuildsix(parent, Rotate.R); - } - } else { - boolean rightChild = parent.right().right().isRed(); - boolean leftChild = parent.right().left().isRed(); - - if (!parent.isRed()) { //親が黒 - if (!parent.right().isRed()) { //左の子が黒 - if (!rightChild && !leftChild) - throw new RotateParent(rebuildThree(parent, Rotate.L)); - if (rightChild) - return rebuildsix(parent, Rotate.L); - else if (leftChild) - return rebuildfive(parent, Rotate.L); - } else { //左の子が赤 - return rebuildTwo(parent, Rotate.L); - } - } else { //親が赤 - if (!rightChild && !leftChild) - return rebuildFour(parent, Rotate.L); - if (rightChild) - return rebuildsix(parent, Rotate.L); - else if (leftChild) - return rebuildfive(parent, Rotate.L); - } - } - } - if (0 > (compare((Comparable<? super K>) parent.getKey()))) - return parent.createNode(parent.getKey(), parent.getValue(), parent.left(), this); - else - return parent.createNode(parent.getKey(), parent.getValue(), this, parent.right()); - } - - protected Node<K, V> rebuildTwo(Node<K, V> parent, Rotate side) throws RotateParent { // case2 - if (side == Rotate.L) { // rotate Left - Node<K, V> node = parent.right(); - Node<K, V> leftSubTreeRoot = node.createNode(parent.getKey(), parent.getValue(), this, node.left()); // check - Node<K, V> leftNode = this.deleteBalance(leftSubTreeRoot); - Node<K, V> rightNode = node.right(); - return parent.createNode(node.getKey(), node.getValue(), leftNode, rightNode); - } else { // rotate Right - Node<K, V> node = parent.left(); - Node<K, V> rightSubTreeRoot = node.createNode(parent.getKey(), parent.getValue(), node.right(), this); - Node<K, V> rightNode = this.deleteBalance(rightSubTreeRoot); - Node<K, V> leftNode = node.left(); - return parent.createNode(node.getKey(), node.getValue(), leftNode, rightNode); - } - } - - protected Node rebuildThree(Node<K, V> parent, Rotate side) { // case3 再帰 - if (side == Rotate.L) { - Node<K, V> rightNode; - if (parent.right().isNotEmpty()) - rightNode = new RedNode<K, V>(parent.right().getKey(), parent.right().getValue(), parent.right().left(), parent.right().right()); // check - else - rightNode = new EmptyNode<>(); - return parent.createNode(parent.getKey(), parent.getValue(), this, rightNode); - } else { - Node<K, V> leftNode; - if (parent.left().isNotEmpty()) - leftNode = new RedNode<K, V>(parent.left().getKey(), parent.left().getValue(), parent.left().left(), parent.left().right()); // check - else - leftNode = new EmptyNode<>(); - return parent.createNode(parent.getKey(), parent.getValue(), leftNode, this); - } - } - - protected Node rebuildFour(Node<K, V> parent, Rotate side) { //case 4 - if (side == Rotate.R) { - Node<K, V> leftNode = new RedNode<K, V>(parent.left().getKey(), parent.left().getValue(), parent.left().left(), parent.left().right()); - return new BlackNode<K, V>(parent.getKey(), parent.getValue(), leftNode, this); - } else { - Node<K, V> rightNode = new RedNode<K, V>(parent.right().getKey(), parent.right().getValue(), parent.right().left(), parent.right().right()); - return new BlackNode<K, V>(parent.getKey(), parent.getValue(), this, rightNode); - } - } - - protected Node rebuildfive(Node<K, V> parent, Rotate side) { //case5 - if (side == Rotate.R) { // rotate Left - Node<K, V> leftChild = new RedNode<K, V>(parent.left().getKey(), parent.left().getValue(), parent.left().left(), parent.left().right().left()); - Node<K, V> rightChild = parent.left().right().right(); - Node<K, V> leftSubTreeRoot = new BlackNode<K, V>(parent.left().right().getKey(), parent.left().right().getValue(), leftChild, rightChild); - Node<K, V> newParent = parent.createNode(parent.getKey(), parent.getValue(), leftSubTreeRoot, this); - return this.rebuildsix(newParent, Rotate.R); - } else { // rotate Right 修正済み - Node<K, V> leftChild = parent.right().left().left(); - Node<K, V> rightChild = new RedNode<K, V>(parent.right().getKey(), parent.right().getValue(), parent.right().left().right(), parent.right().right()); - Node<K, V> rightSubTreeRoot = new BlackNode<K, V>(parent.right().left().getKey(), parent.right().left().getValue(), leftChild, rightChild); - Node<K, V> newParent = parent.createNode(parent.getKey(), parent.getValue(), this, rightSubTreeRoot); - return this.rebuildsix(newParent, Rotate.L); - } - } - - protected Node rebuildsix(Node<K, V> parent, Rotate side) { //case6 - if (side == Rotate.L) { // rotate Left - Node<K, V> leftChild = parent.right().createNode(parent.getKey(), parent.getValue(), this, parent.right().left()); //check - Node<K, V> rightChild = new BlackNode<K, V>(parent.right().right().getKey(), parent.right().right().getValue(), parent.right().right().left(), parent.right().right().right()); - return parent.createNode(parent.right().getKey(), parent.right().getValue(), leftChild, rightChild); - } else { // rotate Right - Node<K, V> leftChild = new BlackNode<K, V>(parent.left().left().getKey(), parent.left().left().getValue(), parent.left().left().left(), parent.left().left().right()); - Node<K, V> rightChild = parent.left().createNode(parent.getKey(), parent.getValue(), parent.left().right(), this); - return parent.createNode(parent.left().getKey(), parent.left().getValue(), leftChild, rightChild); - } - } - - - protected abstract boolean isNotEmpty(); - - public abstract Node<K, V> createNode(K key, V value, Node<K, V> left, Node<K, V> right); - - abstract Node<K, V> insBalance(); - - abstract Rotate checkRotate(Rotate side); - - abstract boolean isRed(); - - public abstract Node replaceNode(Node<K, V> parent) throws RotateParent; - - protected abstract Node deleteNode() throws RotateParent; - - @Test - protected abstract int checkDepth (int count , int minCount); // test method -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/treemap/RedNode.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,113 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.treemap; - -import org.junit.Test; - -/** - * Created by e115731 on 15/03/25. - */ -public class RedNode<K, V> extends Node<K, V> { - - - public RedNode(K key, V value, Node<K, V> left, Node<K, V> right) { - super(key, value, left, right); - } - - - @Override - protected boolean isNotEmpty() { - return true; - } - - @Override - public Node<K, V> createNode(K key, V value, Node<K, V> left, Node<K, V> right) { - return new RedNode<K, V>(key, value, left, right); - } - - @Override - protected Node<K, V> insBalance() { - return this; - } - - @Override - protected Node deleteNode() throws RotateParent { - EmptyNode emptyNode = new EmptyNode(this.getKey()); - return emptyNode; - } - - @Override - Rotate checkRotate(Rotate side) { - if (side == Rotate.L) { - if (left.isRed()) - return Rotate.R; - else if (right.isRed()) - return Rotate.LR; - return Rotate.N; - } else { - if (left.isRed()) - return Rotate.RL; - else if (right.isRed()) - return Rotate.L; - return Rotate.N; - } - } - - @Override - boolean isRed() { - return true; - } - - @Override - public Node replaceNode(Node<K, V> parent) throws RotateParent { - Node<K, V> newNode = null; - if (!this.left().isNotEmpty() && !this.right().isNotEmpty()) { //自身を削除する - return deleteNode(); - } else if (this.left().isNotEmpty() && !this.right().isNotEmpty()) { //左の部分木を昇格させる - newNode = left().createNode(left().getKey(), left().getValue(), left().left(), left().right()); - return newNode; - } else if (!this.left().isNotEmpty() && this.right().isNotEmpty()) { //右の部分木を昇格させる - newNode = right().createNode(right().getKey(), right().getValue(), right().left(), right().right()); - return newNode; - } else {//子ノードが左右にある場合 - //左の部分木の最大の値を持つNodeと自身を置き換える - Node<K, V> cur = this.left(); - - while (cur.right().isNotEmpty()) { - cur = cur.right(); - } - Node leftSubTreeNode = null; - if (this.left().right().isNotEmpty()) { - try { - leftSubTreeNode = this.left().deleteSubTreeMaxNode(null,Rotate.L); - newNode = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.right()); - return newNode; - } catch (RotateParent e) { - leftSubTreeNode = e.getParent(); - Node<K, V> newParent = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.right()); - return leftSubTreeNode.deleteBalance(newParent); - } - } else { - try { - leftSubTreeNode = this.left().replaceNode(this); - newNode = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.right()); - return newNode; - } catch (RotateParent e) { - Node node = e.getParent(); - Node newParent = createNode(this.left().getKey(), this.left().getValue(), leftSubTreeNode, this.right()); - return node.deleteBalance(newParent); - } - } - - } - } - - - @Override - @Test - protected int checkDepth(int count,int minCount) { // test method - count ++; - minCount = left().checkDepth(count, minCount); - minCount = right().checkDepth(count, minCount); - count --; - return minCount; - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/treemap/Rotate.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.treemap; - -/** - * Created by e115731 on 15/03/23. - */ -public enum Rotate { - R, L, RL, LR, N; -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/treemap/RotateParent.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.treemap; - -/** - * Created by e115731 on 15/04/17. - */ -public class RotateParent extends Exception { - Node parent ; - public RotateParent(Node node) { - this.parent = node; - } - - public Node getParent(){ - return parent; - } -}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/treemap/TreeMap.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,114 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.treemap; - - -import org.junit.Test; - -import java.util.Iterator; -import java.util.Optional; -import java.util.Stack; - - -/** - * Created by e115731 on 15/03/23. - */ -public class TreeMap<K, V> { - final Node<K, V> root; - final int size; - - public TreeMap() { - this.root = new EmptyNode(); - this.size = 0; - } - - - public Node getRoot() { - return root; - } - - public TreeMap(Node<K, V> root, int size) { - this.root = root; - this.size = size; - } - - public Optional<V> get(final K key) { - return root.get(key); - } - - public TreeMap put(K key, V value) { - - if (key == null || value == null) // null check - throw new NullPointerException(); - - if (isEmpty()) { - Node<K, V> newRoot = new BlackNode(key, value, new EmptyNode(), new EmptyNode()); - return new TreeMap<K, V>(newRoot, size + 1); - } - - Node<K, V> newEntry = root.put((Comparable<? super K>) key, value); - Node<K, V> newRoot = new BlackNode(newEntry.getKey(), newEntry.getValue(), newEntry.left(), newEntry.right()); - return new TreeMap(newRoot, 0); - } - - - public boolean isEmpty() { - return !root.isNotEmpty(); - } - - - public TreeMap<K, V> delete(K key) { - Node node = null; - try { - node = root.delete((Comparable<? super K>) key, null, Rotate.N); - } catch (RotateParent rotateParent) { - } - if (node == null) - return this; // not key - if (!node.isNotEmpty()) - return new TreeMap(new EmptyNode<>(), 0); - Node newRoot = new BlackNode(node.getKey(), node.getValue(), node.left(), node.right()); - return new TreeMap(newRoot, 0); - } - - public Iterator<K> keys() { - return new Iterator<K>() { - Stack<Node> nodeStack = new Stack(); - Node currentNode = root; - - @Override - public boolean hasNext() { - return currentNode != null; - } - - @Override - public K next() { - K key = (K) currentNode.getKey(); - - if (currentNode.left().isNotEmpty()) { - nodeStack.push(currentNode); - currentNode = currentNode.left(); - return key; - } else if (currentNode.right().isNotEmpty()) { - currentNode = currentNode.right(); - return key; - } else if (nodeStack.isEmpty()) { - currentNode = null; - return key; - } - - do { - currentNode = nodeStack.pop().right(); - if (currentNode.isNotEmpty()) - return key; - - } while (!nodeStack.isEmpty()); - return key; - } - }; - } - - @Test - public void checkDepth() { - root.checkDepth(0, 0); - System.out.println("-----------------------------------"); - } -}
--- a/src/test/java/DefaultJungleTreeTest.java Tue May 19 15:15:34 2015 +0900 +++ b/src/test/java/DefaultJungleTreeTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -1,15 +1,15 @@ import java.nio.ByteBuffer; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle; -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.store.impl.DefaultNodePath; -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.traverser.DefaultTraverser; -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.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.jungle.Jungle; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; import junit.framework.Assert; import junit.framework.TestCase;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/AttributesContainerTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,22 @@ +//package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core; +// +//import org.junit.Assert; +//import org.junit.Ignore; +//import org.junit.Test; +// +//import junit.framework.TestCase; +// +//@Ignore +//public abstract class AttributesContainerTest extends TestCase +//{ +// public abstract AttributesContainer instance(); +// +// @Test +// public void testGetAttributes() +// { +// AttributesContainer instance = instance(); +// Attributes attrs = instance.getAttributes(); +// +// Assert.assertNotNull(attrs); +// } +//}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/AttributesTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,33 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Pair; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import junit.framework.Assert; +import junit.framework.TestCase; +import org.junit.Ignore; + +import java.nio.ByteBuffer; + +@Ignore +public abstract class AttributesTest extends TestCase { + @SuppressWarnings("unchecked") + public static List<Pair<String, ByteBuffer>> ENTRIES = new List( + new Pair("KEY1", ByteBuffer.wrap("VALUE1".getBytes())), + new Pair("KEY2", ByteBuffer.wrap("VALUE2".getBytes())), + new Pair("KEY3", ByteBuffer.wrap("VALUE3".getBytes())) + ); + + public abstract Attributes instance(); + + public void testGet() { + Attributes attrs = instance(); + + for (Pair<String, ByteBuffer> entry : ENTRIES) { + String key = entry.left(); + ByteBuffer expect = entry.right(); + ByteBuffer actual = attrs.get(key); + Assert.assertNotNull(actual); + Assert.assertEquals(0, actual.compareTo(expect)); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/ChildrenTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,20 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core; + + +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNodeChildren; +import junit.framework.Assert; +import junit.framework.TestCase; + +public abstract class ChildrenTest<T> extends TestCase +{ + public abstract int expectSize(); + public abstract DefaultTreeNodeChildren instance(); + + public void testSize() + { + int expect = expectSize(); + Children children = instance(); + + Assert.assertEquals(expect,children.size()); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/GetNodeOfPathTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,48 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core; + +import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.jungle.Jungle; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser; +import junit.framework.Assert; +import org.junit.Test; + +import java.nio.ByteBuffer; +import java.util.Iterator; + +public class GetNodeOfPathTest { + + @Test + public void getNodeOfPathTest() { + Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTreeEditor(new DefaultTraverser())); + jungle.createNewTree("tree"); + JungleTree tree = jungle.getTreeByName("tree"); + JungleTreeEditor editor = tree.getTreeEditor(); + DefaultNodePath path = new DefaultNodePath(); + editor = editor.addNewChildAt(path, 0).b(); + path = path.add(0); + editor = editor.putAttribute(path, "KEY", ByteBuffer.wrap("tatsuki".getBytes())).b(); + editor = editor.addNewChildAt(path, 0).b(); + path = path.add(0); + editor = editor.putAttribute(path, "KEY", ByteBuffer.wrap("tatsuki".getBytes())).b(); + editor.success(); + InterfaceTraverser traverser = tree.getTraverser(true); + Iterator<TreeNode> nodeIterator = traverser.find((TreeNode node) -> { + String str = node.getAttributes().getString("KEY"); + if (str == null) + return false; + if (str.equals("tatsuki")) + return true; + return false; + }, "KEY", "tatsuki"); + + TreeNode node = tree.getNodeOfPath(path).b(); + Assert.assertTrue(nodeIterator.hasNext()); + Assert.assertEquals(node, nodeIterator.next()); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/GetOldTreeTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,46 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core; + + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.jungle.Jungle; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import org.junit.Test; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import junit.framework.Assert; + +public class GetOldTreeTest { + + @Test + public void getOldTreeTest() { + Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTreeEditor(new DefaultTraverser())); + jungle.createNewTree("tree"); + JungleTree tree = jungle.getTreeByName("tree"); + JungleTreeEditor editor = tree.getTreeEditor(); + DefaultNodePath path = new DefaultNodePath(); + + for (int num = 0; num < 10; num++) { + JungleTreeEditor addChildEditor = editor.addNewChildAt(path, num).b(); + JungleTreeEditor putAttributeEditor = addChildEditor.putAttribute(path.add(num), "test", ByteBuffer.wrap("tatsuki".getBytes())).b(); + Either<Error, JungleTreeEditor> successEither = putAttributeEditor.success(); + Assert.assertFalse(successEither.isA()); + editor = successEither.b(); + } + System.out.println(tree.revision()); + TreeNode root = tree.getRootNode(); + Assert.assertTrue(root.getChildren().at(9).isB()); + + JungleTree oldTree = tree.getOldTree(9).b(); + System.out.println(oldTree.revision()); + TreeNode oldRoot = oldTree.getRootNode(); + Assert.assertTrue(oldRoot.getChildren().at(9).isA()); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/ParentTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,22 @@ +/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core; + +import org.junit.Ignore; +import org.junit.Test; + +import junit.framework.Assert; +import junit.framework.TestCase; + +@Ignore +public abstract class ParentTest<T extends Parent<?>> extends TestCase +{ + public abstract T instance(); + + @Test + public void testGetChildren() + { + T instance = instance(); + Children<?> children = instance.getChildren(); + Assert.assertNotNull(children); + } +} +*/ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/impl/treeeditor/DefaultTreeEditorTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,94 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core.impl.treeeditor; + +import jp.ac.u_ryukyu.ie.cr.jungle.tests.util.TestUtil; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.AppendChildAt; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.PutAttribute; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultEvaluator; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Traversal; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import junit.framework.Assert; +import junit.framework.TestCase; + +import java.nio.ByteBuffer; + +public class DefaultTreeEditorTest extends TestCase +{ + public DefaultTreeEditor instance() + { + DefaultTraverser traverser = new DefaultTraverser(); + return new DefaultTreeEditor(traverser); + } + + public void testEdittingDoesNotEffectToOtherTree() + { + TreeNode root = TestUtil.createMockTree(3); + DefaultTreeEditor editor = new DefaultTreeEditor(new DefaultTraverser()); + DefaultNodePath path = new DefaultNodePath().add(0).add(2); + + TreeNode oldRoot = root; + + DefaultTreeEditor currentEditor = editor; + String key = "path"; + + + TreeNode currentRoot = root; + for(DefaultNodePath part : path.inits()){ + String str = part.toString(); + ByteBuffer value = ByteBuffer.wrap(str.getBytes()); + PutAttribute putAttribute = new PutAttribute(key,value); + Either<Error,LoggingNode> either = currentEditor.edit(currentRoot,part,putAttribute); + if(either.isA()){ + Assert.fail(); + } + currentRoot = either.b().getWrap(); + } + + TreeNode newRoot = currentRoot; + DefaultTraverser traverser = new DefaultTraverser(); + + for(DefaultNodePath part : path.inits()){ + Either<Error,Traversal> either = traverser.traverse(newRoot,new DefaultEvaluator(part)); + if(either.isA()){ + Assert.fail(); + } + TreeNode target = either.b().destination(); + String expected = part.toString(); + String actual = new String(target.getAttributes().get(key).array()); + + Assert.assertEquals(expected,actual); + } + + for(DefaultNodePath part : path.inits()){ + Either<Error,Traversal> either = traverser.traverse(oldRoot,new DefaultEvaluator(part)); + if(either.isA()){ + Assert.fail(); + } + TreeNode target = either.b().destination(); + ByteBuffer actual = target.getAttributes().get(key); + + Assert.assertNull(actual); + } + + } + + public void testEdit() + { + DefaultTreeEditor instance = instance(); + DefaultTreeNode node = new DefaultTreeNode(); + DefaultNodePath path = new DefaultNodePath(); + + Either<Error,LoggingNode> either = instance.edit(node,path,new AppendChildAt(0)); + if(either.isA()){ + Assert.fail(); + } + TreeNode newRoot = either.b().getWrap(); + Assert.assertEquals(1,newRoot.getChildren().size()); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/AppendChildAtTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,27 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core.nodeeditor; + + +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.AppendChildAt; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import junit.framework.Assert; +import junit.framework.TestCase; + +public class AppendChildAtTest extends TestCase +{ + public void testEdit() + { + TreeNode node = new DefaultTreeNode(); + AppendChildAt op = new AppendChildAt(0); + Either<Error, LoggingNode> either = op.edit(node); + if(either.isA()){ + Assert.fail(); + } + + LoggingNode newNode = either.b(); + Assert.assertEquals(1,newNode.getChildren().size()); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/DeleteAttributeAtTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,37 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core.nodeeditor; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.DeleteAttribute; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import junit.framework.Assert; +import junit.framework.TestCase; + +public class DeleteAttributeAtTest extends TestCase +{ + public void testEdit() + { + String key = "KEY"; + ByteBuffer value = ByteBuffer.wrap(key.getBytes()); + + TreeNode node = new DefaultTreeNode(); + Either<Error,TreeNode> either = node.getAttributes().put(key, value); + if(either.isA()){ + Assert.fail(); + } + node = either.b(); + + DeleteAttribute op = new DeleteAttribute(key); + Either<Error,LoggingNode> either2 = op.edit(node); + if(either2.isA()){ + Assert.fail(); + } + LoggingNode newNode = either2.b(); + ByteBuffer ret = newNode.getAttributes().get(key); + Assert.assertNull(ret); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/DeleteChildAtTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,33 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core.nodeeditor; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.DeleteChildAt; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import junit.framework.Assert; +import junit.framework.TestCase; + +public class DeleteChildAtTest extends TestCase +{ + public void testEdit() + { + TreeNode node = new DefaultTreeNode(); + Either<Error,TreeNode> either = node.getChildren().addNewChildAt(0); + if(either.isA()){ + Assert.fail(); + } + node = either.b(); + Assert.assertEquals(1,node.getChildren().size()); + + DeleteChildAt op = new DeleteChildAt(0); + Either<Error,LoggingNode> either2 = op.edit(node); + if(either2.isA()){ + Assert.fail(); + } + LoggingNode logNode = either2.b(); + + Assert.assertEquals(0,logNode.getChildren().size()); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/EditableAttributesTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,99 @@ +/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor; + +import java.nio.ByteBuffer; + +import org.junit.Assert; + +import fj.P; +import fj.P2; +import fj.data.List; +import TreeNode; +import TreeNodeAttributes; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableAttributes; +import NodeEditorError; +import Either; +import Error; +import junit.framework.TestCase; + +public abstract class EditableAttributesTest<T extends TreeNode<T>> extends TestCase +{ + public abstract TreeNodeAttributes<T> instance(); + + @SuppressWarnings("unchecked") + public static final List<P2<String,ByteBuffer>> ENTRIES = List.list( + P.p("KEY1",ByteBuffer.wrap("VALUE1".getBytes())), + P.p("KEY2",ByteBuffer.wrap("VALUE2".getBytes())), + P.p("KEY3",ByteBuffer.wrap("VALUE3".getBytes())) + ); + + public TreeNodeAttributes<T> createTestData() + { + TreeNodeAttributes<T> instance = instance(); + + T node; + TreeNodeAttributes<T> attr = instance; + for(P2<String,ByteBuffer> entry : ENTRIES){ + Either<Error,T> either = attr.put(entry._1(),entry._2()); + if(either.isA()){ + Assert.fail("error during creating the data."); + } + + node = either.b(); + attr = node.getAttributes(); + } + + return attr; + } + + public void testPutDoesNotAcceptNullValue() + { + TreeNodeAttributes<T> instance = instance(); + + Either<Error,T> either = instance.put("KEY",null); + if(!either.isA()){ + Assert.fail("put must returns NULL_VALUE_NOT_ALLOWED when the value was null."); + } + + Assert.assertEquals(NodeEditorError.NULL_VALUE_NOT_ALLOWED,either.a()); + + either = instance.put(null,ByteBuffer.wrap("VALUE".getBytes())); + + if(!either.isA()){ + Assert.fail("put must returns NULL_VALUE_NOT_ALLOWED when the key was null."); + } + + Assert.assertEquals(NodeEditorError.NULL_VALUE_NOT_ALLOWED,either.a()); + } + + public void testPut() + { + createTestData(); + } + + public void testDeleteIfKeyExsist() + { + TreeNodeAttributes<T> attr = createTestData(); + + for(P2<String,ByteBuffer> entry : ENTRIES){ + Either<Error,T> either = attr.delete(entry._1()); + if(either.isA()){ + Assert.fail("error during deleting exist key."); + } + + attr = either.b().getAttributes(); + } + } + + public static final String DUMMY_KEY = "dummy"; + + public void testDeleteIfKeyNotExist() + { + TreeNodeAttributes<T> attr = createTestData(); + + Either<Error,T> either = attr.delete(DUMMY_KEY); + if(!either.isA()){ + Assert.fail("delete must returns DELETE_KEY_NOT_FOUND when the deleting invalid key."); + } + } +} +*/ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/EditableChildrenTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,135 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core.nodeeditor; + +import java.nio.ByteBuffer; +/*import org.junit.Assert; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableChildren; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; +import NodeEditorError; +import Either; +import Error; +import junit.framework.TestCase; + +public abstract class EditableChildrenTest<T extends EditableNode<T>> extends TestCase +{ + public abstract EditableChildren<T> instance(); + + public static final String KEY = "KEY"; + public static final ByteBuffer VALUE = ByteBuffer.wrap("VALUE".getBytes()); + + public void testAddNewChildAtMuinusValue() + { + EditableChildren<T> children = instance(); + Either<Error,T> either = children.addNewChildAt(-1); + if(!either.isA()){ + Assert.fail("addNewChildAt(-1) must returns INDEX_OUT_OF_BOUNDS Error"); + } + + Error e = either.a(); + Assert.assertSame(e,NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + public void testAddNewChildAtOutOfBounds() + { + EditableChildren<T> children = instance(); + Either<Error,T> either = children.addNewChildAt(1); + if(!either.isA()){ + Assert.fail("addNewChildAt(1) must returns INDEX_OUT_OF_BOUNDS Error"); + } + + Error e = either.a(); + Assert.assertSame(e,NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + public void testAddNewChildAtMiddle() + { + EditableChildren<T> children = instance(); + + for(int i = 0;i < 3;i ++){ + Either<Error,T> either = children.addNewChildAt(0); + if(either.isA()){ + Assert.fail("fail when adding new child to head"); + } + children = either.b().getChildren(); + } + + Either<Error, T> either = children.addNewChildAt(1); + if(either.isA()){ + Assert.fail("fail when adding new child to middle (1)"); + } + // size must be 4 + children = either.b().getChildren(); + Assert.assertEquals(4,children.size()); + } + + public void testAddNewChildAtToHead() + { + EditableChildren<T> children = instance(); + + int size = children.size(); + + Either<Error,T> either = children.addNewChildAt(0); + if(either.isA()){ + Assert.fail("error during add new child to head"); + } + children = either.b().getChildren(); + Assert.assertEquals(size + 1,children.size()); + } + + public void testDeleteChildAtMuinusValue() + { + EditableChildren<T> children = instance(); + Either<Error,T> either = children.deleteChildAt(-1); + if(!either.isA()){ + Assert.fail("deleteChildAt(-1) must returns INDEX_OUT_OF_BOUNDS Error"); + } + + Error e = either.a(); + Assert.assertSame(e,NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + public void testDeleteChildAtOutOfBounds() + { + EditableChildren<T> children = instance(); + Either<Error,T> either = children.deleteChildAt(1); + if(!either.isA()){ + Assert.fail("deleteChildAt(1) must returns INDEX_OUT_OF_BOUNDS Error"); + } + + Error e = either.a(); + Assert.assertSame(e,NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + public void testDeleteChildAtFailsWhenTheSizeIsZero() + { + EditableChildren<T> children = instance(); + Either<Error,T> either = children.deleteChildAt(0); + if(!either.isA()){ + Assert.fail("deleteChildAt(1) must returns INDEX_OUT_OF_BOUNDS Error"); + } + + Error e = either.a(); + Assert.assertSame(e,NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + public void testDeleteChildAt() + { + EditableChildren<T> children = instance(); + + int size = children.size(); + + Either<Error,T> either = children.addNewChildAt(0); + if(either.isA()){ + Assert.fail("error during add new child to head"); + } + children = either.b().getAttributes().put(KEY,VALUE).b().getChildren(); + Assert.assertEquals(size + 1,children.size()); + + either = children.deleteChildAt(0); + if(either.isA()){ + Assert.fail("error during deleting child"); + } + children = either.b().getChildren(); + + Assert.assertEquals(size,children.size()); + } +}*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/PutAttributeTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,33 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core.nodeeditor; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.PutAttribute; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import org.junit.Assert; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import junit.framework.TestCase; + +public class PutAttributeTest extends TestCase +{ + public void testEdit() + { + String key = "KEY"; + ByteBuffer value = ByteBuffer.wrap(key.getBytes()); + TreeNode node = new DefaultTreeNode(); + PutAttribute op = new PutAttribute(key,value); + //EditableNodeWrapper<DefaultTreeNode> wrapper = new EditableNodeWrapper<DefaultTreeNode>(node); + Either<Error, LoggingNode> either = op.edit(node); + if(either.isA()){ + Assert.fail(); + } + + LoggingNode newNode = either.b(); + ByteBuffer ret = newNode.getAttributes().get(key); + Assert.assertEquals(0,ret.compareTo(value)); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/ReplaceRootNodeAt.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,38 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core.nodeeditor; + +import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.jungle.Jungle; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import junit.framework.Assert; + +import org.junit.Test; + +public class ReplaceRootNodeAt { + + @Test + public void ReplaceRootNodeAtTest() { + Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTreeEditor(new DefaultTraverser())); + jungle.createNewTree("tree"); + JungleTree tree = jungle.getTreeByName("tree"); + JungleTreeEditor editor = tree.getTreeEditor(); + + TreeNode oldRoot = tree.getRootNode(); + Either<Error, JungleTreeEditor> either = editor.replaceNewRootNode(); + Assert.assertTrue(either.isB()); + JungleTreeEditor newTreeEditor = either.b(); + Assert.assertTrue(newTreeEditor.success().isB()); + TreeNode newRoot = tree.getRootNode(); + Assert.assertFalse(oldRoot.equals(newRoot)); + + Either<jp.ac.u_ryukyu.ie.cr.jungle.util.Error, TreeNode> childrenEither = newRoot.getChildren().at(0); + Assert.assertTrue(childrenEither.isB()); + TreeNode newRootChildren = childrenEither.b(); + Assert.assertEquals(oldRoot, newRootChildren); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/treeeditor/TreeNodeChildrenTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,131 @@ +/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.treeeditor; + +import java.nio.ByteBuffer; +import org.junit.Assert; +import fj.data.List; +import TreeNode; +import TreeNodeChildren; +import Either; +import Error; +import junit.framework.TestCase; + +public abstract class TreeNodeChildrenTest<T extends TreeNode<T>> extends TestCase +{ + public abstract TreeNode<T> instance(); + + public void testAddNewChildAtWithNode() + { + int count = 5; + for(Integer pos : List.range(0,5)){ + _testAddNewChildAtWithNode(count,pos); + } + } + + public void _testAddNewChildAtWithNode(int _count,int _pos) + { + TreeNode<T> instance = instance(); + + Either<Error, T> either; + for(int i = 0;i < _count;i ++){ + either = instance.getChildren().addNewChildAt(0); + if(either.isA()){ + Assert.fail(); + } + instance = either.b(); + } + + TreeNode<T> newNode = instance.createNewNode(); + String key = "KEY"; + ByteBuffer value = ByteBuffer.wrap("VALUE".getBytes()); + + either = newNode.getAttributes().put(key,value); + if(either.isA()){ + Assert.fail(); + } + newNode = either.b(); + + either = instance.getChildren().addNewChildAt(_pos,newNode); + if(either.isA()){ + Assert.fail(); + } + instance = either.b(); + + // check + either = instance.getChildren().at(_pos); + if(either.isA()){ + Assert.fail(); + } + + T checkTarget = either.b(); + ByteBuffer actual = checkTarget.getAttributes().get(key); + Assert.assertEquals(0,value.compareTo(actual)); + } + + public void testReplaceAt() + { + int count = 5; + for(Integer pos : List.range(0,count)){ + _testReplaceAt(count,pos); + } + } + + public void _testReplaceAt(int _count,int _pos) + { + TreeNode<T> instance = instance(); + String key = "KEY"; + ByteBuffer value = ByteBuffer.wrap("VALUE".getBytes()); + + // prepare + + for(int i = 0;i < _count;i ++){ + TreeNode<T> newNode = instance.createNewNode(); + Either<Error,T> either = newNode.getAttributes().put(key,value); + if(either.isA()){ + Assert.fail("failed to put attributes to child"); + } + + newNode = either.b(); + either = instance.getChildren().addNewChildAt(0,newNode); + if(either.isA()){ + Assert.fail("failed to add child to instance"); + } + + instance = either.b(); + } + + int size = instance.getChildren().size(); + Assert.assertEquals(_count,size); + + // create node for replacement. + + ByteBuffer replaceNodeValue = ByteBuffer.wrap("EULAV".getBytes()); + TreeNode<T> replacement = instance.createNewNode(); + Either<Error,T> either = replacement.getAttributes().put(key,replaceNodeValue); + if(either.isA()){ + Assert.fail("failed to create replacement node"); + } + replacement = either.b(); + + // replace + + either = instance.getChildren().replaceNode(_pos,replacement); + if(either.isA()){ + Assert.fail("failed to replace node."); + } + instance = either.b(); + + TreeNodeChildren<T> children = instance.getChildren(); + for(Integer pos : List.range(0,_count)){ + either = children.at(pos.intValue()); + if(either.isA()){ + Assert.fail("failed to get node."); + } + + T ch = either.b(); + ByteBuffer expect = (_pos != pos) ? value : replaceNodeValue; + ByteBuffer actual = ch.getAttributes().get(key); + + Assert.assertEquals(0,expect.compareTo(actual)); + } + } +}*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/impl/clonable/DefaultTreeNodeAttributesTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,60 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.impl.clonable; + + +import jp.ac.u_ryukyu.ie.cr.jungle.core.Attributes; +import jp.ac.u_ryukyu.ie.cr.jungle.core.AttributesTest; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Pair; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +import java.nio.ByteBuffer; + +public class DefaultTreeNodeAttributesTest extends TestCase +{ + public static TestSuite suite() + { + TestSuite suite = new TestSuite(); + suite.addTestSuite(AttributeTestImpl.class); + //suite.addTestSuite(EditableAttributesTestImpl.class); + return suite; + } + + public static DefaultTreeNode instance() + { + List<TreeNode> rawList = new List(); + TreeMap<String,ByteBuffer> rawMap = new TreeMap(); + + for(Pair<String,ByteBuffer> entry : AttributesTest.ENTRIES){ + rawMap = rawMap.put(entry.left(),entry.right()); + } + + return new DefaultTreeNode(rawList,rawMap); + } + + public static class AttributeTestImpl extends AttributesTest + { + + @Override + public Attributes instance() + { + return DefaultTreeNodeAttributesTest.instance().getAttributes(); + } + + } + + /*public static class EditableAttributesTestImpl extends EditableAttributesTest<DefaultTreeNode> + { + + @Override + public DefaultTreeNodeAttribute instance() + { + DefaultTreeNode instance = DefaultTreeNodeAttributesTest.instance(); + return instance.getAttributes(); + } + + }*/ +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/impl/clonable/DefaultTreeNodeChildrenTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,45 @@ +/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.impl.clonable; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor.EditableChildrenTest; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.treeeditor.TreeNodeChildrenTest; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.EditableNodeWrapper; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableChildren; +import DefaultTreeNode; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +public class DefaultTreeNodeChildrenTest extends TestCase +{ + public static TestSuite suite() + { + TestSuite suite = new TestSuite(); + suite.addTestSuite(EditableChildrenTestImpl.class); + suite.addTestSuite(TreeNodeChildrenTestImpl.class); + return suite; + } + + public static DefaultTreeNode instance() + { + return new DefaultTreeNode(); + } + + public static class TreeNodeChildrenTestImpl extends TreeNodeChildrenTest<DefaultTreeNode> + { + @Override + public DefaultTreeNode instance() + { + return DefaultTreeNodeChildrenTest.instance(); + } + } + + public static class EditableChildrenTestImpl extends EditableChildrenTest<EditableNodeWrapper<DefaultTreeNode>> + { + @Override + public EditableChildren<EditableNodeWrapper<DefaultTreeNode>> instance() + { + DefaultTreeNode wrap = DefaultTreeNodeChildrenTest.instance(); + EditableNodeWrapper<DefaultTreeNode> wrapper = new EditableNodeWrapper<DefaultTreeNode>(wrap); + return wrapper.getChildren(); + } + } +}*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/impl/clonable/DefaultTreeNodeTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,55 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.impl.clonable; + +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import junit.framework.Assert; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +public class DefaultTreeNodeTest extends TestCase +{ + public static TestSuite suite() + { + TestSuite suite = new TestSuite(); + //suite.addTestSuite(AttributesContaierTestImpl.class); + //suite.addTestSuite(ParentTestImpl.class); + return suite; + } + + public static DefaultTreeNode instance() + { + DefaultTreeNode node = new DefaultTreeNode(); + return node; + } + + public void testGetWrapped() + { + DefaultTreeNode instance = instance(); + } + + public void testCreateNewNode() + { + DefaultTreeNode instance = instance(); + DefaultTreeNode node = instance.createNewNode(); + + Assert.assertNotNull(node); + } + +// public static class AttributesContaierTestImpl extends AttributesContainerTest +// { +// @Override +// public AttributesContainer instance() +// { +// return DefaultTreeNodeTest.instance(); +// } +// } + + /*public static class ParentTestImpl extends ParentTest<DefaultTreeNode> + { + + @Override + public DefaultTreeNode instance() + { + return DefaultTreeNodeTest.instance(); + } + }*/ +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/impl/node/DefaultAttributesTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,54 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.impl.node; + +import jp.ac.u_ryukyu.ie.cr.jungle.core.AttributesTest; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeAttributes; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Pair; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; +import org.junit.Assert; + +import java.nio.ByteBuffer; +import java.util.Optional; + +public class DefaultAttributesTest extends AttributesTest +{ + public TreeNodeAttributes instance() + { + List<TreeNode> rawList = new List(); + TreeMap<String,ByteBuffer> rawMap = new TreeMap(); + + // add attributes + + for(Pair<String, ByteBuffer> entry : ENTRIES){ + rawMap = rawMap.put(entry.left(),entry.right()); + } + + TreeNode node = new DefaultTreeNode(rawList,rawMap); + return node.getAttributes(); + } + + public void testGetAttributesAsRawMap() + { + TreeNodeAttributes attrs = instance(); + TreeMap<String,ByteBuffer> rawMap = attrs.getAttributesAsRawMap(); + + // testing rawmap is not null. + Assert.assertNotNull(rawMap); + + // testing rawmap has correct key values. + for(Pair<String,ByteBuffer> entry : ENTRIES){ + String key = entry.left(); + ByteBuffer value = entry.right(); + + Optional<ByteBuffer> option = rawMap.get(key); + if(!option.isPresent()){ + Assert.fail(); + } + + ByteBuffer actual = option.get(); + Assert.assertEquals(0,actual.compareTo(value)); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/impl/node/DefaultChildrenTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,44 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.impl.node; + + +import jp.ac.u_ryukyu.ie.cr.jungle.core.ChildrenTest; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNodeChildren; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; +import org.junit.Assert; + +import java.nio.ByteBuffer; + +public class DefaultChildrenTest extends ChildrenTest<TreeNode> +{ + + @Override + public DefaultTreeNodeChildren instance() + { + List<TreeNode> rawList = new List(); + for(int i = 0;i < expectSize();i ++){ + rawList = rawList.addLast(new DefaultTreeNode()); + } + + TreeMap<String,ByteBuffer> rawMap = new TreeMap(); + + return new DefaultTreeNode(rawList,rawMap).getChildren(); + } + + @Override + public int expectSize() + { + return 3; + } + + public void testGetChildrenAsRawList() + { + DefaultTreeNodeChildren instance = instance(); + List<TreeNode> rawList = instance.getChildrenAsRawList(); + + Assert.assertNotNull(rawList); + Assert.assertEquals(expectSize(),rawList.length()); + } +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/impl/node/DefaultNodeTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,55 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.impl.node; + + +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +import java.nio.ByteBuffer; + +public class DefaultNodeTest extends TestCase +{ + public DefaultNodeTest(String _name) + { + super(_name); + } + + public static TestSuite suite() + { + TestSuite suite = new TestSuite(); + //suite.addTestSuite(DefaultNodeTest.AttributesContaierTestImpl.class); + //suite.addTestSuite(DefaultNodeTest.ParentTestImpl.class); + return suite; + } + + public static DefaultTreeNode instance() + { + List<TreeNode> rawList = new List(); + TreeMap<String,ByteBuffer> rawMap = new TreeMap(); + DefaultTreeNode node = new DefaultTreeNode(rawList,rawMap); + + return node; + } + +// public static class AttributesContaierTestImpl extends AttributesContainerTest +// { +// @Override +// public AttributesContainer instance() +// { +// return DefaultNodeTest.instance(); +// } +//// } + + /*public static class ParentTestImpl extends ParentTest<DefaultTreeNode> + { + + @Override + public DefaultTreeNode instance() + { + return DefaultNodeTest.instance(); + } + }*/ +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/index/parentIndexTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,47 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.index; + +import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.jungle.Jungle; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.store.index.ParentIndex; +import junit.framework.Assert; +import org.junit.Test; + +import java.nio.ByteBuffer; + +/** + * Created by e115731 on 15/05/06. + */ +public class parentIndexTest { + @Test + public void parentIndex() { + Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTreeEditor(new DefaultTraverser())); + jungle.createNewTree("tree"); + JungleTree tree = jungle.getTreeByName("tree"); + JungleTreeEditor editor = tree.getTreeEditor(); + + DefaultNodePath path = new DefaultNodePath(); + for (int count = 0; count < 100; count++) { + editor = editor.addNewChildAt(path, 0).b(); + path = path.add(0); + editor = editor.putAttribute(path, "KEY", ByteBuffer.wrap(("tatsuki" + count).getBytes())).b(); + } + + Either<Error, JungleTreeEditor> either = editor.success(); + Assert.assertTrue(either.isB()); + TreeNode node = tree.getNodeOfPath(path).b(); + ParentIndex parentIndex = tree.getParentIndex(); + for (int count = 99; count >= 0; count--) { + String attribute = node.getAttributes().getString("KEY"); + Assert.assertEquals(attribute, "tatsuki" + count); + node = parentIndex.get(node); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/tests/util/TestUtil.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,44 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.tests.util; + +import java.nio.ByteBuffer; + +import org.junit.Ignore; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +@Ignore +public class TestUtil +{ + public static TreeNode createMockTree(int _maxDepth) + { + return _createMockTree(1,_maxDepth,new DefaultNodePath()); + } + + public static TreeNode _createMockTree(int _currentDepth,int _maxDepth,NodePath _path) + { + TreeNode parent = new DefaultTreeNode(); + Either<Error, TreeNode> either = parent.getAttributes().put("KEY",ByteBuffer.wrap(_path.toString().getBytes())); + if(either.isA()){ + return null; + } + parent = either.b(); + + if(_currentDepth != _maxDepth){ + for(int i = 0;i <= _currentDepth;i ++){ + TreeNode ch = _createMockTree(_currentDepth + 1,_maxDepth,_path.add(i)); + either = parent.getChildren().addNewChildAt(i,ch); + if(either.isA()){ + return null; + } + parent = either.b(); + } + } + + return parent; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/traverse/BruteForceTraverserTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,87 @@ +/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverse; + +import java.nio.ByteBuffer; +import java.util.Iterator; + +import JungleTreeEditor; +import NodePath; +import DefaultNodePath; +import TreeNode; +import DefaultTreeNode; +import InterfaceTraverser; +import Either; +import Error; +import Pair; +import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.SearchQuery; +import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.UpdateQuery; +import junit.framework.TestCase; + +import org.junit.Assert; +import org.junit.Test; + +public abstract class BruteForceTraverserTest extends TestCase{ + public abstract InterfaceTraverser instance(TreeNode node); + + @Test + public void testSearch() { + int maxHeight = 3; + Pair<TreeNode, NodePath> test = null; + TreeNode root = createTree(0,0,maxHeight,new DefaultNodePath()); + InterfaceTraverser traverser = instance(root); + Iterator<Pair<TreeNode, NodePath>> itNode = traverser.find(new SearchQuery("KEY","<-1,0,0>")); + for(;itNode.hasNext(); ){ + test = itNode.next(); + } + String str = new String(test.left().getAttributes().get("KEY").array()); + Assert.assertEquals(str,"<-1,0,0>"); + } + + @Test + public void testUpdate() { + int maxHeight = 3; + Pair<TreeNode, NodePath> test = null; + TreeNode root = createTree(0,0,maxHeight,new DefaultNodePath()); + InterfaceTraverser traverser = instance(root); + JungleTreeEditor editor = traverser.update(new UpdateQuery("KEY", "<-1,0,0>", "tatsuki")); + traverser.set(editor.getRoot()); + Iterator<Pair<TreeNode, NodePath>> checkNode = traverser.find(new SearchQuery("KEY","tatsuki")); + for(;checkNode.hasNext(); ){ + test = checkNode.next(); + } + String str = new String(test.left().getAttributes().get("KEY").array()); + Assert.assertEquals(str,"tatsuki"); + } + + public static String key = "KEY"; + public static ByteBuffer value = ByteBuffer.wrap(key.getBytes()); + public static DefaultTreeNode factory = new DefaultTreeNode(); + + public static TreeNode createTree(int _curX,int _curY,int _maxHeight,NodePath _address) + { + System.out.println(_address.toString()); + TreeNode parent = factory.createNewNode(); + Either<Error,TreeNode> either = parent.getAttributes().put(key,ByteBuffer.wrap(_address.toString().getBytes())); + if(either.isA()){ + Assert.fail(); + } + parent = either.b(); + + if(_curY == _maxHeight){ + return parent; + } + + for(int i = 0;i < _curY + 1;i ++){ + TreeNode ch = createTree(i,_curY + 1,_maxHeight,_address.add(i)); + either = parent.getChildren().addNewChildAt(i,ch); + if(either.isA()){ + Assert.fail(); + } + + parent = either.b(); + } + + return parent; + } + +} +*/ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/traverse/TraverserTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -0,0 +1,108 @@ +/* +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverse; + +import List; +import NodePath; +import DefaultNodePath; +import TreeNode; +import DefaultTreeNode; +import DefaultEvaluator; +import Direction; +import Traversal; +import Traverser; +import Either; +import Error; +import junit.framework.TestCase; +import org.junit.Assert; + +import java.nio.ByteBuffer; + +public abstract class TraverserTest extends TestCase +{ + public abstract Traverser instance(); + + public void testTraverse() + { + int maxHeight = 3; + TreeNode root = createTree(0,0,maxHeight,new DefaultNodePath()); + + //TraversableNodeWrapper<DefaultTreeNode> traversable = new TraversableNodeWrapper<DefaultTreeNode>(root); + Traverser traverser = instance(); + + // generate all pattern. + List<DefaultNodePath> paths = generatePathPattern(new DefaultNodePath(),0,maxHeight); + paths = paths.addLast(new DefaultNodePath()); + + for(DefaultNodePath path : paths){ + DefaultEvaluator evaluator = new DefaultEvaluator(path); + Either<Error,Traversal> ret = traverser.traverse(root,evaluator); + if(ret.isA()){ + Assert.fail(); + } + + Traversal traversal = ret.b(); + TreeNode target = traversal.destination(); + String expect = path.toString(); + ByteBuffer value = target.getAttributes().get(key); + String actual = new String(value.array()); + Assert.assertEquals(expect,actual); + + List<DefaultNodePath> parts = path.inits(); + + for(Direction<TreeNode> d : traversal){ + DefaultNodePath part = parts.head(); + parts = parts.last(); + value = d.getTarget().getAttributes().get(key); + String actualCurrentPathStr = new String(value.array()); + String expectCurrentPathStr = part.toString(); + Assert.assertEquals(expectCurrentPathStr,actualCurrentPathStr); + } + } + } + + public List<DefaultNodePath> generatePathPattern(DefaultNodePath _cur,int _curHeight,int _maxHeight) + { + List<DefaultNodePath> paths = List.nil(); + for(int p = 0;p <= _curHeight;p ++){ + DefaultNodePath path = _cur.add(p); + if(_curHeight != _maxHeight - 1){ + List<DefaultNodePath> newpaths = generatePathPattern(path,_curHeight+1,_maxHeight); + paths = paths.append(newpaths); + } + paths = paths.cons(path); + } + + return paths; + } + + public static String key = "KEY"; + public static ByteBuffer value = ByteBuffer.wrap(key.getBytes()); + public static DefaultTreeNode factory = new DefaultTreeNode(); + + public TreeNode createTree(int _curX,int _curY,int _maxHeight,NodePath _address) + { + TreeNode parent = factory.createNewNode(); + Either<Error,TreeNode> either = parent.getAttributes().put(key,ByteBuffer.wrap(_address.toString().getBytes())); + if(either.isA()){ + Assert.fail(); + } + parent = either.b(); + + if(_curY == _maxHeight){ + return parent; + } + + for(int i = 0;i < _curY + 1;i ++){ + TreeNode ch = createTree(i,_curY + 1,_maxHeight,_address.add(i)); + either = parent.getChildren().addNewChildAt(i,ch); + if(either.isA()){ + Assert.fail(); + } + + parent = either.b(); + } + + return parent; + } +} +*/ \ No newline at end of file
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/AttributesContainerTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -//package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core; -// -//import org.junit.Assert; -//import org.junit.Ignore; -//import org.junit.Test; -// -//import junit.framework.TestCase; -// -//@Ignore -//public abstract class AttributesContainerTest extends TestCase -//{ -// public abstract AttributesContainer instance(); -// -// @Test -// public void testGetAttributes() -// { -// AttributesContainer instance = instance(); -// Attributes attrs = instance.getAttributes(); -// -// Assert.assertNotNull(attrs); -// } -//}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/AttributesTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core; - -import jp.ac.u_ryukyu.ie.cr.list.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; -import junit.framework.Assert; -import junit.framework.TestCase; -import org.junit.Ignore; - -import java.nio.ByteBuffer; - -@Ignore -public abstract class AttributesTest extends TestCase { - @SuppressWarnings("unchecked") - public static List<Pair<String, ByteBuffer>> ENTRIES = new List( - new Pair("KEY1", ByteBuffer.wrap("VALUE1".getBytes())), - new Pair("KEY2", ByteBuffer.wrap("VALUE2".getBytes())), - new Pair("KEY3", ByteBuffer.wrap("VALUE3".getBytes())) - ); - - public abstract Attributes instance(); - - public void testGet() { - Attributes attrs = instance(); - - for (Pair<String, ByteBuffer> entry : ENTRIES) { - String key = entry.left(); - ByteBuffer expect = entry.right(); - ByteBuffer actual = attrs.get(key); - Assert.assertNotNull(actual); - Assert.assertEquals(0, actual.compareTo(expect)); - } - } -}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/ChildrenTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core; - - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNodeChildren; -import junit.framework.Assert; -import junit.framework.TestCase; - -public abstract class ChildrenTest<T> extends TestCase -{ - public abstract int expectSize(); - public abstract DefaultTreeNodeChildren instance(); - - public void testSize() - { - int expect = expectSize(); - Children children = instance(); - - Assert.assertEquals(expect,children.size()); - } -}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/GetNodeOfPathTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle; -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.store.impl.DefaultNodePath; -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.traverser.DefaultTraverser; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; -import junit.framework.Assert; -import org.junit.Test; - -import java.nio.ByteBuffer; -import java.util.Iterator; - -public class GetNodeOfPathTest { - - @Test - public void getNodeOfPathTest() { - Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTreeEditor(new DefaultTraverser())); - jungle.createNewTree("tree"); - JungleTree tree = jungle.getTreeByName("tree"); - JungleTreeEditor editor = tree.getTreeEditor(); - DefaultNodePath path = new DefaultNodePath(); - editor = editor.addNewChildAt(path, 0).b(); - path = path.add(0); - editor = editor.putAttribute(path, "KEY", ByteBuffer.wrap("tatsuki".getBytes())).b(); - editor = editor.addNewChildAt(path, 0).b(); - path = path.add(0); - editor = editor.putAttribute(path, "KEY", ByteBuffer.wrap("tatsuki".getBytes())).b(); - editor.success(); - InterfaceTraverser traverser = tree.getTraverser(true); - Iterator<TreeNode> nodeIterator = traverser.find((TreeNode node) -> { - String str = node.getAttributes().getString("KEY"); - if (str == null) - return false; - if (str.equals("tatsuki")) - return true; - return false; - }, "KEY", "tatsuki"); - - TreeNode node = tree.getNodeOfPath(path).b(); - Assert.assertTrue(nodeIterator.hasNext()); - Assert.assertEquals(node, nodeIterator.next()); - } -}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/GetOldTreeTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core; - - -import java.nio.ByteBuffer; - -import org.junit.Test; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle; -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.store.impl.DefaultNodePath; -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.traverser.DefaultTraverser; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import junit.framework.Assert; - -public class GetOldTreeTest { - - @Test - public void getOldTreeTest() { - Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTreeEditor(new DefaultTraverser())); - jungle.createNewTree("tree"); - JungleTree tree = jungle.getTreeByName("tree"); - JungleTreeEditor editor = tree.getTreeEditor(); - DefaultNodePath path = new DefaultNodePath(); - - for (int num = 0; num < 10; num++) { - JungleTreeEditor addChildEditor = editor.addNewChildAt(path, num).b(); - JungleTreeEditor putAttributeEditor = addChildEditor.putAttribute(path.add(num), "test", ByteBuffer.wrap("tatsuki".getBytes())).b(); - Either<Error, JungleTreeEditor> successEither = putAttributeEditor.success(); - Assert.assertFalse(successEither.isA()); - editor = successEither.b(); - } - System.out.println(tree.revision()); - TreeNode root = tree.getRootNode(); - Assert.assertTrue(root.getChildren().at(9).isB()); - - JungleTree oldTree = tree.getOldTree(9).b(); - System.out.println(oldTree.revision()); - TreeNode oldRoot = oldTree.getRootNode(); - Assert.assertTrue(oldRoot.getChildren().at(9).isA()); - } -}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/ParentTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core; - -import org.junit.Ignore; -import org.junit.Test; - -import junit.framework.Assert; -import junit.framework.TestCase; - -@Ignore -public abstract class ParentTest<T extends Parent<?>> extends TestCase -{ - public abstract T instance(); - - @Test - public void testGetChildren() - { - T instance = instance(); - Children<?> children = instance.getChildren(); - Assert.assertNotNull(children); - } -} -*/ \ No newline at end of file
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/impl/treeeditor/DefaultTreeEditorTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,94 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.impl.treeeditor; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; -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.store.impl.logger.LoggingNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.AppendChildAt; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.PutAttribute; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.tests.util.TestUtil; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultEvaluator; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traversal; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import junit.framework.Assert; -import junit.framework.TestCase; - -import java.nio.ByteBuffer; - -public class DefaultTreeEditorTest extends TestCase -{ - public DefaultTreeEditor instance() - { - DefaultTraverser traverser = new DefaultTraverser(); - return new DefaultTreeEditor(traverser); - } - - public void testEdittingDoesNotEffectToOtherTree() - { - TreeNode root = TestUtil.createMockTree(3); - DefaultTreeEditor editor = new DefaultTreeEditor(new DefaultTraverser()); - DefaultNodePath path = new DefaultNodePath().add(0).add(2); - - TreeNode oldRoot = root; - - DefaultTreeEditor currentEditor = editor; - String key = "path"; - - - TreeNode currentRoot = root; - for(DefaultNodePath part : path.inits()){ - String str = part.toString(); - ByteBuffer value = ByteBuffer.wrap(str.getBytes()); - PutAttribute putAttribute = new PutAttribute(key,value); - Either<Error,LoggingNode> either = currentEditor.edit(currentRoot,part,putAttribute); - if(either.isA()){ - Assert.fail(); - } - currentRoot = either.b().getWrap(); - } - - TreeNode newRoot = currentRoot; - DefaultTraverser traverser = new DefaultTraverser(); - - for(DefaultNodePath part : path.inits()){ - Either<Error,Traversal> either = traverser.traverse(newRoot,new DefaultEvaluator(part)); - if(either.isA()){ - Assert.fail(); - } - TreeNode target = either.b().destination(); - String expected = part.toString(); - String actual = new String(target.getAttributes().get(key).array()); - - Assert.assertEquals(expected,actual); - } - - for(DefaultNodePath part : path.inits()){ - Either<Error,Traversal> either = traverser.traverse(oldRoot,new DefaultEvaluator(part)); - if(either.isA()){ - Assert.fail(); - } - TreeNode target = either.b().destination(); - ByteBuffer actual = target.getAttributes().get(key); - - Assert.assertNull(actual); - } - - } - - public void testEdit() - { - DefaultTreeEditor instance = instance(); - DefaultTreeNode node = new DefaultTreeNode(); - DefaultNodePath path = new DefaultNodePath(); - - Either<Error,LoggingNode> either = instance.edit(node,path,new AppendChildAt(0)); - if(either.isA()){ - Assert.fail(); - } - TreeNode newRoot = either.b().getWrap(); - Assert.assertEquals(1,newRoot.getChildren().size()); - } -}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/AppendChildAtTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor; - - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.AppendChildAt; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import junit.framework.Assert; -import junit.framework.TestCase; - -public class AppendChildAtTest extends TestCase -{ - public void testEdit() - { - TreeNode node = new DefaultTreeNode(); - AppendChildAt op = new AppendChildAt(0); - Either<Error, LoggingNode> either = op.edit(node); - if(either.isA()){ - Assert.fail(); - } - - LoggingNode newNode = either.b(); - Assert.assertEquals(1,newNode.getChildren().size()); - } -}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/DeleteAttributeAtTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor; - -import java.nio.ByteBuffer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteAttribute; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import junit.framework.Assert; -import junit.framework.TestCase; - -public class DeleteAttributeAtTest extends TestCase -{ - public void testEdit() - { - String key = "KEY"; - ByteBuffer value = ByteBuffer.wrap(key.getBytes()); - - TreeNode node = new DefaultTreeNode(); - Either<Error,TreeNode> either = node.getAttributes().put(key, value); - if(either.isA()){ - Assert.fail(); - } - node = either.b(); - - DeleteAttribute op = new DeleteAttribute(key); - Either<Error,LoggingNode> either2 = op.edit(node); - if(either2.isA()){ - Assert.fail(); - } - LoggingNode newNode = either2.b(); - ByteBuffer ret = newNode.getAttributes().get(key); - Assert.assertNull(ret); - } -}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/DeleteChildAtTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteChildAt; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import junit.framework.Assert; -import junit.framework.TestCase; - -public class DeleteChildAtTest extends TestCase -{ - public void testEdit() - { - TreeNode node = new DefaultTreeNode(); - Either<Error,TreeNode> either = node.getChildren().addNewChildAt(0); - if(either.isA()){ - Assert.fail(); - } - node = either.b(); - Assert.assertEquals(1,node.getChildren().size()); - - DeleteChildAt op = new DeleteChildAt(0); - Either<Error,LoggingNode> either2 = op.edit(node); - if(either2.isA()){ - Assert.fail(); - } - LoggingNode logNode = either2.b(); - - Assert.assertEquals(0,logNode.getChildren().size()); - } -}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/EditableAttributesTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor; - -import java.nio.ByteBuffer; - -import org.junit.Assert; - -import fj.P; -import fj.P2; -import fj.data.List; -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 jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableAttributes; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditorError; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import junit.framework.TestCase; - -public abstract class EditableAttributesTest<T extends TreeNode<T>> extends TestCase -{ - public abstract TreeNodeAttributes<T> instance(); - - @SuppressWarnings("unchecked") - public static final List<P2<String,ByteBuffer>> ENTRIES = List.list( - P.p("KEY1",ByteBuffer.wrap("VALUE1".getBytes())), - P.p("KEY2",ByteBuffer.wrap("VALUE2".getBytes())), - P.p("KEY3",ByteBuffer.wrap("VALUE3".getBytes())) - ); - - public TreeNodeAttributes<T> createTestData() - { - TreeNodeAttributes<T> instance = instance(); - - T node; - TreeNodeAttributes<T> attr = instance; - for(P2<String,ByteBuffer> entry : ENTRIES){ - Either<Error,T> either = attr.put(entry._1(),entry._2()); - if(either.isA()){ - Assert.fail("error during creating the data."); - } - - node = either.b(); - attr = node.getAttributes(); - } - - return attr; - } - - public void testPutDoesNotAcceptNullValue() - { - TreeNodeAttributes<T> instance = instance(); - - Either<Error,T> either = instance.put("KEY",null); - if(!either.isA()){ - Assert.fail("put must returns NULL_VALUE_NOT_ALLOWED when the value was null."); - } - - Assert.assertEquals(NodeEditorError.NULL_VALUE_NOT_ALLOWED,either.a()); - - either = instance.put(null,ByteBuffer.wrap("VALUE".getBytes())); - - if(!either.isA()){ - Assert.fail("put must returns NULL_VALUE_NOT_ALLOWED when the key was null."); - } - - Assert.assertEquals(NodeEditorError.NULL_VALUE_NOT_ALLOWED,either.a()); - } - - public void testPut() - { - createTestData(); - } - - public void testDeleteIfKeyExsist() - { - TreeNodeAttributes<T> attr = createTestData(); - - for(P2<String,ByteBuffer> entry : ENTRIES){ - Either<Error,T> either = attr.delete(entry._1()); - if(either.isA()){ - Assert.fail("error during deleting exist key."); - } - - attr = either.b().getAttributes(); - } - } - - public static final String DUMMY_KEY = "dummy"; - - public void testDeleteIfKeyNotExist() - { - TreeNodeAttributes<T> attr = createTestData(); - - Either<Error,T> either = attr.delete(DUMMY_KEY); - if(!either.isA()){ - Assert.fail("delete must returns DELETE_KEY_NOT_FOUND when the deleting invalid key."); - } - } -} -*/ \ No newline at end of file
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/EditableChildrenTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,135 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor; - -import java.nio.ByteBuffer; -/*import org.junit.Assert; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableChildren; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditorError; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import junit.framework.TestCase; - -public abstract class EditableChildrenTest<T extends EditableNode<T>> extends TestCase -{ - public abstract EditableChildren<T> instance(); - - public static final String KEY = "KEY"; - public static final ByteBuffer VALUE = ByteBuffer.wrap("VALUE".getBytes()); - - public void testAddNewChildAtMuinusValue() - { - EditableChildren<T> children = instance(); - Either<Error,T> either = children.addNewChildAt(-1); - if(!either.isA()){ - Assert.fail("addNewChildAt(-1) must returns INDEX_OUT_OF_BOUNDS Error"); - } - - Error e = either.a(); - Assert.assertSame(e,NodeEditorError.INDEX_OUT_OF_BOUNDS); - } - - public void testAddNewChildAtOutOfBounds() - { - EditableChildren<T> children = instance(); - Either<Error,T> either = children.addNewChildAt(1); - if(!either.isA()){ - Assert.fail("addNewChildAt(1) must returns INDEX_OUT_OF_BOUNDS Error"); - } - - Error e = either.a(); - Assert.assertSame(e,NodeEditorError.INDEX_OUT_OF_BOUNDS); - } - - public void testAddNewChildAtMiddle() - { - EditableChildren<T> children = instance(); - - for(int i = 0;i < 3;i ++){ - Either<Error,T> either = children.addNewChildAt(0); - if(either.isA()){ - Assert.fail("fail when adding new child to head"); - } - children = either.b().getChildren(); - } - - Either<Error, T> either = children.addNewChildAt(1); - if(either.isA()){ - Assert.fail("fail when adding new child to middle (1)"); - } - // size must be 4 - children = either.b().getChildren(); - Assert.assertEquals(4,children.size()); - } - - public void testAddNewChildAtToHead() - { - EditableChildren<T> children = instance(); - - int size = children.size(); - - Either<Error,T> either = children.addNewChildAt(0); - if(either.isA()){ - Assert.fail("error during add new child to head"); - } - children = either.b().getChildren(); - Assert.assertEquals(size + 1,children.size()); - } - - public void testDeleteChildAtMuinusValue() - { - EditableChildren<T> children = instance(); - Either<Error,T> either = children.deleteChildAt(-1); - if(!either.isA()){ - Assert.fail("deleteChildAt(-1) must returns INDEX_OUT_OF_BOUNDS Error"); - } - - Error e = either.a(); - Assert.assertSame(e,NodeEditorError.INDEX_OUT_OF_BOUNDS); - } - - public void testDeleteChildAtOutOfBounds() - { - EditableChildren<T> children = instance(); - Either<Error,T> either = children.deleteChildAt(1); - if(!either.isA()){ - Assert.fail("deleteChildAt(1) must returns INDEX_OUT_OF_BOUNDS Error"); - } - - Error e = either.a(); - Assert.assertSame(e,NodeEditorError.INDEX_OUT_OF_BOUNDS); - } - - public void testDeleteChildAtFailsWhenTheSizeIsZero() - { - EditableChildren<T> children = instance(); - Either<Error,T> either = children.deleteChildAt(0); - if(!either.isA()){ - Assert.fail("deleteChildAt(1) must returns INDEX_OUT_OF_BOUNDS Error"); - } - - Error e = either.a(); - Assert.assertSame(e,NodeEditorError.INDEX_OUT_OF_BOUNDS); - } - - public void testDeleteChildAt() - { - EditableChildren<T> children = instance(); - - int size = children.size(); - - Either<Error,T> either = children.addNewChildAt(0); - if(either.isA()){ - Assert.fail("error during add new child to head"); - } - children = either.b().getAttributes().put(KEY,VALUE).b().getChildren(); - Assert.assertEquals(size + 1,children.size()); - - either = children.deleteChildAt(0); - if(either.isA()){ - Assert.fail("error during deleting child"); - } - children = either.b().getChildren(); - - Assert.assertEquals(size,children.size()); - } -}*/
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/PutAttributeTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor; - -import java.nio.ByteBuffer; - -import org.junit.Assert; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.PutAttribute; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import junit.framework.TestCase; - -public class PutAttributeTest extends TestCase -{ - public void testEdit() - { - String key = "KEY"; - ByteBuffer value = ByteBuffer.wrap(key.getBytes()); - TreeNode node = new DefaultTreeNode(); - PutAttribute op = new PutAttribute(key,value); - //EditableNodeWrapper<DefaultTreeNode> wrapper = new EditableNodeWrapper<DefaultTreeNode>(node); - Either<Error, LoggingNode> either = op.edit(node); - if(either.isA()){ - Assert.fail(); - } - - LoggingNode newNode = either.b(); - ByteBuffer ret = newNode.getAttributes().get(key); - Assert.assertEquals(0,ret.compareTo(value)); - } -}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/nodeeditor/ReplaceRootNodeAt.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle; -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.store.impl.DefaultTreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import junit.framework.Assert; - -import org.junit.Test; - -public class ReplaceRootNodeAt { - - @Test - public void ReplaceRootNodeAtTest() { - Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTreeEditor(new DefaultTraverser())); - jungle.createNewTree("tree"); - JungleTree tree = jungle.getTreeByName("tree"); - JungleTreeEditor editor = tree.getTreeEditor(); - - TreeNode oldRoot = tree.getRootNode(); - Either<Error, JungleTreeEditor> either = editor.replaceNewRootNode(); - Assert.assertTrue(either.isB()); - JungleTreeEditor newTreeEditor = either.b(); - Assert.assertTrue(newTreeEditor.success().isB()); - TreeNode newRoot = tree.getRootNode(); - Assert.assertFalse(oldRoot.equals(newRoot)); - - Either<Error, TreeNode> childrenEither = newRoot.getChildren().at(0); - Assert.assertTrue(childrenEither.isB()); - TreeNode newRootChildren = childrenEither.b(); - Assert.assertEquals(oldRoot, newRootChildren); - } -}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/treeeditor/TreeNodeChildrenTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,131 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.treeeditor; - -import java.nio.ByteBuffer; -import org.junit.Assert; -import fj.data.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeChildren; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import junit.framework.TestCase; - -public abstract class TreeNodeChildrenTest<T extends TreeNode<T>> extends TestCase -{ - public abstract TreeNode<T> instance(); - - public void testAddNewChildAtWithNode() - { - int count = 5; - for(Integer pos : List.range(0,5)){ - _testAddNewChildAtWithNode(count,pos); - } - } - - public void _testAddNewChildAtWithNode(int _count,int _pos) - { - TreeNode<T> instance = instance(); - - Either<Error, T> either; - for(int i = 0;i < _count;i ++){ - either = instance.getChildren().addNewChildAt(0); - if(either.isA()){ - Assert.fail(); - } - instance = either.b(); - } - - TreeNode<T> newNode = instance.createNewNode(); - String key = "KEY"; - ByteBuffer value = ByteBuffer.wrap("VALUE".getBytes()); - - either = newNode.getAttributes().put(key,value); - if(either.isA()){ - Assert.fail(); - } - newNode = either.b(); - - either = instance.getChildren().addNewChildAt(_pos,newNode); - if(either.isA()){ - Assert.fail(); - } - instance = either.b(); - - // check - either = instance.getChildren().at(_pos); - if(either.isA()){ - Assert.fail(); - } - - T checkTarget = either.b(); - ByteBuffer actual = checkTarget.getAttributes().get(key); - Assert.assertEquals(0,value.compareTo(actual)); - } - - public void testReplaceAt() - { - int count = 5; - for(Integer pos : List.range(0,count)){ - _testReplaceAt(count,pos); - } - } - - public void _testReplaceAt(int _count,int _pos) - { - TreeNode<T> instance = instance(); - String key = "KEY"; - ByteBuffer value = ByteBuffer.wrap("VALUE".getBytes()); - - // prepare - - for(int i = 0;i < _count;i ++){ - TreeNode<T> newNode = instance.createNewNode(); - Either<Error,T> either = newNode.getAttributes().put(key,value); - if(either.isA()){ - Assert.fail("failed to put attributes to child"); - } - - newNode = either.b(); - either = instance.getChildren().addNewChildAt(0,newNode); - if(either.isA()){ - Assert.fail("failed to add child to instance"); - } - - instance = either.b(); - } - - int size = instance.getChildren().size(); - Assert.assertEquals(_count,size); - - // create node for replacement. - - ByteBuffer replaceNodeValue = ByteBuffer.wrap("EULAV".getBytes()); - TreeNode<T> replacement = instance.createNewNode(); - Either<Error,T> either = replacement.getAttributes().put(key,replaceNodeValue); - if(either.isA()){ - Assert.fail("failed to create replacement node"); - } - replacement = either.b(); - - // replace - - either = instance.getChildren().replaceNode(_pos,replacement); - if(either.isA()){ - Assert.fail("failed to replace node."); - } - instance = either.b(); - - TreeNodeChildren<T> children = instance.getChildren(); - for(Integer pos : List.range(0,_count)){ - either = children.at(pos.intValue()); - if(either.isA()){ - Assert.fail("failed to get node."); - } - - T ch = either.b(); - ByteBuffer expect = (_pos != pos) ? value : replaceNodeValue; - ByteBuffer actual = ch.getAttributes().get(key); - - Assert.assertEquals(0,expect.compareTo(actual)); - } - } -}*/
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeAttributesTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.impl.clonable; - - -import jp.ac.u_ryukyu.ie.cr.list.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Attributes; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesTest; -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.util.Pair; -import jp.ac.u_ryukyu.ie.cr.treemap.TreeMap; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -import java.nio.ByteBuffer; - -public class DefaultTreeNodeAttributesTest extends TestCase -{ - public static TestSuite suite() - { - TestSuite suite = new TestSuite(); - suite.addTestSuite(AttributeTestImpl.class); - //suite.addTestSuite(EditableAttributesTestImpl.class); - return suite; - } - - public static DefaultTreeNode instance() - { - List<TreeNode> rawList = new List(); - TreeMap<String,ByteBuffer> rawMap = new TreeMap(); - - for(Pair<String,ByteBuffer> entry : AttributesTest.ENTRIES){ - rawMap = rawMap.put(entry.left(),entry.right()); - } - - return new DefaultTreeNode(rawList,rawMap); - } - - public static class AttributeTestImpl extends AttributesTest - { - - @Override - public Attributes instance() - { - return DefaultTreeNodeAttributesTest.instance().getAttributes(); - } - - } - - /*public static class EditableAttributesTestImpl extends EditableAttributesTest<DefaultTreeNode> - { - - @Override - public DefaultTreeNodeAttribute instance() - { - DefaultTreeNode instance = DefaultTreeNodeAttributesTest.instance(); - return instance.getAttributes(); - } - - }*/ -}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeChildrenTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.impl.clonable; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor.EditableChildrenTest; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.treeeditor.TreeNodeChildrenTest; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.EditableNodeWrapper; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableChildren; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -public class DefaultTreeNodeChildrenTest extends TestCase -{ - public static TestSuite suite() - { - TestSuite suite = new TestSuite(); - suite.addTestSuite(EditableChildrenTestImpl.class); - suite.addTestSuite(TreeNodeChildrenTestImpl.class); - return suite; - } - - public static DefaultTreeNode instance() - { - return new DefaultTreeNode(); - } - - public static class TreeNodeChildrenTestImpl extends TreeNodeChildrenTest<DefaultTreeNode> - { - @Override - public DefaultTreeNode instance() - { - return DefaultTreeNodeChildrenTest.instance(); - } - } - - public static class EditableChildrenTestImpl extends EditableChildrenTest<EditableNodeWrapper<DefaultTreeNode>> - { - @Override - public EditableChildren<EditableNodeWrapper<DefaultTreeNode>> instance() - { - DefaultTreeNode wrap = DefaultTreeNodeChildrenTest.instance(); - EditableNodeWrapper<DefaultTreeNode> wrapper = new EditableNodeWrapper<DefaultTreeNode>(wrap); - return wrapper.getChildren(); - } - } -}*/
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/clonable/DefaultTreeNodeTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.impl.clonable; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; -import junit.framework.Assert; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -public class DefaultTreeNodeTest extends TestCase -{ - public static TestSuite suite() - { - TestSuite suite = new TestSuite(); - //suite.addTestSuite(AttributesContaierTestImpl.class); - //suite.addTestSuite(ParentTestImpl.class); - return suite; - } - - public static DefaultTreeNode instance() - { - DefaultTreeNode node = new DefaultTreeNode(); - return node; - } - - public void testGetWrapped() - { - DefaultTreeNode instance = instance(); - } - - public void testCreateNewNode() - { - DefaultTreeNode instance = instance(); - DefaultTreeNode node = instance.createNewNode(); - - Assert.assertNotNull(node); - } - -// public static class AttributesContaierTestImpl extends AttributesContainerTest -// { -// @Override -// public AttributesContainer instance() -// { -// return DefaultTreeNodeTest.instance(); -// } -// } - - /*public static class ParentTestImpl extends ParentTest<DefaultTreeNode> - { - - @Override - public DefaultTreeNode instance() - { - return DefaultTreeNodeTest.instance(); - } - }*/ -}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/node/DefaultAttributesTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.impl.node; - -import jp.ac.u_ryukyu.ie.cr.list.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesTest; -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 jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; -import jp.ac.u_ryukyu.ie.cr.treemap.TreeMap; -import org.junit.Assert; - -import java.nio.ByteBuffer; -import java.util.Optional; - -public class DefaultAttributesTest extends AttributesTest -{ - public TreeNodeAttributes instance() - { - List<TreeNode> rawList = new List(); - TreeMap<String,ByteBuffer> rawMap = new TreeMap(); - - // add attributes - - for(Pair<String, ByteBuffer> entry : ENTRIES){ - rawMap = rawMap.put(entry.left(),entry.right()); - } - - TreeNode node = new DefaultTreeNode(rawList,rawMap); - return node.getAttributes(); - } - - public void testGetAttributesAsRawMap() - { - TreeNodeAttributes attrs = instance(); - TreeMap<String,ByteBuffer> rawMap = attrs.getAttributesAsRawMap(); - - // testing rawmap is not null. - Assert.assertNotNull(rawMap); - - // testing rawmap has correct key values. - for(Pair<String,ByteBuffer> entry : ENTRIES){ - String key = entry.left(); - ByteBuffer value = entry.right(); - - Optional<ByteBuffer> option = rawMap.get(key); - if(!option.isPresent()){ - Assert.fail(); - } - - ByteBuffer actual = option.get(); - Assert.assertEquals(0,actual.compareTo(value)); - } - } -}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/node/DefaultChildrenTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.impl.node; - - -import jp.ac.u_ryukyu.ie.cr.list.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.ChildrenTest; -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.DefaultTreeNodeChildren; -import jp.ac.u_ryukyu.ie.cr.treemap.TreeMap; -import org.junit.Assert; - -import java.nio.ByteBuffer; - -public class DefaultChildrenTest extends ChildrenTest<TreeNode> -{ - - @Override - public DefaultTreeNodeChildren instance() - { - List<TreeNode> rawList = new List(); - for(int i = 0;i < expectSize();i ++){ - rawList = rawList.addLast(new DefaultTreeNode()); - } - - TreeMap<String,ByteBuffer> rawMap = new TreeMap(); - - return new DefaultTreeNode(rawList,rawMap).getChildren(); - } - - @Override - public int expectSize() - { - return 3; - } - - public void testGetChildrenAsRawList() - { - DefaultTreeNodeChildren instance = instance(); - List<TreeNode> rawList = instance.getChildrenAsRawList(); - - Assert.assertNotNull(rawList); - Assert.assertEquals(expectSize(),rawList.length()); - } -} \ No newline at end of file
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/impl/node/DefaultNodeTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.impl.node; - - -import jp.ac.u_ryukyu.ie.cr.list.List; -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.treemap.TreeMap; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -import java.nio.ByteBuffer; - -public class DefaultNodeTest extends TestCase -{ - public DefaultNodeTest(String _name) - { - super(_name); - } - - public static TestSuite suite() - { - TestSuite suite = new TestSuite(); - //suite.addTestSuite(DefaultNodeTest.AttributesContaierTestImpl.class); - //suite.addTestSuite(DefaultNodeTest.ParentTestImpl.class); - return suite; - } - - public static DefaultTreeNode instance() - { - List<TreeNode> rawList = new List(); - TreeMap<String,ByteBuffer> rawMap = new TreeMap(); - DefaultTreeNode node = new DefaultTreeNode(rawList,rawMap); - - return node; - } - -// public static class AttributesContaierTestImpl extends AttributesContainerTest -// { -// @Override -// public AttributesContainer instance() -// { -// return DefaultNodeTest.instance(); -// } -//// } - - /*public static class ParentTestImpl extends ParentTest<DefaultTreeNode> - { - - @Override - public DefaultTreeNode instance() - { - return DefaultNodeTest.instance(); - } - }*/ -}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/tests/util/TestUtil.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.tests.util; - -import java.nio.ByteBuffer; - -import org.junit.Ignore; - -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.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -@Ignore -public class TestUtil -{ - public static TreeNode createMockTree(int _maxDepth) - { - return _createMockTree(1,_maxDepth,new DefaultNodePath()); - } - - public static TreeNode _createMockTree(int _currentDepth,int _maxDepth,NodePath _path) - { - TreeNode parent = new DefaultTreeNode(); - Either<Error, TreeNode> either = parent.getAttributes().put("KEY",ByteBuffer.wrap(_path.toString().getBytes())); - if(either.isA()){ - return null; - } - parent = either.b(); - - if(_currentDepth != _maxDepth){ - for(int i = 0;i <= _currentDepth;i ++){ - TreeNode ch = _createMockTree(_currentDepth + 1,_maxDepth,_path.add(i)); - either = parent.getChildren().addNewChildAt(i,ch); - if(either.isA()){ - return null; - } - parent = either.b(); - } - } - - return parent; - } -}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverse/BruteForceTraverserTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ -/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverse; - -import java.nio.ByteBuffer; -import java.util.Iterator; - -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.impl.DefaultNodePath; -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.traverser.InterfaceTraverser; -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; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.SearchQuery; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.UpdateQuery; -import junit.framework.TestCase; - -import org.junit.Assert; -import org.junit.Test; - -public abstract class BruteForceTraverserTest extends TestCase{ - public abstract InterfaceTraverser instance(TreeNode node); - - @Test - public void testSearch() { - int maxHeight = 3; - Pair<TreeNode, NodePath> test = null; - TreeNode root = createTree(0,0,maxHeight,new DefaultNodePath()); - InterfaceTraverser traverser = instance(root); - Iterator<Pair<TreeNode, NodePath>> itNode = traverser.find(new SearchQuery("KEY","<-1,0,0>")); - for(;itNode.hasNext(); ){ - test = itNode.next(); - } - String str = new String(test.left().getAttributes().get("KEY").array()); - Assert.assertEquals(str,"<-1,0,0>"); - } - - @Test - public void testUpdate() { - int maxHeight = 3; - Pair<TreeNode, NodePath> test = null; - TreeNode root = createTree(0,0,maxHeight,new DefaultNodePath()); - InterfaceTraverser traverser = instance(root); - JungleTreeEditor editor = traverser.update(new UpdateQuery("KEY", "<-1,0,0>", "tatsuki")); - traverser.set(editor.getRoot()); - Iterator<Pair<TreeNode, NodePath>> checkNode = traverser.find(new SearchQuery("KEY","tatsuki")); - for(;checkNode.hasNext(); ){ - test = checkNode.next(); - } - String str = new String(test.left().getAttributes().get("KEY").array()); - Assert.assertEquals(str,"tatsuki"); - } - - public static String key = "KEY"; - public static ByteBuffer value = ByteBuffer.wrap(key.getBytes()); - public static DefaultTreeNode factory = new DefaultTreeNode(); - - public static TreeNode createTree(int _curX,int _curY,int _maxHeight,NodePath _address) - { - System.out.println(_address.toString()); - TreeNode parent = factory.createNewNode(); - Either<Error,TreeNode> either = parent.getAttributes().put(key,ByteBuffer.wrap(_address.toString().getBytes())); - if(either.isA()){ - Assert.fail(); - } - parent = either.b(); - - if(_curY == _maxHeight){ - return parent; - } - - for(int i = 0;i < _curY + 1;i ++){ - TreeNode ch = createTree(i,_curY + 1,_maxHeight,_address.add(i)); - either = parent.getChildren().addNewChildAt(i,ch); - if(either.isA()){ - Assert.fail(); - } - - parent = either.b(); - } - - return parent; - } - -} -*/ \ No newline at end of file
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverse/TraverserTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ -/* -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverse; - -import jp.ac.u_ryukyu.ie.cr.list.List; -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.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultEvaluator; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Direction; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traversal; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traverser; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import junit.framework.TestCase; -import org.junit.Assert; - -import java.nio.ByteBuffer; - -public abstract class TraverserTest extends TestCase -{ - public abstract Traverser instance(); - - public void testTraverse() - { - int maxHeight = 3; - TreeNode root = createTree(0,0,maxHeight,new DefaultNodePath()); - - //TraversableNodeWrapper<DefaultTreeNode> traversable = new TraversableNodeWrapper<DefaultTreeNode>(root); - Traverser traverser = instance(); - - // generate all pattern. - List<DefaultNodePath> paths = generatePathPattern(new DefaultNodePath(),0,maxHeight); - paths = paths.addLast(new DefaultNodePath()); - - for(DefaultNodePath path : paths){ - DefaultEvaluator evaluator = new DefaultEvaluator(path); - Either<Error,Traversal> ret = traverser.traverse(root,evaluator); - if(ret.isA()){ - Assert.fail(); - } - - Traversal traversal = ret.b(); - TreeNode target = traversal.destination(); - String expect = path.toString(); - ByteBuffer value = target.getAttributes().get(key); - String actual = new String(value.array()); - Assert.assertEquals(expect,actual); - - List<DefaultNodePath> parts = path.inits(); - - for(Direction<TreeNode> d : traversal){ - DefaultNodePath part = parts.head(); - parts = parts.last(); - value = d.getTarget().getAttributes().get(key); - String actualCurrentPathStr = new String(value.array()); - String expectCurrentPathStr = part.toString(); - Assert.assertEquals(expectCurrentPathStr,actualCurrentPathStr); - } - } - } - - public List<DefaultNodePath> generatePathPattern(DefaultNodePath _cur,int _curHeight,int _maxHeight) - { - List<DefaultNodePath> paths = List.nil(); - for(int p = 0;p <= _curHeight;p ++){ - DefaultNodePath path = _cur.add(p); - if(_curHeight != _maxHeight - 1){ - List<DefaultNodePath> newpaths = generatePathPattern(path,_curHeight+1,_maxHeight); - paths = paths.append(newpaths); - } - paths = paths.cons(path); - } - - return paths; - } - - public static String key = "KEY"; - public static ByteBuffer value = ByteBuffer.wrap(key.getBytes()); - public static DefaultTreeNode factory = new DefaultTreeNode(); - - public TreeNode createTree(int _curX,int _curY,int _maxHeight,NodePath _address) - { - TreeNode parent = factory.createNewNode(); - Either<Error,TreeNode> either = parent.getAttributes().put(key,ByteBuffer.wrap(_address.toString().getBytes())); - if(either.isA()){ - Assert.fail(); - } - parent = either.b(); - - if(_curY == _maxHeight){ - return parent; - } - - for(int i = 0;i < _curY + 1;i ++){ - TreeNode ch = createTree(i,_curY + 1,_maxHeight,_address.add(i)); - either = parent.getChildren().addNewChildAt(i,ch); - if(either.isA()){ - Assert.fail(); - } - - parent = either.b(); - } - - return parent; - } -} -*/ \ No newline at end of file
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/index/parentIndexTest.java Tue May 19 15:15:34 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.index; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle; -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.store.impl.DefaultNodePath; -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.traverser.DefaultTraverser; -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.ParentIndex; -import junit.framework.Assert; -import org.junit.Test; - -import java.nio.ByteBuffer; - -/** - * Created by e115731 on 15/05/06. - */ -public class parentIndexTest { - @Test - public void parentIndex() { - Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTreeEditor(new DefaultTraverser())); - jungle.createNewTree("tree"); - JungleTree tree = jungle.getTreeByName("tree"); - JungleTreeEditor editor = tree.getTreeEditor(); - - DefaultNodePath path = new DefaultNodePath(); - for (int count = 0; count < 100; count++) { - editor = editor.addNewChildAt(path, 0).b(); - path = path.add(0); - editor = editor.putAttribute(path, "KEY", ByteBuffer.wrap(("tatsuki" + count).getBytes())).b(); - } - - Either<Error, JungleTreeEditor> either = editor.success(); - Assert.assertTrue(either.isB()); - TreeNode node = tree.getNodeOfPath(path).b(); - ParentIndex parentIndex = tree.getParentIndex(); - for (int count = 99; count >= 0; count--) { - String attribute = node.getAttributes().getString("KEY"); - Assert.assertEquals(attribute, "tatsuki" + count); - node = parentIndex.get(node); - } - } -}
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/list/appendTest.java Tue May 19 15:15:34 2015 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/list/appendTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -1,6 +1,6 @@ package jp.ac.u_ryukyu.ie.cr.tatsuki.list; -import jp.ac.u_ryukyu.ie.cr.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; import junit.framework.Assert; import org.junit.Test;
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/list/deleteTest.java Tue May 19 15:15:34 2015 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/list/deleteTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -1,6 +1,6 @@ package jp.ac.u_ryukyu.ie.cr.tatsuki.list; -import jp.ac.u_ryukyu.ie.cr.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; import junit.framework.Assert; import org.junit.Test;
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/list/listAdd.java Tue May 19 15:15:34 2015 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/list/listAdd.java Tue Jul 28 08:32:58 2015 +0900 @@ -1,6 +1,6 @@ package jp.ac.u_ryukyu.ie.cr.tatsuki.list; -import jp.ac.u_ryukyu.ie.cr.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; import junit.framework.Assert; import org.junit.Test; @@ -26,20 +26,12 @@ Assert.assertEquals(num,count); Assert.assertEquals(num2,count); } - Assert.assertEquals(list.length(), 10); + + List<Integer> newList = list.add(5, 50); int num = list.index(5); - Assert.assertEquals(num, 5); - List<Integer> newList = list.add(5, 1000); - num = newList.index(5); - Assert.assertEquals(num, 1000); - num = list.index(5); - Assert.assertEquals(num, 5); - list = list.add(1000, 1001); - num = list.index(5); - Assert.assertEquals(num, 5); - list = list.add(0,0); - num = list.index(0); - Assert.assertEquals(num, 0); + int num2 = newList.index(5); + Assert.assertEquals(num,5); + Assert.assertEquals(num2,50); }
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/list/listIterator.java Tue May 19 15:15:34 2015 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/list/listIterator.java Tue Jul 28 08:32:58 2015 +0900 @@ -1,6 +1,6 @@ package jp.ac.u_ryukyu.ie.cr.tatsuki.list; -import jp.ac.u_ryukyu.ie.cr.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; import junit.framework.Assert; import org.junit.Test;
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/list/replaceTest.java Tue May 19 15:15:34 2015 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/list/replaceTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -1,6 +1,6 @@ package jp.ac.u_ryukyu.ie.cr.tatsuki.list; -import jp.ac.u_ryukyu.ie.cr.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; import junit.framework.Assert; import org.junit.Test;
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/treemap/TreeMapDelete.java Tue May 19 15:15:34 2015 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/treemap/TreeMapDelete.java Tue Jul 28 08:32:58 2015 +0900 @@ -1,7 +1,7 @@ package jp.ac.u_ryukyu.ie.cr.tatsuki.treemap; -import jp.ac.u_ryukyu.ie.cr.treemap.RotateParent; -import jp.ac.u_ryukyu.ie.cr.treemap.TreeMap; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.RotateParent; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; import org.junit.Test; import java.util.ArrayList;
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/treemap/TreeMapTest.java Tue May 19 15:15:34 2015 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/treemap/TreeMapTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -1,6 +1,6 @@ package jp.ac.u_ryukyu.ie.cr.tatsuki.treemap; -import jp.ac.u_ryukyu.ie.cr.treemap.TreeMap; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; import java.util.Optional;
--- a/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/treemap/TreeNodeIteratorTest.java Tue May 19 15:15:34 2015 +0900 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/tatsuki/treemap/TreeNodeIteratorTest.java Tue Jul 28 08:32:58 2015 +0900 @@ -1,6 +1,6 @@ package jp.ac.u_ryukyu.ie.cr.tatsuki.treemap; -import jp.ac.u_ryukyu.ie.cr.treemap.TreeMap; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; import junit.framework.Assert; import org.junit.Test;