package org.fastcatsearch.ir.field; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.fastcatsearch.ir.io.CharVector; import org.fastcatsearch.ir.io.DataInput; import org.fastcatsearch.ir.io.DataOutput; public class AStringMvField extends AStringField implements MultiValueFieldType { public AStringMvField(String id) { super(id); multiValue = true; } public AStringMvField(String id, int size) { super(id, size); multiValue = true; } public AStringMvField(String id, String data, int size) { super(id, data, size); multiValue = true; } @Override public void readFrom(DataInput input) throws IOException { int multiValueCount = input.readVInt(); fieldsData = new ArrayList<CharVector>(multiValueCount); for (int i = 0; i < multiValueCount; i++) { char[] chars = input.readAString(); ((List<CharVector>) fieldsData).add(new CharVector(chars, 0, chars.length)); } } @Override public void writeTo(DataOutput output) throws IOException { List<CharVector> list = (List<CharVector>) fieldsData; int multiValueCount = list.size(); output.writeVInt(multiValueCount); // 고정길이인지 가변길이인지 if (size > 0) { // 고정길이 for (int i = 0; i < list.size(); i++) { CharVector charVector = (CharVector) list.get(i); output.writeVInt(size); output.writeAChars(charVector.array(), charVector.start(), size); } } else { // 가변길이 for (int i = 0; i < multiValueCount; i++) { CharVector charVector = (CharVector) list.get(i); output.writeAString(charVector.array(), charVector.start(), charVector.length()); } } } @Override public void writeFixedDataTo(DataOutput output, int indexSize, boolean upperCase) throws IOException { // multi value필드는 데이터가 없으면 기록하지 않는다. if (fieldsData == null) { return; } int size = indexSize > 0 ? indexSize : this.size; if (size > 0) { List<CharVector> list = (List<CharVector>) fieldsData; for (int i = 0; i < list.size(); i++) { CharVector charVector = (CharVector) list.get(i); output.writeAChars(charVector.array(), charVector.start(), size, upperCase); } } else { throw new IOException("가변길이필드는 지원하지 않습니다."); } } @Override public final void writeDataTo(DataOutput output, boolean upperCase) throws IOException { if (size > 0) { writeFixedDataTo(output, 0, upperCase); } else { List<CharVector> list = (List<CharVector>) fieldsData; for (int i = 0; i < list.size(); i++) { CharVector charVector = (CharVector) list.get(i); output.writeAChars(charVector.array(), charVector.start(), charVector.length(), upperCase); } } } @Override public FieldDataWriter getDataWriter() throws IOException { final List<CharVector> list = (List<CharVector>) fieldsData; return new FieldDataWriter(list) { @Override protected void writeEachData(Object object, DataOutput output) throws IOException { CharVector charVector = (CharVector) object; if (size > 0) { output.writeAChars(charVector.array(), charVector.start(), size, upperCase); } else { // 가변길이. output.writeAChars(charVector.array(), charVector.start(), charVector.length(), upperCase); } } }; } }