FindBy + tests

This commit is contained in:
Ilja Neumann
2020-10-14 18:03:52 +02:00
parent 36f8931621
commit a8f7d5d5f7
4 changed files with 71 additions and 28 deletions
+22 -26
View File
@@ -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
}
+46 -1
View File
@@ -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")
+1 -1
View File
@@ -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},
},
}
}
+2
View File
@@ -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 {