📄 btreemultifieldindex.java
字号:
buf.extend(dst+4);
if (p != null) {
if (!p.isPersistent())
{
getStorage().makePersistent(p);
}
Bytes.pack4(buf.arr, dst, p.getOid());
} 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.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.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(IPersistent obj) {
return super.put(extractKey(obj), obj);
}
public IPersistent set(IPersistent obj) {
return super.set(extractKey(obj), obj);
}
public void remove(IPersistent obj) {
super.remove(new BtreeKey(extractKey(obj), obj.getOid()));
}
public IPersistent remove(Key key) {
return super.remove(convertKey(key));
}
public boolean containsObject(IPersistent 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(IPersistent 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(IPersistent obj) {
throw new StorageError(StorageError.UNSUPPORTED_INDEX_TYPE);
}
public IPersistent[] 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 (IPersistent[])list.toArray((Object[])Array.newInstance(cls, list.size()));
}
public IPersistent[] toPersistentArray() {
IPersistent[] arr = (IPersistent[])Array.newInstance(cls, nElems);
if (root != 0) {
BtreePage.traverseForward((StorageImpl)getStorage(), root, type, height, arr, 0);
}
return arr;
}
public IPersistent get(Key key) {
return super.get(convertKey(key));
}
public Iterator iterator(Key from, Key till, int order) {
return super.iterator(convertKey(from), convertKey(till), order);
}
public Iterator entryIterator(Key from, Key till, int order) {
return super.entryIterator(convertKey(from), convertKey(till), order);
}
public Iterator select(String predicate) {
Query query = new QueryImpl(getStorage());
return query.select(cls, iterator(), predicate);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -