SemanticSearchPOC / adapters /repos /db /crud_deletion_integration_test.go
KevinStephenson
Adding in weaviate code
b110593
raw
history blame
7.28 kB
// _ _
// __ _____ __ ___ ___ __ _| |_ ___
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
// \ V V / __/ (_| |\ V /| | (_| | || __/
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
//
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
//
// CONTACT: [email protected]
//
//go:build integrationTest
// +build integrationTest
package db
import (
"context"
"testing"
"github.com/sirupsen/logrus"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/weaviate/weaviate/entities/additional"
"github.com/weaviate/weaviate/entities/dto"
"github.com/weaviate/weaviate/entities/filters"
"github.com/weaviate/weaviate/entities/models"
"github.com/weaviate/weaviate/entities/schema"
libschema "github.com/weaviate/weaviate/entities/schema"
)
func TestDeleteJourney(t *testing.T) {
dirName := t.TempDir()
logger := logrus.New()
schemaGetter := &fakeSchemaGetter{
schema: schema.Schema{Objects: &models.Schema{Classes: nil}},
shardState: singleShardState(),
}
repo, err := New(logger, Config{
MemtablesFlushIdleAfter: 60,
RootPath: dirName,
QueryMaximumResults: 10000,
MaxImportGoroutinesFactor: 1,
}, &fakeRemoteClient{}, &fakeNodeResolver{}, &fakeRemoteNodeClient{}, &fakeReplicationClient{}, nil)
require.Nil(t, err)
repo.SetSchemaGetter(schemaGetter)
require.Nil(t, repo.WaitForStartup(testCtx()))
defer repo.Shutdown(context.Background())
migrator := NewMigrator(repo, logger)
schema := libschema.Schema{
Objects: &models.Schema{
Classes: []*models.Class{updateTestClass()},
},
}
t.Run("add schema", func(t *testing.T) {
err := migrator.AddClass(context.Background(), updateTestClass(),
schemaGetter.CopyShardingState(updateTestClass().Class))
require.Nil(t, err)
})
schemaGetter.schema = schema
t.Run("import some objects", func(t *testing.T) {
for _, res := range updateTestData() {
err := repo.PutObject(context.Background(), res.Object(), res.Vector, nil)
require.Nil(t, err)
}
})
searchVector := []float32{0.1, 0.1, 0.1}
t.Run("verify vector search results are initially as expected",
func(t *testing.T) {
res, err := repo.VectorSearch(context.Background(), dto.GetParams{
ClassName: "UpdateTestClass",
SearchVector: searchVector,
Pagination: &filters.Pagination{
Limit: 100,
},
})
expectedOrder := []interface{}{
"element-0", "element-2", "element-3", "element-1",
}
require.Nil(t, err)
require.Len(t, res, 4)
assert.Equal(t, expectedOrder, extractPropValues(res, "name"))
})
searchInv := func(t *testing.T, op filters.Operator, value int) []interface{} {
res, err := repo.ObjectSearch(context.Background(), 0, 100,
&filters.LocalFilter{
Root: &filters.Clause{
Operator: op,
On: &filters.Path{
Class: "UpdateTestClass",
Property: libschema.PropertyName("intProp"),
},
Value: &filters.Value{
Type: libschema.DataTypeInt,
Value: value,
},
},
}, nil, additional.Properties{}, "")
require.Nil(t, err)
return extractPropValues(res, "name")
}
t.Run("verify invert index results are initially as expected",
func(t *testing.T) {
expectedOrder := []interface{}{
"element-0", "element-1", "element-2", "element-3",
}
assert.Equal(t, expectedOrder, searchInv(t, filters.OperatorGreaterThanEqual, 0))
expectedOrder = []interface{}{"element-0"}
assert.Equal(t, expectedOrder, searchInv(t, filters.OperatorEqual, 0))
expectedOrder = []interface{}{"element-1"}
assert.Equal(t, expectedOrder, searchInv(t, filters.OperatorEqual, 10))
expectedOrder = []interface{}{"element-2"}
assert.Equal(t, expectedOrder, searchInv(t, filters.OperatorEqual, 20))
expectedOrder = []interface{}{"element-3"}
assert.Equal(t, expectedOrder, searchInv(t, filters.OperatorEqual, 30))
})
t.Run("delete element-0",
func(t *testing.T) {
id := updateTestData()[0].ID
err := repo.DeleteObject(context.Background(), "UpdateTestClass", id, nil, "")
require.Nil(t, err)
})
t.Run("verify new vector search results are as expected", func(t *testing.T) {
res, err := repo.VectorSearch(context.Background(), dto.GetParams{
ClassName: "UpdateTestClass",
SearchVector: searchVector,
Pagination: &filters.Pagination{
Limit: 100,
},
})
expectedOrder := []interface{}{
"element-2", "element-3", "element-1",
}
require.Nil(t, err)
require.Len(t, res, 3)
assert.Equal(t, expectedOrder, extractPropValues(res, "name"))
})
t.Run("verify invert results still work properly", func(t *testing.T) {
expectedOrder := []interface{}{
"element-1", "element-2", "element-3",
}
assert.Equal(t, expectedOrder, searchInv(t, filters.OperatorGreaterThanEqual, 0))
expectedOrder = []interface{}{"element-1"}
assert.Equal(t, expectedOrder, searchInv(t, filters.OperatorEqual, 10))
expectedOrder = []interface{}{"element-2"}
assert.Equal(t, expectedOrder, searchInv(t, filters.OperatorEqual, 20))
expectedOrder = []interface{}{"element-3"}
assert.Equal(t, expectedOrder, searchInv(t, filters.OperatorEqual, 30))
})
t.Run("delete element-1",
func(t *testing.T) {
id := updateTestData()[1].ID
err := repo.DeleteObject(context.Background(), "UpdateTestClass", id, nil, "")
require.Nil(t, err)
})
t.Run("verify new vector search results are as expected", func(t *testing.T) {
res, err := repo.VectorSearch(context.Background(), dto.GetParams{
ClassName: "UpdateTestClass",
SearchVector: searchVector,
Pagination: &filters.Pagination{
Limit: 100,
},
})
expectedOrder := []interface{}{
"element-2", "element-3",
}
require.Nil(t, err)
require.Len(t, res, 2)
assert.Equal(t, expectedOrder, extractPropValues(res, "name"))
})
t.Run("verify invert results have been updated correctly", func(t *testing.T) {
expectedOrder := []interface{}{
"element-2", "element-3",
}
assert.Equal(t, expectedOrder, searchInv(t, filters.OperatorGreaterThanEqual, 0))
expectedOrder = []interface{}{"element-2"}
assert.Equal(t, expectedOrder, searchInv(t, filters.OperatorEqual, 20))
expectedOrder = []interface{}{"element-3"}
assert.Equal(t, expectedOrder, searchInv(t, filters.OperatorEqual, 30))
})
t.Run("delete the index", func(t *testing.T) {
res, err := repo.VectorSearch(context.Background(), dto.GetParams{
ClassName: "UpdateTestClass",
SearchVector: searchVector,
Pagination: &filters.Pagination{
Limit: 100,
},
})
expectedOrder := []interface{}{
"element-2", "element-3",
}
require.Nil(t, err)
require.Len(t, res, 2)
assert.Equal(t, expectedOrder, extractPropValues(res, "name"))
id := updateTestData()[2].ID
err = repo.DeleteObject(context.Background(), "UpdateTestClass", id, nil, "")
require.Nil(t, err)
index := repo.GetIndex("UpdateTestClass")
require.NotNil(t, index)
err = repo.DeleteIndex("UpdateTestClass")
assert.Nil(t, err)
})
}