github.com/ravendb/ravendb-go-client@v0.0.0-20240229102137-4474ee7aa0fa/tests/more_like_this_test.go (about)

     1  package tests
     2  
     3  import (
     4  	"fmt"
     5  	"math/rand"
     6  	"strings"
     7  	"testing"
     8  
     9  	ravendb "github.com/ravendb/ravendb-go-client"
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  func getLorem(numWords int) string {
    14  	theLorem := "Morbi nec purus eu libero interdum laoreet Nam metus quam posuere in elementum eget egestas eget justo Aenean orci ligula ullamcorper nec convallis non placerat nec lectus Quisque convallis porta suscipit Aliquam sollicitudin ligula sit amet libero cursus egestas Maecenas nec mauris neque at faucibus justo Fusce ut orci neque Nunc sodales pulvinar lobortis Praesent dui tellus fermentum sed faucibus nec faucibus non nibh Vestibulum adipiscing porta purus ut varius mi pulvinar eu Nam sagittis sodales hendrerit Vestibulum et tincidunt urna Fusce lacinia nisl at luctus lobortis lacus quam rhoncus risus a posuere nulla lorem at nisi Sed non erat nisl Cras in augue velit a mattis ante Etiam lorem dui elementum eget facilisis vitae viverra sit amet tortor Suspendisse potenti Nunc egestas accumsan justo viverra viverra Sed faucibus ullamcorper mauris ut pharetra ligula ornare eget Donec suscipit luctus rhoncus Pellentesque eget justo ac nunc tempus consequat Nullam fringilla egestas leo Praesent condimentum laoreet magna vitae luctus sem cursus sed Mauris massa purus suscipit ac malesuada a accumsan non neque Proin et libero vitae quam ultricies rhoncus Praesent urna neque molestie et suscipit vestibulum iaculis ac nulla Integer porta nulla vel leo ullamcorper eu rhoncus dui semper Donec dictum dui"
    15  
    16  	loremArray := strings.Split(theLorem, " ")
    17  
    18  	output := ""
    19  	maxN := len(loremArray) - 1
    20  
    21  	for i := 0; i < numWords; i++ {
    22  		idx := rand.Intn(maxN)
    23  		s := loremArray[idx]
    24  		output += s
    25  		output += " "
    26  	}
    27  	return output
    28  }
    29  
    30  func getDataList() []*Data {
    31  	var items []*Data
    32  	items = append(items, NewData("This is a test. Isn't it great? I hope I pass my test!"))
    33  	items = append(items, NewData("I have a test tomorrow. I hate having a test"))
    34  	items = append(items, NewData("Cake is great."))
    35  	items = append(items, NewData("This document has the word test only once"))
    36  	items = append(items, NewData("test"))
    37  	items = append(items, NewData("test"))
    38  	items = append(items, NewData("test"))
    39  	items = append(items, NewData("test"))
    40  	return items
    41  }
    42  
    43  func moreLikeThisCanGetResultsUsingTermVectors(t *testing.T, driver *RavenTestDriver) {
    44  	var err error
    45  	store := driver.getDocumentStoreMust(t)
    46  	defer store.Close()
    47  
    48  	var id string
    49  	dataIndex := NewDataIndex2(true, false)
    50  	err = dataIndex.Execute(store, nil, "")
    51  	assert.NoError(t, err)
    52  	{
    53  		session := openSessionMust(t, store)
    54  		list := getDataList()
    55  		for _, el := range list {
    56  			err = session.Store(el)
    57  			assert.NoError(t, err)
    58  		}
    59  		err = session.SaveChanges()
    60  		assert.NoError(t, err)
    61  		id = session.Advanced().GetDocumentID(list[0])
    62  		err = driver.waitForIndexing(store, store.GetDatabase(), 0)
    63  		assert.NoError(t, err)
    64  	}
    65  
    66  	moreLikeThisAssertMoreLikeThisHasMatchesFor(t, dataIndex, store, id)
    67  }
    68  
    69  func moreLikeThisCanGetResultsUsingTermVectorsLazy(t *testing.T, driver *RavenTestDriver) {
    70  	var err error
    71  	store := driver.getDocumentStoreMust(t)
    72  	defer store.Close()
    73  
    74  	var id string
    75  	dataIndex := NewDataIndex2(true, false)
    76  
    77  	{
    78  		session := openSessionMust(t, store)
    79  		err = dataIndex.Execute(store, nil, "")
    80  		assert.NoError(t, err)
    81  		list := getDataList()
    82  		for _, el := range list {
    83  			err = session.Store(el)
    84  			assert.NoError(t, err)
    85  		}
    86  		err = session.SaveChanges()
    87  		assert.NoError(t, err)
    88  		id = session.Advanced().GetDocumentID(list[0])
    89  		err = driver.waitForIndexing(store, store.GetDatabase(), 0)
    90  		assert.NoError(t, err)
    91  	}
    92  	{
    93  		session := openSessionMust(t, store)
    94  		options := ravendb.NewMoreLikeThisOptions()
    95  		options.Fields = []string{"body"}
    96  
    97  		query := session.QueryIndex(dataIndex.IndexName)
    98  		builder := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) {
    99  			builder := func(b *ravendb.DocumentQuery) {
   100  				b.WhereEquals("id()", id)
   101  			}
   102  			ops := f.UsingDocumentWithBuilder(builder)
   103  			ops.WithOptions(options)
   104  		}
   105  		query = query.MoreLikeThisWithBuilder(builder)
   106  		lazyLst, err := query.Lazily()
   107  		assert.NoError(t, err)
   108  		var list []*Data
   109  		err = lazyLst.GetValue(&list)
   110  		assert.NoError(t, err)
   111  		assert.NotEmpty(t, list)
   112  		// TODO: more precise check that returned the right values
   113  	}
   114  }
   115  
   116  func moreLikeThisCanGetResultsUsingTermVectorsWithDocumentQuery(t *testing.T, driver *RavenTestDriver) {
   117  	var err error
   118  	store := driver.getDocumentStoreMust(t)
   119  	defer store.Close()
   120  
   121  	var id string
   122  	dataIndex := NewDataIndex2(true, false)
   123  	err = dataIndex.Execute(store, nil, "")
   124  	assert.NoError(t, err)
   125  
   126  	{
   127  		session := openSessionMust(t, store)
   128  		list := getDataList()
   129  		for _, el := range list {
   130  			err = session.Store(el)
   131  			assert.NoError(t, err)
   132  		}
   133  		err = session.SaveChanges()
   134  		assert.NoError(t, err)
   135  		id = session.Advanced().GetDocumentID(list[0])
   136  		err = driver.waitForIndexing(store, store.GetDatabase(), 0)
   137  		assert.NoError(t, err)
   138  	}
   139  	{
   140  		session := openSessionMust(t, store)
   141  		options := ravendb.NewMoreLikeThisOptions()
   142  		options.Fields = []string{"body"}
   143  		query := session.QueryIndex(dataIndex.IndexName)
   144  		builder := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) {
   145  			builder := func(b *ravendb.DocumentQuery) {
   146  				b.WhereEquals("id()", id)
   147  			}
   148  			ops := f.UsingDocumentWithBuilder(builder)
   149  			ops.WithOptions(options)
   150  		}
   151  		query = query.MoreLikeThisWithBuilder(builder)
   152  		var list []*Data
   153  		err = query.GetResults(&list)
   154  		assert.NoError(t, err)
   155  		assert.NotEmpty(t, list)
   156  		assert.Equal(t, len(list), 7)
   157  		// TODO: better check if returned the right result
   158  	}
   159  }
   160  
   161  func moreLikeThisCanGetResultsUsingStorage(t *testing.T, driver *RavenTestDriver) {
   162  	var err error
   163  	store := driver.getDocumentStoreMust(t)
   164  	defer store.Close()
   165  
   166  	var id string
   167  	dataIndex := NewDataIndex2(false, true)
   168  	err = dataIndex.Execute(store, nil, "")
   169  	assert.NoError(t, err)
   170  
   171  	{
   172  		session := openSessionMust(t, store)
   173  		list := getDataList()
   174  		for _, el := range list {
   175  			err = session.Store(el)
   176  			assert.NoError(t, err)
   177  		}
   178  		err = session.SaveChanges()
   179  		assert.NoError(t, err)
   180  		id = session.Advanced().GetDocumentID(list[0])
   181  		err = driver.waitForIndexing(store, store.GetDatabase(), 0)
   182  		assert.NoError(t, err)
   183  	}
   184  
   185  	moreLikeThisAssertMoreLikeThisHasMatchesFor(t, dataIndex, store, id)
   186  }
   187  
   188  func moreLikeThisCanGetResultsUsingTermVectorsAndStorage(t *testing.T, driver *RavenTestDriver) {
   189  	var err error
   190  	store := driver.getDocumentStoreMust(t)
   191  	defer store.Close()
   192  
   193  	var id string
   194  	dataIndex := NewDataIndex2(true, true)
   195  	err = dataIndex.Execute(store, nil, "")
   196  	assert.NoError(t, err)
   197  
   198  	{
   199  		session := openSessionMust(t, store)
   200  		list := getDataList()
   201  		for _, el := range list {
   202  			err = session.Store(el)
   203  			assert.NoError(t, err)
   204  		}
   205  		err = session.SaveChanges()
   206  		assert.NoError(t, err)
   207  		id = session.Advanced().GetDocumentID(list[0])
   208  		err = driver.waitForIndexing(store, store.GetDatabase(), 0)
   209  		assert.NoError(t, err)
   210  	}
   211  	moreLikeThisAssertMoreLikeThisHasMatchesFor(t, dataIndex, store, id)
   212  }
   213  
   214  func moreLikeThisTestWithLotsOfRandomData(t *testing.T, driver *RavenTestDriver) {
   215  	var err error
   216  	store := driver.getDocumentStoreMust(t)
   217  	defer store.Close()
   218  
   219  	key := "data/1-A" // Note: in Java it's datas/ because of bad pluralization of data
   220  	dataIndex := NewDataIndex()
   221  	err = dataIndex.Execute(store, nil, "")
   222  	assert.NoError(t, err)
   223  
   224  	{
   225  		session := openSessionMust(t, store)
   226  		for i := 0; i < 100; i++ {
   227  			data := &Data{}
   228  			data.Body = getLorem(200)
   229  			err = session.Store(data)
   230  			assert.NoError(t, err)
   231  		}
   232  		err = session.SaveChanges()
   233  		assert.NoError(t, err)
   234  		err = driver.waitForIndexing(store, store.GetDatabase(), 0)
   235  		assert.NoError(t, err)
   236  	}
   237  	moreLikeThisAssertMoreLikeThisHasMatchesFor(t, dataIndex, store, key)
   238  }
   239  
   240  func moreLikeThisDoNotPassFieldNames(t *testing.T, driver *RavenTestDriver) {
   241  	var err error
   242  	store := driver.getDocumentStoreMust(t)
   243  	defer store.Close()
   244  
   245  	key := "data/1-A" // Note: in Java it's datas/ because of bad pluralization of data
   246  	dataIndex := NewDataIndex()
   247  	err = dataIndex.Execute(store, nil, "")
   248  	assert.NoError(t, err)
   249  
   250  	{
   251  		session := openSessionMust(t, store)
   252  		for i := 0; i < 10; i++ {
   253  			data := &Data{}
   254  			data.Body = fmt.Sprintf("Body%d", i)
   255  			data.WhitespaceAnalyzerField = "test test"
   256  			err = session.Store(data)
   257  			assert.NoError(t, err)
   258  
   259  		}
   260  		err = session.SaveChanges()
   261  		assert.NoError(t, err)
   262  		err = driver.waitForIndexing(store, store.GetDatabase(), 0)
   263  		assert.NoError(t, err)
   264  	}
   265  
   266  	{
   267  		session := openSessionMust(t, store)
   268  		query := session.QueryIndex(dataIndex.IndexName)
   269  		builder := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) {
   270  			builder := func(b *ravendb.DocumentQuery) {
   271  				b.WhereEquals("id()", key)
   272  			}
   273  			f.UsingDocumentWithBuilder(builder)
   274  		}
   275  		query = query.MoreLikeThisWithBuilder(builder)
   276  		var list []*Data
   277  		err = query.GetResults(&list)
   278  		assert.NoError(t, err)
   279  		assert.Equal(t, 9, len(list)) // TODO: should this be 10? 1?
   280  	}
   281  }
   282  
   283  func moreLikeThisEachFieldShouldUseCorrectAnalyzer(t *testing.T, driver *RavenTestDriver) {
   284  	var err error
   285  	store := driver.getDocumentStoreMust(t)
   286  	defer store.Close()
   287  
   288  	key1 := "data/1-A" // Note: in Java it's datas/ because of bad pluralization of data
   289  	dataIndex := NewDataIndex()
   290  	err = dataIndex.Execute(store, nil, "")
   291  	assert.NoError(t, err)
   292  
   293  	{
   294  		session := openSessionMust(t, store)
   295  		for i := 0; i < 10; i++ {
   296  			data := &Data{}
   297  			data.WhitespaceAnalyzerField = "bob@hotmail.com hotmail"
   298  			err = session.Store(data)
   299  			assert.NoError(t, err)
   300  
   301  		}
   302  		err = session.SaveChanges()
   303  		assert.NoError(t, err)
   304  		err = driver.waitForIndexing(store, store.GetDatabase(), 0)
   305  		assert.NoError(t, err)
   306  	}
   307  
   308  	{
   309  		session := openSessionMust(t, store)
   310  		options := ravendb.NewMoreLikeThisOptions()
   311  		v1 := 2
   312  		options.MinimumTermFrequency = &v1
   313  		v2 := 5
   314  		options.MinimumDocumentFrequency = &v2
   315  
   316  		query := session.QueryIndex(dataIndex.IndexName)
   317  		builder := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) {
   318  			builder := func(b *ravendb.DocumentQuery) {
   319  				b.WhereEquals("id()", key1)
   320  			}
   321  			o := f.UsingDocumentWithBuilder(builder)
   322  			o.WithOptions(options)
   323  		}
   324  		query = query.MoreLikeThisWithBuilder(builder)
   325  		var list []*Data
   326  		err = query.GetResults(&list)
   327  		assert.NoError(t, err)
   328  		assert.Empty(t, list)
   329  	}
   330  
   331  	key2 := "data/11-A" // Note: in Java it's datas/ because of bad pluralization of data
   332  
   333  	{
   334  		session := openSessionMust(t, store)
   335  		err = dataIndex.Execute(store, nil, "")
   336  		assert.NoError(t, err)
   337  		for i := 0; i < 10; i++ {
   338  			data := &Data{}
   339  			data.WhitespaceAnalyzerField = "bob@hotmail.com bob@hotmail.com"
   340  			err = session.Store(data)
   341  			assert.NoError(t, err)
   342  
   343  		}
   344  		err = session.SaveChanges()
   345  		assert.NoError(t, err)
   346  		err = driver.waitForIndexing(store, store.GetDatabase(), 0)
   347  		assert.NoError(t, err)
   348  	}
   349  
   350  	{
   351  		session := openSessionMust(t, store)
   352  
   353  		query := session.QueryIndex(dataIndex.IndexName)
   354  		builder := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) {
   355  			builder := func(b *ravendb.DocumentQuery) {
   356  				b.WhereEquals("id()", key2)
   357  			}
   358  			f.UsingDocumentWithBuilder(builder)
   359  		}
   360  		query = query.MoreLikeThisWithBuilder(builder)
   361  		var list []*Data
   362  		err = query.GetResults(&list)
   363  		assert.NoError(t, err)
   364  		assert.NotEmpty(t, list)
   365  	}
   366  }
   367  
   368  func moreLikeThisCanUseMinDocFreqParam(t *testing.T, driver *RavenTestDriver) {
   369  	var err error
   370  	store := driver.getDocumentStoreMust(t)
   371  	defer store.Close()
   372  
   373  	key := "data/1-A" // Note: in Java it's datas/ because of bad pluralization of data
   374  	dataIndex := NewDataIndex()
   375  	err = dataIndex.Execute(store, nil, "")
   376  	assert.NoError(t, err)
   377  
   378  	{
   379  		session := openSessionMust(t, store)
   380  		d := []string{
   381  			"This is a test. Isn't it great? I hope I pass my test!",
   382  			"I have a test tomorrow. I hate having a test",
   383  			"Cake is great.",
   384  			"This document has the word test only once",
   385  		}
   386  		for _, text := range d {
   387  			data := &Data{}
   388  			data.Body = text
   389  			err = session.Store(data)
   390  			assert.NoError(t, err)
   391  		}
   392  		err = session.SaveChanges()
   393  		assert.NoError(t, err)
   394  		err = driver.waitForIndexing(store, store.GetDatabase(), 0)
   395  		assert.NoError(t, err)
   396  	}
   397  
   398  	{
   399  		session := openSessionMust(t, store)
   400  		options := ravendb.NewMoreLikeThisOptions()
   401  		options.Fields = []string{"body"}
   402  		options.SetMinimumDocumentFrequency(2)
   403  
   404  		query := session.QueryIndex(dataIndex.IndexName)
   405  		builder := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) {
   406  			builder := func(b *ravendb.DocumentQuery) {
   407  				b.WhereEquals("id()", key)
   408  			}
   409  			o := f.UsingDocumentWithBuilder(builder)
   410  			o.WithOptions(options)
   411  		}
   412  		query = query.MoreLikeThisWithBuilder(builder)
   413  		var list []*Data
   414  		err = query.GetResults(&list)
   415  		assert.NoError(t, err)
   416  		assert.NotEmpty(t, list)
   417  	}
   418  }
   419  
   420  func moreLikeThisCanUseBoostParam(t *testing.T, driver *RavenTestDriver) {
   421  	var err error
   422  	store := driver.getDocumentStoreMust(t)
   423  	defer store.Close()
   424  
   425  	key := "data/1-A" // Note: in Java it's datas/ because of bad pluralization of data
   426  	dataIndex := NewDataIndex()
   427  	err = dataIndex.Execute(store, nil, "")
   428  	assert.NoError(t, err)
   429  
   430  	{
   431  		session := openSessionMust(t, store)
   432  		d := []string{
   433  			"This is a test. it is a great test. I hope I pass my great test!",
   434  			"Cake is great.",
   435  			"I have a test tomorrow.",
   436  		}
   437  		for _, text := range d {
   438  			data := &Data{
   439  				Body: text,
   440  			}
   441  			err = session.Store(data)
   442  			assert.NoError(t, err)
   443  		}
   444  		err = session.SaveChanges()
   445  		assert.NoError(t, err)
   446  		err = driver.waitForIndexing(store, store.GetDatabase(), 0)
   447  		assert.NoError(t, err)
   448  	}
   449  
   450  	{
   451  		session := openSessionMust(t, store)
   452  		options := ravendb.NewMoreLikeThisOptions()
   453  		options.Fields = []string{"body"}
   454  		options.SetMinimumWordLength(3)
   455  		options.SetMinimumDocumentFrequency(1)
   456  		options.SetMinimumTermFrequency(2)
   457  		options.SetBoost(true)
   458  
   459  		query := session.QueryIndex(dataIndex.IndexName)
   460  		builder := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) {
   461  			builder := func(b *ravendb.DocumentQuery) {
   462  				b.WhereEquals("id()", key)
   463  			}
   464  			o := f.UsingDocumentWithBuilder(builder)
   465  			o.WithOptions(options)
   466  		}
   467  		query = query.MoreLikeThisWithBuilder(builder)
   468  		var list []*Data
   469  		err = query.GetResults(&list)
   470  		assert.NoError(t, err)
   471  		assert.NotEmpty(t, list)
   472  		assert.Equal(t, list[0].Body, "I have a test tomorrow.")
   473  	}
   474  }
   475  
   476  func moreLikeThisCanUseStopWords(t *testing.T, driver *RavenTestDriver) {
   477  	var err error
   478  	store := driver.getDocumentStoreMust(t)
   479  	defer store.Close()
   480  
   481  	key := "data/1-A" // Note: in Java it's datas/ because of bad pluralization of data
   482  	dataIndex := NewDataIndex()
   483  	err = dataIndex.Execute(store, nil, "")
   484  	assert.NoError(t, err)
   485  
   486  	{
   487  		session := openSessionMust(t, store)
   488  		d := []string{
   489  			"This is a test. Isn't it great? I hope I pass my test!",
   490  			"I should not hit this document. I hope",
   491  			"Cake is great.",
   492  			"This document has the word test only once",
   493  			"test",
   494  			"test",
   495  			"test",
   496  			"test",
   497  		}
   498  		for _, text := range d {
   499  			data := &Data{
   500  				Body: text,
   501  			}
   502  			err = session.Store(data)
   503  			assert.NoError(t, err)
   504  		}
   505  
   506  		stopWords := &ravendb.MoreLikeThisStopWords{
   507  			ID:        "Config/Stopwords",
   508  			StopWords: []string{"I", "A", "Be"},
   509  		}
   510  		err = session.Store(stopWords)
   511  		assert.NoError(t, err)
   512  
   513  		err = session.SaveChanges()
   514  		assert.NoError(t, err)
   515  		err = driver.waitForIndexing(store, store.GetDatabase(), 0)
   516  		assert.NoError(t, err)
   517  	}
   518  
   519  	{
   520  		session := openSessionMust(t, store)
   521  		options := ravendb.NewMoreLikeThisOptions()
   522  		options.Fields = []string{"body"}
   523  		options.SetMinimumTermFrequency(2)
   524  		options.SetMinimumDocumentFrequency(1)
   525  		options.SetStopWordsDocumentID("Config/Stopwords")
   526  
   527  		query := session.QueryIndex(dataIndex.IndexName)
   528  		builder := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) {
   529  			builder := func(b *ravendb.DocumentQuery) {
   530  				b.WhereEquals("id()", key)
   531  			}
   532  			o := f.UsingDocumentWithBuilder(builder)
   533  			o.WithOptions(options)
   534  		}
   535  		query = query.MoreLikeThisWithBuilder(builder)
   536  		var list []*Data
   537  		err = query.GetResults(&list)
   538  		assert.NoError(t, err)
   539  		assert.Equal(t, len(list), 5)
   540  	}
   541  }
   542  
   543  func moreLikeThisCanMakeDynamicDocumentQueries(t *testing.T, driver *RavenTestDriver) {
   544  	var err error
   545  	store := driver.getDocumentStoreMust(t)
   546  	defer store.Close()
   547  
   548  	dataIndex := NewDataIndex()
   549  	err = dataIndex.Execute(store, nil, "")
   550  	assert.NoError(t, err)
   551  
   552  	{
   553  		session := openSessionMust(t, store)
   554  		list := getDataList()
   555  		for _, el := range list {
   556  			err = session.Store(el)
   557  			assert.NoError(t, err)
   558  		}
   559  		err = session.SaveChanges()
   560  		assert.NoError(t, err)
   561  
   562  		err = driver.waitForIndexing(store, store.GetDatabase(), 0)
   563  		assert.NoError(t, err)
   564  	}
   565  
   566  	{
   567  		session := openSessionMust(t, store)
   568  		options := ravendb.NewMoreLikeThisOptions()
   569  		options.Fields = []string{"body"}
   570  		options.SetMinimumTermFrequency(1)
   571  		options.SetMinimumDocumentFrequency(1)
   572  
   573  		query := session.QueryIndex(dataIndex.IndexName)
   574  		builder := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) {
   575  			o := f.UsingDocument("{ \"body\": \"A test\" }")
   576  			o.WithOptions(options)
   577  		}
   578  		query = query.MoreLikeThisWithBuilder(builder)
   579  		var list []*Data
   580  		err = query.GetResults(&list)
   581  		assert.NoError(t, err)
   582  		assert.Equal(t, len(list), 7)
   583  	}
   584  }
   585  
   586  func moreLikeThisCanMakeDynamicDocumentQueriesWithComplexProperties(t *testing.T, driver *RavenTestDriver) {
   587  	var err error
   588  	store := driver.getDocumentStoreMust(t)
   589  	defer store.Close()
   590  
   591  	dataIndex := NewComplexDataIndex()
   592  	err = dataIndex.Execute(store, nil, "")
   593  	assert.NoError(t, err)
   594  
   595  	{
   596  		session := openSessionMust(t, store)
   597  
   598  		complexProperty := &ComplexProperty{
   599  			Body: "test",
   600  		}
   601  
   602  		complexData := &ComplexData{
   603  			Property: complexProperty,
   604  		}
   605  
   606  		err = session.Store(complexData)
   607  		assert.NoError(t, err)
   608  
   609  		err = session.SaveChanges()
   610  		assert.NoError(t, err)
   611  
   612  		err = driver.waitForIndexing(store, store.GetDatabase(), 0)
   613  		assert.NoError(t, err)
   614  	}
   615  
   616  	{
   617  		session := openSessionMust(t, store)
   618  		options := ravendb.NewMoreLikeThisOptions()
   619  		options.SetMinimumTermFrequency(1)
   620  		options.SetMinimumDocumentFrequency(1)
   621  
   622  		query := session.QueryIndex(dataIndex.IndexName)
   623  		builder := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) {
   624  			o := f.UsingDocument("{ \"Property\": { \"Body\": \"test\" } }")
   625  			o.WithOptions(options)
   626  		}
   627  		query = query.MoreLikeThisWithBuilder(builder)
   628  		var list []*ComplexData
   629  		err = query.GetResults(&list)
   630  		assert.NoError(t, err)
   631  		assert.Equal(t, len(list), 1)
   632  	}
   633  }
   634  
   635  func moreLikeThisAssertMoreLikeThisHasMatchesFor(t *testing.T, index *ravendb.IndexCreationTask, store *ravendb.DocumentStore, documentKey string) {
   636  	session := openSessionMust(t, store)
   637  
   638  	options := ravendb.NewMoreLikeThisOptions()
   639  	options.Fields = []string{"body"}
   640  
   641  	q := session.QueryIndex(index.IndexName)
   642  	fn1 := func(b *ravendb.DocumentQuery) {
   643  		b.WhereEquals("id()", documentKey)
   644  	}
   645  	fn2 := func(f ravendb.IMoreLikeThisBuilderForDocumentQuery) {
   646  		f.UsingDocumentWithBuilder(fn1).WithOptions(options)
   647  	}
   648  	var data []*Data
   649  	q = q.MoreLikeThisWithBuilder(fn2)
   650  	err := q.GetResults(&data)
   651  	assert.NoError(t, err)
   652  	assert.True(t, len(data) > 0)
   653  
   654  	session.Close()
   655  }
   656  
   657  type Identity struct {
   658  	ID string
   659  }
   660  
   661  type Data struct {
   662  	Identity
   663  
   664  	Body                    string `json:"body"`
   665  	WhitespaceAnalyzerField string `json:"whitespaceAnalyzerField"`
   666  	PersonID                string `json:"personId"`
   667  }
   668  
   669  func NewData(s string) *Data {
   670  	return &Data{
   671  		Body: s,
   672  	}
   673  }
   674  
   675  type DataWithIntegerId struct {
   676  	Identity
   677  	Body string `json:"body"`
   678  }
   679  
   680  type ComplexData struct {
   681  	ID       string
   682  	Property *ComplexProperty `json:"property"`
   683  }
   684  
   685  type ComplexProperty struct {
   686  	Body string `json:"body"`
   687  }
   688  
   689  func NewDataIndex() *ravendb.IndexCreationTask {
   690  	return NewDataIndex2(true, false)
   691  }
   692  
   693  func NewDataIndex2(termVector bool, store bool) *ravendb.IndexCreationTask {
   694  	res := ravendb.NewIndexCreationTask("DataIndex")
   695  
   696  	// Note: in Java it's docs.Datas because Inflector.pluralize() doesn't
   697  	// handle 'data' properly and we do
   698  	res.Map = "from doc in docs.Data select new { doc.body, doc.whitespaceAnalyzerField }"
   699  
   700  	res.Analyze("body", "Lucene.Net.Analysis.Standard.StandardAnalyzer")
   701  	res.Analyze("whitespaceAnalyzerField", "Lucene.Net.Analysis.WhitespaceAnalyzer")
   702  
   703  	if store {
   704  		res.Store("body", ravendb.FieldStorageYes)
   705  		res.Store("whitespaceAnalyzerField", ravendb.FieldStorageYes)
   706  	}
   707  
   708  	if termVector {
   709  		res.TermVector("body", ravendb.FieldTermVectorYes)
   710  		res.TermVector("whitespaceAnalyzerField", ravendb.FieldTermVectorYes)
   711  	}
   712  	return res
   713  }
   714  
   715  func NewComplexDataIndex() *ravendb.IndexCreationTask {
   716  	res := ravendb.NewIndexCreationTask("ComplexDataIndex")
   717  	// Note: In Java it's docs.ComplexDatas due to not pluralizing Data properly
   718  	res.Map = "from doc in docs.ComplexData select new  { doc.property, doc.property.body }"
   719  	res.Index("body", ravendb.FieldIndexingSearch)
   720  	return res
   721  }
   722  
   723  func TestMoreLikeThis(t *testing.T) {
   724  	driver := createTestDriver(t)
   725  	destroy := func() { destroyDriver(t, driver) }
   726  	defer recoverTest(t, destroy)
   727  
   728  	// order matches Java tests
   729  	moreLikeThisCanUseStopWords(t, driver)
   730  	moreLikeThisCanUseBoostParam(t, driver)
   731  	moreLikeThisCanGetResultsUsingTermVectors(t, driver)
   732  	moreLikeThisCanUseMinDocFreqParam(t, driver)
   733  	moreLikeThisEachFieldShouldUseCorrectAnalyzer(t, driver)
   734  	moreLikeThisTestWithLotsOfRandomData(t, driver)
   735  	moreLikeThisCanMakeDynamicDocumentQueries(t, driver)
   736  	moreLikeThisCanGetResultsUsingTermVectorsAndStorage(t, driver)
   737  	moreLikeThisCanGetResultsUsingStorage(t, driver)
   738  	moreLikeThisCanMakeDynamicDocumentQueriesWithComplexProperties(t, driver)
   739  	moreLikeThisDoNotPassFieldNames(t, driver)
   740  	moreLikeThisCanGetResultsUsingTermVectorsLazy(t, driver)
   741  	moreLikeThisCanGetResultsUsingTermVectorsWithDocumentQuery(t, driver)
   742  }