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
|
// Add a new entry to the indexer
|
||||||
func (i Indexer) Add(t interface{}) error {
|
func (i Indexer) Add(t interface{}) error {
|
||||||
typeName := getTypeFQN(t)
|
typeName := getTypeFQN(t)
|
||||||
|
if fields, ok := i.indices[typeName]; ok {
|
||||||
fields, ok := i.indices[typeName]
|
|
||||||
if ok {
|
|
||||||
for _, indices := range fields.indicesByField {
|
for _, indices := range fields.indicesByField {
|
||||||
for _, idx := range indices {
|
for _, idx := range indices {
|
||||||
pkVal := valueOf(t, fields.pKFieldName)
|
pkVal := valueOf(t, fields.pKFieldName)
|
||||||
idxByVal := valueOf(t, idx.IndexBy())
|
idxByVal := valueOf(t, idx.IndexBy())
|
||||||
_, err := idx.Add(pkVal, idxByVal)
|
if _, err := idx.Add(pkVal, idxByVal); err != nil {
|
||||||
if err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
func (i Indexer) FindBy(t interface{}, field string, val string) ([]string, error) {
|
||||||
// Find a entry by type,field and value.
|
typeName := getTypeFQN(t)
|
||||||
// // Find a User type by email
|
resultPaths := make([]string, 0)
|
||||||
// man.Find("User", "Email", "foo@example.com")
|
if fields, ok := i.indices[typeName]; ok {
|
||||||
func (i Indexer) Find(typeName, key, value string) (pk string, err error) {
|
for _, idx := range fields.indicesByField[field] {
|
||||||
var res = []string{}
|
res, err := idx.Lookup(val)
|
||||||
if indices, ok := i.indices[typeName][key]; ok {
|
if err != nil {
|
||||||
for _, idx := range indices {
|
if IsNotFoundErr(err) {
|
||||||
if res, err = idx.Lookup(value); IsNotFoundErr(err) {
|
continue
|
||||||
continue
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
resultPaths = append(resultPaths, res...)
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(res) == 0 {
|
result := make([]string, 0, len(resultPaths))
|
||||||
return "", err
|
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 {
|
func (i Indexer) Delete(typeName, pk string) error {
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestIndexer_Add(t *testing.T) {
|
func TestIndexer_AddWithUniqueIndex(t *testing.T) {
|
||||||
dataDir := writeIndexTestData(t, testData, "Id")
|
dataDir := writeIndexTestData(t, testData, "Id")
|
||||||
indexer := NewIndex(&Config{
|
indexer := NewIndex(&Config{
|
||||||
DataDir: dataDir,
|
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) {
|
func TestManagerQueryMultipleIndices(t *testing.T) {
|
||||||
dataDir := writeIndexTestData(t, testData, "Id")
|
dataDir := writeIndexTestData(t, testData, "Id")
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ func (m indexMap) addIndex(typeName string, pkName string, idx IndexType) {
|
|||||||
m[typeName] = typeMapping{
|
m[typeName] = typeMapping{
|
||||||
pKFieldName: pkName,
|
pKFieldName: pkName,
|
||||||
indicesByField: map[string][]IndexType{
|
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)
|
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) {
|
func (idx Unique) Lookup(v string) (resultPath []string, err error) {
|
||||||
searchPath := path.Join(idx.indexRootDir, v)
|
searchPath := path.Join(idx.indexRootDir, v)
|
||||||
if err = isValidSymlink(searchPath); err != nil {
|
if err = isValidSymlink(searchPath); err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user