github.com/ravendb/ravendb-go-client@v0.0.0-20240229102137-4474ee7aa0fa/tests/indexes_from_client_test.go (about) 1 package tests 2 3 import ( 4 "testing" 5 "time" 6 7 ravendb "github.com/ravendb/ravendb-go-client" 8 "github.com/stretchr/testify/assert" 9 ) 10 11 func indexesFromClientTestCanCreateIndexesUsingIndexCreation(t *testing.T, driver *RavenTestDriver) { 12 var err error 13 store := driver.getDocumentStoreMust(t) 14 defer store.Close() 15 16 indexes := []*ravendb.IndexCreationTask{NewUsers_ByName()} 17 err = store.ExecuteIndexes(indexes, "") 18 assert.NoError(t, err) 19 20 { 21 session := openSessionMust(t, store) 22 user1 := &User{} 23 user1.setName("Marcin") 24 err = session.StoreWithID(user1, "users/1") 25 assert.NoError(t, err) 26 err = session.SaveChanges() 27 assert.NoError(t, err) 28 29 session.Close() 30 } 31 32 err = driver.waitForIndexing(store, "", 0) 33 assert.NoError(t, err) 34 35 { 36 session := openSessionMust(t, store) 37 38 var users []*User 39 q := session.QueryIndex(indexes[0].IndexName) 40 err = q.GetResults(&users) 41 assert.NoError(t, err) 42 assert.Equal(t, 1, len(users)) 43 44 session.Close() 45 } 46 } 47 48 func indexesFromClientTestCanReset(t *testing.T, driver *RavenTestDriver) { 49 var err error 50 store := driver.getDocumentStoreMust(t) 51 defer store.Close() 52 53 { 54 session := openSessionMust(t, store) 55 user1 := &User{} 56 user1.setName("Marcin") 57 err = session.StoreWithID(user1, "users/1") 58 assert.NoError(t, err) 59 err = session.SaveChanges() 60 assert.NoError(t, err) 61 session.Close() 62 } 63 64 userIndex := NewUsersIndex() 65 err = store.ExecuteIndex(userIndex, "") 66 assert.NoError(t, err) 67 68 err = driver.waitForIndexing(store, store.GetDatabase(), 0) 69 assert.NoError(t, err) 70 71 command := ravendb.NewGetStatisticsCommand("") 72 err = store.GetRequestExecutor("").ExecuteCommand(command, nil) 73 assert.NoError(t, err) 74 statistics := command.Result 75 firstIndexingTime := statistics.Indexes[0].GetLastIndexingTime() 76 77 indexName := NewUsersIndex().IndexName 78 // now reset index 79 time.Sleep(time.Millisecond * 2) 80 { 81 op, err := ravendb.NewResetIndexOperation(indexName) 82 assert.NoError(t, err) 83 err = store.Maintenance().Send(op) 84 assert.NoError(t, err) 85 } 86 87 err = driver.waitForIndexing(store, store.GetDatabase(), 0) 88 assert.NoError(t, err) 89 90 command = ravendb.NewGetStatisticsCommand("") 91 err = store.GetRequestExecutor("").ExecuteCommand(command, nil) 92 assert.NoError(t, err) 93 statistics = command.Result 94 secondIndexingTime := statistics.GetLastIndexingTime() 95 assert.True(t, secondIndexingTime.Sub(firstIndexingTime) > 0) 96 } 97 98 func indexesFromClientTestCanExecuteManyIndexes(t *testing.T, driver *RavenTestDriver) { 99 var err error 100 store := driver.getDocumentStoreMust(t) 101 defer store.Close() 102 103 indexes := []*ravendb.IndexCreationTask{NewUsersIndex()} 104 err = store.ExecuteIndexes(indexes, "") 105 assert.NoError(t, err) 106 107 indexNamesOperation := ravendb.NewGetIndexNamesOperation(0, 10) 108 err = store.Maintenance().Send(indexNamesOperation) 109 assert.NoError(t, err) 110 indexNames := indexNamesOperation.Command.Result 111 assert.Equal(t, len(indexNames), 1) 112 } 113 114 func NewUsersIndex() *ravendb.IndexCreationTask { 115 res := ravendb.NewIndexCreationTask("UsersIndex") 116 res.Map = "from user in docs.users select new { user.name }" 117 return res 118 } 119 120 func indexesFromClientTestCanDelete(t *testing.T, driver *RavenTestDriver) { 121 var err error 122 store := driver.getDocumentStoreMust(t) 123 defer store.Close() 124 125 userIndex := NewUsersIndex() 126 err = store.ExecuteIndex(userIndex, "") 127 assert.NoError(t, err) 128 129 op := ravendb.NewDeleteIndexOperation(NewUsersIndex().IndexName) 130 err = store.Maintenance().Send(op) 131 assert.NoError(t, err) 132 133 command := ravendb.NewGetStatisticsCommand("") 134 err = store.GetRequestExecutor("").ExecuteCommand(command, nil) 135 assert.NoError(t, err) 136 statistics := command.Result 137 assert.Equal(t, len(statistics.Indexes), 0) 138 } 139 140 func indexesFromClientTestCanStopAndStart(t *testing.T, driver *RavenTestDriver) { 141 var err error 142 store := driver.getDocumentStoreMust(t) 143 defer store.Close() 144 145 err = NewUsers_ByName().Execute(store, nil, "") 146 assert.NoError(t, err) 147 148 { 149 op := ravendb.NewGetIndexingStatusOperation() 150 err = store.Maintenance().Send(op) 151 assert.NoError(t, err) 152 status := op.Command.Result 153 154 assert.Equal(t, status.Status, ravendb.IndexRunningStatusRunning) 155 assert.Equal(t, len(status.Indexes), 1) 156 assert.Equal(t, status.Indexes[0].Status, ravendb.IndexRunningStatusRunning) 157 } 158 159 { 160 op := ravendb.NewStopIndexingOperation() 161 err = store.Maintenance().Send(op) 162 assert.NoError(t, err) 163 164 { 165 op := ravendb.NewGetIndexingStatusOperation() 166 err = store.Maintenance().Send(op) 167 assert.NoError(t, err) 168 status := op.Command.Result 169 assert.Equal(t, status.Status, ravendb.IndexRunningStatusPaused) 170 assert.Equal(t, status.Indexes[0].Status, ravendb.IndexRunningStatusPaused) 171 } 172 } 173 174 indexName := "" 175 { 176 op := ravendb.NewStartIndexingOperation() 177 err = store.Maintenance().Send(op) 178 assert.NoError(t, err) 179 { 180 op := ravendb.NewGetIndexingStatusOperation() 181 err = store.Maintenance().Send(op) 182 assert.NoError(t, err) 183 status := op.Command.Result 184 indexName = status.Indexes[0].Name 185 186 assert.Equal(t, status.Status, ravendb.IndexRunningStatusRunning) 187 assert.Equal(t, len(status.Indexes), 1) 188 assert.Equal(t, status.Indexes[0].Status, ravendb.IndexRunningStatusRunning) 189 } 190 191 } 192 193 { 194 op, err := ravendb.NewStopIndexOperation(indexName) 195 assert.NoError(t, err) 196 err = store.Maintenance().Send(op) 197 assert.NoError(t, err) 198 { 199 op := ravendb.NewGetIndexingStatusOperation() 200 err = store.Maintenance().Send(op) 201 assert.NoError(t, err) 202 status := op.Command.Result 203 assert.Equal(t, status.Status, ravendb.IndexRunningStatusRunning) 204 assert.Equal(t, len(status.Indexes), 1) 205 assert.Equal(t, status.Indexes[0].Status, ravendb.IndexRunningStatusPaused) 206 } 207 } 208 } 209 210 func NewUsers_ByName() *ravendb.IndexCreationTask { 211 res := ravendb.NewIndexCreationTask("NewUsers_ByName") 212 res.Map = "from u in docs.Users select new { u.name }" 213 214 res.Index("name", ravendb.FieldIndexingSearch) 215 216 res.IndexSuggestions = append(res.IndexSuggestions, "name") 217 218 res.Store("name", ravendb.FieldStorageYes) 219 220 return res 221 } 222 223 func indexesFromClientTestSetLockModeAndSetPriority(t *testing.T, driver *RavenTestDriver) { 224 var err error 225 store := driver.getDocumentStoreMust(t) 226 defer store.Close() 227 228 usersByName := NewUsers_ByName() 229 err = store.ExecuteIndex(usersByName, "") 230 assert.NoError(t, err) 231 232 { 233 session := openSessionMust(t, store) 234 235 user1 := &User{} 236 user1.setName("Fitzchak") 237 err = session.Store(user1) 238 assert.NoError(t, err) 239 240 user2 := &User{} 241 user2.setName("Arek") 242 err = session.Store(user2) 243 assert.NoError(t, err) 244 245 err = session.SaveChanges() 246 assert.NoError(t, err) 247 248 session.Close() 249 } 250 251 { 252 session := openSessionMust(t, store) 253 254 var users []*User 255 q := session.QueryIndex(usersByName.IndexName) 256 q = q.WaitForNonStaleResults(0) 257 q = q.WhereEquals("name", "Arek") 258 err = q.GetResults(&users) 259 assert.NoError(t, err) 260 assert.Equal(t, len(users), 1) 261 } 262 263 op := ravendb.NewGetIndexesOperation(0, 128) 264 err = store.Maintenance().Send(op) 265 assert.NoError(t, err) 266 indexes := op.Command.Result 267 assert.Equal(t, len(indexes), 1) 268 269 index := indexes[0] 270 271 { 272 op := ravendb.NewGetIndexStatisticsOperation(index.Name) 273 err = store.Maintenance().Send(op) 274 assert.NoError(t, err) 275 stats := op.Command.Result 276 assert.Equal(t, stats.LockMode, ravendb.IndexLockModeUnlock) 277 assert.Equal(t, stats.Priority, ravendb.IndexPriorityNormal) 278 } 279 280 { 281 op, err := ravendb.NewSetIndexesLockOperation(index.Name, ravendb.IndexLockModeLockedIgnore) 282 assert.NoError(t, err) 283 err = store.Maintenance().Send(op) 284 assert.NoError(t, err) 285 } 286 287 { 288 op, err := ravendb.NewSetIndexesPriorityOperation(index.Name, ravendb.IndexPriorityLow) 289 assert.NoError(t, err) 290 err = store.Maintenance().Send(op) 291 assert.NoError(t, err) 292 } 293 { 294 op := ravendb.NewGetIndexStatisticsOperation(index.Name) 295 err = store.Maintenance().Send(op) 296 assert.NoError(t, err) 297 stats := op.Command.Result 298 assert.Equal(t, stats.LockMode, ravendb.IndexLockModeLockedIgnore) 299 assert.Equal(t, stats.Priority, ravendb.IndexPriorityLow) 300 } 301 } 302 303 func indexesFromClientTestGetTerms(t *testing.T, driver *RavenTestDriver) { 304 var err error 305 store := driver.getDocumentStoreMust(t) 306 defer store.Close() 307 308 { 309 session := openSessionMust(t, store) 310 311 user1 := &User{} 312 user1.setName("Fitzchak") 313 err = session.Store(user1) 314 assert.NoError(t, err) 315 316 user2 := &User{} 317 user2.setName("Arek") 318 err = session.Store(user2) 319 assert.NoError(t, err) 320 321 err = session.SaveChanges() 322 assert.NoError(t, err) 323 324 session.Close() 325 } 326 327 var indexName string 328 329 { 330 session := openSessionMust(t, store) 331 332 var stats *ravendb.QueryStatistics 333 var notUsed []*User 334 q := session.QueryCollectionForType(userType) 335 q = q.WaitForNonStaleResults(0) 336 q = q.Statistics(&stats) 337 q = q.WhereEquals("name", "Arek") 338 err = q.GetResults(¬Used) 339 assert.NoError(t, err) 340 341 indexName = stats.IndexName 342 343 session.Close() 344 } 345 346 op, err := ravendb.NewGetTermsOperation(indexName, "name", "", 128) 347 assert.NoError(t, err) 348 err = store.Maintenance().Send(op) 349 assert.NoError(t, err) 350 terms := op.Command.Result 351 assert.Equal(t, len(terms), 2) 352 assert.True(t, stringArrayContains(terms, "fitzchak")) 353 assert.True(t, stringArrayContains(terms, "arek")) 354 } 355 356 func indexesFromClientTestGetIndexNames(t *testing.T, driver *RavenTestDriver) { 357 var err error 358 store := driver.getDocumentStoreMust(t) 359 defer store.Close() 360 361 { 362 session := openSessionMust(t, store) 363 364 user1 := &User{} 365 user1.setName("Fitzchak") 366 err = session.Store(user1) 367 assert.NoError(t, err) 368 369 user2 := &User{} 370 user2.setName("Arek") 371 err = session.Store(user2) 372 assert.NoError(t, err) 373 374 err = session.SaveChanges() 375 assert.NoError(t, err) 376 377 session.Close() 378 } 379 380 var indexName string 381 382 { 383 session := openSessionMust(t, store) 384 385 var notUsed []*User 386 var stats *ravendb.QueryStatistics 387 q := session.QueryCollectionForType(userType) 388 q = q.WaitForNonStaleResults(0) 389 q = q.Statistics(&stats) 390 q = q.WhereEquals("name", "Arek") 391 err = q.GetResults(¬Used) 392 assert.NoError(t, err) 393 394 indexName = stats.IndexName 395 396 session.Close() 397 } 398 399 { 400 session := openSessionMust(t, store) 401 op := ravendb.NewGetIndexNamesOperation(0, 10) 402 err = store.Maintenance().Send(op) 403 assert.NoError(t, err) 404 405 indexNames := op.Command.Result 406 407 assert.Equal(t, len(indexNames), 1) 408 assert.True(t, stringArrayContains(indexNames, indexName)) 409 session.Close() 410 } 411 } 412 413 func indexesFromClientTestCanExplain(t *testing.T, driver *RavenTestDriver) { 414 var err error 415 store := driver.getDocumentStoreMust(t) 416 defer store.Close() 417 418 user1 := &User{} 419 user1.setName("Fitzchak") 420 421 user2 := &User{} 422 user2.setName("Arek") 423 424 { 425 session := openSessionMust(t, store) 426 427 err = session.Store(user1) 428 assert.NoError(t, err) 429 err = session.Store(user2) 430 assert.NoError(t, err) 431 err = session.SaveChanges() 432 assert.NoError(t, err) 433 434 session.Close() 435 } 436 437 { 438 session := openSessionMust(t, store) 439 440 var notUsed []*User 441 var statsRef *ravendb.QueryStatistics 442 q := session.QueryCollectionForType(userType) 443 q = q.Statistics(&statsRef) 444 q = q.WhereEquals("name", "Arek") 445 err = q.GetResults(¬Used) 446 assert.NoError(t, err) 447 448 q = session.QueryCollectionForType(userType) 449 q = q.Statistics(&statsRef) 450 q = q.WhereGreaterThan("age", 10) 451 err = q.GetResults(¬Used) 452 assert.NoError(t, err) 453 454 session.Close() 455 } 456 457 indexQuery := ravendb.NewIndexQuery("from users") 458 command := ravendb.NewExplainQueryCommand(store.GetConventions(), indexQuery) 459 err = store.GetRequestExecutor("").ExecuteCommand(command, nil) 460 assert.NoError(t, err) 461 462 explanations := command.Result 463 464 assert.Equal(t, len(explanations), 1) 465 explanation := explanations[0] 466 assert.NotEmpty(t, explanation.Index) 467 assert.NotEmpty(t, explanation.Reason) 468 } 469 470 func indexesFromClientTestMoreLikeThis(t *testing.T, driver *RavenTestDriver) { 471 var err error 472 store := driver.getDocumentStoreMust(t) 473 defer store.Close() 474 475 { 476 session := openSessionMust(t, store) 477 478 post1 := &Post{ 479 ID: "posts/1", 480 Title: "doduck", 481 Desc: "prototype", 482 } 483 err = session.Store(post1) 484 assert.NoError(t, err) 485 486 post2 := &Post{ 487 ID: "posts/2", 488 Title: "doduck", 489 Desc: "prototype your idea", 490 } 491 err = session.Store(post2) 492 assert.NoError(t, err) 493 494 post3 := &Post{ 495 ID: "posts/3", 496 Title: "doduck", 497 Desc: "love programming", 498 } 499 err = session.Store(post3) 500 assert.NoError(t, err) 501 502 post4 := &Post{ 503 ID: "posts/4", 504 Title: "We do", 505 Desc: "prototype", 506 } 507 err = session.Store(post4) 508 assert.NoError(t, err) 509 510 post5 := &Post{ 511 ID: "posts/5", 512 Title: "We love", 513 Desc: "challenge", 514 } 515 err = session.Store(post5) 516 assert.NoError(t, err) 517 518 err = session.SaveChanges() 519 assert.NoError(t, err) 520 521 session.Close() 522 } 523 524 err = PostsByTitleAndDesc().Execute(store, nil, "") 525 assert.NoError(t, err) 526 527 err = driver.waitForIndexing(store, "", 0) 528 assert.NoError(t, err) 529 530 { 531 session := openSessionMust(t, store) 532 533 options := ravendb.NewMoreLikeThisOptions() 534 options.SetMinimumDocumentFrequency(1) 535 options.SetMinimumTermFrequency(0) 536 537 var list []*Post 538 q := session.QueryIndex(PostsByTitleAndDesc().IndexName) 539 540 fn1 := func(x *ravendb.DocumentQuery) { 541 x.WhereEquals("id()", "posts/1") 542 } 543 544 fn2 := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) { 545 f.UsingDocumentWithBuilder(fn1).WithOptions(options) 546 } 547 548 q = q.MoreLikeThisWithBuilder(fn2) 549 550 err = q.GetResults(&list) 551 assert.NoError(t, err) 552 553 assert.Equal(t, len(list), 3) 554 555 var post *Post 556 557 post = list[0] 558 assert.Equal(t, post.Title, "doduck") 559 assert.Equal(t, post.Desc, "prototype your idea") 560 561 post = list[1] 562 assert.Equal(t, post.Title, "doduck") 563 assert.Equal(t, post.Desc, "love programming") 564 565 post = list[2] 566 assert.Equal(t, post.Title, "We do") 567 assert.Equal(t, post.Desc, "prototype") 568 569 session.Close() 570 } 571 } 572 573 func PostsByTitleAndDesc() *ravendb.IndexCreationTask { 574 res := ravendb.NewIndexCreationTask("Posts_ByTitleAndDesc") 575 res.Map = "from p in docs.Posts select new { p.title, p.desc }" 576 res.Index("title", ravendb.FieldIndexingSearch) 577 res.Store("title", ravendb.FieldStorageYes) 578 res.Analyze("title", "Lucene.Net.Analysis.SimpleAnalyzer") 579 580 res.Index("desc", ravendb.FieldIndexingSearch) 581 res.Store("desc", ravendb.FieldStorageYes) 582 res.Analyze("desc", "Lucene.Net.Analysis.SimpleAnalyzer") 583 584 return res 585 } 586 587 func TestIndexesFromClient(t *testing.T) { 588 driver := createTestDriver(t) 589 destroy := func() { destroyDriver(t, driver) } 590 defer recoverTest(t, destroy) 591 592 // order matches Java tests 593 indexesFromClientTestCanExecuteManyIndexes(t, driver) 594 indexesFromClientTestCanDelete(t, driver) 595 indexesFromClientTestCanReset(t, driver) 596 indexesFromClientTestGetIndexNames(t, driver) 597 indexesFromClientTestCanStopAndStart(t, driver) 598 indexesFromClientTestCanExplain(t, driver) 599 indexesFromClientTestMoreLikeThis(t, driver) 600 indexesFromClientTestSetLockModeAndSetPriority(t, driver) 601 indexesFromClientTestGetTerms(t, driver) 602 603 // TODO: order doesn't match Java 604 indexesFromClientTestCanCreateIndexesUsingIndexCreation(t, driver) 605 }