📄 btreemultifieldindex.java
字号:
} else {
Bytes.pack4(buf.arr, dst, 0);
}
dst += 4;
break;
}
case ClassDescriptor.tpLong:
buf.extend(dst+8);
Bytes.pack8(buf.arr, dst, f.getLong(obj));
dst += 8;
break;
case ClassDescriptor.tpDate:
{
Date d = (Date)f.get(obj);
buf.extend(dst+8);
Bytes.pack8(buf.arr, dst, d == null ? -1 : d.getTime());
dst += 8;
break;
}
case ClassDescriptor.tpFloat:
buf.extend(dst+4);
Bytes.pack4(buf.arr, dst, Float.floatToIntBits(f.getFloat(obj)));
dst += 4;
break;
case ClassDescriptor.tpDouble:
buf.extend(dst+8);
Bytes.pack8(buf.arr, dst, Double.doubleToLongBits(f.getDouble(obj)));
dst += 8;
break;
case ClassDescriptor.tpEnum:
buf.extend(dst+4);
Bytes.pack4(buf.arr, dst, ((Enum)f.get(obj)).ordinal());
dst += 4;
break;
case ClassDescriptor.tpString:
{
buf.extend(dst+4);
String str = (String)f.get(obj);
if (str != null) {
int len = str.length();
Bytes.pack4(buf.arr, dst, len);
dst += 4;
buf.extend(dst + len*2);
for (int j = 0; j < len; j++) {
Bytes.pack2(buf.arr, dst, (short)str.charAt(j));
dst += 2;
}
} else {
Bytes.pack4(buf.arr, dst, 0);
dst += 4;
}
break;
}
case ClassDescriptor.tpArrayOfByte:
{
buf.extend(dst+4);
byte[] arr = (byte[])f.get(obj);
if (arr != null) {
int len = arr.length;
Bytes.pack4(buf.arr, dst, len);
dst += 4;
buf.extend(dst + len);
System.arraycopy(arr, 0, buf.arr, dst, len);
dst += len;
} else {
Bytes.pack4(buf.arr, dst, 0);
dst += 4;
}
break;
}
default:
Assert.failed("Invalid type");
}
}
return new Key(buf.toArray());
} catch (Exception x) {
throw new StorageError(StorageError.ACCESS_VIOLATION, x);
}
}
private Key convertKey(Key key) {
if (key == null) {
return null;
}
if (key.type != ClassDescriptor.tpArrayOfObject) {
throw new StorageError(StorageError.INCOMPATIBLE_KEY_TYPE);
}
Object[] values = (Object[])key.oval;
ByteBuffer buf = new ByteBuffer();
int dst = 0;
for (int i = 0; i < values.length; i++) {
Object v = values[i];
switch (types[i]) {
case ClassDescriptor.tpBoolean:
buf.extend(dst+1);
buf.arr[dst++] = (byte)(((Boolean)v).booleanValue() ? 1 : 0);
break;
case ClassDescriptor.tpByte:
buf.extend(dst+1);
buf.arr[dst++] = ((Number)v).byteValue();
break;
case ClassDescriptor.tpShort:
buf.extend(dst+2);
Bytes.pack2(buf.arr, dst, ((Number)v).shortValue());
dst += 2;
break;
case ClassDescriptor.tpChar:
buf.extend(dst+2);
Bytes.pack2(buf.arr, dst, (v instanceof Number) ? ((Number)v).shortValue() : (short)((Character)v).charValue());
dst += 2;
break;
case ClassDescriptor.tpInt:
buf.extend(dst+4);
Bytes.pack4(buf.arr, dst, ((Number)v).intValue());
dst += 4;
break;
case ClassDescriptor.tpObject:
buf.extend(dst+4);
Bytes.pack4(buf.arr, dst, v == null ? 0 : ((IPersistent)v).getOid());
dst += 4;
break;
case ClassDescriptor.tpLong:
buf.extend(dst+8);
Bytes.pack8(buf.arr, dst, ((Number)v).longValue());
dst += 8;
break;
case ClassDescriptor.tpDate:
buf.extend(dst+8);
Bytes.pack8(buf.arr, dst, v == null ? -1 : ((Date)v).getTime());
dst += 8;
break;
case ClassDescriptor.tpFloat:
buf.extend(dst+4);
Bytes.pack4(buf.arr, dst, Float.floatToIntBits(((Number)v).floatValue()));
dst += 4;
break;
case ClassDescriptor.tpDouble:
buf.extend(dst+8);
Bytes.pack8(buf.arr, dst, Double.doubleToLongBits(((Number)v).doubleValue()));
dst += 8;
break;
case ClassDescriptor.tpEnum:
buf.extend(dst+4);
Bytes.pack4(buf.arr, dst, ((Enum)v).ordinal());
dst += 4;
break;
case ClassDescriptor.tpString:
{
buf.extend(dst+4);
if (v != null) {
String str = (String)v;
int len = str.length();
Bytes.pack4(buf.arr, dst, len);
dst += 4;
buf.extend(dst + len*2);
for (int j = 0; j < len; j++) {
Bytes.pack2(buf.arr, dst, (short)str.charAt(j));
dst += 2;
}
} else {
Bytes.pack4(buf.arr, dst, 0);
dst += 4;
}
break;
}
case ClassDescriptor.tpArrayOfByte:
{
buf.extend(dst+4);
if (v != null) {
byte[] arr = (byte[])v;
int len = arr.length;
Bytes.pack4(buf.arr, dst, len);
dst += 4;
buf.extend(dst + len);
System.arraycopy(arr, 0, buf.arr, dst, len);
dst += len;
} else {
Bytes.pack4(buf.arr, dst, 0);
dst += 4;
}
break;
}
default:
Assert.failed("Invalid type");
}
}
return new Key(buf.toArray(), key.inclusion != 0);
}
public boolean put(T obj) {
return super.put(extractKey(obj), obj);
}
public T set(T obj) {
return super.set(extractKey(obj), obj);
}
public void remove(T obj) {
super.remove(new BtreeKey(extractKey(obj), obj.getOid()));
}
public T remove(Key key) {
return super.remove(convertKey(key));
}
public boolean containsObject(T obj) {
Key key = extractKey(obj);
if (unique) {
return super.get(key) != null;
} else {
IPersistent[] mbrs = get(key, key);
for (int i = 0; i < mbrs.length; i++) {
if (mbrs[i] == obj) {
return true;
}
}
return false;
}
}
public boolean contains(T obj) {
Key key = extractKey(obj);
if (unique) {
return super.get(key) != null;
} else {
IPersistent[] mbrs = get(key, key);
for (int i = 0; i < mbrs.length; i++) {
if (mbrs[i].equals(obj)) {
return true;
}
}
return false;
}
}
public void append(T obj) {
throw new StorageError(StorageError.UNSUPPORTED_INDEX_TYPE);
}
public T[] get(Key from, Key till) {
ArrayList list = new ArrayList();
if (root != 0) {
BtreePage.find((StorageImpl)getStorage(), root, convertKey(from), convertKey(till), this, height, list);
}
return (T[])list.toArray((T[])Array.newInstance(cls, list.size()));
}
public T[] getPrefix(String prefix) {
throw new StorageError(StorageError.INCOMPATIBLE_KEY_TYPE);
}
public T[] prefixSearch(String key) {
throw new StorageError(StorageError.INCOMPATIBLE_KEY_TYPE);
}
public T[] toPersistentArray() {
T[] arr = (T[])Array.newInstance(cls, nElems);
if (root != 0) {
BtreePage.traverseForward((StorageImpl)getStorage(), root, type, height, arr, 0);
}
return arr;
}
public T get(Key key) {
return super.get(convertKey(key));
}
public IterableIterator<T> iterator(Key from, Key till, int order) {
return super.iterator(convertKey(from), convertKey(till), order);
}
public IterableIterator<Map.Entry<Object,T>> entryIterator(Key from, Key till, int order) {
return super.entryIterator(convertKey(from), convertKey(till), order);
}
public Iterator<T> select(String predicate) {
Query<T> query = new QueryImpl<T>(getStorage());
return query.select(cls, iterator(), predicate);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -