view src/main/java/jp/ac/u_ryukyu/ie/cr/benchMark/JungleTreeCreater.java @ 329:2a0cb1f0ba4e

rename Error package
author kono
date Sat, 08 Jul 2017 21:05:55 +0900
parents e3e4ffd746cb
children
line wrap: on
line source

package jp.ac.u_ryukyu.ie.cr.benchMark;

import jp.ac.u_ryukyu.ie.cr.jungle.store.nodepath.NodePath;
import jp.ac.u_ryukyu.ie.cr.jungle.transaction.editor.jungleTreeEditor.JungleTreeEditor;
import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
import jp.ac.u_ryukyu.ie.cr.jungle.util.jungleError.Error;
import junit.framework.Assert;

import java.nio.ByteBuffer;


public class JungleTreeCreater {

    private int maxDeps;
    private int maxNodeCount;
    private int distanceCreateIndex;
    private int editCount = 0;
    private int nodeCount = 1;//今作ったノードのカウント、rootがあるから最初は1

    public JungleTreeCreater(int maxNodeCount, int distanceCreateIndex) {
        this.maxNodeCount = maxNodeCount;
        this.distanceCreateIndex = distanceCreateIndex;
        this.maxDeps = getMaxDeps(maxNodeCount);
    }

    public JungleTreeEditor createTree(JungleTreeEditor editor, String key, String indexKey, NodePath path) {
        int deps = 1;
        JungleTreeEditor newEditor = createTree(editor, key, indexKey, deps, path);
        Either<Error, JungleTreeEditor> either = newEditor.success();
        if (either.isA())
            Assert.fail();
        return either.b();
    }

    private JungleTreeEditor createTree(JungleTreeEditor editor, String key, String indexKey, int deps, NodePath path) {
        Either<Error, JungleTreeEditor> either;
        for (int i = 0; i < 2; i++) {
            if (nodeCount == maxNodeCount || maxDeps == deps) {
                return editor;
            }
            String value = String.valueOf(nodeCount);
            either = editor.addNewChildAndPutAttribute(path, i, key, ByteBuffer.wrap(value.getBytes()));
            if (either.isA())
                Assert.fail();
            editor = either.b();
            editCount++;
            if (distanceCreateIndex == editCount) {
                either = editor.success();
                if (either.isA())
                    Assert.fail();
                editor = either.b();
                editCount = 0;
            }
            nodeCount++;
        }
        for (int i = 0; i < 2; i++) {
            editor = createTree(editor, key, indexKey, deps + 1, path.add(i));
        }
        return editor;
    }

    private int getMaxDeps(int maxNodeCount) {
        int i = 1;
        int count = 1; //深さを決めるために使う。
        int currentNodeCount = 1;
        for (; count < maxNodeCount; i++) {
            count = count + (currentNodeCount * 2);
            currentNodeCount = currentNodeCount * 2;
        }
        return i;
    }

    public int getDeps() {
        return maxDeps;
    }
}