github.com/altipla-consulting/ravendb-go-client@v0.1.3/tests/suggestions_test.go (about) 1 package tests 2 3 import ( 4 "testing" 5 6 ravendb "github.com/altipla-consulting/ravendb-go-client" 7 "github.com/stretchr/testify/assert" 8 ) 9 10 // avoids conflict with other User classes 11 type User4 struct { 12 ID string 13 Name string `json:"name"` 14 Email string `json:"email"` 15 } 16 17 func suggestionsSetup(t *testing.T, driver *RavenTestDriver, store *ravendb.DocumentStore) { 18 var err error 19 indexDefinition := ravendb.NewIndexDefinition() 20 indexDefinition.Name = "test" 21 indexDefinition.Maps = []string{"from doc in docs.User4s select new { doc.name }"} 22 indexFieldOptions := ravendb.NewIndexFieldOptions() 23 indexFieldOptions.Suggestions = true 24 indexDefinition.Fields["name"] = indexFieldOptions 25 26 err = store.Maintenance().Send(ravendb.NewPutIndexesOperation(indexDefinition)) 27 assert.NoError(t, err) 28 29 { 30 session := openSessionMust(t, store) 31 32 user1 := &User4{ 33 Name: "Ayende", 34 } 35 36 user2 := &User4{ 37 Name: "Oren", 38 } 39 40 user3 := &User4{ 41 Name: "John Steinbeck", 42 } 43 44 err = session.Store(user1) 45 assert.NoError(t, err) 46 err = session.Store(user2) 47 assert.NoError(t, err) 48 err = session.Store(user3) 49 assert.NoError(t, err) 50 err = session.SaveChanges() 51 assert.NoError(t, err) 52 53 session.Close() 54 } 55 56 err = driver.waitForIndexing(store, "", 0) 57 assert.NoError(t, err) 58 } 59 60 func suggestionsExactMatch(t *testing.T, driver *RavenTestDriver) { 61 store := driver.getDocumentStoreMust(t) 62 defer store.Close() 63 64 suggestionsSetup(t, driver, store) 65 { 66 session := openSessionMust(t, store) 67 68 options := ravendb.NewSuggestionOptions() 69 options.PageSize = 10 70 71 q := session.QueryIndex("test") 72 x := ravendb.NewSuggestionBuilder() 73 x = x.ByField("name", "Oren").WithOptions(options) 74 q2 := q.SuggestUsing(x.GetSuggestion()) 75 suggestionQueryResult, err := q2.Execute() 76 assert.NoError(t, err) 77 78 assert.Equal(t, len(suggestionQueryResult["name"].Suggestions), 0) 79 80 session.Close() 81 } 82 } 83 84 func suggestionsUsingLinq(t *testing.T, driver *RavenTestDriver) { 85 store := driver.getDocumentStoreMust(t) 86 defer store.Close() 87 88 suggestionsSetup(t, driver, store) 89 { 90 s := openSessionMust(t, store) 91 92 q := s.QueryIndex("test") 93 x := ravendb.NewSuggestionBuilder() 94 x = x.ByField("name", "Owen") 95 q2 := q.SuggestUsing(x.GetSuggestion()) 96 suggestionQueryResult, err := q2.Execute() 97 assert.NoError(t, err) 98 99 su := suggestionQueryResult["name"].Suggestions 100 assert.Equal(t, len(su), 1) 101 assert.Equal(t, su[0], "oren") 102 103 s.Close() 104 } 105 } 106 107 func suggestionsUsingLinqWithOptions(t *testing.T, driver *RavenTestDriver) { 108 store := driver.getDocumentStoreMust(t) 109 defer store.Close() 110 111 suggestionsSetup(t, driver, store) 112 { 113 s := openSessionMust(t, store) 114 115 options := ravendb.NewSuggestionOptions() 116 options.Accuracy = 0.4 117 q := s.QueryIndex("test") 118 x := ravendb.NewSuggestionBuilder() 119 x = x.ByField("name", "Owen").WithOptions(options) 120 q2 := q.SuggestUsing(x.GetSuggestion()) 121 suggestionQueryResult, err := q2.Execute() 122 assert.NoError(t, err) 123 124 su := suggestionQueryResult["name"].Suggestions 125 assert.Equal(t, len(su), 1) 126 assert.Equal(t, su[0], "oren") 127 128 s.Close() 129 } 130 } 131 132 func suggestionsUsingLinqMultipleWords(t *testing.T, driver *RavenTestDriver) { 133 store := driver.getDocumentStoreMust(t) 134 defer store.Close() 135 136 suggestionsSetup(t, driver, store) 137 { 138 s := openSessionMust(t, store) 139 140 options := ravendb.NewSuggestionOptions() 141 options.Accuracy = 0.4 142 options.Distance = ravendb.StringDistanceLevenshtein 143 144 q := s.QueryIndex("test") 145 x := ravendb.NewSuggestionBuilder() 146 x = x.ByField("name", "John Steinback").WithOptions(options) 147 q2 := q.SuggestUsing(x.GetSuggestion()) 148 suggestionQueryResult, err := q2.Execute() 149 assert.NoError(t, err) 150 151 su := suggestionQueryResult["name"].Suggestions 152 assert.Equal(t, len(su), 1) 153 assert.Equal(t, su[0], "john steinbeck") 154 155 s.Close() 156 } 157 } 158 159 func suggestionsWithTypo(t *testing.T, driver *RavenTestDriver) { 160 store := driver.getDocumentStoreMust(t) 161 defer store.Close() 162 163 suggestionsSetup(t, driver, store) 164 { 165 s := openSessionMust(t, store) 166 167 options := ravendb.NewSuggestionOptions() 168 options.Accuracy = 0.2 169 options.PageSize = 10 170 options.Distance = ravendb.StringDistanceLevenshtein 171 172 q := s.QueryIndex("test") 173 x := ravendb.NewSuggestionBuilder() 174 x = x.ByField("name", "Oern").WithOptions(options) 175 q2 := q.SuggestUsing(x.GetSuggestion()) 176 suggestionQueryResult, err := q2.Execute() 177 assert.NoError(t, err) 178 179 su := suggestionQueryResult["name"].Suggestions 180 assert.Equal(t, len(su), 1) 181 assert.Equal(t, su[0], "oren") 182 183 s.Close() 184 } 185 } 186 187 func NewUsers4ByName() *ravendb.IndexCreationTask { 188 res := ravendb.NewIndexCreationTask("NewUsers_ByName") 189 res.Map = "from u in docs.User4s select new { u.name }" 190 191 res.Index("name", ravendb.FieldIndexingSearch) 192 193 res.IndexSuggestions = append(res.IndexSuggestions, "name") 194 195 res.Store("name", ravendb.FieldStorageYes) 196 197 return res 198 } 199 200 func suggestionsCanGetSuggestions(t *testing.T, driver *RavenTestDriver) { 201 var err error 202 store := driver.getDocumentStoreMust(t) 203 defer store.Close() 204 205 index := NewUsers4ByName() 206 err = index.Execute(store, nil, "") 207 assert.NoError(t, err) 208 209 { 210 s := openSessionMust(t, store) 211 212 user1 := &User4{ 213 Name: "John Smith", 214 } 215 err = s.StoreWithID(user1, "users/1") 216 assert.NoError(t, err) 217 218 user2 := &User4{ 219 Name: "Jack Johnson", 220 } 221 err = s.StoreWithID(user2, "users/2") 222 assert.NoError(t, err) 223 224 user3 := &User4{ 225 Name: "Robery Jones", 226 } 227 err = s.StoreWithID(user3, "users/3") 228 assert.NoError(t, err) 229 230 user4 := &User4{ 231 Name: "David Jones", 232 } 233 err = s.StoreWithID(user4, "users/4") 234 assert.NoError(t, err) 235 236 err = s.SaveChanges() 237 assert.NoError(t, err) 238 239 s.Close() 240 } 241 242 err = driver.waitForIndexing(store, "", 0) 243 assert.NoError(t, err) 244 245 { 246 session := openSessionMust(t, store) 247 248 options := ravendb.NewSuggestionOptions() 249 options.Accuracy = 0.4 250 options.PageSize = 5 251 options.Distance = ravendb.StringDistanceJaroWinkler 252 options.SortMode = ravendb.SuggestionSortModePopularity 253 254 q := session.QueryIndex(index.IndexName) 255 x := ravendb.NewSuggestionBuilder() 256 x = x.ByField("name", "johne", "davi").WithOptions(options) 257 q2 := q.SuggestUsing(x.GetSuggestion()) 258 suggestionQueryResult, err := q2.Execute() 259 assert.NoError(t, err) 260 261 su := suggestionQueryResult["name"].Suggestions 262 assert.Equal(t, len(su), 5) 263 ok := stringArrayContainsSequence(su, []string{"john", "jones", "johnson", "david", "jack"}) 264 assert.True(t, ok) 265 266 session.Close() 267 } 268 } 269 270 func TestSuggestions(t *testing.T) { 271 driver := createTestDriver(t) 272 destroy := func() { destroyDriver(t, driver) } 273 defer recoverTest(t, destroy) 274 275 // matches the order of Java tests 276 suggestionsCanGetSuggestions(t, driver) 277 suggestionsUsingLinqMultipleWords(t, driver) 278 suggestionsWithTypo(t, driver) 279 suggestionsUsingLinq(t, driver) 280 suggestionsUsingLinqWithOptions(t, driver) 281 suggestionsExactMatch(t, driver) 282 }