view src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/InterfaceTraverser.java @ 124:75ba2f2d6ea3

searchQueryTest add index
author one
date Tue, 07 Oct 2014 22:45:52 +0900
parents b006861cb795
children a0c4a4b8ad10
line wrap: on
line source

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

import java.util.Iterator;

import fj.Ord;
import fj.data.List;
import fj.data.Option;
import fj.data.TreeMap;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
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;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair;
import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.PathNodeIndexIterator;
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.query.SearchQuery;
import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query.UpdateQuery;

public class InterfaceTraverser {

	InterfaceTraverser traverser;
	TreeNode node;
	TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index;
	JungleTreeEditor editor;

	public InterfaceTraverser(TreeNode _root, JungleTreeEditor editor) {
		this.node = _root;
		this.index = TreeMap.empty(Ord.stringOrd);
		this.editor = editor;
	}

	public InterfaceTraverser(
			TreeNode _root,
			TreeMap<String, TreeMap<String, List<Pair<TreeNode, NodePath>>>> index,
			JungleTreeEditor editor) {
		this.node = _root;
		this.index = index;
		this.editor = editor;
	}

	public InterfaceTraverser getTraverser(JungleTree tree) {
		return new InterfaceTraverser(tree.getRootNode(), tree.getIndex(),
				tree.getTreeEditor());
	}

	public void set(TreeNode root) {
		this.node = root;
	}

	/*
	 * public IteratorPathNode traverse(TreeNode _node ,NodePath _path ,int
	 * _pos){
	 * 
	 * Children children = _node.getChildren(); Either<Error,TreeNode> either =
	 * children.at(0); IteratorPathNode list = new IteratorPathNodeImpl(); int
	 * pathCount = _pos; if(children.size() == 0){ list = list.add(new
	 * Pair<TreeNode, NodePath>(node, _path.add(_pos))); return list; }
	 * 
	 * for(TreeNode child : children){ list =
	 * list.append(traverse(child,_path,pathCount)); pathCount++; }
	 * 
	 * list = list.add(new Pair<TreeNode,NodePath>(_node, _path.add(_pos)));
	 * return list; }
	 * 
	 * public int count(Query _query, String _key, String _attribute){ return
	 * this.find(_query,_key,_attribute); }
	 * 
	 * public List<Pair<NodePath,TreeNode>> distinct(String _key ,String...
	 * _attribute){ return null; }
	 */

	public JungleTreeEditor update(final Query query) {
		/*
		 * Iterator<Pair<TreeNode, NodePath>> findNode = find(query); //do { for
		 * (; findNode.hasNext();) { Either<Error, JungleTreeEditor> either =
		 * editor.putAttribute(findNode.next().right(), "KEY",
		 * query.getUpdateAttribute()); if (either.isA()) ;// wait delay write
		 * editor = either.b(); } //} while (editor.success().isA());
		 */
		return editor;
	}

	public Iterator<Pair<TreeNode, NodePath>> find(final Query query, String key, String searchValue) {
		
		if (!index.get(key).isNone()) {

			TreeMap<String, List<Pair<TreeNode, NodePath>>> innerIndex = this.index.get(key).some();
			Option<List<Pair<TreeNode, NodePath>>> opList = innerIndex.get(searchValue);

			if (opList.isNone())
				return null;

			final List<Pair<TreeNode, NodePath>> list = opList.some();
			return list.iterator();

		} else {
			
			final PathNodeIterator itNode = new PathNodeIterator(node);
			return new Iterator<Pair<TreeNode, NodePath>>() {

				private Pair<TreeNode, NodePath> matchPair = nextmatch(itNode);

				private Pair<TreeNode, NodePath> nextmatch(
						PathNodeIterator itNode) {

					for (; itNode.hasNext();) {
						Pair<TreeNode, NodePath> pathNode = itNode.next();
						String value = pathNode.left().getAttributes().getString(key);
						Option<TreeMap<String, List<Pair<TreeNode, NodePath>>>> innerIndexOp = index.get(key);
						System.out.println("value = "+ value);

						if (value != null) {
							if (innerIndexOp.isNone()) {

								TreeMap<String, List<Pair<TreeNode, NodePath>>> innerIndex = TreeMap.empty(Ord.stringOrd);
								List<Pair<TreeNode, NodePath>> list = List.nil();
								list = list.cons(pathNode);
								innerIndex = innerIndex.set(value, list);
								index = index.set(key, innerIndex);

							} else {

								TreeMap<String, List<Pair<TreeNode, NodePath>>> innerIndex = innerIndexOp.some();
								innerIndex.set(value, null);
								Option<List<Pair<TreeNode, NodePath>>> opList = innerIndex.get(value);

								if (opList.isNone()) {

									List<Pair<TreeNode, NodePath>> list = List.nil();
									list = list.cons(pathNode);
									innerIndex = innerIndex.set(value, list);

								} else {

									List<Pair<TreeNode, NodePath>> list = opList.some();
									list = list.cons(pathNode);
									innerIndex = innerIndex.set(value, list);

								}
								index = index.set(key, innerIndex);

							}
						}

						if (query.condition(pathNode.left()))
							return pathNode;
					}
					return null;
				}

				@Override
				public boolean hasNext() {
					if (matchPair == null) {
//						index = itNode.getIndex();
						return false;
					}
					return true;
				}

				@Override
				public Pair<TreeNode, NodePath> next() {
					Pair<TreeNode, NodePath> currentPair = matchPair;
					matchPair = nextmatch(itNode);
					return currentPair;
				}

				@Override
				public void remove() {
					// TODO Auto-generated method stub

				}

			};
		}
	}
}