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  }