From a8f7d5d5f717fcbf96d43028f3c5d8381b34e7c5 Mon Sep 17 00:00:00 2001 From: Ilja Neumann Date: Thu, 1 Oct 2020 15:11:35 +0200 Subject: [PATCH] FindBy + tests --- accounts/pkg/indexer/indexer.go | 48 +++++++++++++--------------- accounts/pkg/indexer/indexer_test.go | 47 ++++++++++++++++++++++++++- accounts/pkg/indexer/map.go | 2 +- accounts/pkg/indexer/unique.go | 2 ++ 4 files changed, 71 insertions(+), 28 deletions(-) diff --git a/accounts/pkg/indexer/indexer.go b/accounts/pkg/indexer/indexer.go index 020a3d7d3f..67abb2bdfd 100644 --- a/accounts/pkg/indexer/indexer.go +++ b/accounts/pkg/indexer/indexer.go @@ -64,54 +64,50 @@ func (i Indexer) AddNonUniqueIndex(t interface{}, indexBy, pkName, entityDirName // Add a new entry to the indexer func (i Indexer) Add(t interface{}) error { typeName := getTypeFQN(t) - - fields, ok := i.indices[typeName] - if ok { + if fields, ok := i.indices[typeName]; ok { for _, indices := range fields.indicesByField { for _, idx := range indices { pkVal := valueOf(t, fields.pKFieldName) idxByVal := valueOf(t, idx.IndexBy()) - _, err := idx.Add(pkVal, idxByVal) - if err != nil { + if _, err := idx.Add(pkVal, idxByVal); err != nil { return err } } - } - } return nil - } -/* -// Find a entry by type,field and value. -// // Find a User type by email -// man.Find("User", "Email", "foo@example.com") -func (i Indexer) Find(typeName, key, value string) (pk string, err error) { - var res = []string{} - if indices, ok := i.indices[typeName][key]; ok { - for _, idx := range indices { - if res, err = idx.Lookup(value); IsNotFoundErr(err) { - continue +func (i Indexer) FindBy(t interface{}, field string, val string) ([]string, error) { + typeName := getTypeFQN(t) + resultPaths := make([]string, 0) + if fields, ok := i.indices[typeName]; ok { + for _, idx := range fields.indicesByField[field] { + res, err := idx.Lookup(val) + if err != nil { + if IsNotFoundErr(err) { + continue + } + + if err != nil { + return nil, err + } } - if err != nil { - return - } + resultPaths = append(resultPaths, res...) + } } - if len(res) == 0 { - return "", err + result := make([]string, 0, len(resultPaths)) + for _, v := range resultPaths { + result = append(result, path.Base(v)) } - return path.Base(res[0]), err + return result, nil } -*/ func (i Indexer) Delete(typeName, pk string) error { - return nil } diff --git a/accounts/pkg/indexer/indexer_test.go b/accounts/pkg/indexer/indexer_test.go index b9f3e3e859..f2d643f1be 100644 --- a/accounts/pkg/indexer/indexer_test.go +++ b/accounts/pkg/indexer/indexer_test.go @@ -6,7 +6,7 @@ import ( "testing" ) -func TestIndexer_Add(t *testing.T) { +func TestIndexer_AddWithUniqueIndex(t *testing.T) { dataDir := writeIndexTestData(t, testData, "Id") indexer := NewIndex(&Config{ DataDir: dataDir, @@ -22,6 +22,51 @@ func TestIndexer_Add(t *testing.T) { } +func TestIndexer_FindByWithUniqueIndex(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") + + u := &User{Id: "abcdefg-123", UserName: "mikey", Email: "mikey@example.com"} + err := indexer.Add(u) + assert.NoError(t, err) + + res, err := indexer.FindBy(User{}, "UserName", "mikey") + assert.NoError(t, err) + t.Log(res) +} + +func TestIndexer_AddWithNonUniqueIndex(t *testing.T) { + dataDir := writeIndexTestData(t, testData, "Id") + indexer := NewIndex(&Config{ + DataDir: dataDir, + IndexRootDirName: "index.disk", + Log: zerolog.Logger{}, + }) + + indexer.AddNonUniqueIndex(&TestPet{}, "Kind", "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) + + res, err := indexer.FindBy(TestPet{}, "Kind", "Hog") + assert.NoError(t, err) + + t.Log(res) + +} + /* func TestManagerQueryMultipleIndices(t *testing.T) { dataDir := writeIndexTestData(t, testData, "Id") diff --git a/accounts/pkg/indexer/map.go b/accounts/pkg/indexer/map.go index 024bb62cb6..654edd3926 100644 --- a/accounts/pkg/indexer/map.go +++ b/accounts/pkg/indexer/map.go @@ -19,7 +19,7 @@ func (m indexMap) addIndex(typeName string, pkName string, idx IndexType) { m[typeName] = typeMapping{ pKFieldName: pkName, indicesByField: map[string][]IndexType{ - pkName: {idx}, + idx.IndexBy(): {idx}, }, } } diff --git a/accounts/pkg/indexer/unique.go b/accounts/pkg/indexer/unique.go index baaba43882..99e8e8a4c9 100644 --- a/accounts/pkg/indexer/unique.go +++ b/accounts/pkg/indexer/unique.go @@ -81,6 +81,8 @@ func (idx Unique) Remove(id string, v string) (err error) { return os.Remove(searchPath) } +// unique.github.com.owncloud.ocis.accounts.pkg.indexer.User.UserName +// unique.github.com.owncloud.ocis.accounts.pkg.indexer.User.UserName/UserName func (idx Unique) Lookup(v string) (resultPath []string, err error) { searchPath := path.Join(idx.indexRootDir, v) if err = isValidSymlink(searchPath); err != nil {