Skip to content

feat: add BM25Operator.AndCross for cross-property keyword AND (Weaviate 1.38.8+) - #365

Merged
g-despot merged 3 commits into
mainfrom
feat/bm25-and-cross
Aug 14, 2026
Merged

feat: add BM25Operator.AndCross for cross-property keyword AND (Weaviate 1.38.8+)#365
g-despot merged 3 commits into
mainfrom
feat/bm25-and-cross

Conversation

@g-despot

@g-despot g-despot commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator

Adds BM25Operator.AndCross(), exposing the server's opt-in OPERATOR_AND_CROSS search operator (Weaviate 1.39.0, backported to 1.38.8): every query token must match, but tokens may be matched by different searched properties. Available everywhere a BM25 operator is accepted (bm25 and hybrid query/generate/aggregate paths).

  • Client-side guard throws WeaviateFeatureNotSupportedException on servers without the operator, which would otherwise silently return OR-semantics results.
  • All searched properties must share the same tokenization/analyzer settings (server-enforced error, covered by an integration test).
  • generate.bm25 now accepts a search operator as well. It was the one BM25 surface that didn't, which would have left AndCross unreachable from generative keyword search.
  • Integration tests gated RequireVersion("1.38.8"); CI matrix minors bumped to latest patches and a 1.39.0 lane added.

@orca-security-eu orca-security-eu Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Orca Security Scan Summary

Status Check Issues by priority
Passed Passed Infrastructure as Code high 0   medium 0   low 0   info 0 View in Orca
Passed Passed SAST high 0   medium 0   low 0   info 0 View in Orca
Passed Passed Secrets high 0   medium 0   low 0   info 0 View in Orca
Passed Passed Vulnerabilities high 0   medium 0   low 0   info 0 View in Orca

@github-actions

github-actions Bot commented Aug 12, 2026

Copy link
Copy Markdown

Summary - Weaviate C# Client Coverage

Summary
Generated on: 08/14/2026 - 06:24:49
Coverage date: 08/14/2026 - 06:16:17 - 08/14/2026 - 06:23:56
Parser: MultiReport (130x Cobertura)
Assemblies: 3
Classes: 374
Files: 240
Line coverage: 47.7% (11081 of 23191)
Covered lines: 11081
Uncovered lines: 12110
Coverable lines: 23191
Total lines: 58980
Branch coverage: 36.3% (2449 of 6741)
Covered branches: 2449
Total branches: 6741
Method coverage: Feature is only available for sponsors

Coverage

