package org.fastcatsearch.ir.search; import java.io.IOException; import java.util.List; import org.apache.lucene.util.BytesRef; import org.fastcatsearch.ir.field.Field; import org.fastcatsearch.ir.field.FieldDataParseException; import org.fastcatsearch.ir.index.PrimaryKeys; import org.fastcatsearch.ir.io.BytesDataOutput; import org.fastcatsearch.ir.settings.FieldSetting; import org.fastcatsearch.ir.settings.PrimaryKeySetting; import org.fastcatsearch.ir.settings.RefSetting; import org.fastcatsearch.ir.settings.Schema; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class PrimaryKeysToBytesRef { private static Logger logger = LoggerFactory.getLogger(PrimaryKeysToBytesRef.class); private BytesDataOutput pkOutput; private int pkSize; private FieldSetting[] pkFieldSettingList; public PrimaryKeysToBytesRef(Schema schma) { PrimaryKeySetting primaryKeySetting = schma.schemaSetting().getPrimaryKeySetting(); List<FieldSetting> fieldSettingList = schma.schemaSetting().getFieldSettingList(); List<RefSetting> pkRefSettingList = primaryKeySetting.getFieldList(); pkSize = pkRefSettingList.size(); pkFieldSettingList = new FieldSetting[pkSize]; int pkByteSize = 0; for (int i = 0; i < pkSize; i++) { String fieldId = pkRefSettingList.get(i).getRef(); int fieldSequence = schma.getFieldSequence(fieldId); pkFieldSettingList[i] = fieldSettingList.get(fieldSequence); pkByteSize += pkFieldSettingList[i].getByteSize(); } pkOutput = new BytesDataOutput(pkByteSize); } public BytesRef getBytesRef(PrimaryKeys keys) throws IOException { pkOutput.reset(); // multivalue는 불가능. for (int i = 0; i < pkSize; i++) { String idString = keys.getKey(i); Field field = null; try { field = pkFieldSettingList[i].createPrimaryKeyField(idString); field.writeFixedDataTo(pkOutput); } catch (FieldDataParseException e) { // id 값을 필드로 만드는데 실패했다면 건너뛴다. logger.error("ID필드를 만들수 없습니다. {}, {}", idString, e); } } return pkOutput.bytesRef(); } }