yacy_search_server/source/de/anomic/kelondro/index/Column.java
orbiter c079b18ee7 - refactoring of IntegerHandleIndex and LongHandleIndex: both classes had been merged into the new HandleMap class, which handles (key<byte[]>,n-byte-long) pairs with arbitraty key and value length. This will be useful to get a memory-enhanced/minimized database table indexing.
- added a analysis method that counts bytes that could be saved in case the new HandleMap can be applied in the most efficient way. Look for the log messages beginning with "HeapReader saturation": in most cases we could save about 30% RAM!
- removed the old FlexTable database structure. It was not used any more.
- removed memory statistics in PerformanceMemory about flex tables and node caches (node caches were used by Tree Tables, which are also not used any more)
- add a stub for a steering of navigation functions. That should help to switch off naviagtion computation in cases where it is not demanded by a client

git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@6034 6c8d7289-2bf4-0310-a012-ef5d649a1542
2009-06-07 21:48:01 +00:00

294 lines
11 KiB
Java

// kelondroColumn.java
// (C) 2006 by Michael Peter Christen; mc@yacy.net, Frankfurt a. M., Germany
// first published 24.05.2006 on http://www.anomic.de
//
// This is a part of the kelondro database,
// which is a part of YaCy, a peer-to-peer based web search engine
//
// $LastChangedDate: 2006-04-02 22:40:07 +0200 (So, 02 Apr 2006) $
// $LastChangedRevision: 1986 $
// $LastChangedBy: orbiter $
//
// LICENSE
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
package de.anomic.kelondro.index;
import de.anomic.kelondro.util.kelondroException;
public class Column {
public static final int celltype_undefined = 0;
public static final int celltype_boolean = 1;
public static final int celltype_binary = 2;
public static final int celltype_string = 3;
public static final int celltype_cardinal = 4;
public static final int celltype_bitfield = 5;
public static final int encoder_none = 0;
public static final int encoder_b64e = 1;
public static final int encoder_b256 = 2;
public static final int encoder_bytes = 3;
public int cellwidth;
public final String nickname;
protected final int celltype;
protected final int encoder;
protected final String description;
public Column(final String nickname, final int celltype, final int encoder, final int cellwidth, final String description) {
this.celltype = celltype;
this.cellwidth = cellwidth;
this.encoder = encoder;
this.nickname = nickname;
this.description = description;
}
public Column(String celldef) {
// define column with column syntax
// example: <UDate-3>
// cut quotes etc.
celldef = celldef.trim();
if (celldef.startsWith("<")) celldef = celldef.substring(1);
if (celldef.endsWith(">")) celldef = celldef.substring(0, celldef.length() - 1);
// parse type definition
int p = celldef.indexOf(' ');
String typename = "";
if (p < 0) {
// no typedef
this.celltype = celltype_undefined;
this.cellwidth = -1;
} else {
typename = celldef.substring(0, p);
celldef = celldef.substring(p + 1).trim();
if (typename.equals("boolean")) {
this.celltype = celltype_boolean;
this.cellwidth = 1;
} else if (typename.equals("byte")) {
this.celltype = celltype_cardinal;
this.cellwidth = 1;
} else if (typename.equals("short")) {
this.celltype = celltype_cardinal;
this.cellwidth = 2;
} else if (typename.equals("int")) {
this.celltype = celltype_cardinal;
this.cellwidth = 4;
} else if (typename.equals("long")) {
this.celltype = celltype_cardinal;
this.cellwidth = 8;
} else if (typename.equals("byte[]")) {
this.celltype = celltype_binary;
this.cellwidth = -1; // yet undefined
} else if (typename.equals("char")) {
this.celltype = celltype_string;
this.cellwidth = 1;
} else if (typename.equals("String")) {
this.celltype = celltype_string;
this.cellwidth = -1; // yet undefined
} else if (typename.equals("Cardinal")) {
this.celltype = celltype_cardinal;
this.cellwidth = -1; // yet undefined
} else if (typename.equals("Bitfield")) {
this.celltype = celltype_bitfield;
this.cellwidth = -1; // yet undefined
} else {
throw new kelondroException("kelondroColumn - undefined type def '" + typename + "'");
}
}
// parse length
p = celldef.indexOf('-');
if (p < 0) {
// if the cell was defined with a type, we dont need to give an explicit with definition
if (this.cellwidth < 0) throw new kelondroException("kelondroColumn - no cell width definition given");
final int q = celldef.indexOf(' ');
if (q < 0) {
this.nickname = celldef;
celldef = "";
} else {
this.nickname = celldef.substring(0, p);
celldef = celldef.substring(q + 1);
}
} else {
this.nickname = celldef.substring(0, p);
final int q = celldef.indexOf(' ');
if (q < 0) {
try {
this.cellwidth = Integer.parseInt(celldef.substring(p + 1));
} catch (final NumberFormatException e) {
throw new kelondroException("kelondroColumn - cellwidth description wrong:" + celldef.substring(p + 1));
}
celldef = "";
} else {
try {
this.cellwidth = Integer.parseInt(celldef.substring(p + 1, q));
} catch (final NumberFormatException e) {
throw new kelondroException("kelondroColumn - cellwidth description wrong:" + celldef.substring(p + 1, q));
}
celldef = celldef.substring(q + 1);
}
}
// check length constraints
if (this.cellwidth < 0) throw new kelondroException("kelondroColumn - no cell width given for " + this.nickname);
if (((typename.equals("boolean")) && (this.cellwidth > 1)) ||
((typename.equals("byte")) && (this.cellwidth > 1)) ||
((typename.equals("short")) && (this.cellwidth > 2)) ||
((typename.equals("int")) && (this.cellwidth > 4)) ||
((typename.equals("long")) && (this.cellwidth > 8)) ||
((typename.equals("char")) && (this.cellwidth > 1))
) throw new kelondroException("kelondroColumn - cell width " + this.cellwidth + " too wide for type " + typename);
/*
if (((typename.equals("short")) && (this.cellwidth <= 1)) ||
((typename.equals("int")) && (this.cellwidth <= 2)) ||
((typename.equals("long")) && (this.cellwidth <= 4))
) throw new kelondroException("kelondroColumn - cell width " + this.cellwidth + " not appropriate for type " + typename);
*/
// parse/check encoder type
if ((celldef.length() > 0) && (celldef.charAt(0) == '{')) {
p = celldef.indexOf('}');
final String expf = celldef.substring(1, p);
celldef = celldef.substring(p + 1).trim();
if (expf.equals("b64e")) this.encoder = encoder_b64e;
else if (expf.equals("b256")) this.encoder = encoder_b256;
else if (expf.equals("bytes")) this.encoder = encoder_bytes;
else {
if (this.celltype == celltype_undefined) this.encoder = encoder_bytes;
else if (this.celltype == celltype_boolean) this.encoder = encoder_bytes;
else if (this.celltype == celltype_binary) this.encoder = encoder_bytes;
else if (this.celltype == celltype_string) this.encoder = encoder_bytes;
else throw new kelondroException("kelondroColumn - encoder missing for cell " + this.nickname);
}
} else {
if (this.celltype == celltype_cardinal) throw new kelondroException("kelondroColumn - encoder missing for cell " + this.nickname);
this.encoder = encoder_bytes;
}
assert (this.celltype != celltype_cardinal) || (this.encoder == encoder_b64e) || (this.encoder == encoder_b256);
// parse/check description
if ((celldef.length() > 0) && (celldef.charAt(0) == '"')) {
p = celldef.indexOf('"', 1);
this.description = celldef.substring(1, p);
//unused: celldef = celldef.substring(p + 1).trim();
} else {
this.description = this.nickname;
}
}
public String toString() {
final StringBuilder s = new StringBuilder();
switch (celltype) {
case celltype_undefined:
s.append(nickname);
s.append('-');
s.append(cellwidth);
break;
case celltype_boolean:
s.append("boolean ");
s.append(nickname);
break;
case celltype_binary:
s.append("byte[] ");
s.append(nickname);
s.append('-');
s.append(cellwidth);
break;
case celltype_string:
s.append("String ");
s.append(nickname);
s.append('-');
s.append(cellwidth);
break;
case celltype_cardinal:
s.append("Cardinal ");
s.append(nickname);
s.append('-');
s.append(cellwidth);
break;
case celltype_bitfield:
s.append("Bitfield ");
s.append(nickname);
s.append('-');
s.append(cellwidth);
break;
}
switch (encoder) {
case encoder_b64e:
s.append(" {b64e}");
break;
case encoder_b256:
s.append(" {b256}");
break;
}
return new String(s);
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + celltype;
result = prime * result + cellwidth;
result = prime * result + encoder;
result = prime * result
+ ((nickname == null) ? 0 : nickname.hashCode());
return result;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Column))
return false;
Column other = (Column) obj;
if (celltype != other.celltype)
return false;
if (cellwidth != other.cellwidth)
return false;
if (encoder != other.encoder)
return false;
if (nickname == null) {
if (other.nickname != null)
return false;
} else if (!nickname.equals(other.nickname))
return false;
return true;
}
// public boolean equals(final kelondroColumn otherCol) {
// return
// (this.celltype == otherCol.celltype) &&
// (this.cellwidth == otherCol.cellwidth) &&
// (this.encoder == otherCol.encoder) &&
// (this.nickname.equals(otherCol.nickname));
// }
}