Weaviate.Client - 49.7%
Name Line Branch
Weaviate.Client 49.7% 38.7%
Weaviate.Client.AggregateClient 19.5% 11.3%
Weaviate.Client.AggregateClientHybridExtensions 0%
Weaviate.Client.AliasClient 100% 62.5%
Weaviate.Client.ApiKeyTokenService 87.5% 50%
Weaviate.Client.Auth 38%
Weaviate.Client.AuthenticatedHttpHandler 75% 71.4%
Weaviate.Client.BackupClient 82% 45.8%
Weaviate.Client.BaseCollectionClient 0% 0%
Weaviate.Client.Batch.BatchContext 58% 50%
Weaviate.Client.Batch.BatchManager 39.2% 25.7%
Weaviate.Client.Batch.BatchOptions 25% 50%
Weaviate.Client.Batch.BatchResult 100%
Weaviate.Client.Batch.TaskHandle 83.3% 50%
Weaviate.Client.Cache.SchemaCache 69.4% 60%
Weaviate.Client.ClientConfiguration 100% 100%
Weaviate.Client.ClientConfigurationExtensions 35.2% 16.6%
Weaviate.Client.ClusterClient 86.2% 64.2%
Weaviate.Client.CollectionClient 98.7% 87.5%
Weaviate.Client.CollectionClientExtensions 100% 100%
Weaviate.Client.CollectionConfigClient 95.7% 68.7%
Weaviate.Client.CollectionsClient 47.7% 68.3%
Weaviate.Client.CollectionTokenizeClient 100% 50%
Weaviate.Client.Configure 48.6% 50%
Weaviate.Client.Connect 25.5% 0%
Weaviate.Client.DataClient 91.5% 78.7%
Weaviate.Client.DefaultTokenServiceFactory 27.6% 25%
Weaviate.Client.DependencyInjection.ScopedTokenServiceAdapter 0%
Weaviate.Client.DependencyInjection.WeaviateClientFactory 0% 0%
Weaviate.Client.DependencyInjection.WeaviateInitializationService 0%
Weaviate.Client.DependencyInjection.WeaviateOptions 50.9% 87.5%
Weaviate.Client.DependencyInjection.WeaviateServiceCollectionExtensions 0% 0%
Weaviate.Client.ExportClient 94% 47.8%
Weaviate.Client.Factory 100%
Weaviate.Client.Generate 100%
Weaviate.Client.GenerateClient 13.4% 32.6%
Weaviate.Client.GenerateClientHybridExtensions 0%
Weaviate.Client.GenerativeConfigFactory 5.2% 100%
Weaviate.Client.GenerativeProviderFactory 1%
Weaviate.Client.GroupsClient 100%
Weaviate.Client.GroupsOidcClient 47.8%
Weaviate.Client.Grpc.BatchStreamContext 100%
Weaviate.Client.Grpc.BatchStreamWrapper 75.3% 58.9%
Weaviate.Client.Grpc.LoggingInterceptor 0% 0%
Weaviate.Client.Grpc.RetryInterceptor 41.6% 37.5%
Weaviate.Client.Grpc.WeaviateGrpcClient 67.3% 50.9%
Weaviate.Client.Grpc.WeaviateGrpcServerException 0%
Weaviate.Client.Internal.AutoArray`1 61.9% 50%
Weaviate.Client.Internal.AutoArrayBuilder 100% 100%
Weaviate.Client.Internal.BatchStreamAcks 100%
Weaviate.Client.Internal.BatchStreamBackoff 0%
Weaviate.Client.Internal.BatchStreamError 0%
Weaviate.Client.Internal.BatchStreamOutOfMemory 0%
Weaviate.Client.Internal.BatchStreamResults 100%
Weaviate.Client.Internal.BatchStreamSuccess 100%
Weaviate.Client.Internal.ExceptionHelper 72.1% 61.5%
Weaviate.Client.Internal.HttpLoggingHandler 0% 0%
Weaviate.Client.Internal.KeySortedList`2 50%
Weaviate.Client.Internal.MultiKeySortedList`2 0% 0%
Weaviate.Client.Internal.ObjectHelper 48% 34.8%
Weaviate.Client.Internal.RetryHandler 49% 50%
Weaviate.Client.Internal.TimeoutHelper 72.9% 44.4%
Weaviate.Client.Internal.VersionGuard 92.3% 88.8%
Weaviate.Client.Models.Aggregate 100%
Weaviate.Client.Models.AggregateGroupByResult 26.1% 8.4%
Weaviate.Client.Models.AggregateResult 49.2% 12.8%
Weaviate.Client.Models.Alias 100%
Weaviate.Client.Models.AliasesResource 100%
Weaviate.Client.Models.AndNestedFilter 50%
Weaviate.Client.Models.AsciiFoldConfig 100%
Weaviate.Client.Models.Backup 63.6%
Weaviate.Client.Models.BackupBackend 20%
Weaviate.Client.Models.BackupClientConfig 100%
Weaviate.Client.Models.BackupCreateOperation 100%
Weaviate.Client.Models.BackupCreateRequest 100%
Weaviate.Client.Models.BackupOperationBase 67.7% 67.8%
Weaviate.Client.Models.BackupRestoreOperation 100%
Weaviate.Client.Models.BackupRestoreRequest 100%
Weaviate.Client.Models.BackupsResource 100%
Weaviate.Client.Models.BackupStatusExtensions 78.5% 52.5%
Weaviate.Client.Models.BatchInsertRequest 52.1%
Weaviate.Client.Models.BatchInsertResponse 80%
Weaviate.Client.Models.BatchInsertResponseEntry 100%
Weaviate.Client.Models.BatchReferenceReturn 29% 0%
Weaviate.Client.Models.BM25Config 61.1% 66.6%
Weaviate.Client.Models.Bm25ConfigUpdate 60% 50%
Weaviate.Client.Models.BM25Operator 100%
Weaviate.Client.Models.ClusterNode 30.7%
Weaviate.Client.Models.ClusterNodeVerbose 23% 0%
Weaviate.Client.Models.CollectionConfig 69.5% 57.1%
Weaviate.Client.Models.CollectionConfigCommon 67.9% 59.3%
Weaviate.Client.Models.CollectionConfigExport 0% 0%
Weaviate.Client.Models.CollectionsResource 100%
Weaviate.Client.Models.CollectionUpdate 42.2% 50%
Weaviate.Client.Models.CurrentUserInfo 80%
Weaviate.Client.Models.DatabaseUser 55.5%
Weaviate.Client.Models.DataReference 100% 50%
Weaviate.Client.Models.DataResource 100%
Weaviate.Client.Models.DataTypeExtensions 0% 0%
Weaviate.Client.Models.DeleteManyObjectResult 100%
Weaviate.Client.Models.DeleteManyResult 100%
Weaviate.Client.Models.DynamicDto 0%
Weaviate.Client.Models.EmptyBackend 33.3%
Weaviate.Client.Models.EmptyStringEnumConverter`1 86.9% 66.6%
Weaviate.Client.Models.Export 61.5%
Weaviate.Client.Models.ExportBackend 0%
Weaviate.Client.Models.ExportClientConfig 100%
Weaviate.Client.Models.ExportCreateRequest 100%
Weaviate.Client.Models.ExportOperation 100%
Weaviate.Client.Models.ExportOperationBase 72.8% 67.8%
Weaviate.Client.Models.ExportStatusExtensions 63.6% 41.6%
Weaviate.Client.Models.FilesystemBackend 100%
Weaviate.Client.Models.Filter 60.8% 40%
Weaviate.Client.Models.Filter`1 50% 50%
Weaviate.Client.Models.FlatDto 100%
Weaviate.Client.Models.FlexibleConverter`1 15.9% 9.1%
Weaviate.Client.Models.FlexibleStringConverter 46.1% 41.6%
Weaviate.Client.Models.Generative.Providers 0.6%
Weaviate.Client.Models.GenerativeConfig 7.5%
Weaviate.Client.Models.GenerativeConfigSerialization 46.8% 55.4%
Weaviate.Client.Models.GenerativeDebug 0%
Weaviate.Client.Models.GenerativeGroupByObject 100%
Weaviate.Client.Models.GenerativeGroupByResult 25%
Weaviate.Client.Models.GenerativePrompt 100%
Weaviate.Client.Models.GenerativeProvider 83.3%
Weaviate.Client.Models.GenerativeReply 100%
Weaviate.Client.Models.GenerativeResult 20% 0%
Weaviate.Client.Models.GenerativeWeaviateGroup 100%
Weaviate.Client.Models.GenerativeWeaviateObject 100%
Weaviate.Client.Models.GenerativeWeaviateResult 100%
Weaviate.Client.Models.GeoCoordinate 100%
Weaviate.Client.Models.GeoCoordinateConstraint 0%
Weaviate.Client.Models.GroupByObject 100%
Weaviate.Client.Models.GroupByRequest 100%
Weaviate.Client.Models.GroupByResult 16.6%
Weaviate.Client.Models.GroupByResult`2 100%
Weaviate.Client.Models.GroupedTask 100%
Weaviate.Client.Models.GroupRoleAssignment 0%
Weaviate.Client.Models.GroupsResource 100%
Weaviate.Client.Models.HFreshDto 100%
Weaviate.Client.Models.HnswDto 100%
Weaviate.Client.Models.HybridNearTextBuilder 0%
Weaviate.Client.Models.HybridNearVectorBuilder 0%
Weaviate.Client.Models.HybridVectorInput 78.5% 85.7%
Weaviate.Client.Models.HybridVectorInputBuilder 0%
Weaviate.Client.Models.InvertedIndexConfig 44.5% 29.1%
Weaviate.Client.Models.InvertedIndexConfigUpdate 71.4% 50%
Weaviate.Client.Models.JsonConverterEmptyCollectionAsNull 73.6% 50%
Weaviate.Client.Models.Metadata 100%
Weaviate.Client.Models.MetadataQuery 81.8%
Weaviate.Client.Models.MetaInfo 92.8% 80%
Weaviate.Client.Models.Metrics 84.8% 60%
Weaviate.Client.Models.ModelsToDtoExtensions 100% 90%
Weaviate.Client.Models.ModuleConfigList 0% 0%
Weaviate.Client.Models.Move 100%
Weaviate.Client.Models.MultiTenancyConfig 100%
Weaviate.Client.Models.MultiTenancyConfigUpdate 60%
Weaviate.Client.Models.MultiVectorDto 100%
Weaviate.Client.Models.MultiVectorEncodingDto 100%
Weaviate.Client.Models.MuveraDto 100% 100%
Weaviate.Client.Models.NamedVector 100% 100%
Weaviate.Client.Models.NamespacesResource 100%
Weaviate.Client.Models.NearTextBuilder 36.2%
Weaviate.Client.Models.NearTextInput 50%
Weaviate.Client.Models.NearVectorBuilder 0%
Weaviate.Client.Models.NearVectorInput 45.4%
Weaviate.Client.Models.NestedFilter 100%
Weaviate.Client.Models.NodesResource 50%
Weaviate.Client.Models.NodeStatusExtensions 0% 0%
Weaviate.Client.Models.NotNestedFilter 100%
Weaviate.Client.Models.ObjectReference 80%
Weaviate.Client.Models.ObjectStorageBackend 0%
Weaviate.Client.Models.ObjectTTLConfig 97.5%
Weaviate.Client.Models.ObjectTTLConfigUpdate 89.6% 26.9%
Weaviate.Client.Models.OrNestedFilter 100%
Weaviate.Client.Models.PermissionResourceExtensions 80.5% 33.3%
Weaviate.Client.Models.Permissions 70% 59.3%
Weaviate.Client.Models.PermissionScope 100%
Weaviate.Client.Models.PhoneNumber 77.7%
Weaviate.Client.Models.Property 86.4% 62.5%
Weaviate.Client.Models.Property`1 100%
Weaviate.Client.Models.PropertyFilter 74.4% 50%
Weaviate.Client.Models.PropertyHelper 67.8% 53.4%
Weaviate.Client.Models.PropertyIndexTypeExtensions 50% 25%
Weaviate.Client.Models.PropertyUpdate 25%
Weaviate.Client.Models.QueryProfile 100%
Weaviate.Client.Models.QueryReference 100%
Weaviate.Client.Models.Reference 100%
Weaviate.Client.Models.ReferenceFilter 100%
Weaviate.Client.Models.ReferenceUpdate 0%
Weaviate.Client.Models.ReplicateRequest 100%
Weaviate.Client.Models.ReplicateResource 100%
Weaviate.Client.Models.ReplicationAsyncConfig 100%
Weaviate.Client.Models.ReplicationClientConfig 100%
Weaviate.Client.Models.ReplicationConfig 100%
Weaviate.Client.Models.ReplicationConfigUpdate 44.4%
Weaviate.Client.Models.ReplicationOperation 70% 50%
Weaviate.Client.Models.ReplicationOperationError 0%
Weaviate.Client.Models.ReplicationOperationStatus 37.5% 0%
Weaviate.Client.Models.ReplicationOperationTracker 68% 54.5%
Weaviate.Client.Models.Rerank 100%
Weaviate.Client.Models.Reranker 15.3%
Weaviate.Client.Models.RerankerConfigSerialization 56.8% 55%
Weaviate.Client.Models.RoleInfo 100%
Weaviate.Client.Models.RolesResource 100%
Weaviate.Client.Models.SearchProfile 100%
Weaviate.Client.Models.ShardInfo 100%
Weaviate.Client.Models.ShardingConfig 100%
Weaviate.Client.Models.ShardProfile 100%
Weaviate.Client.Models.ShardProgress 33.3%
Weaviate.Client.Models.ShardStatusExtensions 100% 50%
Weaviate.Client.Models.SimpleTargetVectors 100%
Weaviate.Client.Models.SinglePrompt 100%
Weaviate.Client.Models.Sort 100% 50%
Weaviate.Client.Models.SortExtensions 100%
Weaviate.Client.Models.StopwordConfig 61.9% 62.5%
Weaviate.Client.Models.StopwordsConfigUpdate 57.1% 50%
Weaviate.Client.Models.TargetVectors 27.6% 0%
Weaviate.Client.Models.Tenant 38.8% 13.3%
Weaviate.Client.Models.TenantsResource 100%
Weaviate.Client.Models.TextAnalyzerConfig 100%
Weaviate.Client.Models.TimeFilter 75% 25%
Weaviate.Client.Models.TokenizeMapping 77.2% 60.4%
Weaviate.Client.Models.TokenizeResult 100%
Weaviate.Client.Models.Typed.AggregateGroupByResult`1 0% 0%
Weaviate.Client.Models.Typed.AggregatePropertyMapper 0% 0%
Weaviate.Client.Models.Typed.AggregateResult`1 0%
Weaviate.Client.Models.Typed.BooleanMetricsAttribute 0%
Weaviate.Client.Models.Typed.DateMetricsAttribute 0%
Weaviate.Client.Models.Typed.GenerativeGroupByObject`1 0%
Weaviate.Client.Models.Typed.GenerativeGroupByResult`1 0%
Weaviate.Client.Models.Typed.GenerativeWeaviateGroup`1 0%
Weaviate.Client.Models.Typed.GenerativeWeaviateObject`1 0%
Weaviate.Client.Models.Typed.GenerativeWeaviateResult`1 0%
Weaviate.Client.Models.Typed.GroupByObject`1 0%
Weaviate.Client.Models.Typed.GroupByResult`1 0%
Weaviate.Client.Models.Typed.IntegerMetricsAttribute 0%
Weaviate.Client.Models.Typed.MetricsExtractor 0% 0%
Weaviate.Client.Models.Typed.NumberMetricsAttribute 0%
Weaviate.Client.Models.Typed.TextMetricsAttribute 0%
Weaviate.Client.Models.Typed.TypedResultConverter 12% 7.6%
Weaviate.Client.Models.Typed.WeaviateGroup`2 0%
Weaviate.Client.Models.Typed.WeaviateObject`1 47.3% 37.5%
Weaviate.Client.Models.TypedBase`1 70.5%
Weaviate.Client.Models.TypedGuid 66.6%
Weaviate.Client.Models.TypedValue`1 80%
Weaviate.Client.Models.User 0%
Weaviate.Client.Models.UserMetadata 0%
Weaviate.Client.Models.UserRoleAssignment 100%
Weaviate.Client.Models.UsersResource 100%
Weaviate.Client.Models.Vector 32.8% 18.7%
Weaviate.Client.Models.VectorBuilder 0% 0%
Weaviate.Client.Models.VectorConfig 82.7% 58.3%
Weaviate.Client.Models.VectorConfigList 59.3% 60%
Weaviate.Client.Models.VectorConfigUpdate 50%
Weaviate.Client.Models.VectorIndex 98%
Weaviate.Client.Models.VectorIndexConfig 100%
Weaviate.Client.Models.VectorIndexConfigUpdate 68.4% 33.3%
Weaviate.Client.Models.VectorIndexConfigUpdateDynamic 0% 0%
Weaviate.Client.Models.VectorIndexConfigUpdateFlat 40%
Weaviate.Client.Models.VectorIndexConfigUpdateHNSW 52.9%
Weaviate.Client.Models.VectorIndexMappingExtensions 89.1% 60.6%
Weaviate.Client.Models.VectorIndexSerialization 58.2% 58.3%
Weaviate.Client.Models.VectorInputBuilderFactories 50% 50%
Weaviate.Client.Models.Vectorizer 8.7% 0%
Weaviate.Client.Models.VectorizerAttribute 100%
Weaviate.Client.Models.VectorizerConfig 64.1% 56.2%
Weaviate.Client.Models.VectorizerRegistry 68.9% 71.4%
Weaviate.Client.Models.Vectorizers.VectorizerConfigFactory 58% 62.5%
Weaviate.Client.Models.VectorMulti`1 38.8% 23%
Weaviate.Client.Models.VectorQuery 45% 50%
Weaviate.Client.Models.Vectors 31.2% 100%
Weaviate.Client.Models.VectorSearchInput 51.7% 16.6%
Weaviate.Client.Models.VectorSingle`1 18.1% 0%
Weaviate.Client.Models.WeaviateGroup`1 80%
Weaviate.Client.Models.WeaviateObject 88.8%
Weaviate.Client.Models.WeaviateObjectExtensions 56.5% 50%
Weaviate.Client.Models.WeaviateResult 100%
Weaviate.Client.Models.WeaviateResult`1 100%
Weaviate.Client.Models.WeightedField 0%
Weaviate.Client.Models.WeightedFields 0% 0%
Weaviate.Client.Models.WeightedTargetVectors 100% 100%
Weaviate.Client.NearMediaBuilder 0% 0%
Weaviate.Client.NearMediaInput 0%
Weaviate.Client.NodesClient 87.5% 50%
Weaviate.Client.OAuthConfig 71.4%
Weaviate.Client.OAuthTokenService 39.2% 18.7%
Weaviate.Client.QueryClient 47.6% 40%
Weaviate.Client.QueryClientHybridExtensions 0% 0%
Weaviate.Client.QueryClientNearTextExtensions 0% 0%
Weaviate.Client.ReplicationsClient 88.5% 56.6%
Weaviate.Client.RequiresWeaviateVersionAttribute 100%
Weaviate.Client.RerankerConfigFactory 14.2% 100%
Weaviate.Client.Rest.EnumMemberJsonConverter`1 0% 0%
Weaviate.Client.Rest.EnumMemberJsonConverterFactory 0%
Weaviate.Client.Rest.HttpResponseMessageExtensions 82.9% 62.5%
Weaviate.Client.Rest.InvalidEnumWireFormatException 0%
Weaviate.Client.Rest.WeaviateEndpoints 79.1% 75.8%
Weaviate.Client.Rest.WeaviateRestClient 88.5% 53.2%
Weaviate.Client.Rest.WeaviateRestClientException 0% 0%
Weaviate.Client.Rest.WeaviateRestServerException 0% 0%
Weaviate.Client.Rest.WeaviateUnexpectedStatusCodeException 100%
Weaviate.Client.RetryPolicy 50% 42.8%
Weaviate.Client.RolesClient 90.3% 50%
Weaviate.Client.Serialization.Converters.BlobHashPropertyConverter 10.7% 0%
Weaviate.Client.Serialization.Converters.BlobPropertyConverter 58.8% 37.5%
Weaviate.Client.Serialization.Converters.BoolPropertyConverter 64% 40%
Weaviate.Client.Serialization.Converters.DatePropertyConverter 31% 21%
Weaviate.Client.Serialization.Converters.GeoPropertyConverter 28.3% 10.5%
Weaviate.Client.Serialization.Converters.IntPropertyConverter 49.2% 26.3%
Weaviate.Client.Serialization.Converters.NumberPropertyConverter 56.8% 23.5%
Weaviate.Client.Serialization.Converters.ObjectPropertyConverter 18% 7.3%
Weaviate.Client.Serialization.Converters.PhonePropertyConverter 14.4% 5.2%
Weaviate.Client.Serialization.Converters.TextPropertyConverter 36.3% 20.8%
Weaviate.Client.Serialization.Converters.UuidPropertyConverter 61.1% 37.5%
Weaviate.Client.Serialization.PropertyBag 0% 0%
Weaviate.Client.Serialization.PropertyConverterBase 23% 11.9%
Weaviate.Client.Serialization.PropertyConverterRegistry 73.7% 65.5%
Weaviate.Client.TenantsClient 84.5% 37.5%
Weaviate.Client.TokenizeClient 85.1% 75%
Weaviate.Client.Typed.TypedCollectionClient`1 91.1% 50%
Weaviate.Client.Typed.TypedDataClient`1 49%
Weaviate.Client.Typed.TypedGenerateClient`1 0.8% 0%
Weaviate.Client.Typed.TypedGenerateClientHybridExtensions 0%
Weaviate.Client.Typed.TypedQueryClient`1 10.6% 100%
Weaviate.Client.Typed.TypedQueryClientHybridExtensions 0%
Weaviate.Client.UsersClient 89.4% 66.6%
Weaviate.Client.UsersDatabaseClient 100% 62.5%
Weaviate.Client.UsersOidcClient 4.5%
Weaviate.Client.Validation.TypeValidationException 0%
Weaviate.Client.Validation.TypeValidator 50% 48.6%
Weaviate.Client.Validation.ValidationError 83.3%
Weaviate.Client.Validation.ValidationResult 62.5% 50%
Weaviate.Client.Validation.ValidationWarning 0%
Weaviate.Client.ValidationExtensions 80% 100%
Weaviate.Client.VectorizerFactory 3% 0%
Weaviate.Client.VectorizerFactoryMulti 6.2%
Weaviate.Client.WeaviateAuthenticationException 100% 100%
Weaviate.Client.WeaviateAuthorizationException 100% 100%
Weaviate.Client.WeaviateBackupConflictException 100%
Weaviate.Client.WeaviateBadRequestException 0% 0%
Weaviate.Client.WeaviateClient 59.8% 48%
Weaviate.Client.WeaviateClientBuilder 56.6% 50%
Weaviate.Client.WeaviateClientBuilderExtensions 0% 0%
Weaviate.Client.WeaviateClientException 33.3%
Weaviate.Client.WeaviateCollectionLimitReachedException 0% 0%
Weaviate.Client.WeaviateConflictException 100%
Weaviate.Client.WeaviateDefaults 100%
Weaviate.Client.WeaviateException 66.6%
Weaviate.Client.WeaviateExtensions 78.3% 53.4%
Weaviate.Client.WeaviateExternalModuleProblemException 0% 0%
Weaviate.Client.WeaviateFeatureNotSupportedException 0% 0%
Weaviate.Client.WeaviateModuleNotAvailableException 0% 0%
Weaviate.Client.WeaviateNotFoundException 14.8% 0%
Weaviate.Client.WeaviateServerException 66.6%
Weaviate.Client.WeaviateTimeoutException 0% 0%
Weaviate.Client.WeaviateUnprocessableEntityException 100% 100%
Weaviate.Client.WeaviateVersionMismatchException 76.9% 50%
Weaviate.Client.Analyzers - 0%
Name Line Branch
Weaviate.Client.Analyzers 0% 0%
Weaviate.Client.Analyzers.AggregatePropertySuffixAnalyzer 0% 0%
Weaviate.Client.Analyzers.AutoArrayUsageAnalyzer 0% 0%
Weaviate.Client.Analyzers.HybridSearchNullParametersAnalyzer 0% 0%
Weaviate.Client.Analyzers.RequiresVersionEnsureCallAnalyzer 0% 0%
Weaviate.Client.Analyzers.VectorizerFactoryAnalyzer 0% 0%
Weaviate.Client.VectorData - 50.3%
Name Line Branch
Weaviate.Client.VectorData 50.3% 31.2%
Weaviate.Client.VectorData.DependencyInjection.WeaviateVectorDataServiceCol
lectionExtensions
0% 0%
Weaviate.Client.VectorData.Filters.WeaviateFilterTranslator 29.2% 19.5%
Weaviate.Client.VectorData.Mapping.AttributeBasedRecordMapper`1 59.7% 50%
Weaviate.Client.VectorData.Mapping.DataPropertyInfo 100%
Weaviate.Client.VectorData.Mapping.DynamicRecordMapper 0% 0%
Weaviate.Client.VectorData.Mapping.RecordPropertyModel 54.9% 43.1%
Weaviate.Client.VectorData.Mapping.VectorDataSchemaBuilder 41.3% 18.7%
Weaviate.Client.VectorData.Mapping.VectorPropertyInfo 85.7%
Weaviate.Client.VectorData.WeaviateVectorStore 61.2% 33.3%
Weaviate.Client.VectorData.WeaviateVectorStoreCollection`2 71.3% 44.7%
Weaviate.Client.VectorData.WeaviateVectorStoreCollectionOptions 0%
Weaviate.Client.VectorData.WeaviateVectorStoreOptions 0%

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds cross-property BM25 AND support across gRPC search paths with version validation and tests.

