From af15347b7fbac9559be42284ae83f7ecc55329a3 Mon Sep 17 00:00:00 2001 From: Radu Ioan Fericean Date: Tue, 14 Jul 2015 23:38:23 +0300 Subject: [PATCH] added user search ponders --- console/users.go | 2 +- engine/users.go | 54 +++++++++++++++++++++++++------ engine/users_test.go | 77 +++++++++++++++++++++++++++----------------- 3 files changed, 93 insertions(+), 40 deletions(-) diff --git a/console/users.go b/console/users.go index 28da13968..e343297cd 100644 --- a/console/users.go +++ b/console/users.go @@ -58,6 +58,6 @@ func (self *CmdGetUsers) PostprocessRpcParams() error { } func (self *CmdGetUsers) RpcResult() interface{} { - s := []*engine.UserProfile{} + s := engine.UserProfiles{} return &s } diff --git a/engine/users.go b/engine/users.go index 4ec51a5a5..8684b9620 100644 --- a/engine/users.go +++ b/engine/users.go @@ -1,6 +1,7 @@ package engine import ( + "sort" "strings" "github.com/cgrates/cgrates/utils" @@ -11,6 +12,25 @@ type UserProfile struct { Tenant string UserName string Profile map[string]string + ponder int +} + +type UserProfiles []*UserProfile + +func (ups UserProfiles) Len() int { + return len(ups) +} + +func (ups UserProfiles) Swap(i, j int) { + ups[i], ups[j] = ups[j], ups[i] +} + +func (ups UserProfiles) Less(j, i int) bool { // get higher ponder in front + return ups[i].ponder < ups[j].ponder +} + +func (ups UserProfiles) Sort() { + sort.Sort(ups) } func (ud *UserProfile) GetId() string { @@ -31,7 +51,7 @@ type UserService interface { SetUser(UserProfile, *string) error RemoveUser(UserProfile, *string) error UpdateUser(UserProfile, *string) error - GetUsers(UserProfile, *[]*UserProfile) error + GetUsers(UserProfile, *UserProfiles) error AddIndex([]string, *string) error GetIndexes(string, *map[string][]string) error } @@ -123,7 +143,7 @@ func (um *UserMap) UpdateUser(up UserProfile, reply *string) error { return nil } -func (um *UserMap) GetUsers(up UserProfile, results *[]*UserProfile) error { +func (um *UserMap) GetUsers(up UserProfile, results *UserProfiles) error { table := um.table // no index indexUnionKeys := make(map[string]bool) @@ -156,20 +176,34 @@ func (um *UserMap) GetUsers(up UserProfile, results *[]*UserProfile) error { } } - var candidates []*UserProfile + var candidates UserProfiles for key, values := range table { - if up.Tenant != "" && !strings.HasPrefix(key, up.Tenant+utils.CONCATENATED_KEY_SEP) { + ponder := 0 + tableUP := &UserProfile{ + Profile: values, + } + tableUP.SetId(key) + if up.Tenant != "" && tableUP.Tenant != "" && up.Tenant != tableUP.Tenant { continue } - if up.UserName != "" && !strings.HasSuffix(key, utils.CONCATENATED_KEY_SEP+up.UserName) { + if tableUP.Tenant != "" { + ponder += 1 + } + if up.UserName != "" && tableUP.UserName != "" && up.UserName != tableUP.UserName { continue } + if tableUP.UserName != "" { + ponder += 1 + } valid := true for k, v := range up.Profile { - if values[k] != v { + if tableUP.Profile[k] != "" && tableUP.Profile[k] != v { valid = false break } + if tableUP.Profile[k] != "" { + ponder += 1 + } } if !valid { continue @@ -177,11 +211,13 @@ func (um *UserMap) GetUsers(up UserProfile, results *[]*UserProfile) error { // all filters passed, add to candidates nup := &UserProfile{Profile: make(map[string]string)} nup.SetId(key) - for k, v := range values { + nup.ponder = ponder + for k, v := range tableUP.Profile { nup.Profile[k] = v } candidates = append(candidates, nup) } + candidates.Sort() *results = candidates return nil } @@ -307,7 +343,7 @@ func (ps *ProxyUserService) UpdateUser(ud UserProfile, reply *string) error { return ps.Client.Call("UsersV1.UpdateUser", ud, reply) } -func (ps *ProxyUserService) GetUsers(ud UserProfile, users *[]*UserProfile) error { +func (ps *ProxyUserService) GetUsers(ud UserProfile, users *UserProfiles) error { return ps.Client.Call("UsersV1.GetUsers", ud, users) } @@ -343,7 +379,7 @@ func LoadUserProfile(in interface{}) (interface{}, error) { //TODO: add extra fields - ups := make([]*UserProfile, 0) + ups := UserProfiles{} if err := userService.GetUsers(*up, &ups); err != nil { return nil, err } diff --git a/engine/users_test.go b/engine/users_test.go index c43b0b42b..b519803b9 100644 --- a/engine/users_test.go +++ b/engine/users_test.go @@ -149,9 +149,9 @@ func TestUsersGetFull(t *testing.T) { "t": "v", }, } - results := make([]*UserProfile, 0) + results := UserProfiles{} testMap.GetUsers(up, &results) - if len(results) != 1 { + if len(results) != 3 { t.Error("error getting users: ", results) } } @@ -164,9 +164,9 @@ func TestUsersGetTenant(t *testing.T) { "t": "v", }, } - results := make([]*UserProfile, 0) + results := UserProfiles{} testMap.GetUsers(up, &results) - if len(results) != 0 { + if len(results) != 1 { t.Error("error getting users: ", results) } } @@ -179,9 +179,9 @@ func TestUsersGetUserName(t *testing.T) { "t": "v", }, } - results := make([]*UserProfile, 0) + results := UserProfiles{} testMap.GetUsers(up, &results) - if len(results) != 0 { + if len(results) != 1 { t.Error("error getting users: ", results) } } @@ -194,9 +194,9 @@ func TestUsersGetNotFoundProfile(t *testing.T) { "o": "p", }, } - results := make([]*UserProfile, 0) + results := UserProfiles{} testMap.GetUsers(up, &results) - if len(results) != 0 { + if len(results) != 3 { t.Error("error getting users: ", results) } } @@ -208,9 +208,9 @@ func TestUsersGetMissingTenant(t *testing.T) { "t": "v", }, } - results := make([]*UserProfile, 0) + results := UserProfiles{} testMap.GetUsers(up, &results) - if len(results) != 2 { + if len(results) != 3 { t.Error("error getting users: ", results) } } @@ -222,9 +222,9 @@ func TestUsersGetMissingUserName(t *testing.T) { "t": "v", }, } - results := make([]*UserProfile, 0) + results := UserProfiles{} testMap.GetUsers(up, &results) - if len(results) != 2 { + if len(results) != 3 { t.Error("error getting users: ", results) } } @@ -235,7 +235,7 @@ func TestUsersGetMissingId(t *testing.T) { "t": "v", }, } - results := make([]*UserProfile, 0) + results := UserProfiles{} testMap.GetUsers(up, &results) if len(results) != 4 { t.Error("error getting users: ", results) @@ -249,13 +249,30 @@ func TestUsersGetMissingIdTwo(t *testing.T) { "x": "y", }, } - results := make([]*UserProfile, 0) + results := UserProfiles{} testMap.GetUsers(up, &results) - if len(results) != 1 { + if len(results) != 4 { t.Error("error getting users: ", results) } } +func TestUsersGetMissingIdTwoSort(t *testing.T) { + up := UserProfile{ + Profile: map[string]string{ + "t": "v", + "x": "y", + }, + } + results := UserProfiles{} + testMap.GetUsers(up, &results) + if len(results) != 4 { + t.Error("error getting users: ", results) + } + if results[0].GetId() != "test1:user1" { + t.Errorf("Error sorting profiles: %+v", results[0]) + } +} + func TestUsersAddIndex(t *testing.T) { var r string testMap.AddIndex([]string{"t"}, &r) @@ -298,9 +315,9 @@ func TestUsersGetFullindex(t *testing.T) { "t": "v", }, } - results := make([]*UserProfile, 0) + results := UserProfiles{} testMap.GetUsers(up, &results) - if len(results) != 1 { + if len(results) != 3 { t.Error("error getting users: ", results) } } @@ -316,9 +333,9 @@ func TestUsersGetTenantindex(t *testing.T) { "t": "v", }, } - results := make([]*UserProfile, 0) + results := UserProfiles{} testMap.GetUsers(up, &results) - if len(results) != 0 { + if len(results) != 1 { t.Error("error getting users: ", results) } } @@ -334,9 +351,9 @@ func TestUsersGetUserNameindex(t *testing.T) { "t": "v", }, } - results := make([]*UserProfile, 0) + results := UserProfiles{} testMap.GetUsers(up, &results) - if len(results) != 0 { + if len(results) != 1 { t.Error("error getting users: ", results) } } @@ -352,9 +369,9 @@ func TestUsersGetNotFoundProfileindex(t *testing.T) { "o": "p", }, } - results := make([]*UserProfile, 0) + results := UserProfiles{} testMap.GetUsers(up, &results) - if len(results) != 0 { + if len(results) != 3 { t.Error("error getting users: ", results) } } @@ -369,9 +386,9 @@ func TestUsersGetMissingTenantindex(t *testing.T) { "t": "v", }, } - results := make([]*UserProfile, 0) + results := UserProfiles{} testMap.GetUsers(up, &results) - if len(results) != 2 { + if len(results) != 3 { t.Error("error getting users: ", results) } } @@ -386,9 +403,9 @@ func TestUsersGetMissingUserNameindex(t *testing.T) { "t": "v", }, } - results := make([]*UserProfile, 0) + results := UserProfiles{} testMap.GetUsers(up, &results) - if len(results) != 2 { + if len(results) != 3 { t.Error("error getting users: ", results) } } @@ -402,7 +419,7 @@ func TestUsersGetMissingIdindex(t *testing.T) { "t": "v", }, } - results := make([]*UserProfile, 0) + results := UserProfiles{} testMap.GetUsers(up, &results) if len(results) != 4 { t.Error("error getting users: ", results) @@ -419,9 +436,9 @@ func TestUsersGetMissingIdTwoINdex(t *testing.T) { "x": "y", }, } - results := make([]*UserProfile, 0) + results := UserProfiles{} testMap.GetUsers(up, &results) - if len(results) != 1 { + if len(results) != 4 { t.Error("error getting users: ", results) } }