@@ -10,7 +10,7 @@ import (
1010 "strings"
1111)
1212
13- const levenshtein = 0.8
13+ const levenshtein = 0.85
1414
1515//CreateName create new name on database of type NameType
1616func CreateName (c * gin.Context ) {
@@ -94,28 +94,29 @@ func SearchSimilarNames(c *gin.Context) {
9494 database .Db .Find (& names )
9595
9696 mtf := metaphone .Pack (name )
97- var similarNames []string
97+ var similarNames []models. NameVar
9898 for _ , n := range names {
9999 if metaphone .IsMetaphoneSimilar (mtf , n .Metaphone ) {
100- if metaphone .SimilarityBetweenWords (strings .ToLower (name ), strings .ToLower (n .Name )) >= levenshtein {
101- similarNames = append (similarNames , n .Name )
100+ smlt := metaphone .SimilarityBetweenWords (strings .ToLower (name ), strings .ToLower (n .Name ))
101+ if smlt >= levenshtein {
102+ similarNames = append (similarNames , models.NameVar {Name : n .Name , Levenshtein : smlt })
102103 varWords := strings .Split (n .NameVariations , "|" )
103104 for _ , vw := range varWords {
104105 if vw != "" {
105- similarNames = append (similarNames , strings . TrimSpace ( vw ) )
106+ similarNames = append (similarNames , models. NameVar { Name : vw , Levenshtein : smlt } )
106107 }
107108 }
108109 }
110+
109111 if len (similarNames ) == 0 {
110- similarNames = append (similarNames , n .Name )
112+ similarNames = append (similarNames , models. NameVar { Name : n .Name , Levenshtein : smlt } )
111113 varWords := strings .Split (n .NameVariations , "|" )
112114 for _ , vw := range varWords {
113115 if vw != "" {
114- similarNames = append (similarNames , strings . TrimSpace ( vw ) )
116+ similarNames = append (similarNames , models. NameVar { Name : vw , Levenshtein : smlt } )
115117 }
116118 }
117119 }
118- sort .Strings (similarNames )
119120 }
120121 }
121122
@@ -124,10 +125,34 @@ func SearchSimilarNames(c *gin.Context) {
124125 return
125126 }
126127
128+ nameV := orderByLevenshtein (similarNames )
129+
127130 c .JSON (200 , gin.H {
128131 "Name" : strings .ToUpper (name ),
129132 "metaphone" : mtf ,
130- "nameVariations" : similarNames ,
133+ "nameVariations" : nameV ,
131134 })
132135
133136}
137+
138+ //orderByLevenshtein used to sort an array by Levenshtein
139+ func orderByLevenshtein (arr []models.NameVar ) []string {
140+ // creates copy of original array
141+ sortedArr := make ([]models.NameVar , len (arr ))
142+ copy (sortedArr , arr )
143+
144+ // compilation func
145+ cmp := func (i , j int ) bool {
146+ return sortedArr [i ].Levenshtein > sortedArr [j ].Levenshtein
147+ }
148+
149+ // order by func
150+ sort .Slice (sortedArr , cmp )
151+
152+ var retArry []string
153+ for _ , lv := range sortedArr {
154+ retArry = append (retArry , lv .Name )
155+ }
156+
157+ return retArry
158+ }
0 commit comments