From 9bd6c0179a6da14a064cfc285f06fa82a4c2bb95 Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Tue, 18 Jul 2023 23:52:23 -0700 Subject: [PATCH] Added support for Npgsql 8 --- .../Pgvector.EntityFrameworkCore.csproj | 2 +- .../Npgsql/VectorTypeHandlerResolver.cs | 13 ++++------ .../VectorTypeHandlerResolverFactory.cs | 11 ++++---- .../Npgsql/VectorTypeMappingResolver.cs | 26 +++++++++++++++++++ src/Pgvector/Pgvector.csproj | 2 +- 5 files changed, 39 insertions(+), 15 deletions(-) create mode 100644 src/Pgvector/Npgsql/VectorTypeMappingResolver.cs diff --git a/src/Pgvector.EntityFrameworkCore/Pgvector.EntityFrameworkCore.csproj b/src/Pgvector.EntityFrameworkCore/Pgvector.EntityFrameworkCore.csproj index a676e9f..5a37f7e 100644 --- a/src/Pgvector.EntityFrameworkCore/Pgvector.EntityFrameworkCore.csproj +++ b/src/Pgvector.EntityFrameworkCore/Pgvector.EntityFrameworkCore.csproj @@ -19,7 +19,7 @@ - + diff --git a/src/Pgvector/Npgsql/VectorTypeHandlerResolver.cs b/src/Pgvector/Npgsql/VectorTypeHandlerResolver.cs index 020b973..439b150 100644 --- a/src/Pgvector/Npgsql/VectorTypeHandlerResolver.cs +++ b/src/Pgvector/Npgsql/VectorTypeHandlerResolver.cs @@ -27,7 +27,7 @@ internal VectorTypeHandlerResolver(NpgsqlConnector connector) public override NpgsqlTypeHandler? ResolveByClrType(Type type) { - var dataTypeName = ClrTypeToDataTypeName(type); + var dataTypeName = VectorTypeMappingResolver.ClrTypeToDataTypeName(type); if (dataTypeName != null) { var handler = ResolveByDataTypeName(dataTypeName); @@ -38,14 +38,11 @@ internal VectorTypeHandlerResolver(NpgsqlConnector connector) return null; } - public override TypeMappingInfo? GetMappingByDataTypeName(string dataTypeName) - => DoGetMappingByDataTypeName(dataTypeName); + public override NpgsqlTypeHandler? ResolveByNpgsqlDbType(NpgsqlDbType npgsqlDbType) + => null; - internal static string? ClrTypeToDataTypeName(Type type) - => type == typeof(Vector) ? "vector" : null; - - internal static TypeMappingInfo? DoGetMappingByDataTypeName(string dataTypeName) - => dataTypeName == "vector" ? new TypeMappingInfo(NpgsqlDbType.Unknown, "vector") : null; + public override NpgsqlTypeHandler? ResolveValueTypeGenerically(T value) + => typeof(T) == typeof(Vector) ? _vectorHandler : null; PostgresType? PgType(string pgTypeName) => _databaseInfo.TryGetPostgresTypeByName(pgTypeName, out var pgType) ? pgType : null; diff --git a/src/Pgvector/Npgsql/VectorTypeHandlerResolverFactory.cs b/src/Pgvector/Npgsql/VectorTypeHandlerResolverFactory.cs index 273a899..9d5eff1 100644 --- a/src/Pgvector/Npgsql/VectorTypeHandlerResolverFactory.cs +++ b/src/Pgvector/Npgsql/VectorTypeHandlerResolverFactory.cs @@ -1,17 +1,18 @@ using Npgsql.Internal; using Npgsql.Internal.TypeHandling; +using Npgsql.Internal.TypeMapping; using System; namespace Pgvector.Npgsql; public class VectorTypeHandlerResolverFactory : TypeHandlerResolverFactory { - public override TypeHandlerResolver Create(NpgsqlConnector connector) + public override TypeHandlerResolver Create(TypeMapper typeMapper, NpgsqlConnector connector) => new VectorTypeHandlerResolver(connector); - public override string? GetDataTypeNameByClrType(Type type) - => VectorTypeHandlerResolver.ClrTypeToDataTypeName(type); + public override TypeMappingResolver CreateMappingResolver() + => new VectorTypeMappingResolver(); - public override TypeMappingInfo? GetMappingByDataTypeName(string dataTypeName) - => VectorTypeHandlerResolver.DoGetMappingByDataTypeName(dataTypeName); + public override TypeMappingResolver CreateGlobalMappingResolver() + => new VectorTypeMappingResolver(); } diff --git a/src/Pgvector/Npgsql/VectorTypeMappingResolver.cs b/src/Pgvector/Npgsql/VectorTypeMappingResolver.cs new file mode 100644 index 0000000..ac3ab97 --- /dev/null +++ b/src/Pgvector/Npgsql/VectorTypeMappingResolver.cs @@ -0,0 +1,26 @@ +using Npgsql.Internal; +using Npgsql.Internal.TypeHandling; +using Npgsql.Internal.TypeMapping; +using Npgsql.PostgresTypes; +using NpgsqlTypes; +using System; + +namespace Pgvector.Npgsql; + +public class VectorTypeMappingResolver : TypeMappingResolver +{ + public override string? GetDataTypeNameByClrType(Type type) + => ClrTypeToDataTypeName(type); + + public override TypeMappingInfo? GetMappingByDataTypeName(string dataTypeName) + => DoGetMappingByDataTypeName(dataTypeName); + + public override TypeMappingInfo? GetMappingByPostgresType(TypeMapper mapper, PostgresType type) + => DoGetMappingByDataTypeName(type.Name); + + static TypeMappingInfo? DoGetMappingByDataTypeName(string dataTypeName) + => dataTypeName == "vector" ? new TypeMappingInfo(NpgsqlDbType.Unknown, "vector") : null; + + internal static string? ClrTypeToDataTypeName(Type type) + => type == typeof(Vector) ? "vector" : null; +} diff --git a/src/Pgvector/Pgvector.csproj b/src/Pgvector/Pgvector.csproj index 8a4d169..28fdbb1 100644 --- a/src/Pgvector/Pgvector.csproj +++ b/src/Pgvector/Pgvector.csproj @@ -17,7 +17,7 @@ - +