@@ -76,6 +76,8 @@ public int getDim() throws IllegalResponseException {
7676 }
7777
7878 // this method returns bytes size of each vector according to vector type
79+ // for binary vector, each dimension is one bit, each byte is 8 dim
80+ // for float16 vector, each dimension 2 bytes
7981 private int checkDim (DataType dt , ByteString data , int dim ) {
8082 if (dt == DataType .BinaryVector ) {
8183 if ((data .size ()*8 ) % dim != 0 ) {
@@ -96,6 +98,21 @@ private int checkDim(DataType dt, ByteString data, int dim) {
9698 return 0 ;
9799 }
98100
101+ private ByteString getVectorBytes (FieldData fieldData , DataType dt ) {
102+ ByteString data ;
103+ if (dt == DataType .BinaryVector ) {
104+ data = fieldData .getVectors ().getBinaryVector ();
105+ } else if (dt == DataType .Float16Vector ) {
106+ data = fieldData .getVectors ().getFloat16Vector ();
107+ } else if (dt == DataType .BFloat16Vector ) {
108+ data = fieldData .getVectors ().getBfloat16Vector ();
109+ } else {
110+ String msg = String .format ("Unsupported data type %s returned by FieldData" , dt .name ());
111+ throw new IllegalResponseException (msg );
112+ }
113+ return data ;
114+ }
115+
99116 /**
100117 * Gets the row count of a field.
101118 * * Throws {@link IllegalResponseException} if the field type is illegal.
@@ -116,20 +133,11 @@ public long getRowCount() throws IllegalResponseException {
116133
117134 return data .size ()/dim ;
118135 }
119- case BinaryVector : {
120- // for binary vector, each dimension is one bit, each byte is 8 dim
121- int dim = getDim ();
122- ByteString data = fieldData .getVectors ().getBinaryVector ();
123- int bytePerVec = checkDim (dt , data , dim );
124-
125- return data .size ()/bytePerVec ;
126- }
136+ case BinaryVector :
127137 case Float16Vector :
128138 case BFloat16Vector : {
129- // for float16 vector, each dimension 2 bytes
130139 int dim = getDim ();
131- ByteString data = (dt == DataType .Float16Vector ) ?
132- fieldData .getVectors ().getFloat16Vector () : fieldData .getVectors ().getBfloat16Vector ();
140+ ByteString data = getVectorBytes (fieldData , dt );
133141 int bytePerVec = checkDim (dt , data , dim );
134142
135143 return data .size ()/bytePerVec ;
@@ -213,22 +221,14 @@ private List<?> getFieldDataInternal() throws IllegalResponseException {
213221 case Float16Vector :
214222 case BFloat16Vector : {
215223 int dim = getDim ();
216- ByteString data = null ;
217- if (dt == DataType .BinaryVector ) {
218- data = fieldData .getVectors ().getBinaryVector ();
219- } else if (dt == DataType .Float16Vector ) {
220- data = fieldData .getVectors ().getFloat16Vector ();
221- } else {
222- data = fieldData .getVectors ().getBfloat16Vector ();
223- }
224-
224+ ByteString data = getVectorBytes (fieldData , dt );
225225 int bytePerVec = checkDim (dt , data , dim );
226226 int count = data .size ()/bytePerVec ;
227227 List <ByteBuffer > packData = new ArrayList <>();
228228 for (int i = 0 ; i < count ; ++i ) {
229229 ByteBuffer bf = ByteBuffer .allocate (bytePerVec );
230230 // binary vector doesn't care endian since each byte is independent
231- // fp16/bf16 vector is sensetive to endian because each dim occupies 2 bytes,
231+ // fp16/bf16 vector is sensitive to endian because each dim occupies 2 bytes,
232232 // milvus server stores fp16/bf16 vector as little endian
233233 bf .order (ByteOrder .LITTLE_ENDIAN );
234234 bf .put (data .substring (i * bytePerVec , (i + 1 ) * bytePerVec ).toByteArray ());
0 commit comments