Issue #22 added possibility to stop processing on generating at least one emit

This commit is contained in:
robert-bor 2015-09-22 19:31:05 +02:00
parent 4399e42b99
commit b85f8fc08f
3 changed files with 33 additions and 2 deletions

View File

@ -48,6 +48,11 @@ public class Trie {
return this;
}
public Trie stopOnHit() {
this.trieConfig.setStopOnHit(true);
return this;
}
public void addKeyword(String keyword) {
if (keyword == null || keyword.length() == 0) {
return;
@ -116,7 +121,9 @@ public class Trie {
character = Character.toLowerCase(character);
}
currentState = getState(currentState, character);
storeEmits(position, currentState, emitHandler);
if (storeEmits(position, currentState, emitHandler) && trieConfig.isStopOnHit()) {
return;
}
}
}
@ -183,13 +190,16 @@ public class Trie {
}
}
private void storeEmits(int position, State currentState, EmitHandler emitHandler) {
private boolean storeEmits(int position, State currentState, EmitHandler emitHandler) {
boolean emitted = false;
Collection<String> emits = currentState.emit();
if (emits != null && !emits.isEmpty()) {
for (String emit : emits) {
emitHandler.emit(new Emit(position - emit.length() + 1, position, emit));
emitted = true;
}
}
return emitted;
}
}

View File

@ -8,6 +8,12 @@ public class TrieConfig {
private boolean caseInsensitive = false;
private boolean stopOnHit = false;
public boolean isStopOnHit() { return stopOnHit; }
public void setStopOnHit(boolean stopOnHit) { this.stopOnHit = stopOnHit; }
public boolean isAllowOverlaps() {
return allowOverlaps;
}

View File

@ -41,6 +41,21 @@ public class TrieTest {
checkEmit(iterator.next(), 0, 2, "bcd");
}
@Test
public void ushersTestAndStopOnHit() {
Trie trie = new Trie();
trie.addKeyword("hers");
trie.addKeyword("his");
trie.addKeyword("she");
trie.addKeyword("he");
trie.stopOnHit();
Collection<Emit> emits = trie.parseText("ushers");
assertEquals(2, emits.size()); // she @ 3, he @ 3, hers @ 5
Iterator<Emit> iterator = emits.iterator();
checkEmit(iterator.next(), 2, 3, "he");
checkEmit(iterator.next(), 1, 3, "she");
}
@Test
public void ushersTest() {
Trie trie = new Trie();