FindBy + tests
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user