Skip to content

Commit 99e8720

Browse files
authored
Merge pull request #11 from JKamsker/codex/add-vector-aware-index-support
Integrate vector indexes into planner and tests
2 parents cae4a4f + 543126a commit 99e8720

File tree

86 files changed

+9478
-353
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+9478
-353
lines changed

.github/workflows/ci.yml

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ on:
66
jobs:
77
build:
88
runs-on: ubuntu-latest
9+
concurrency:
10+
group: ${{ github.workflow }}-${{ github.ref }}
11+
cancel-in-progress: true
912

1013
steps:
1114
- name: Check out repository
@@ -22,18 +25,40 @@ jobs:
2225
run: dotnet restore LiteDB.sln
2326

2427
- name: Build
25-
run: dotnet build LiteDB.sln --configuration Release --no-restore
28+
run: dotnet build LiteDB.sln --configuration Release --no-restore /p:DefineConstants=TESTING
2629

27-
- name: Test
28-
timeout-minutes: 5
29-
continue-on-error: true
30-
run: dotnet test LiteDB.sln --configuration Release --no-build --verbosity normal --settings tests.runsettings --logger "trx;LogFileName=TestResults.trx" --logger "console;verbosity=detailed"
30+
- name: Test (with hang diagnostics)
31+
timeout-minutes: 8
32+
env:
33+
VSTEST_TESTHOST_HANG_DUMP_TYPE: full
34+
VSTEST_TESTHOST_HANG_DUMP_FOLDER: ${{ github.workspace }}/hangdumps
35+
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
36+
DOTNET_NOLOGO: 1
37+
run: >-
38+
dotnet test LiteDB.sln
39+
--configuration Release
40+
--no-build
41+
--verbosity normal
42+
--settings tests.ci.runsettings
43+
--logger "trx;LogFileName=TestResults.trx"
44+
--logger "console;verbosity=detailed"
45+
--blame-hang --blame-hang-timeout 00:02:00
46+
--diag "TestHost.diag.log;tracelevel=verbose"
47+
/p:DefineConstants=TESTING
3148
3249
- name: Upload test results
33-
if: always()
3450
uses: actions/upload-artifact@v4
51+
if: always()
3552
with:
3653
name: test-results
54+
path: "**/*TestResults*.trx"
55+
56+
- name: Upload hang dumps (if any)
57+
uses: actions/upload-artifact@v4
58+
if: always()
59+
with:
60+
name: hangdumps
3761
path: |
38-
**/TestResults.trx
39-
**/TestResults/**/*
62+
hangdumps
63+
**/TestResults/**/*.dmp
64+
if-no-files-found: ignore

.github/workflows/publish-prerelease.yml

Lines changed: 63 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ jobs:
1010
runs-on: ubuntu-latest
1111
permissions:
1212
contents: write
13+
concurrency:
14+
group: ${{ github.workflow }}-${{ github.ref }}
15+
cancel-in-progress: true
1316

1417
steps:
1518
- name: Check out repository
@@ -22,30 +25,74 @@ jobs:
2225
with:
2326
dotnet-version: 8.0.x
2427

28+
- name: Set prerelease version
29+
id: version
30+
run: |
31+
# Use SemVer-compliant prerelease without leading zeros
32+
echo "package_version=6.0.0-prerelease.${{ github.run_number }}" >> "$GITHUB_OUTPUT"
33+
echo "Version set to 6.0.0-prerelease.${{ github.run_number }}"
34+
2535
- name: Restore
2636
run: dotnet restore LiteDB.sln
2737

