public async Task GlobalSetup()
        {
            _path = Guid.NewGuid().ToString();

            var plain = await PlainIndex();

            _lmdb = new LmdbIndex(_path);

            foreach (var field in plain.Fields)
            {
                _lmdb.AddField(field);
            }

            foreach (var(k, v) in plain.FieldVectors)
            {
                _lmdb.AddFieldVector(k, v);
            }

            foreach (var(k, v) in plain.InvertedIndex)
            {
                _lmdb.AddInvertedIndexEntry(k, v);
            }

            Index = new DelegatedIndex(_lmdb, plain.Pipeline);
        }
        public void Can_persist_inverted_index_entries()
        {
            using var lmdb = new LmdbIndex(_tempDir.NewDirectory());

            var builder = new Builder();

            builder.AddField("title");
            builder.Add(new Document
            {
                { "id", "id" },
                { "title", "test" },
                { "body", "missing" }
            }).ConfigureAwait(false).GetAwaiter().GetResult();
            Index index = builder.Build();

            var firstKey = index.InvertedIndex.Keys.FirstOrDefault() ?? throw new InvalidOperationException();

            Assert.NotNull(firstKey);

            var added = lmdb.AddInvertedIndexEntry(firstKey, index.InvertedIndex[firstKey], CancellationToken.None);

            Assert.True(added);

            var getInvertedIndexEntry = lmdb.GetInvertedIndexEntryByKey(firstKey);

            Assert.NotNull(getInvertedIndexEntry);

            var tokenSet = lmdb.IntersectTokenSets(index.TokenSet);

            Assert.Single(tokenSet.Edges);
        }
        private DelegatedIndex CopyIndex(Lunr.Index index)
        {
            var path = _tempDir.NewDirectory();

            var lmdb = new LmdbIndex(path);

            foreach (var field in index.Fields)
            {
                Assert.True(lmdb.AddField(field));
            }

            foreach (var(k, v) in index.FieldVectors)
            {
                Assert.True(lmdb.AddFieldVector(k, v));
            }

            foreach (var(k, v) in index.InvertedIndex)
            {
                Assert.True(lmdb.AddInvertedIndexEntry(k, v));
            }

            var idx = new DelegatedIndex(lmdb, index.Pipeline);

            return(idx);
        }
        public void Can_persist_vectors()
        {
            const string key = "Key";

            using var index = new LmdbIndex(_tempDir.NewDirectory());

            Vector vector = VectorFrom(4, 5, 6);

            Assert.Equal(Math.Sqrt(77), vector.Magnitude);

            var addedVector = index.AddFieldVector(key, vector, CancellationToken.None);

            Assert.True(addedVector);

            var getByKey = index.GetFieldVectorByKey(key);

            Assert.NotNull(getByKey);
            Assert.Equal(Math.Sqrt(77), getByKey?.Magnitude);

            var getKeys = index.GetFieldVectorKeys().ToList();

            Assert.Single(getKeys);
            Assert.Equal(getKeys[0], key);

            var removedVector = index.RemoveFieldVector(key, CancellationToken.None);

            Assert.True(removedVector);

            var noVector = index.GetFieldVectorByKey(key);

            Assert.Null(noVector);

            var noVectorKeys = index.GetFieldVectorKeys(CancellationToken.None);

            Assert.Empty(noVectorKeys);
        }
        public void Can_persist_fields()
        {
            const string field = "Field";

            using var index = new LmdbIndex(_tempDir.NewDirectory());

            var addedField = index.AddField(field);

            Assert.True(addedField);

            var fields = index.GetFields();

            Assert.NotNull(fields);
            Assert.Equal(field, fields.Single());

            var removedField = index.RemoveField(field);

            Assert.True(removedField);

            var noFields = index.GetFields();

            Assert.NotNull(fields);
            Assert.Empty(noFields);
        }