diff --git a/source/de/anomic/kelondro/kelondroAbstractOrder.java b/source/de/anomic/kelondro/kelondroAbstractOrder.java new file mode 100644 index 000000000..f1f90dd15 --- /dev/null +++ b/source/de/anomic/kelondro/kelondroAbstractOrder.java @@ -0,0 +1,66 @@ +// kelondroAbstractOrder.java +// ----------------------- +// part of The Kelondro Database +// (C) by Michael Peter Christen; mc@anomic.de +// first published on http://www.anomic.de +// Frankfurt, Germany, 2005 +// created 29.12.2005 +// +// $LastChangedDate: 2005-09-22 22:01:26 +0200 (Thu, 22 Sep 2005) $ +// $LastChangedRevision: 774 $ +// $LastChangedBy: orbiter $ +// +// 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 +// +// Using this software in any meaning (reading, learning, copying, compiling, +// running) means that you agree that the Author(s) is (are) not responsible +// for cost, loss of data or any harm that may be caused directly or indirectly +// by usage of this softare or this documentation. The usage of this software +// is on your own risk. The installation and usage (starting/running) of this +// software may allow other people or application to access your computer and +// any attached devices and is highly dependent on the configuration of the +// software which must be done by the user of the software; the author(s) is +// (are) also not responsible for proper configuration and usage of the +// software, even if provoked by documentation provided together with +// the software. +// +// Any changes to this file according to the GPL as documented in the file +// gpl.txt aside this file in the shipment you received can be done to the +// lines that follows this copyright notice here, but changes must not be +// done inside the copyright notive above. A re-distribution must contain +// the intact and unchanged copyright notice. +// Contributions and changes to the program code must be marked as such. + +package de.anomic.kelondro; + +import de.anomic.kelondro.kelondroRecords.Node; + +public abstract class kelondroAbstractOrder implements kelondroOrder { + + public long partition(byte[] key, int forks) { + final long d = (Long.MAX_VALUE / forks) + ((Long.MAX_VALUE % forks) + 1) / forks; + return cardinal(key) / d; + } + + public int compare(Object a, Object b) { + if ((a instanceof byte[]) && (b instanceof byte[])) { + return compare((byte[]) a, (byte[]) b); + } else if ((a instanceof Node) && (b instanceof Node)) { + return compare(((Node) a).getKey(), ((Node) b).getKey()); + } else + throw new IllegalArgumentException("Object type or Object type combination not supported"); + } + +} diff --git a/source/de/anomic/kelondro/kelondroBinSearch.java b/source/de/anomic/kelondro/kelondroBinSearch.java index d306bc486..d2e9c7944 100644 --- a/source/de/anomic/kelondro/kelondroBinSearch.java +++ b/source/de/anomic/kelondro/kelondroBinSearch.java @@ -52,6 +52,7 @@ public class kelondroBinSearch { private int chunksize; private byte[] buffer; private int count; + private kelondroOrder objectOrder = new kelondroNaturalOrder(); public kelondroBinSearch(byte[] chunks, int chunksize) { this.chunks = chunks; @@ -71,7 +72,7 @@ public class kelondroBinSearch { int pivot = (beginPos + endPos) / 2; if ((pivot < 0) || (pivot >= this.count)) return false; selectBuffer(pivot); - int c = kelondroTree.compare(buffer, t); + int c = objectOrder.compare(buffer, t); if (c == 0) return true; if (c < 0) /* buffer < t */ return contains(t, pivot + 1, endPos); if (c > 0) /* buffer > t */ return contains(t, beginPos, pivot); diff --git a/source/de/anomic/kelondro/kelondroNaturalOrder.java b/source/de/anomic/kelondro/kelondroNaturalOrder.java new file mode 100644 index 000000000..276029d5c --- /dev/null +++ b/source/de/anomic/kelondro/kelondroNaturalOrder.java @@ -0,0 +1,101 @@ +// kelondroNaturalOrder.java +// ----------------------- +// part of The Kelondro Database +// (C) by Michael Peter Christen; mc@anomic.de +// first published on http://www.anomic.de +// Frankfurt, Germany, 2005 +// created 29.12.2005 +// +// $LastChangedDate: 2005-09-22 22:01:26 +0200 (Thu, 22 Sep 2005) $ +// $LastChangedRevision: 774 $ +// $LastChangedBy: orbiter $ +// +// 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 +// +// Using this software in any meaning (reading, learning, copying, compiling, +// running) means that you agree that the Author(s) is (are) not responsible +// for cost, loss of data or any harm that may be caused directly or indirectly +// by usage of this softare or this documentation. The usage of this software +// is on your own risk. The installation and usage (starting/running) of this +// software may allow other people or application to access your computer and +// any attached devices and is highly dependent on the configuration of the +// software which must be done by the user of the software; the author(s) is +// (are) also not responsible for proper configuration and usage of the +// software, even if provoked by documentation provided together with +// the software. +// +// Any changes to this file according to the GPL as documented in the file +// gpl.txt aside this file in the shipment you received can be done to the +// lines that follows this copyright notice here, but changes must not be +// done inside the copyright notive above. A re-distribution must contain +// the intact and unchanged copyright notice. +// Contributions and changes to the program code must be marked as such. + +package de.anomic.kelondro; + +import java.util.Comparator; + +public class kelondroNaturalOrder extends kelondroAbstractOrder implements kelondroOrder, Comparator { + + public kelondroNaturalOrder() { + } + + public long cardinal(byte[] key) { + // returns a cardinal number in the range of 0 .. Long.MAX_VALUE + long c = 0; + int p = 0; + while ((p < 8) && (p < key.length)) c = (c << 8) | ((long) key[p++] & 0xFF); + while (p++ < 8) c = (c << 8); + c = c >>> 1; + return c; + } + + // Compares its two arguments for order. + // Returns -1, 0, or 1 as the first argument + // is less than, equal to, or greater than the second. + // two arrays are also equal if one array is a subset of the other's array + // with filled-up char(0)-values + public int compare(byte[] a, byte[] b) { + int i = 0; + final int al = a.length; + final int bl = b.length; + final int len = (al > bl) ? bl : al; + while (i < len) { + if (a[i] > b[i]) + return 1; + if (a[i] < b[i]) + return -1; + // else the bytes are equal and it may go on yet undecided + i++; + } + // check if we have a zero-terminated equality + if ((i == al) && (i < bl) && (b[i] == 0)) return 0; + if ((i == bl) && (i < al) && (a[i] == 0)) return 0; + // no, decide by length + if (al > bl) return 1; + if (al < bl) return -1; + // no, they are equal + return 0; + } + + public static void main(String[] args) { + byte[] t = new byte[12]; + for (int i = 0; i < 12; i++) t[i] = (byte) 255; + t[0] = (byte) 127; + kelondroOrder o = new kelondroNaturalOrder(); + System.out.println(o.partition(t, 16)); + } + +} diff --git a/source/de/anomic/kelondro/kelondroOrder.java b/source/de/anomic/kelondro/kelondroOrder.java new file mode 100644 index 000000000..71693177f --- /dev/null +++ b/source/de/anomic/kelondro/kelondroOrder.java @@ -0,0 +1,58 @@ +// kelondroOrder.java +// ----------------------- +// part of The Kelondro Database +// (C) by Michael Peter Christen; mc@anomic.de +// first published on http://www.anomic.de +// Frankfurt, Germany, 2005 +// created 29.12.2005 +// +// $LastChangedDate: 2005-09-22 22:01:26 +0200 (Thu, 22 Sep 2005) $ +// $LastChangedRevision: 774 $ +// $LastChangedBy: orbiter $ +// +// 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 +// +// Using this software in any meaning (reading, learning, copying, compiling, +// running) means that you agree that the Author(s) is (are) not responsible +// for cost, loss of data or any harm that may be caused directly or indirectly +// by usage of this softare or this documentation. The usage of this software +// is on your own risk. The installation and usage (starting/running) of this +// software may allow other people or application to access your computer and +// any attached devices and is highly dependent on the configuration of the +// software which must be done by the user of the software; the author(s) is +// (are) also not responsible for proper configuration and usage of the +// software, even if provoked by documentation provided together with +// the software. +// +// Any changes to this file according to the GPL as documented in the file +// gpl.txt aside this file in the shipment you received can be done to the +// lines that follows this copyright notice here, but changes must not be +// done inside the copyright notive above. A re-distribution must contain +// the intact and unchanged copyright notice. +// Contributions and changes to the program code must be marked as such. + +package de.anomic.kelondro; + +import java.util.Comparator; + +public interface kelondroOrder extends Comparator { + + public long partition(byte[] key, int forkes); + + public long cardinal(byte[] key); // returns a cardinal number in the range of 0 .. Long.MAX_VALUE + + public int compare(byte[] a, byte[] b); + +} diff --git a/source/de/anomic/kelondro/kelondroTree.java b/source/de/anomic/kelondro/kelondroTree.java index 2eb5bdb47..f6d35a70e 100644 --- a/source/de/anomic/kelondro/kelondroTree.java +++ b/source/de/anomic/kelondro/kelondroTree.java @@ -50,7 +50,6 @@ import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.RandomAccessFile; -import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -58,7 +57,7 @@ import java.util.LinkedList; import java.util.StringTokenizer; import java.util.Vector; -public class kelondroTree extends kelondroRecords implements Comparator, kelondroIndex { +public class kelondroTree extends kelondroRecords implements kelondroIndex { // define the Over-Head-Array private static short thisOHBytes = 2; // our record definition of two bytes @@ -76,7 +75,7 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr private static int root = 0; // pointer for FHandles-array: pointer to root node private Search writeSearchObj = new Search(); - //private kelondroLock writeLock = new kelondroLock(); + private kelondroOrder objectOrder = new kelondroNaturalOrder(); public kelondroTree(File file, long buffersize, int key, int value, boolean exitOnFail) { this(file, buffersize, new int[] { key, value }, 1, 8, exitOnFail); @@ -261,7 +260,7 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr return; } //System.out.println("Comparing key = '" + new String(key) + "' with '" + otherkey + "':"); // debug - c = compare(key, thenode.getKey()); + c = objectOrder.compare(key, thenode.getKey()); //System.out.println(c); // debug if (c == 0) { found = true; @@ -821,7 +820,7 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr ii = new nodeIterator(up, rotating, start); nextNode = (ii.hasNext()) ? (Node) ii.next() : null; if (nextNode != null) { - int c = compare(firstKey, nextNode.getKey()); + int c = objectOrder.compare(firstKey, nextNode.getKey()); if ((c > 0) && (up)) { // firstKey > nextNode.getKey() logWarning("CORRECTING ITERATOR: firstKey=" + new String(firstKey) + ", nextNode=" + new String(nextNode.getKey())); @@ -884,7 +883,7 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr Node searchNode = getNode(searchHandle, null, 0); byte[] startKey = start.getKey(); int c, ct; - while ((c = compare(startKey, searchNode.getKey())) != 0) { + while ((c = objectOrder.compare(startKey, searchNode.getKey())) != 0) { // the current 'thisNode' is not the start node, put it on the stack ct = (c < 0) ? leftchild : rightchild; nodeStack.addLast(new Object[]{searchNode, new Integer(ct)}); @@ -1293,46 +1292,8 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr } } - - public int compare(Object a, Object b) { - if ((a instanceof byte[]) && (b instanceof byte[])) { - return compare((byte[]) a, (byte[]) b); - } else if ((a instanceof Node) && (b instanceof Node)) { - return compare(((Node) a).getKey(), ((Node) b).getKey()); - } else - throw new IllegalArgumentException("Object type or Object type combination not supported"); - } - - // Compares its two arguments for order. - // Returns -1, 0, or 1 as the first argument - // is less than, equal to, or greater than the second. - // two arrays are also equal if one array is a subset of the other's array with filled-up char(0)-values - public static int compare(byte[] a, byte[] b) { - int i = 0; - final int al = a.length; - final int bl = b.length; - final int len = (al > bl) ? bl : al; - while (i < len) { - if (a[i] > b[i]) return 1; - if (a[i] < b[i]) return -1; - // else the bytes are equal and it may go on yet undecided - i++; - } - // check if we have a zero-terminated equality - if ((i == al) && (i < bl) && (b[i] == 0)) return 0; - if ((i == bl) && (i < al) && (a[i] == 0)) return 0; - // no, decide by length - if (al > bl) return 1; - if (al < bl) return -1; - // no, they are equal - return 0; - } - - // Returns the comparator used to order this map, - // or null if this map uses its keys' natural order. - - public Comparator comparator() { - return this; + public kelondroOrder order() { + return this.objectOrder; } public static void main(String[] args) {