package org.fastcatsearch.ir.search;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.fastcatsearch.ir.io.DataRef;
public class IndexRef<T extends ReferenceableReader> {
protected List<T> readerList;
protected List<DataRef> dataRefList;
protected Map<Integer, T> readerSequenceMap;
protected int sequence;
protected Map<Integer, T[]> readersSequenceMap;
public IndexRef(){
this(5);
}
public IndexRef(int size){
readerList = new ArrayList<T>(size);
dataRefList = new ArrayList<DataRef>(size);
readerSequenceMap = new HashMap<Integer, T>(size);
readerList = new ArrayList<T>(size);
}
//모든 색인 reader를 read한다.
//multi value field의 경우 데이터를 모두 메모리로 올릴수 없기때문에, single value field 도 하나씩 읽도록 하여 로직을 통일한다.
public void read(int docNo) throws IOException{
for (T reader : readerList) {
reader.read(docNo);
}
}
public List<DataRef> getDataRefList(){
return dataRefList;
}
public DataRef getDataRef(int sequence){
return dataRefList.get(sequence);
}
public void add(String fieldId, T reader) throws IOException {
readerSequenceMap.put(sequence++, reader);
if(reader == null){
dataRefList.add(DataRef.EMPTY_DATAREF);
return;
}
//unique한 reader 리스트.
if(!readerList.contains(reader)){
readerList.add(reader);
}
DataRef dataRef = reader.getRef();
dataRefList.add(dataRef);
}
public int getSize(){
return sequence;
}
public T getReader(int sequence){
return readerSequenceMap.get(sequence);
}
public T[] getReaders(int sequence){
return readersSequenceMap.get(sequence);
}
}