Changes:

  • Adds BM25Operator.AndCross and protobuf mapping.
  • Adds server-version guards for BM25 and hybrid requests.
  • Adds unit/integration coverage and updates CI versions.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated no comments.

Show a summary per file
File Description
WeaviateClient.cs Propagates server version to gRPC.
PublicAPI.Unshipped.txt Tracks the new public record.
Models/Search.cs Defines AndCross.
gRPC/Search.Builders.cs Maps and validates the operator.
gRPC/proto/v1/base_search.proto Adds the protobuf enum value.
gRPC/Client.cs Stores server-version metadata.
TestBM25OperatorSyntax.cs Tests mapping and version guards.
Mocks/MockHelpers.cs Configures mocked server versions.
TestSearchHybrid.cs Tests hybrid cross-property matching.
TestQueries.cs Tests BM25 behavior and analyzer errors.
.github/workflows/main.yaml Updates the integration-test matrix.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

The operator was already accepted on query.bm25, all four hybrid surfaces
and aggregate.hybrid, but not on generate.bm25 — leaving AndCross
unreachable from generative keyword search. Adds the parameter to the four
GenerateClient/TypedGenerateClient overloads, in the same position the
query client uses. It flows into the existing BuildBM25 path, so the
server-version guard applies unchanged.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 13 out of 13 changed files in this pull request and generated 1 comment.

