package de.danielbasedow.prospecter.core.index;
import de.danielbasedow.prospecter.core.Matcher;
import de.danielbasedow.prospecter.core.Token;
import de.danielbasedow.prospecter.core.document.Field;
import gnu.trove.list.TLongList;
import gnu.trove.list.array.TLongArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class StringIndex extends AbstractFieldIndex {
protected final Map<String, TLongList> index = new ConcurrentHashMap<String, TLongList>();
public StringIndex(String name) {
super(name);
}
@Override
public void match(Field field, Matcher matcher) {
List<Token> tokens = field.getTokens();
for (Token token : tokens) {
String strToken = (String) token.getToken();
if (index.containsKey(strToken)) {
matcher.addHits(index.get(strToken));
}
}
}
@Override
public void addPosting(Token token, Long posting) {
String tokenStr = (String) token.getToken();
addOrCreate(tokenStr, posting);
}
@Override
public void removePosting(Token token, Long posting) {
String tokenStr = (String) token.getToken();
TLongList postingList = getOrCreatePostingList(tokenStr);
postingList.remove(posting);
}
public void addOrCreate(String token, Long posting) {
TLongList postingList = getOrCreatePostingList(token);
postingList.add(posting);
}
public TLongList getOrCreatePostingList(String token) {
TLongList postingList = index.get(token);
if (postingList == null) {
postingList = new TLongArrayList();
index.put(token, postingList);
}
return postingList;
}
@Override
public FieldType getFieldType() {
return FieldType.STRING;
}
}