Skip to content

Commit d8747dd

Browse files
ankaneroji
andcommitted
Added support for MaxLength - #50
Co-authored-by: Shay Rojansky <[email protected]>
1 parent d38af37 commit d8747dd

File tree

4 files changed

+58
-12
lines changed

4 files changed

+58
-12
lines changed

src/Pgvector.EntityFrameworkCore/CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
## 0.2.2 (unreleased)
22

33
- Added support for scaffolding
4+
- Added support for `MaxLength`
45

56
## 0.2.1 (2024-06-25)
67

src/Pgvector.EntityFrameworkCore/VectorTypeMapping.cs

+11-6
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,18 @@ namespace Pgvector.EntityFrameworkCore;
66

77
public class VectorTypeMapping : RelationalTypeMapping
88
{
9-
public static VectorTypeMapping Default { get; } = new();
9+
public static VectorTypeMapping Default { get; } = new("vector", typeof(Vector));
1010

11-
public VectorTypeMapping() : base("vector", typeof(Vector)) { }
12-
13-
public VectorTypeMapping(string storeType) : base(storeType, typeof(Vector)) { }
14-
15-
public VectorTypeMapping(string storeType, Type clrType) : base(storeType, clrType) { }
11+
public VectorTypeMapping(string storeType, Type clrType, int? size = null)
12+
: this(
13+
new RelationalTypeMappingParameters(
14+
new CoreTypeMappingParameters(clrType),
15+
storeType,
16+
StoreTypePostfix.Size,
17+
size: size,
18+
fixedLength: size is not null))
19+
{
20+
}
1621

1722
protected VectorTypeMapping(RelationalTypeMappingParameters parameters) : base(parameters) { }
1823

src/Pgvector.EntityFrameworkCore/VectorTypeMappingSourcePlugin.cs

+6-6
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,18 @@ public class VectorTypeMappingSourcePlugin : IRelationalTypeMappingSourcePlugin
1010
{
1111
return (mappingInfo.StoreTypeNameBase ?? mappingInfo.StoreTypeName) switch
1212
{
13-
"vector" => new VectorTypeMapping(mappingInfo.StoreTypeName ?? "vector", typeof(Vector)),
14-
"halfvec" => new VectorTypeMapping(mappingInfo.StoreTypeName ?? "halfvec", typeof(HalfVector)),
15-
"sparsevec" => new VectorTypeMapping(mappingInfo.StoreTypeName ?? "sparsevec", typeof(SparseVector)),
13+
"vector" => new VectorTypeMapping(mappingInfo.StoreTypeName ?? "vector", typeof(Vector), mappingInfo.Size),
14+
"halfvec" => new VectorTypeMapping(mappingInfo.StoreTypeName ?? "halfvec", typeof(HalfVector), mappingInfo.Size),
15+
"sparsevec" => new VectorTypeMapping(mappingInfo.StoreTypeName ?? "sparsevec", typeof(SparseVector), mappingInfo.Size),
1616
_ => null,
1717
};
1818
}
1919

2020
return mappingInfo.ClrType switch
2121
{
22-
var t when t == typeof(Vector) => new VectorTypeMapping(mappingInfo.StoreTypeName ?? "vector", typeof(Vector)),
23-
var t when t == typeof(HalfVector) => new VectorTypeMapping(mappingInfo.StoreTypeName ?? "halfvec", typeof(HalfVector)),
24-
var t when t == typeof(SparseVector) => new VectorTypeMapping(mappingInfo.StoreTypeName ?? "sparsevec", typeof(SparseVector)),
22+
var t when t == typeof(Vector) => new VectorTypeMapping(mappingInfo.StoreTypeName ?? "vector", typeof(Vector), mappingInfo.Size),
23+
var t when t == typeof(HalfVector) => new VectorTypeMapping(mappingInfo.StoreTypeName ?? "halfvec", typeof(HalfVector), mappingInfo.Size),
24+
var t when t == typeof(SparseVector) => new VectorTypeMapping(mappingInfo.StoreTypeName ?? "sparsevec", typeof(SparseVector), mappingInfo.Size),
2525
_ => null,
2626
};
2727
}

tests/Pgvector.CSharp.Tests/EntityFrameworkCoreTests.cs

+40
Original file line numberDiff line numberDiff line change
@@ -141,4 +141,44 @@ public async Task Main()
141141
Assert.Equal(new int[] { 1, 3, 2 }, neighbors.Select(v => v.Entity.Id).ToArray());
142142
Assert.Equal(new double[] { 0, 1, Math.Sqrt(3) }, neighbors.Select(v => v.Distance).ToArray());
143143
}
144+
145+
[Theory]
146+
[InlineData(typeof(Vector), null, "vector")]
147+
[InlineData(typeof(Vector), 3, "vector(3)")]
148+
[InlineData(typeof(HalfVector), null, "halfvec")]
149+
[InlineData(typeof(HalfVector), 3, "halfvec(3)")]
150+
[InlineData(typeof(BitArray), null, "bit varying")]
151+
[InlineData(typeof(BitArray), 3, "bit varying(3)")]
152+
[InlineData(typeof(SparseVector), null, "sparsevec")]
153+
[InlineData(typeof(SparseVector), 3, "sparsevec(3)")]
154+
public void ByStoreType(Type type, int? size, string expectedStoreType)
155+
{
156+
using var ctx = new ItemContext();
157+
var typeMappingSource = ctx.GetService<IRelationalTypeMappingSource>();
158+
159+
var typeMapping = typeMappingSource.FindMapping(type, storeTypeName: null, size: size)!;
160+
Assert.Equal(expectedStoreType, typeMapping.StoreType);
161+
Assert.Same(type, typeMapping.ClrType);
162+
Assert.Equal(size, typeMapping.Size);
163+
}
164+
165+
[Theory]
166+
[InlineData("vector", typeof(Vector), null)]
167+
[InlineData("vector(3)", typeof(Vector), 3)]
168+
[InlineData("halfvec", typeof(HalfVector), null)]
169+
[InlineData("halfvec(3)", typeof(HalfVector), 3)]
170+
[InlineData("bit varying", typeof(BitArray), null)]
171+
[InlineData("bit(3)", typeof(BitArray), 3)]
172+
[InlineData("sparsevec", typeof(SparseVector), null)]
173+
[InlineData("sparsevec(3)", typeof(SparseVector), 3)]
174+
public void ByClrType(string storeType, Type expectedType, int? expectedSize)
175+
{
176+
using var ctx = new ItemContext();
177+
var typeMappingSource = ctx.GetService<IRelationalTypeMappingSource>();
178+
179+
var typeMapping = typeMappingSource.FindMapping(storeType)!;
180+
Assert.Equal(storeType, typeMapping.StoreType);
181+
Assert.Same(expectedType, typeMapping.ClrType);
182+
Assert.Equal(expectedSize, typeMapping.Size);
183+
}
144184
}

0 commit comments

Comments
 (0)