Comment thread src/Weaviate.Client/PublicAPI.Unshipped.txt
Comment on lines +812 to +824
if (_serverVersion.Major == minimum.Major && _serverVersion.Minor == minimum.Minor)
{
if (_serverVersion >= minimum)
{
return;
}
break;
}
}
if (_serverVersion >= AndCrossMinimumVersions[^1])
{
return;
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: This may be duplicating code

I have a strong feeling that this client already has some logic for checking "is this version lower than the minimum required version". I don't know in which file, unfortunately, but AFAIK C# client does a lot of this kind of validation.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is Internal/VersionGuard + [RequiresWeaviateVersion], but it can't express this one as AndCross has a backport list (≥1.37.15, ≥1.38.8, ≥1.39.0). Will keep it like this for now and implement generic checks later.

Your nit did catch a real bug though, it was throwing WeaviateFeatureNotSupportedException, which derives from WeaviateServerException. Switched to WeaviateVersionMismatchException, matching the other version gates.

… guard

EnsureBM25OperatorSupported runs before the request ever leaves the client,
but WeaviateFeatureNotSupportedException derives from WeaviateServerException.
Switched to WeaviateVersionMismatchException (WeaviateClientException), which
is what the client's other version gates throw via Internal/VersionGuard. The
two previously sat under different bases, so a caller could not catch both
with anything narrower than WeaviateException.

That exception's only constructor takes (operation, requiredVersion,
actualVersion), so the backport floors now travel in the operation argument,
sourced from the existing AndCrossMinimumVersions ladder rather than a
hand-written string. Tests assert the structured RequiredVersion and
ActualVersion alongside the exception type.

