Skip to content

Commit ea7d14e

Browse files
committed
implement orderByLevenshtein to better use of json
1 parent 9a31d22 commit ea7d14e

File tree

2 files changed

+39
-9
lines changed

2 files changed

+39
-9
lines changed

controllers/controller.go

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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
1616
func 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+
}

models/nameType.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,8 @@ type NameType struct {
1010
Metaphone string `json:"Metaphone,omitempty"`
1111
NameVariations string `json:"NameVariations,omitempty"`
1212
}
13+
14+
type NameVar struct {
15+
Name string
16+
Levenshtein float32
17+
}

0 commit comments

Comments
 (0)