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(&notUsed)
   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(&notUsed)
   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(&notUsed)
   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(&notUsed)
   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  }