This is an automated email from the ASF dual-hosted git repository.

hossman pushed a commit to branch jira/SOLR-17975
in repository https://gitbox.apache.org/repos/asf/solr.git

commit 8b027beacab148a083489429f3bc40d59cf533d5
Author: Chris Hostetter <[email protected]>
AuthorDate: Thu Jan 15 15:13:17 2026 -0700

    refactor implementation details of LateInteractionVectorField -> 
StrFloatLateInteractionVectorField such that LateInteractionVectorField is now 
just a marker interface for the query time support
---
 .../solr/schema/LateInteractionVectorField.java    | 395 ++-------------------
 ...ava => StrFloatLateInteractionVectorField.java} |   9 +-
 .../org/apache/solr/search/ValueSourceParser.java  |   2 +-
 .../conf/bad-schema-late-vec-field-indexed.xml     |   2 +-
 .../conf/bad-schema-late-vec-field-multivalued.xml |   2 +-
 .../conf/bad-schema-late-vec-field-nodv.xml        |   2 +-
 .../conf/bad-schema-late-vec-ft-indexed.xml        |   2 +-
 .../conf/bad-schema-late-vec-ft-nodim.xml          |   2 +-
 .../conf/bad-schema-late-vec-ft-nodv.xml           |   2 +-
 .../conf/bad-schema-late-vec-ft-sim.xml            |   2 +-
 .../solr/collection1/conf/schema-deprecations.xml  |   2 +-
 .../conf/schema-inplace-required-field.xml         |   2 +-
 .../solr/collection1/conf/schema-late-vec.xml      |   8 +-
 .../test-files/solr/collection1/conf/schema15.xml  |   2 +-
 .../conf/solrconfig-test-properties.xml            |   2 +-
 .../solr/configsets/cache-control/conf/schema.xml  |   2 +-
 .../configsets/cache-control/conf/solrconfig.xml   |   2 +-
 .../collectionA/conf/schema.xml                    |   2 +-
 .../collectionA/conf/solrconfig.xml                |   2 +-
 .../schema/TestLateInteractionVectorFieldInit.java |  23 +-
 .../solr/search/TestLateInteractionVectors.java    |   6 +-
 21 files changed, 75 insertions(+), 398 deletions(-)

diff --git 
a/solr/core/src/java/org/apache/solr/schema/LateInteractionVectorField.java 
b/solr/core/src/java/org/apache/solr/schema/LateInteractionVectorField.java
index ca50cd748c5..f4083481d4f 100644
--- a/solr/core/src/java/org/apache/solr/schema/LateInteractionVectorField.java
+++ b/solr/core/src/java/org/apache/solr/schema/LateInteractionVectorField.java
@@ -16,373 +16,48 @@
  */
 package org.apache.solr.schema;
 
-import static java.util.Optional.ofNullable;
-
-import java.io.IOException;
-import java.lang.invoke.MethodHandles;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import org.apache.lucene.document.LateInteractionField;
-import org.apache.lucene.document.StoredField;
-import org.apache.lucene.index.IndexableField;
-import org.apache.lucene.index.VectorSimilarityFunction;
-import org.apache.lucene.queries.function.ValueSource;
 import org.apache.lucene.search.DoubleValuesSource;
-import org.apache.lucene.search.LateInteractionFloatValuesSource;
-import org.apache.lucene.search.LateInteractionFloatValuesSource.ScoreFunction;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.SortField;
-import org.apache.lucene.util.BytesRef;
-import org.apache.solr.common.SolrException;
-import org.apache.solr.response.TextResponseWriter;
 import org.apache.solr.search.FunctionQParser;
-import org.apache.solr.search.QParser;
-import org.apache.solr.search.StrParser;
 import org.apache.solr.search.SyntaxError;
