From 2a77e2b691c0e4efee9c423e613e23bf29918529 Mon Sep 17 00:00:00 2001 From: Ilja Neumann Date: Thu, 1 Oct 2020 16:24:40 +0200 Subject: [PATCH] Add Update + tests to indexer --- accounts/pkg/indexer/indexer.go | 14 +++++++ accounts/pkg/indexer/indexer_test.go | 52 +++++++++++++++++++++++++ accounts/pkg/indexer/non_unique_test.go | 4 +- accounts/pkg/indexer/unique_test.go | 6 +-- 4 files changed, 71 insertions(+), 5 deletions(-) diff --git a/accounts/pkg/indexer/indexer.go b/accounts/pkg/indexer/indexer.go index 54b48459f..d75e7662c 100644 --- a/accounts/pkg/indexer/indexer.go +++ b/accounts/pkg/indexer/indexer.go @@ -154,3 +154,17 @@ func (i Indexer) FindByPartial(t interface{}, field string, pattern string) ([]s return result, nil } + +func (i Indexer) Update(t interface{}, field, oldVal, newVal string) error { + typeName := getTypeFQN(t) + if fields, ok := i.indices[typeName]; ok { + for _, idx := range fields.indicesByField[field] { + pkVal := valueOf(t, fields.pKFieldName) + if err := idx.Update(pkVal, oldVal, newVal); err != nil { + return err + } + } + } + + return nil +} diff --git a/accounts/pkg/indexer/indexer_test.go b/accounts/pkg/indexer/indexer_test.go index 3b35a8a93..060f07b23 100644 --- a/accounts/pkg/indexer/indexer_test.go +++ b/accounts/pkg/indexer/indexer_test.go @@ -114,6 +114,58 @@ func TestIndexer_SearchWithNonUniqueIndex(t *testing.T) { t.Log(res) } +func TestIndexer_UpdateWithUniqueIndex(t *testing.T) { + dataDir := writeIndexTestData(t, testData, "Id") + indexer := NewIndex(&Config{ + DataDir: dataDir, + IndexRootDirName: "index.disk", + Log: zerolog.Logger{}, + }) + + indexer.AddUniqueIndex(&User{}, "UserName", "Id", "users") + + user1 := &User{Id: "abcdefg-123", UserName: "mikey", Email: "mikey@example.com"} + user2 := &User{Id: "hijklmn-456", UserName: "frank", Email: "frank@example.com"} + + err := indexer.Add(user1) + assert.NoError(t, err) + + err = indexer.Add(user2) + assert.NoError(t, err) + + // Update to non existing value + err = indexer.Update(user2, "UserName", "frank", "jane") + assert.NoError(t, err) + + // Update to non existing value + err = indexer.Update(user2, "UserName", "mikey", "jane") + assert.Error(t, err) + assert.IsType(t, &alreadyExistsErr{}, err) +} + +func TestIndexer_UpdateWithNonUniqueIndex(t *testing.T) { + dataDir := writeIndexTestData(t, testData, "Id") + indexer := NewIndex(&Config{ + DataDir: dataDir, + IndexRootDirName: "index.disk", + Log: zerolog.Logger{}, + }) + + indexer.AddNonUniqueIndex(&TestPet{}, "Name", "Id", "pets") + + pet1 := TestPet{Id: "goefe-789", Kind: "Hog", Color: "Green", Name: "Dicky"} + pet2 := TestPet{Id: "xadaf-189", Kind: "Hog", Color: "Green", Name: "Ricky"} + + err := indexer.Add(pet1) + assert.NoError(t, err) + + err = indexer.Add(pet2) + assert.NoError(t, err) + + err = indexer.Update(pet2, "Name", "Ricky", "Jonny") + assert.NoError(t, err) +} + /* func TestManagerQueryMultipleIndices(t *testing.T) { dataDir := writeIndexTestData(t, testData, "Id") diff --git a/accounts/pkg/indexer/non_unique_test.go b/accounts/pkg/indexer/non_unique_test.go index b0abf6182..bacbea951 100644 --- a/accounts/pkg/indexer/non_unique_test.go +++ b/accounts/pkg/indexer/non_unique_test.go @@ -29,10 +29,10 @@ func TestNonUniqueIndexAdd(t *testing.T) { func TestNonUniqueIndexUpdate(t *testing.T) { sut, dataPath := getNonUniqueIdxSut(t) - err := sut.Update("goefe-789", "Green", "Black") + err := sut.Update("goefe-789", "", "Black") assert.NoError(t, err) - err = sut.Update("xadaf-189", "Green", "Black") + err = sut.Update("xadaf-189", "", "Black") assert.NoError(t, err) assert.DirExists(t, path.Join(dataPath, "index.disk/PetByColor/Black")) diff --git a/accounts/pkg/indexer/unique_test.go b/accounts/pkg/indexer/unique_test.go index f7e0ed6e0..7ad9bab40 100644 --- a/accounts/pkg/indexer/unique_test.go +++ b/accounts/pkg/indexer/unique_test.go @@ -54,16 +54,16 @@ func TestUniqueUpdate(t *testing.T) { uniq, dataDir := getUniqueIdxSut(t) t.Log("successful update") - err := uniq.Update("", "mikey@example.com", "mikey2@example.com") + err := uniq.Update("", "", "mikey2@example.com") assert.NoError(t, err) t.Log("failed update because already exists") - err = uniq.Update("", "frank@example.com", "mikey2@example.com") + err = uniq.Update("", "", "mikey2@example.com") assert.Error(t, err) assert.IsType(t, &alreadyExistsErr{}, err) t.Log("failed update because not found") - err = uniq.Update("", "notexist@example.com", "something2@example.com") + err = uniq.Update("", "", "something2@example.com") assert.Error(t, err) assert.IsType(t, ¬FoundErr{}, err)