All Downloads are FREE. Search and download functionalities are using the official Maven repository.

src.org.neodatis.btree.impl.multiplevalue.BTreeNodeMultipleValuesPerKey Maven / Gradle / Ivy

The newest version!
/*
 NeoDatis ODB : Native Object Database ([email protected])
 Copyright (C) 2007 NeoDatis Inc. http://www.neodatis.org

 "This file is part of the NeoDatis ODB open source object database".

 NeoDatis ODB is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.

 NeoDatis ODB is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with this library; if not, write to the Free Software
 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */
package org.neodatis.btree.impl.multiplevalue;

import java.util.ArrayList;
import java.util.List;

import org.neodatis.btree.IBTree;
import org.neodatis.btree.IBTreeNodeMultipleValuesPerKey;
import org.neodatis.btree.IKeyAndValue;
import org.neodatis.btree.exception.BTreeException;
import org.neodatis.btree.impl.AbstractBTreeNode;
import org.neodatis.btree.tool.BTreeValidator;

public abstract class BTreeNodeMultipleValuesPerKey extends AbstractBTreeNode implements IBTreeNodeMultipleValuesPerKey {

	public BTreeNodeMultipleValuesPerKey() {
		super();
	}

	public BTreeNodeMultipleValuesPerKey(IBTree btree) {
		super(btree);
	}
	
	public List getValueAt(int index){
		return (List) values[index];
	}

	public void insertKeyAndValue(Comparable key, Object value) {

		int position = getPositionOfKey(key);
		boolean addToExistingCollection = false;
		int realPosition = 0;
		if (position >= 0) {
			addToExistingCollection = true;
			realPosition = position - 1;
		} else {
			realPosition = -position - 1;
		}
		// If there is an element at this position and the key is different,
		// then right shift, size
		// safety is guaranteed by the rightShiftFrom method
		if (realPosition < nbKeys && key.compareTo(keys[realPosition]) != 0) {
			rightShiftFrom(realPosition, true);
		}
		keys[realPosition] = key;
		// This is a non unique btree node, manage collection
		manageCollectionValue(realPosition, value);

		if (!addToExistingCollection) {
			nbKeys++;
		}
	}

	/**
	 * @param realPosition
	 * @param value
	 */
	private void manageCollectionValue(int realPosition, Object value) {
		Object o = values[realPosition];

		if (o == null) {
			o = new ArrayList();
			values[realPosition] = o;
		} else {
			if (!(o instanceof List)) {
				throw new BTreeException("Value of Non Unique Value BTree should be collection and it is " + o.getClass().getName());
			}
		}
		List l = (List) o;
		l.add(value);
	}

	public List search(Comparable key) {
		int position = getPositionOfKey(key);
		boolean keyIsHere = position > 0;
		int realPosition = -1;

		if (keyIsHere) {
			realPosition = position - 1;
			List value = getValueAt(realPosition);
			return value;
		} else if (isLeaf()) {
			// key is not here and node is leaf
			return null;
		}

		realPosition = -position - 1;
		IBTreeNodeMultipleValuesPerKey node = (IBTreeNodeMultipleValuesPerKey) getChildAt(realPosition, true); 
		return node.search(key);
	}
	
	public Object deleteKeyForLeafNode(IKeyAndValue keyAndValue) {
		boolean objectHasBeenFound = false;
		int position = getPositionOfKey(keyAndValue.getKey());
		if (position < 0) {
			return null;
		}
		int realPosition = position - 1;
		// In Multiple Values per key, the value is a list
		List value = (List) values[realPosition];
		
		// Here we must search for the right object. The list can contains more than 1 object
		int size = value.size();
		for(int i=0;i




© 2015 - 2024 Weber Informatics LLC | Privacy Policy