view src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/BruteForceTraverser.java @ 97:a1e20a440ddd

add BruteForceTraverser
author one
date Mon, 08 Sep 2014 17:03:08 +0900
parents
children 95000ff9064d
line wrap: on
line source

package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser;

import fj.data.List;
import fj.data.TreeMap;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children;
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.util.Pair;

public class BruteForceTraverser {
	List<Pair<NodePath,TreeNode>> pathNodes;
	TreeMap<String,TreeNode> nodeIndex;
	TreeMap<String,String> attributeIndex;	
	
	BruteForceTraverser(TreeNode _root){
		pathNodes = this.traverse(_root,new DefaultNodePath(),-1);
	}
	
	public List<Pair<NodePath,TreeNode>> traverse(TreeNode _node ,NodePath _path ,int _pos){
		
		Children  children = _node.getChildren();
		List<Pair<NodePath,TreeNode>> list = List.nil();
		int pathCount = _pos;
		if(children.size() == 0){
			list = list.cons(new Pair<NodePath,TreeNode>(_path.add(_pos),_node));
			return list;
		}
		
			for(TreeNode child : children){
				list = list.append(traverse(child,_path,pathCount));
				pathCount++;
			}
			
			list = list.cons(new Pair<NodePath,TreeNode>(_path.add(_pos),_node));
		return list;
	}
	
	public List<Pair<NodePath,TreeNode>> search(String _key, String _Attribute){
		List<Pair<NodePath,TreeNode>> pathNode = List.nil();
		for(Pair<NodePath,TreeNode> searchNode : pathNodes){
			if(searchNode.right().getAttributes().get(_key).equals(_Attribute))
				pathNode = pathNode.cons(searchNode);
		}
		return pathNode;
	}
	
	public int count(String _key, String _attribute){
		return this.search(_key,_attribute).length();
	}
	
	public List<Pair<NodePath,TreeNode>> distinct(String _key ,String... _attribute){
		return null;
	}

}