WeaviateFeatureNotSupportedException is left in place: ExceptionHelper still
maps a genuine server-side gRPC Unimplemented to it, where the server base
class is correct.
@g-despot
g-despot merged commit 3468d14 into main Aug 14, 2026
20 checks passed
@g-despot
g-despot deleted the feat/bm25-and-cross branch August 14, 2026 06:24
g-despot added a commit that referenced this pull request Aug 14, 2026
Brings in #359 (module endpoint/location), #365 (BM25Operator.AndCross +
searchOperator on generate.bm25), #366 (diversitySelection across hybrid and
the near* family), and #367 (multimodal vectorizer weights).

All of the .cs overload files auto-merged: boost is inserted after `rerank`
and diversitySelection after `bm25Operator`/before `autoLimit`, so the two
parameter additions never collided. Verified structurally in both directions
(merged-minus-boost == origin/main, merged-minus-diversitySelection/
searchOperator == the branch) rather than trusting the auto-merge.

The only textual conflict was PublicAPI.Unshipped.txt, where both sides emit
a *REMOVED* line plus a replacement signature for the same 102 overloads.
Resolved to a deduplicated union (102 identical *REMOVED* lines collapsed),
then adjudicated by the public API analyzer: 204 single-parameter signatures
were stale (RS0017) and 102 combined signatures were missing (RS0016). After
applying those, the RS0016/RS0017 sets are identical to both parents'.

Parameter counts after the merge match each parent exactly: boost 111
declarations (as on the branch), diversitySelection 105 and searchOperator 10
(as on main).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants