mirror of https://github.com/apache/lucene.git
reuse a single BytesReader in NodeHash
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1432474 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
60b19f2da9
commit
f30dd532ec
|
@ -160,7 +160,7 @@ public class Builder<T> {
|
||||||
this.acceptableOverheadRatio = acceptableOverheadRatio;
|
this.acceptableOverheadRatio = acceptableOverheadRatio;
|
||||||
fst = new FST<T>(inputType, outputs, doPackFST, acceptableOverheadRatio, allowArrayArcs);
|
fst = new FST<T>(inputType, outputs, doPackFST, acceptableOverheadRatio, allowArrayArcs);
|
||||||
if (doShareSuffix) {
|
if (doShareSuffix) {
|
||||||
dedupHash = new NodeHash<T>(fst);
|
dedupHash = new NodeHash<T>(fst, fst.bytes.getReverseReader(false));
|
||||||
} else {
|
} else {
|
||||||
dedupHash = null;
|
dedupHash = null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -374,7 +374,11 @@ class BytesStore extends DataOutput {
|
||||||
}
|
}
|
||||||
|
|
||||||
public FST.BytesReader getReverseReader() {
|
public FST.BytesReader getReverseReader() {
|
||||||
if (blocks.size() == 1) {
|
return getReverseReader(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
FST.BytesReader getReverseReader(boolean allowSingle) {
|
||||||
|
if (allowSingle && blocks.size() == 1) {
|
||||||
return new ReverseBytesReader(blocks.get(0));
|
return new ReverseBytesReader(blocks.get(0));
|
||||||
}
|
}
|
||||||
return new FST.BytesReader() {
|
return new FST.BytesReader() {
|
||||||
|
|
|
@ -146,7 +146,7 @@ public final class FST<T> {
|
||||||
// produces this output
|
// produces this output
|
||||||
T emptyOutput;
|
T emptyOutput;
|
||||||
|
|
||||||
private final BytesStore bytes;
|
final BytesStore bytes;
|
||||||
|
|
||||||
private int startNode = -1;
|
private int startNode = -1;
|
||||||
|
|
||||||
|
|
|
@ -27,14 +27,16 @@ final class NodeHash<T> {
|
||||||
private int mask;
|
private int mask;
|
||||||
private final FST<T> fst;
|
private final FST<T> fst;
|
||||||
private final FST.Arc<T> scratchArc = new FST.Arc<T>();
|
private final FST.Arc<T> scratchArc = new FST.Arc<T>();
|
||||||
|
private final FST.BytesReader in;
|
||||||
|
|
||||||
public NodeHash(FST<T> fst) {
|
public NodeHash(FST<T> fst, FST.BytesReader in) {
|
||||||
table = new int[16];
|
table = new int[16];
|
||||||
mask = 15;
|
mask = 15;
|
||||||
this.fst = fst;
|
this.fst = fst;
|
||||||
|
this.in = in;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean nodesEqual(Builder.UnCompiledNode<T> node, int address, FST.BytesReader in) throws IOException {
|
private boolean nodesEqual(Builder.UnCompiledNode<T> node, int address) throws IOException {
|
||||||
fst.readFirstRealTargetArc(address, scratchArc, in);
|
fst.readFirstRealTargetArc(address, scratchArc, in);
|
||||||
if (scratchArc.bytesPerArc != 0 && node.numArcs != scratchArc.numArcs) {
|
if (scratchArc.bytesPerArc != 0 && node.numArcs != scratchArc.numArcs) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -87,7 +89,6 @@ final class NodeHash<T> {
|
||||||
// hash code for a frozen node
|
// hash code for a frozen node
|
||||||
private int hash(int node) throws IOException {
|
private int hash(int node) throws IOException {
|
||||||
final int PRIME = 31;
|
final int PRIME = 31;
|
||||||
final FST.BytesReader in = fst.getBytesReader(0);
|
|
||||||
//System.out.println("hash frozen node=" + node);
|
//System.out.println("hash frozen node=" + node);
|
||||||
int h = 0;
|
int h = 0;
|
||||||
fst.readFirstRealTargetArc(node, scratchArc, in);
|
fst.readFirstRealTargetArc(node, scratchArc, in);
|
||||||
|
@ -111,7 +112,6 @@ final class NodeHash<T> {
|
||||||
|
|
||||||
public int add(Builder.UnCompiledNode<T> nodeIn) throws IOException {
|
public int add(Builder.UnCompiledNode<T> nodeIn) throws IOException {
|
||||||
// System.out.println("hash: add count=" + count + " vs " + table.length);
|
// System.out.println("hash: add count=" + count + " vs " + table.length);
|
||||||
final FST.BytesReader in = fst.getBytesReader(0);
|
|
||||||
final int h = hash(nodeIn);
|
final int h = hash(nodeIn);
|
||||||
int pos = h & mask;
|
int pos = h & mask;
|
||||||
int c = 0;
|
int c = 0;
|
||||||
|
@ -128,7 +128,7 @@ final class NodeHash<T> {
|
||||||
rehash();
|
rehash();
|
||||||
}
|
}
|
||||||
return node;
|
return node;
|
||||||
} else if (nodesEqual(nodeIn, v, in)) {
|
} else if (nodesEqual(nodeIn, v)) {
|
||||||
// same node is already here
|
// same node is already here
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue