3030import org .elasticsearch .index .mapper .BlockLoader .IntBuilder ;
3131import org .elasticsearch .index .mapper .BlockLoader .LongBuilder ;
3232import org .elasticsearch .index .mapper .vectors .DenseVectorFieldMapper ;
33- import org .elasticsearch .index .mapper .vectors .DenseVectorFieldMapper .ElementType ;
3433import org .elasticsearch .index .mapper .vectors .VectorEncoderDecoder ;
3534import org .elasticsearch .search .fetch .StoredFieldsSpec ;
3635
@@ -530,39 +529,31 @@ public Builder builder(BlockFactory factory, int expectedCount) {
530529
531530 @ Override
532531 public AllReader reader (LeafReaderContext context ) throws IOException {
533- switch (fieldType .getElementType ()) {
534- case FLOAT -> {
535- FloatVectorValues floatVectorValues = context .reader ().getFloatVectorValues (fieldName );
536- if (floatVectorValues != null ) {
537- if (fieldType .isNormalized ()) {
538- return new FloatDenseVectorNormalizedValuesBlockReader (
539- floatVectorValues ,
540- dimensions ,
541- context .reader ().getNumericDocValues (fieldType .name () + COSINE_MAGNITUDE_FIELD_SUFFIX )
542- );
543- }
544- return new FloatDenseVectorValuesBlockReader (floatVectorValues , dimensions );
545- }
546- }
547- case BYTE -> {
548- ByteVectorValues byteVectorValues = context .reader ().getByteVectorValues (fieldName );
549- if (byteVectorValues != null ) {
550- return new ByteDenseVectorValuesBlockReader (byteVectorValues , dimensions );
551- }
532+ FloatVectorValues floatVectorValues = context .reader ().getFloatVectorValues (fieldName );
533+ if (floatVectorValues != null ) {
534+ if (fieldType .isNormalized ()) {
535+ return new FloatDenseVectorNormalizedValuesBlockReader (
536+ floatVectorValues ,
537+ dimensions ,
538+ context .reader ().getNumericDocValues (fieldType .name () + COSINE_MAGNITUDE_FIELD_SUFFIX )
539+ );
552540 }
541+ return new FloatDenseVectorValuesBlockReader (floatVectorValues , dimensions );
553542 }
543+
554544 return new ConstantNullsReader ();
555545 }
556546 }
557547
558- private static class DenseVectorValuesBlockReader extends BlockDocValuesReader {
559- private final FloatVectorValues floatVectorValues ;
560- private final KnnVectorValues .DocIndexIterator iterator ;
561- private final int dimensions ;
548+ private abstract static class DenseVectorValuesBlockReader <T extends KnnVectorValues > extends BlockDocValuesReader {
562549
563- DenseVectorValuesBlockReader (FloatVectorValues floatVectorValues , int dimensions ) {
564- this .floatVectorValues = floatVectorValues ;
565- iterator = floatVectorValues .iterator ();
550+ protected final T vectorValues ;
551+ protected final KnnVectorValues .DocIndexIterator iterator ;
552+ protected final int dimensions ;
553+
554+ DenseVectorValuesBlockReader (T vectorValues , int dimensions ) {
555+ this .vectorValues = vectorValues ;
556+ iterator = vectorValues .iterator ();
566557 this .dimensions = dimensions ;
567558 }
568559
@@ -587,18 +578,15 @@ private void read(int doc, BlockLoader.FloatBuilder builder) throws IOException
587578 builder .appendNull ();
588579 } else if (iterator .docID () == doc || iterator .advance (doc ) == doc ) {
589580 builder .beginPositionEntry ();
590- float [] floats = floatVectorValues .vectorValue (iterator .index ());
591- assert floats .length == dimensions
592- : "unexpected dimensions for vector value; expected " + dimensions + " but got " + floats .length ;
593- for (float aFloat : floats ) {
594- builder .appendFloat (aFloat );
595- }
581+ appendDoc (builder );
596582 builder .endPositionEntry ();
597583 } else {
598584 builder .appendNull ();
599585 }
600586 }
601587
588+ protected abstract void appendDoc (BlockLoader .FloatBuilder builder ) throws IOException ;
589+
602590 @ Override
603591 public int docId () {
604592 return iterator .docID ();
@@ -657,26 +645,6 @@ public String toString() {
657645 }
658646 }
659647
660- private static class ByteDenseVectorValuesBlockReader extends DenseVectorValuesBlockReader <ByteVectorValues > {
661- ByteDenseVectorValuesBlockReader (ByteVectorValues floatVectorValues , int dimensions ) {
662- super (floatVectorValues , dimensions );
663- }
664-
665- protected void appendDoc (BlockLoader .FloatBuilder builder ) throws IOException {
666- byte [] bytes = vectorValues .vectorValue (iterator .index ());
667- assert bytes .length == dimensions
668- : "unexpected dimensions for vector value; expected " + dimensions + " but got " + bytes .length ;
669- for (byte aFloat : bytes ) {
670- builder .appendFloat (aFloat );
671- }
672- }
673-
674- @ Override
675- public String toString () {
676- return "BlockDocValuesReader.ByteDenseVectorValuesBlockReader" ;
677- }
678- }
679-
680648 public static class BytesRefsFromOrdsBlockLoader extends DocValuesBlockLoader {
681649 private final String fieldName ;
682650
0 commit comments