-import org.apache.solr.uninverting.UninvertingReader;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** nocommit: jdocs */
-public class LateInteractionVectorField extends FieldType {
-  private static final Logger log = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
-  public static final String VECTOR_DIMENSION = "vectorDimension";
-  public static final String SIMILARITY_FUNCTION = "similarityFunction";
-  public static final VectorSimilarityFunction DEFAULT_SIMILARITY =
-      VectorSimilarityFunction.EUCLIDEAN;
-  public static final String SCORE_FUNCTION = "scoreFunction";
-  public static final ScoreFunction DEFAULT_SCORE_FUNCTION = 
ScoreFunction.SUM_MAX_SIM;
-
-  private static final int MUST_BE_TRUE = DOC_VALUES;
-  private static final int MUST_BE_FALSE = MULTIVALUED | TOKENIZED | INDEXED | 
UNINVERTIBLE;
-
-  private static String MUST_BE_TRUE_MSG =
-      " fields require these properties to be true: " + 
propertiesToString(MUST_BE_TRUE);
-  private static String MUST_BE_FALSE_MSG =
-      " fields require these properties to be false: " + 
propertiesToString(MUST_BE_FALSE);
-
-  private int dimension;
-  private VectorSimilarityFunction similarityFunction;
-  private ScoreFunction scoreFunction;
-
-  public LateInteractionVectorField() {
-    super();
-  }
-
-  @Override
-  public void init(IndexSchema schema, Map<String, String> args) {
-
-    this.dimension =
-        ofNullable(args.remove(VECTOR_DIMENSION))
-            .map(Integer::parseInt)
-            .orElseThrow(
-                () ->
-                    new SolrException(
-                        SolrException.ErrorCode.SERVER_ERROR,
-                        VECTOR_DIMENSION + " is a mandatory parameter"));
-
-    this.similarityFunction =
-        optionalEnumArg(
-            SIMILARITY_FUNCTION,
-            args.remove(SIMILARITY_FUNCTION),
-            VectorSimilarityFunction.class,
-            DEFAULT_SIMILARITY);
-    this.scoreFunction =
-        optionalEnumArg(
-            SCORE_FUNCTION,
-            args.remove(SCORE_FUNCTION),
-            ScoreFunction.class,
-            DEFAULT_SCORE_FUNCTION);
-
-    // By the time this method is called, FieldType.setArgs has already set 
"typical" defaults,
-    // and parsed the users explicit options.
-    // We need to override those defaults, and error if the user asked for 
nonsense
-
-    this.properties |= MUST_BE_TRUE;
-    this.properties &= ~MUST_BE_FALSE;
-    if (on(trueProperties, MUST_BE_FALSE)) {
-      throw new SolrException(
-          SolrException.ErrorCode.SERVER_ERROR, getClass().getSimpleName() + 
MUST_BE_FALSE_MSG);
-    }
-    if (on(falseProperties, MUST_BE_TRUE)) {
-      throw new SolrException(
-          SolrException.ErrorCode.SERVER_ERROR, getClass().getSimpleName() + 
MUST_BE_TRUE_MSG);
-    }
-
-    super.init(schema, args);
-  }
-
-  public int getDimension() {
-    return dimension;
-  }
-
-  public VectorSimilarityFunction getSimilarityFunction() {
-    return similarityFunction;
-  }
-
-  public ScoreFunction getScoreFunction() {
-    return scoreFunction;
-  }
-
-  // nocommit: jdocs
-  public DoubleValuesSource parseLateInteractionValuesSource(
-      final String fieldName, final FunctionQParser fp) throws SyntaxError {
-    final String vecStr = fp.parseArg();
-    if (null == vecStr || fp.hasMoreArguments()) {
-      throw new SolrException(
-          SolrException.ErrorCode.BAD_REQUEST,
-          "Invalid number of arguments. Please provide both a field name, and 
a (String) multi-vector.");
-    }
-    return new LateInteractionFloatValuesSource(
-        fieldName,
-        stringToMultiFloatVector(dimension, vecStr),
-        getSimilarityFunction(),
-        getScoreFunction());
-  }
-
-  @Override
-  protected void checkSupportsDocValues() {
-    // No-Op: always supported
-  }
-
-  @Override
-  protected boolean enableDocValuesByDefault() {
-    return true;
-  }
-
-  @Override
-  public void checkSchemaField(final SchemaField field) throws SolrException {
-    super.checkSchemaField(field);
-    if (field.multiValued()) {
-      throw new SolrException(
-          SolrException.ErrorCode.SERVER_ERROR,
-          getClass().getSimpleName() + " fields can not be multiValued: " + 
field.getName());
-    }
-    if (field.indexed()) {
-      throw new SolrException(
-          SolrException.ErrorCode.SERVER_ERROR,
-          getClass().getSimpleName() + " fields can not be indexed: " + 
field.getName());
-    }
-
-    if (!field.hasDocValues()) {
-      throw new SolrException(
-          SolrException.ErrorCode.SERVER_ERROR,
-          getClass().getSimpleName() + " fields must have docValues: " + 
field.getName());
-    }
-  }
-
-  /** Not supported: We override createFields. so this should never be called 
*/
-  @Override
-  public IndexableField createField(SchemaField field, Object value) {
-    throw new IllegalStateException("This method should never be called in 
expected operation");
-  }
-
-  @Override
-  public List<IndexableField> createFields(SchemaField field, Object value) {
-    try {
-      final ArrayList<IndexableField> fields = new ArrayList<>(2);
-
-      if (!CharSequence.class.isInstance(value)) {
-        throw new SolrException(
-            SolrException.ErrorCode.SERVER_ERROR,
-            getClass().getSimpleName() + " fields require string input: " + 
field.getName());
-      }
-      final String valueString = value.toString();
-
-      final float[][] multiVec = stringToMultiFloatVector(dimension, 
valueString);
-      fields.add(new LateInteractionField(field.getName(), multiVec));
-
-      if (field.stored()) {
-        fields.add(new StoredField(field.getName(), valueString));
-      }
 
-      return fields;
-    } catch (SyntaxError | RuntimeException e) {
-      throw new SolrException(
-          SolrException.ErrorCode.SERVER_ERROR,
-          "Error while creating field '" + field + "' from value '" + value + 
"'",
-          e);
-    }
-  }
+/**
+ * This is a marrker interface indicating that a {@link FieldType} supports 
query time usage as
+ * "late interaction" vector field
+ *
+ * @lucene.internal
+ * @lucene.experimental Not currently intended for implementation by custom 
FieldTypes
+ */
+public interface LateInteractionVectorField {
+
+  // TODO: Refactor StrFloatLateInteractionVectorField if/when more classes 
implement this
+  // interface.
+  //
+  // The surface area of this interface is intentionally small to focus on the 
query time aspects
+  //
+  // If/When we want to add more FieldTypes that implement this interface, we 
should strongly
+  // consider refactoring some of the StrFloatLateInteractionVectorField 
internals into an
+  // abstract base class for re-use.
+  //
+  // What that abstract base class should look like (and what should be 
refactored will largely
+  // depend on *why* more implementations are being added:
+  //  - new external representations ? (ie: not a single String)
+  //  - new internal implementation ? (ie: int/byte vectors)
 
-  // nocommit: 1/2 public methods that refer to float[][] explicitly
-  // nocommit: maybe refactor into an abstraction in case lucene supports 
byte/int/etc later?
   /**
-   * nocommit: jdocs, note input must not be null, dimension must be positive
+   * Method used for parsing some type specific query input structure into 
Value source.
    *
-   * @lucene.experimental
-   */
-  public static float[][] stringToMultiFloatVector(final int dimension, final 
String input)
-      throws SyntaxError {
-
-    assert 0 < dimension;
-    final int lastIndex = dimension - 1;
-
-    final List<float[]> result = new ArrayList<>(7);
-    final StrParser sp = new StrParser(input);
-    sp.expect("["); // outer array
-
-    while (sp.pos < sp.end) {
-      sp.expect("[");
-      final float[] entry = new float[dimension];
-      for (int i = 0; i < dimension; i++) {
-        final int preFloatPos = sp.pos;
-        try {
-          entry[i] = sp.getFloat();
-        } catch (NumberFormatException e) {
-          throw new SyntaxError(
-              "Expected float at position " + preFloatPos + " in '" + input + 
"'", e);
-        }
-        if (i < lastIndex) {
-          sp.expect(",");
-        }
-      }
-
-      sp.expect("]");
-      result.add(entry);
-
-      if (',' != sp.peek()) {
-        // no more entries in outer array
-        break;
-      }
-      sp.expect(",");
-    }
-    sp.expect("]"); // outer array
-
-    sp.eatws();
-    if (sp.pos < sp.end) {
-      throw new SyntaxError("Unexpected text at position " + sp.pos + " in '" 
+ input + "'");
-    }
-    return result.toArray(new float[result.size()][]);
-  }
-
-  // nocommit: 1/2 public methods that refer to float[][] explicitly
-  // nocommit: maybe refactor into an abstraction in case lucene supports 
byte/int/etc later?
-  /**
-   * nocommit: jdocs, note input must not be null(s), dimensions must be 
positive
+   * <p>At the time this method is called, the {@link FunctionQParser} will 
have already been used
+   * to parse the <code>fieldName</code> which will have been resolved to a 
{@link FieldType} which
+   * must implement this interface
    *
-   * @lucene.experimental
-   */
-  public static String multiFloatVectorToString(final float[][] input) {
-    assert null != input && 0 < input.length;
-    final StringBuilder out =
-        new StringBuilder(input.length * 89 /* prime, smallish, ~4 verbose 
floats */);
-    out.append("[");
-    for (int i = 0; i < input.length; i++) {
-      final float[] currentVec = input[i];
-      assert 0 < currentVec.length;
-      out.append("[");
-      for (int x = 0; x < currentVec.length; x++) {
-        out.append(currentVec[x]);
-        out.append(",");
-      }
-      out.replace(out.length() - 1, out.length(), "]");
-      out.append(",");
-    }
-    out.replace(out.length() - 1, out.length(), "]");
-    return out.toString();
-  }
-
-  @Override
-  public String toExternal(IndexableField f) {
-    String val = f.stringValue();
-    if (val == null) {
-      val = 
multiFloatVectorToString(LateInteractionField.decode(f.binaryValue()));
-    }
-    return val;
-  }
-
-  @Override
-  public UninvertingReader.Type getUninversionType(SchemaField sf) {
-    return null;
-  }
-
-  @Override
-  public void write(TextResponseWriter writer, String name, IndexableField f) 
throws IOException {
-    writer.writeStr(name, toExternal(f), false);
-  }
-
-  @Override
-  public Object toObject(SchemaField sf, BytesRef term) {
-    return multiFloatVectorToString(LateInteractionField.decode(term));
-  }
-
-  /** Not supported */
-  @Override
-  public Query getPrefixQuery(QParser parser, SchemaField sf, String termStr) {
-    throw new SolrException(
-        SolrException.ErrorCode.BAD_REQUEST,
-        getClass().getSimpleName() + " not supported for prefix queries.");
-  }
-
-  /** Not supported */
-  @Override
-  public ValueSource getValueSource(SchemaField field, QParser parser) {
-    throw new SolrException(
-        SolrException.ErrorCode.BAD_REQUEST,
-        getClass().getSimpleName()
-            + " not supported for function queries, use lateVector() 
function.");
-  }
-
-  /** Not supported */
-  @Override
-  public Query getFieldQuery(QParser parser, SchemaField field, String 
externalVal) {
-    throw new SolrException(
-        SolrException.ErrorCode.BAD_REQUEST,
-        getClass().getSimpleName()
-            + " not supported for field queries, use lateVector() function.");
-  }
-
-  /** Not Supported */
-  @Override
-  public Query getRangeQuery(
-      QParser parser,
-      SchemaField field,
-      String part1,
-      String part2,
-      boolean minInclusive,
-      boolean maxInclusive) {
-    throw new SolrException(
-        SolrException.ErrorCode.BAD_REQUEST,
-        getClass().getSimpleName() + " not supported for range queries.");
-  }
-
-  /** Not Supported */
-  @Override
-  public Query getSetQuery(QParser parser, SchemaField field, 
Collection<String> externalVals) {
-    throw new SolrException(
-        SolrException.ErrorCode.BAD_REQUEST,
-        getClass().getSimpleName() + " not supported for set queries.");
-  }
-
-  /** Not Supported */
-  @Override
-  public SortField getSortField(SchemaField field, boolean top) {
-    throw new SolrException(
-        SolrException.ErrorCode.BAD_REQUEST,
-        getClass().getSimpleName() + " not supported for sorting.");
-  }
-
-  /**
-   * @param key Config option name, used in exception messages
-   * @param value Value specified in configuration, may be <code>null</code>
-   * @param clazz Enum class specifying the return type
-   * @param defaultValue default to use if value is <code>null</code>
+   * <p>This method should be responsible for whatever type specific argument 
parsing is neccessary,
+   * and confirm that no invalid (or unexpected "extra") arguments exist in 
the <code>
+   * FunctionQParser</code>
+   *
+   * <p>(If field types implementing this method need the {@link SchemaField} 
corrisponding to the
+   * <code>fieldName</code>, they should maintain a reference to the {@link 
IndexSchema} used to
+   * initialize the <code>FieldType</code> instance.
    */
-  private static final <E extends Enum<E>> E optionalEnumArg(
-      final String key, final String value, final Class<E> clazz, final E 
defaultValue)
-      throws SolrException {
-    try {
-      return ofNullable(value)
-          .map(v -> Enum.valueOf(clazz, v.toUpperCase(Locale.ROOT)))
-          .orElse(defaultValue);
-    } catch (IllegalArgumentException e) {
-      throw new SolrException(
-          SolrException.ErrorCode.SERVER_ERROR, key + " not recognized: " + 
value);
-    }
-  }
+  public DoubleValuesSource parseLateInteractionValuesSource(
+      final String fieldName, final FunctionQParser fp) throws SyntaxError;
 }
diff --git 
a/solr/core/src/java/org/apache/solr/schema/LateInteractionVectorField.java 
b/solr/core/src/java/org/apache/solr/schema/StrFloatLateInteractionVectorField.java
similarity index 96%
copy from 
solr/core/src/java/org/apache/solr/schema/LateInteractionVectorField.java
copy to 
solr/core/src/java/org/apache/solr/schema/StrFloatLateInteractionVectorField.java
index ca50cd748c5..29da2b6f413 100644
--- a/solr/core/src/java/org/apache/solr/schema/LateInteractionVectorField.java
+++ 
b/solr/core/src/java/org/apache/solr/schema/StrFloatLateInteractionVectorField.java
@@ -47,7 +47,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /** nocommit: jdocs */
-public class LateInteractionVectorField extends FieldType {
+public class StrFloatLateInteractionVectorField extends FieldType
+    implements LateInteractionVectorField {
   private static final Logger log = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   public static final String VECTOR_DIMENSION = "vectorDimension";
@@ -69,7 +70,7 @@ public class LateInteractionVectorField extends FieldType {
   private VectorSimilarityFunction similarityFunction;
   private ScoreFunction scoreFunction;
 
-  public LateInteractionVectorField() {
+  public StrFloatLateInteractionVectorField() {
     super();
   }
 
@@ -209,8 +210,6 @@ public class LateInteractionVectorField extends FieldType {
     }
   }
 
-  // nocommit: 1/2 public methods that refer to float[][] explicitly
-  // nocommit: maybe refactor into an abstraction in case lucene supports 
byte/int/etc later?
   /**
    * nocommit: jdocs, note input must not be null, dimension must be positive
    *
@@ -260,8 +259,6 @@ public class LateInteractionVectorField extends FieldType {
     return result.toArray(new float[result.size()][]);
   }
 
-  // nocommit: 1/2 public methods that refer to float[][] explicitly
-  // nocommit: maybe refactor into an abstraction in case lucene supports 
byte/int/etc later?
   /**
    * nocommit: jdocs, note input must not be null(s), dimensions must be 
positive
    *
diff --git a/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java 
b/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java
index 012aca0fa32..1c2cf28e435 100644
--- a/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java
+++ b/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java
@@ -1382,7 +1382,7 @@ public abstract class ValueSourceParser implements 
NamedListInitializedPlugin {
             }
             throw new SolrException(
                 SolrException.ErrorCode.BAD_REQUEST,
-                "Field name is not defined in schema as a 
LateInteractionVectorField: "
+                "Field name is not defined in schema as a 
StrFloatLateInteractionVectorField: "
                     + fieldName);
           }
         });
diff --git 
a/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-field-indexed.xml
 
b/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-field-indexed.xml
index 0f9c306cfac..656d8a75b56 100644
--- 
a/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-field-indexed.xml
+++ 
b/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-field-indexed.xml
@@ -20,7 +20,7 @@
   
   <field name="bad_field" type="late" indexed="true" />
   
-  <fieldType name="late" class="solr.LateInteractionVectorField" 
vectorDimension="4" />
+  <fieldType name="late" class="solr.StrFloatLateInteractionVectorField" 
vectorDimension="4" />
   <fieldType name="string" class="solr.StrField" multiValued="true"/>
   <field name="id" type="string" indexed="true" stored="true" 
multiValued="false" required="false"/>
   <uniqueKey>id</uniqueKey>
diff --git 
a/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-field-multivalued.xml
 
b/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-field-multivalued.xml
index 086e3a5d1ee..a5803e61391 100644
--- 
a/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-field-multivalued.xml
+++ 
b/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-field-multivalued.xml
@@ -20,7 +20,7 @@
   
   <field name="bad_field" type="late" multiValued="true" />
   
-  <fieldType name="late" class="solr.LateInteractionVectorField" 
vectorDimension="4" />
+  <fieldType name="late" class="solr.StrFloatLateInteractionVectorField" 
vectorDimension="4" />
   <fieldType name="string" class="solr.StrField" multiValued="true"/>
   <field name="id" type="string" indexed="true" stored="true" 
multiValued="false" required="false"/>
   <uniqueKey>id</uniqueKey>
diff --git 
a/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-field-nodv.xml
 
b/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-field-nodv.xml
index 81ca39a9985..68a0a744628 100644
--- 
a/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-field-nodv.xml
+++ 
b/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-field-nodv.xml
@@ -20,7 +20,7 @@
   
   <field name="bad_field" type="late" docValues="false" />
   
-  <fieldType name="late" class="solr.LateInteractionVectorField" 
vectorDimension="4" />
+  <fieldType name="late" class="solr.StrFloatLateInteractionVectorField" 
vectorDimension="4" />
   <fieldType name="string" class="solr.StrField" multiValued="true"/>
   <field name="id" type="string" indexed="true" stored="true" 
multiValued="false" required="false"/>
   <uniqueKey>id</uniqueKey>
diff --git 
a/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-ft-indexed.xml
 
b/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-ft-indexed.xml
index 2676f92dc3d..7cb4545ad68 100644
--- 
a/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-ft-indexed.xml
+++ 
b/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-ft-indexed.xml
@@ -18,7 +18,7 @@
 
 <schema name="bad-schema" version="1.7">
   
-  <fieldType name="bad_ft" class="solr.LateInteractionVectorField" 
vectorDimension="4" indexed="true" multiValued="true" />
+  <fieldType name="bad_ft" class="solr.StrFloatLateInteractionVectorField" 
vectorDimension="4" indexed="true" multiValued="true" />
 
   <fieldType name="string" class="solr.StrField" multiValued="true"/>
   
diff --git 
a/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-ft-nodim.xml
 
b/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-ft-nodim.xml
index 1e1521ba517..9734e3ac7d0 100644
--- 
a/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-ft-nodim.xml
+++ 
b/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-ft-nodim.xml
@@ -18,7 +18,7 @@
 
 <schema name="bad-schema" version="1.7">
   
-  <fieldType name="bad_ft" class="solr.LateInteractionVectorField" />
+  <fieldType name="bad_ft" class="solr.StrFloatLateInteractionVectorField" />
 
   <fieldType name="string" class="solr.StrField" multiValued="true"/>
   
diff --git 
a/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-ft-nodv.xml
 
b/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-ft-nodv.xml
index 9895b72a31b..91d2e257b7e 100644
--- 
a/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-ft-nodv.xml
+++ 
b/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-ft-nodv.xml
@@ -18,7 +18,7 @@
 
 <schema name="bad-schema" version="1.7">
   
-  <fieldType name="bad_ft" class="solr.LateInteractionVectorField" 
vectorDimension="4" docValues="false" />
+  <fieldType name="bad_ft" class="solr.StrFloatLateInteractionVectorField" 
vectorDimension="4" docValues="false" />
 
   <fieldType name="string" class="solr.StrField" multiValued="true"/>
   
diff --git 
a/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-ft-sim.xml 
b/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-ft-sim.xml
index 6d9bcccbe3b..41c7be6b0cc 100644
--- 
a/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-ft-sim.xml
+++ 
b/solr/core/src/test-files/solr/collection1/conf/bad-schema-late-vec-ft-sim.xml
@@ -18,7 +18,7 @@
 
 <schema name="bad-schema" version="1.7">
   
-  <fieldType name="bad_ft" class="solr.LateInteractionVectorField" 
vectorDimension="4" similarityFunction="bogus" />
+  <fieldType name="bad_ft" class="solr.StrFloatLateInteractionVectorField" 
vectorDimension="4" similarityFunction="bogus" />
 
   <fieldType name="string" class="solr.StrField" multiValued="true"/>
   
diff --git 
a/solr/core/src/test-files/solr/collection1/conf/schema-deprecations.xml 
b/solr/core/src/test-files/solr/collection1/conf/schema-deprecations.xml
index e50bfa8575c..a44cb99f67f 100644
--- a/solr/core/src/test-files/solr/collection1/conf/schema-deprecations.xml
+++ b/solr/core/src/test-files/solr/collection1/conf/schema-deprecations.xml
@@ -27,4 +27,4 @@
     <field name="_version_" type="long" indexed="false" stored="false"/>
   </fields>
 
-</schema>
\ No newline at end of file
+</schema>
diff --git 
a/solr/core/src/test-files/solr/collection1/conf/schema-inplace-required-field.xml
 
b/solr/core/src/test-files/solr/collection1/conf/schema-inplace-required-field.xml
index 2892e5eb39f..5fd1c11e257 100644
--- 
a/solr/core/src/test-files/solr/collection1/conf/schema-inplace-required-field.xml
+++ 
b/solr/core/src/test-files/solr/collection1/conf/schema-inplace-required-field.xml
@@ -32,4 +32,4 @@
   <field name="signatureField" type="string" indexed="true" stored="false"/>
   <dynamicField name="*_sS" type="string" indexed="true" stored="true"/>
 
-</schema>
\ No newline at end of file
+</schema>
diff --git a/solr/core/src/test-files/solr/collection1/conf/schema-late-vec.xml 
b/solr/core/src/test-files/solr/collection1/conf/schema-late-vec.xml
index 810cb038225..e68e54decb4 100644
--- a/solr/core/src/test-files/solr/collection1/conf/schema-late-vec.xml
+++ b/solr/core/src/test-files/solr/collection1/conf/schema-late-vec.xml
@@ -18,11 +18,11 @@
 
 <schema name="late-vec-schema" version="1.7">
   
-  <fieldType name="late_vec_3_defaults" 
class="solr.LateInteractionVectorField" vectorDimension="3" />
-  <fieldType name="late_vec_4_defaults" 
class="solr.LateInteractionVectorField" vectorDimension="4" />
+  <fieldType name="late_vec_3_defaults" 
class="solr.StrFloatLateInteractionVectorField" vectorDimension="3" />
+  <fieldType name="late_vec_4_defaults" 
class="solr.StrFloatLateInteractionVectorField" vectorDimension="4" />
   
-  <fieldType name="late_vec_4_cosine" class="solr.LateInteractionVectorField" 
vectorDimension="4" similarityFunction="cosine" />
-  <fieldType name="late_vec_4_nostored" 
class="solr.LateInteractionVectorField" vectorDimension="4" stored="false" />
+  <fieldType name="late_vec_4_cosine" 
class="solr.StrFloatLateInteractionVectorField" vectorDimension="4" 
similarityFunction="cosine" />
+  <fieldType name="late_vec_4_nostored" 
class="solr.StrFloatLateInteractionVectorField" vectorDimension="4" 
stored="false" />
 
   <field name="lv_3_def" type="late_vec_3_defaults" />
   <field name="lv_4_def" type="late_vec_4_defaults" />
diff --git a/solr/core/src/test-files/solr/collection1/conf/schema15.xml 
b/solr/core/src/test-files/solr/collection1/conf/schema15.xml
index 4e06a94d5ac..87fdad981d6 100644
--- a/solr/core/src/test-files/solr/collection1/conf/schema15.xml
+++ b/solr/core/src/test-files/solr/collection1/conf/schema15.xml
@@ -632,7 +632,7 @@
   </fieldType>
 
   <!-- Late Interaction Vectors -->
-  <fieldType name="late_vector_4" class="solr.LateInteractionVectorField" 
vectorDimension="4" />
+  <fieldType name="late_vector_4" 
class="solr.StrFloatLateInteractionVectorField" vectorDimension="4" />
   <field name="late_vec_4" type="late_vector_4" />
 
   <uniqueKey>id</uniqueKey>
diff --git 
a/solr/core/src/test-files/solr/collection1/conf/solrconfig-test-properties.xml 
b/solr/core/src/test-files/solr/collection1/conf/solrconfig-test-properties.xml
index 2a095e0b02a..7fea20f90b3 100644
--- 
a/solr/core/src/test-files/solr/collection1/conf/solrconfig-test-properties.xml
+++ 
b/solr/core/src/test-files/solr/collection1/conf/solrconfig-test-properties.xml
@@ -34,4 +34,4 @@
             
attr2="${non.existent.sys.prop:default-from-config}">prefix-${solr.test.sys.prop2}-suffix</propTest>
 
   <requestHandler name="/select" class="solr.SearchHandler" />
-</config>
\ No newline at end of file
+</config>
diff --git 
a/solr/core/src/test-files/solr/configsets/cache-control/conf/schema.xml 
b/solr/core/src/test-files/solr/configsets/cache-control/conf/schema.xml
index 9d85ec4f7f0..954baf7cfee 100644
--- a/solr/core/src/test-files/solr/configsets/cache-control/conf/schema.xml
+++ b/solr/core/src/test-files/solr/configsets/cache-control/conf/schema.xml
@@ -24,4 +24,4 @@
     <field name="id" type="string" indexed="true" stored="true"/>
     <dynamicField name="*_s"  type="string"  indexed="true"  stored="true" />
     <uniqueKey>id</uniqueKey>
-</schema>
\ No newline at end of file
+</schema>
diff --git 
a/solr/core/src/test-files/solr/configsets/cache-control/conf/solrconfig.xml 
b/solr/core/src/test-files/solr/configsets/cache-control/conf/solrconfig.xml
index bd27a88952a..6fb9ca42086 100644
--- a/solr/core/src/test-files/solr/configsets/cache-control/conf/solrconfig.xml
+++ b/solr/core/src/test-files/solr/configsets/cache-control/conf/solrconfig.xml
@@ -51,4 +51,4 @@
     <indexConfig>
         <mergeScheduler 
class="${solr.mscheduler:org.apache.lucene.index.ConcurrentMergeScheduler}"/>
         :  </indexConfig>
-</config>
\ No newline at end of file
+</config>
diff --git 
a/solr/core/src/test-files/solr/configsets/different-stopwords/collectionA/conf/schema.xml
 
b/solr/core/src/test-files/solr/configsets/different-stopwords/collectionA/conf/schema.xml
index 0d788eb038a..37692c15943 100644
--- 
a/solr/core/src/test-files/solr/configsets/different-stopwords/collectionA/conf/schema.xml
+++ 
b/solr/core/src/test-files/solr/configsets/different-stopwords/collectionA/conf/schema.xml
@@ -102,4 +102,4 @@
   <uniqueKey>id</uniqueKey>
 
 
-</schema>
\ No newline at end of file
+</schema>
diff --git 
a/solr/core/src/test-files/solr/configsets/different-stopwords/collectionA/conf/solrconfig.xml
 
b/solr/core/src/test-files/solr/configsets/different-stopwords/collectionA/conf/solrconfig.xml
index 52da2f113a5..f190e0d9a7c 100644
--- 
a/solr/core/src/test-files/solr/configsets/different-stopwords/collectionA/conf/solrconfig.xml
+++ 
b/solr/core/src/test-files/solr/configsets/different-stopwords/collectionA/conf/solrconfig.xml
@@ -55,4 +55,4 @@
     </lst>
 
   </requestHandler>
-</config>
\ No newline at end of file
+</config>
diff --git 
a/solr/core/src/test/org/apache/solr/schema/TestLateInteractionVectorFieldInit.java
 
b/solr/core/src/test/org/apache/solr/schema/TestLateInteractionVectorFieldInit.java
index 4f154ef5b79..e15448bb324 100644
--- 
a/solr/core/src/test/org/apache/solr/schema/TestLateInteractionVectorFieldInit.java
+++ 
b/solr/core/src/test/org/apache/solr/schema/TestLateInteractionVectorFieldInit.java
@@ -20,18 +20,21 @@ import java.util.Arrays;
 import org.apache.lucene.index.VectorSimilarityFunction;
 import org.apache.solr.core.AbstractBadConfigTestBase;
 
-/** Basic tests of {@link LateInteractionVectorField} FieldType &amp; 
SchemaField initialization */
+/**
+ * Basic tests of {@link StrFloatLateInteractionVectorField} FieldType &amp; 
SchemaField
+ * initialization
+ */
 public class TestLateInteractionVectorFieldInit extends 
AbstractBadConfigTestBase {
 
   public void test_bad_ft_opts() throws Exception {
     assertConfigs(
         "solrconfig-basic.xml",
         "bad-schema-late-vec-ft-nodim.xml",
-        LateInteractionVectorField.VECTOR_DIMENSION);
+        StrFloatLateInteractionVectorField.VECTOR_DIMENSION);
     assertConfigs(
         "solrconfig-basic.xml",
         "bad-schema-late-vec-ft-sim.xml",
-        LateInteractionVectorField.SIMILARITY_FUNCTION);
+        StrFloatLateInteractionVectorField.SIMILARITY_FUNCTION);
     assertConfigs(
         "solrconfig-basic.xml",
         "bad-schema-late-vec-ft-nodv.xml",
@@ -68,17 +71,19 @@ public class TestLateInteractionVectorFieldInit extends 
AbstractBadConfigTestBas
       for (SchemaField sf : Arrays.asList(def3, def4, cosine4, nostored3, 
nostored4)) {
         assertNotNull(sf.getName(), sf);
         assertNotNull(sf.getName(), sf.getType());
-        assertNotNull(sf.getName(), sf.getType() instanceof 
LateInteractionVectorField);
+        assertNotNull(sf.getName(), sf.getType() instanceof 
StrFloatLateInteractionVectorField);
         assertTrue(sf.getName(), sf.hasDocValues());
         assertFalse(sf.getName(), sf.multiValued());
         assertFalse(sf.getName(), sf.indexed());
       }
 
       for (SchemaField sf : Arrays.asList(def3, nostored3)) {
-        assertEquals(sf.getName(), 3, ((LateInteractionVectorField) 
sf.getType()).getDimension());
+        assertEquals(
+            sf.getName(), 3, ((StrFloatLateInteractionVectorField) 
sf.getType()).getDimension());
       }
       for (SchemaField sf : Arrays.asList(def4, cosine4, nostored4)) {
-        assertEquals(sf.getName(), 4, ((LateInteractionVectorField) 
sf.getType()).getDimension());
+        assertEquals(
+            sf.getName(), 4, ((StrFloatLateInteractionVectorField) 
sf.getType()).getDimension());
       }
       for (SchemaField sf : Arrays.asList(def3, def4, cosine4)) {
         assertTrue(sf.getName(), sf.stored());
@@ -89,14 +94,14 @@ public class TestLateInteractionVectorFieldInit extends 
AbstractBadConfigTestBas
       for (SchemaField sf : Arrays.asList(def3, def4, nostored3, nostored4)) {
         assertEquals(
             sf.getName(),
-            LateInteractionVectorField.DEFAULT_SIMILARITY,
-            ((LateInteractionVectorField) 
sf.getType()).getSimilarityFunction());
+            StrFloatLateInteractionVectorField.DEFAULT_SIMILARITY,
+            ((StrFloatLateInteractionVectorField) 
sf.getType()).getSimilarityFunction());
       }
 
       assertEquals(
           cosine4.getName(),
           VectorSimilarityFunction.COSINE,
-          ((LateInteractionVectorField) 
cosine4.getType()).getSimilarityFunction());
+          ((StrFloatLateInteractionVectorField) 
cosine4.getType()).getSimilarityFunction());
 
     } finally {
       deleteCore();
diff --git 
a/solr/core/src/test/org/apache/solr/search/TestLateInteractionVectors.java 
b/solr/core/src/test/org/apache/solr/search/TestLateInteractionVectors.java
index 493999c8b83..e0f83936b19 100644
--- a/solr/core/src/test/org/apache/solr/search/TestLateInteractionVectors.java
+++ b/solr/core/src/test/org/apache/solr/search/TestLateInteractionVectors.java
@@ -17,8 +17,8 @@
 package org.apache.solr.search;
 
 import static 
org.apache.lucene.search.LateInteractionFloatValuesSource.ScoreFunction.SUM_MAX_SIM;
-import static 
org.apache.solr.schema.LateInteractionVectorField.multiFloatVectorToString;
-import static 
org.apache.solr.schema.LateInteractionVectorField.stringToMultiFloatVector;
+import static 
org.apache.solr.schema.StrFloatLateInteractionVectorField.multiFloatVectorToString;
+import static 
org.apache.solr.schema.StrFloatLateInteractionVectorField.stringToMultiFloatVector;
 import static org.hamcrest.Matchers.startsWith;
 
 import java.util.Arrays;
@@ -62,7 +62,7 @@ public class TestLateInteractionVectors extends 
SolrTestCaseJ4 {
         EnumSet.allOf(ScoreFunction.class));
   }
 
-  public void testStringEncodingAndDecoding() throws Exception {
+  public void testStringFloatEncodingAndDecoding() throws Exception {
     final int DIMENSIONS = 4;
 
     // some basic whitespace and int/float equivilences...


Reply via email to