28-
- name: Build
29-
run: dotnet build LiteDB.sln --configuration Release --no-restore
38+
- name: Test (with hang diagnostics)
39+
timeout-minutes: 8
40+
env:
41+
VSTEST_TESTHOST_HANG_DUMP_TYPE: full
42+
VSTEST_TESTHOST_HANG_DUMP_FOLDER: ${{ github.workspace }}/hangdumps
43+
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
44+
DOTNET_NOLOGO: 1
45+
run: >-
46+
dotnet test LiteDB.sln
47+
--configuration Release
48+
--verbosity normal
49+
--settings tests.ci.runsettings
50+
--logger "trx;LogFileName=TestResults.trx"
51+
--logger "console;verbosity=detailed"
52+
--blame-hang --blame-hang-timeout 00:02:00
53+
--diag "TestHost.diag.log;tracelevel=verbose"
54+
/p:DefineConstants=TESTING
55+
56+
- name: Upload test results
57+
uses: actions/upload-artifact@v4
58+
if: always()
59+
with:
60+
name: test-results
61+
path: "**/*TestResults*.trx"
62+
63+
- name: Upload hang dumps (if any)
64+
uses: actions/upload-artifact@v4
65+
if: always()
66+
with:
67+
name: hangdumps
68+
path: |
69+
hangdumps
70+
**/TestResults/**/*.dmp
71+
if-no-files-found: ignore
3072

31-
- name: Test
32-
timeout-minutes: 5
33-
run: dotnet test LiteDB.sln --configuration Release --no-build --verbosity normal --settings tests.runsettings --logger "trx;LogFileName=TestResults.trx" --logger "console;verbosity=detailed"
73+
- name: Build
74+
if: success()
75+
run: dotnet build LiteDB/LiteDB.csproj --configuration Release --no-restore -p:Version=${{ steps.version.outputs.package_version }} -p:PackageVersion=${{ steps.version.outputs.package_version }} -p:MinVerSkip=true
3476

3577
- name: Pack
36-
run: |
37-
dotnet pack LiteDB/LiteDB.csproj --configuration Release --no-build -o artifacts
78+
if: success()
79+
run: dotnet pack LiteDB/LiteDB.csproj --configuration Release --no-build -o artifacts -p:PackageVersion=${{ steps.version.outputs.package_version }} -p:Version=${{ steps.version.outputs.package_version }} -p:MinVerSkip=true
3880

