/*
* $Id: IntArrayIndex.java,v 1.4 2005/03/12 02:10:41 ahimanikya Exp $
* =======================================================================
* Copyright (c) 2004-2005 Axion Development Team. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above
* copyright notice, this list of conditions and the following
* disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The names "Tigris", "Axion", nor the names of its contributors may
* not be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* 4. Products derived from this software may not be called "Axion", nor
* may "Tigris" or "Axion" appear in their names without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* =======================================================================
*/
package org.axiondb.engine.indexes;
import java.util.List;
import org.apache.commons.collections.primitives.ArrayIntList;
import org.apache.commons.collections.primitives.IntList;
import org.apache.commons.collections.primitives.adapters.IntListList;
import org.axiondb.AxionException;
import org.axiondb.Column;
import org.axiondb.IndexLoader;
import org.axiondb.engine.IntArrayIndexLoader;
/**
* An {@link BaseArrayIndex array index}over integer keys.
*
* @version $Revision: 1.4 $ $Date: 2005/03/12 02:10:41 $
* @author Rodney Waldhoff
*/
public class IntArrayIndex extends BaseArrayIndex {
public IntArrayIndex(String name, Column column, boolean unique) {
super(name, column, unique);
_keys = new ArrayIntList();
}
public IntArrayIndex(String name, Column column, boolean unique, IntList keys, IntList values) {
super(name, column, unique, values);
_keys = keys;
}
public IndexLoader getIndexLoader() {
return LOADER;
}
public List getKeyList() {
return IntListList.wrap(_keys);
}
public void truncate() throws AxionException {
super.truncate();
if (_keys != null) {
_keys.clear();
}
}
protected int find(int seeking, boolean required) {
int high = _keys.size();
int low = 0;
int cur = 0;
boolean found = false;
while (low < high) {
cur = (high + low) / 2;
if (_keys.get(cur) == seeking) {
found = true;
break;
} else if (_keys.get(cur) > seeking) {
high = cur;
} else { // if(_keys.getInt(cur) < seeking)
if (low == cur) {
cur++;
}
low = cur;
}
}
if (!isUnique()) {
while (cur > 0 && seeking == _keys.get(cur - 1)) {
cur--;
}
}
if (!found) {
return required ? -1 : cur;
}
return cur;
}
protected int find(Object value, boolean required) {
return find(((Integer) value).intValue(), required);
}
protected List getKeyList(int minIndex, int maxIndex) {
return IntListList.wrap(_keys.subList(minIndex, maxIndex));
}
protected int insertKey(int seeking) throws AxionException {
int high = _keys.size();
int low = 0;
int cur = 0;
while (low < high) {
cur = (high + low) / 2;
if (_keys.get(cur) == seeking) {
if (isUnique()) {
throw new AxionException("Expected " + getIndexedColumn() + " to be unique, found " + seeking + " already.");
}
break;
} else if (_keys.get(cur) > seeking) {
high = cur;
} else { // if(_keys.getInt(cur) < seeking)
if (low == cur) {
cur++;
}
low = cur;
}
}
_keys.add(cur, seeking);
return cur;
}
protected int insertKey(Object value) throws AxionException {
int seeking = ((Integer) value).intValue();
return insertKey(seeking);
}
protected int removeKey(int seeking) throws AxionException {
int index = find(seeking, true);
if (-1 != index) {
_keys.removeElementAt(index);
}
return index;
}
protected int removeKey(Object value) throws AxionException {
int seeking = ((Integer) value).intValue();
return removeKey(seeking);
}
protected void removeKeyAt(int index) throws AxionException {
_keys.removeElementAt(index);
}
private static final IndexLoader LOADER = new IntArrayIndexLoader();
private IntList _keys = null;
}
|