@@ -94,10 +94,11 @@ import {
9494 IVectorEmbeddingFieldFactoryAccessor , IVectorEmbeddingTextField ,
9595 IVectorField ,
9696 IVectorFieldFactory , IVectorFieldValueFactory , VectorEmbeddingFieldValueFactory
97- } from "./IVectorFieldFactory .js" ;
97+ } from "./VectorFieldFactory .js" ;
9898import { VectorEmbeddingFieldFactory } from "../Queries/VectorSearch/VectorEmbeddingFieldFactory.js" ;
9999import { Field } from "../../Types/index.js" ;
100100import { JsonSerializer } from "../../Mapping/Json/Serializer.js" ;
101+ import { VectorSearchToken } from "./Tokens/VectorSearchToken.js" ;
101102
102103/**
103104 * A query against a Raven index
@@ -2577,56 +2578,63 @@ export abstract class AbstractDocumentQuery<T extends object, TSelf extends Abst
25772578 ) {
25782579 this . _assertMethodIsCurrentlySupported ( "vectorSearch" ) ;
25792580
2581+ const fieldAccessor = this . _resolveVectorSearchFieldAccessor ( fieldName ) ;
2582+ const { value, isDocumentId} = this . _resolveVectorSearchValueFactory ( valueOrFactory ) ;
2583+
2584+ const tokens = this . _getCurrentWhereTokens ( ) ;
2585+ this . _appendOperatorIfNeeded ( tokens ) ;
2586+ this . _negateIfNeeded ( tokens , fieldAccessor . fieldName ) ;
2587+
2588+ const sourceQuantizationType = VectorSearchToken . getSourceQuantizationType ( fieldAccessor ) ;
2589+ const targetQuantizationType = VectorSearchToken . getTargetQuantizationType ( fieldAccessor ) ;
2590+ const taskIdentifier = VectorSearchToken . getTaskIdentifier ( fieldAccessor ) ;
2591+
2592+ const parameterName = this . _addQueryParameter ( value ) ;
2593+
2594+ const vectorSearchToken = new VectorSearchToken (
2595+ fieldAccessor . fieldName ,
2596+ parameterName ,
2597+ sourceQuantizationType ,
2598+ targetQuantizationType ,
2599+ options ?. similarity || null ,
2600+ options ?. numberOfCandidates || null ,
2601+ options ?. isExact || VectorSearchToken . DEFAULT_IS_EXACT ,
2602+ isDocumentId ,
2603+ taskIdentifier
2604+ ) ;
2605+
2606+ tokens . push ( vectorSearchToken ) ;
2607+ }
2608+
2609+
2610+ private _resolveVectorSearchFieldAccessor ( fieldName : Field < T > | ( ( factory : IVectorFieldFactory < T > ) => IVectorField | IVectorEmbeddingField | IVectorEmbeddingTextField ) ) : IVectorEmbeddingFieldFactoryAccessor < T > {
25802611 const vectorFactory = new VectorEmbeddingFieldFactory < T > ( ) ;
2581- let fieldAccessor : IVectorEmbeddingFieldFactoryAccessor < T > ;
2582-
2612+
25832613 if ( typeof fieldName === "string" ) {
2584- fieldAccessor = vectorFactory . withField ( fieldName ) as IVectorEmbeddingFieldFactoryAccessor < T > ;
2614+ return vectorFactory . withField ( fieldName ) as IVectorEmbeddingFieldFactoryAccessor < T > ;
25852615 } else if ( typeof fieldName === "function" ) {
2586- fieldAccessor = fieldName ( vectorFactory ) as IVectorEmbeddingFieldFactoryAccessor < T > ;
2616+ return fieldName ( vectorFactory ) as IVectorEmbeddingFieldFactoryAccessor < T > ;
25872617 } else {
2588- throwError ( "InvalidArgumentException" ,
2589- "fieldName must be either a string or a function that selects a vector field" ) ;
2618+ throwError ( "InvalidArgumentException" , "fieldName must be either a string or a function that selects a vector field" ) ;
25902619 }
2591-
2592- const whereParams = new WhereParams ( ) ;
2593- whereParams . fieldName = fieldAccessor . fieldName ;
2620+ }
25942621
2595- // Handle value or valueFactory
2622+ private _resolveVectorSearchValueFactory ( valueOrFactory : number [ ] | string | ( ( factory : IVectorFieldValueFactory ) => void ) ) {
25962623 if ( typeof valueOrFactory === "function" ) {
25972624 const fieldValueFactory = new VectorEmbeddingFieldValueFactory ( ) ;
25982625 valueOrFactory ( fieldValueFactory ) ;
25992626
2600- if ( fieldValueFactory . embeddings ) {
2601- whereParams . value = fieldValueFactory . embeddings ;
2602- } else if ( fieldValueFactory . embedding ) {
2603- whereParams . value = fieldValueFactory . embedding ;
2604- } else if ( fieldValueFactory . text ) {
2605- whereParams . value = fieldValueFactory . text ;
2606- } else if ( fieldValueFactory . texts ) {
2607- whereParams . value = fieldValueFactory . texts ;
2608- } else {
2627+ const value = fieldValueFactory . embedding || fieldValueFactory . embeddings ||
2628+ fieldValueFactory . text || fieldValueFactory . texts || fieldValueFactory . byId ;
2629+
2630+ if ( ! value ) {
26092631 throwError ( "InvalidOperationException" , "No value was provided in the valueFactory" ) ;
26102632 }
2633+
2634+ return { value, isDocumentId : ! ! fieldValueFactory . byId } ;
26112635 } else {
2612- whereParams . value = valueOrFactory ;
2636+ return { value : valueOrFactory , isDocumentId : false } ;
26132637 }
2614-
2615- whereParams . allowWildcards = true ;
2616- const transformToEqualValue = this . _transformValue ( whereParams ) ;
2617-
2618- const tokens = this . _getCurrentWhereTokens ( ) ;
2619- this . _appendOperatorIfNeeded ( tokens ) ;
2620- this . _negateIfNeeded ( tokens , whereParams . fieldName ) ;
2621-
2622- const whereToken = WhereToken . create (
2623- "VectorSearch" ,
2624- whereParams . fieldName ,
2625- this . _addQueryParameter ( transformToEqualValue ) ,
2626- new WhereOptions ( { vectorSearch : options , exact : options ?. isExact } )
2627- ) ;
2628-
2629- tokens . push ( whereToken ) ;
26302638 }
26312639}
26322640
0 commit comments