39-
- name: Capture package version
40-
id: version
41-
run: |
42-
PACKAGE_PATH=$(ls artifacts/LiteDB.*.nupkg | head -n 1)
43-
PACKAGE_FILENAME=$(basename "$PACKAGE_PATH")
44-
PACKAGE_VERSION=${PACKAGE_FILENAME#LiteDB.}
45-
PACKAGE_VERSION=${PACKAGE_VERSION%.nupkg}
46-
echo "package_version=${PACKAGE_VERSION}" >> "$GITHUB_OUTPUT"
81+
- name: Publish GitHub prerelease
82+
if: success()
83+
uses: softprops/action-gh-release@v2
84+
with:
85+
tag_name: v${{ steps.version.outputs.package_version }}
86+
name: LiteDB ${{ steps.version.outputs.package_version }}
87+
generate_release_notes: true
88+
prerelease: true
89+
files: artifacts/*.nupkg
90+
target_commitish: ${{ github.sha }}
91+
env:
92+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
4793

4894
- name: Retrieve secrets from Bitwarden
95+
if: success()
4996
uses: bitwarden/sm-action@v2
5097
with:
5198
access_token: ${{ secrets.BW_ACCESS_TOKEN }}
@@ -54,16 +101,7 @@ jobs:
54101
265b2fb6-2cf0-4859-9bc8-b24c00ab4378 > NUGET_API_KEY
55102
56103
- name: Push package to NuGet
104+
if: success()
57105
run: |
58106
dotnet nuget push "artifacts/*.nupkg" --api-key "$NUGET_API_KEY" --source https://api.nuget.org/v3/index.json --skip-duplicate
59107
60-
- name: Publish GitHub prerelease
61-
uses: softprops/action-gh-release@v2
62-
with:
63-
tag_name: v${{ steps.version.outputs.package_version }}
64-
name: LiteDB ${{ steps.version.outputs.package_version }}
65-
generate_release_notes: true
66-
prerelease: true
67-
files: artifacts/*.nupkg
68-
env:
69-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

ConsoleApp1/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
{
2828
using (var db = new LiteEngine(settings))
2929
{
30-
#if DEBUG
30+
#if DEBUG || TESTING
3131
db.SimulateDiskWriteFail = (page) =>
3232
{
3333
var p = new BasePage(page);

LiteDB.Benchmarks/Benchmarks/Queries/QueryWithVectorSimilarity.cs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.IO;
44
using System.Linq;
55
using BenchmarkDotNet.Attributes;
6+
using LiteDB;
67
using LiteDB.Benchmarks.Models;
78
using LiteDB.Benchmarks.Models.Generators;
89

@@ -12,6 +13,7 @@ namespace LiteDB.Benchmarks.Benchmarks.Queries
1213
public class QueryWithVectorSimilarity : BenchmarkBase
1314
{
1415
private ILiteCollection<FileMetaBase> _fileMetaCollection;
16+
private ILiteCollection<FileMetaBase> _unindexedCollection;
1517
private float[] _queryVector;
1618

1719
[GlobalSetup]
@@ -20,12 +22,18 @@ public void GlobalSetup()
2022
File.Delete(DatabasePath);
2123

2224
DatabaseInstance = new LiteDatabase(ConnectionString());
23-
_fileMetaCollection = DatabaseInstance.GetCollection<FileMetaBase>();
25+
_fileMetaCollection = DatabaseInstance.GetCollection<FileMetaBase>("withIndex");
26+
_unindexedCollection = DatabaseInstance.GetCollection<FileMetaBase>("withoutIndex");
27+
2428
_fileMetaCollection.EnsureIndex(fileMeta => fileMeta.ShouldBeShown);
29+
_unindexedCollection.EnsureIndex(fileMeta => fileMeta.ShouldBeShown);
30+
_fileMetaCollection.EnsureIndex(fileMeta => fileMeta.Vectors, new VectorIndexOptions(128));
2531

2632
var rnd = new Random();
33+
var data = FileMetaGenerator<FileMetaBase>.GenerateList(DatasetSize);
2734

28-
_fileMetaCollection.Insert(FileMetaGenerator<FileMetaBase>.GenerateList(DatasetSize)); // executed once per each N value
35+
_fileMetaCollection.Insert(data); // executed once per each N value
36+
_unindexedCollection.Insert(data);
2937

3038
_queryVector = Enumerable.Range(0, 128).Select(_ => (float)rnd.NextDouble()).ToArray();
3139

@@ -34,6 +42,14 @@ public void GlobalSetup()
3442

3543
[Benchmark]
3644
public List<FileMetaBase> WhereNear_Filter()
45+
{
46+
return _unindexedCollection.Query()
47+
.WhereNear(x => x.Vectors, _queryVector, maxDistance: 0.5)
48+
.ToList();
49+
}
50+
51+
[Benchmark]
52+
public List<FileMetaBase> WhereNear_Filter_Indexed()
3753
{
3854
return _fileMetaCollection.Query()
3955
.WhereNear(x => x.Vectors, _queryVector, maxDistance: 0.5)
@@ -42,6 +58,14 @@ public List<FileMetaBase> WhereNear_Filter()
4258

4359
[Benchmark]
4460
public List<FileMetaBase> TopKNear_OrderLimit()
61+
{
62+
return _unindexedCollection.Query()
63+
.TopKNear(x => x.Vectors, _queryVector, k: 10)
64+
.ToList();
65+
}
66+
67+
[Benchmark]
68+
public List<FileMetaBase> TopKNear_OrderLimit_Indexed()
4569
{
4670
return _fileMetaCollection.Query()
4771
.TopKNear(x => x.Vectors, _queryVector, k: 10)

0 commit comments

Comments
 (0)