package de.danielbasedow.prospecter.core.index;
import de.danielbasedow.prospecter.core.Matcher;
import de.danielbasedow.prospecter.core.Token;
import de.danielbasedow.prospecter.core.analysis.Analyzer;
import de.danielbasedow.prospecter.core.document.Field;
import gnu.trove.list.TLongList;
import gnu.trove.list.array.TLongArrayList;
import gnu.trove.map.hash.TIntObjectHashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
/**
* Index enabling full text search
*/
public class FullTextIndex extends AbstractFieldIndex {
private static final Logger LOGGER = LoggerFactory.getLogger(FullTextIndex.class);
protected final TIntObjectHashMap<TLongList> index = new TIntObjectHashMap<TLongList>();
private final Analyzer analyzer;
public FullTextIndex(String name, Analyzer analyzer) {
super(name);
this.analyzer = analyzer;
}
@Override
public void addPosting(Token token, Long posting) {
TLongList postingList;
if (index.containsKey((Integer) token.getToken())) {
postingList = index.get((Integer) token.getToken());
} else {
postingList = new TLongArrayList();
index.put((Integer) token.getToken(), postingList);
}
postingList.add(posting);
}
@Override
public void removePosting(Token token, Long posting) {
TLongList postingList = index.get((Integer) token.getToken());
if (postingList != null && postingList.contains(posting)) {
LOGGER.debug("removing posting: " + String.valueOf(posting));
postingList.remove(posting);
}
}
@Override
public FieldType getFieldType() {
return FieldType.FULL_TEXT;
}
public TLongList getQueryPostingsForTermId(Token token) {
Integer t = (Integer) token.getToken();
if (index.containsKey(t)) {
return index.get(t);
}
return null;
}
@Override
public void match(Field field, Matcher matcher) {
for (Token token : field.getTokens()) {
Integer t = (Integer) token.getToken();
TLongList additionalPostings = index.get(t);
if (additionalPostings != null) {
matcher.addHits(additionalPostings);
}
}
}
public Analyzer getAnalyzer() {
return analyzer;
}
public void trim() {
for (Object list : index.values()) {
if (list instanceof ArrayList) {
((ArrayList) list).trimToSize();
}
}
}
}