github.com/ravendb/ravendb-go-client@v0.0.0-20240229102137-4474ee7aa0fa/tests/simple_multi_map_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 simpleMultiMap_canCreateMultiMapIndex(t *testing.T, driver *RavenTestDriver) { 12 var err error 13 store := driver.getDocumentStoreMust(t) 14 defer store.Close() 15 16 index := NewCatsAndDogs() 17 err = index.Execute(store, nil, "") 18 assert.NoError(t, err) 19 20 op := ravendb.NewGetIndexOperation("CatsAndDogs") 21 err = store.Maintenance().Send(op) 22 indexDefinition := op.Command.Result 23 assert.Equal(t, len(indexDefinition.Maps), 2) 24 } 25 26 func simpleMultiMap_canQueryUsingMultiMap(t *testing.T, driver *RavenTestDriver) { 27 var err error 28 store := driver.getDocumentStoreMust(t) 29 defer store.Close() 30 31 index := NewCatsAndDogs() 32 err = index.Execute(store, nil, "") 33 assert.NoError(t, err) 34 35 { 36 session := openSessionMust(t, store) 37 38 cat := &Cat{Name: "Tom"} 39 dog := &Dog{Name: "Oscar"} 40 41 err = session.Store(cat) 42 assert.NoError(t, err) 43 err = session.Store(dog) 44 assert.NoError(t, err) 45 46 err = session.SaveChanges() 47 assert.NoError(t, err) 48 49 session.Close() 50 } 51 52 { 53 session := openSessionMust(t, store) 54 55 // Note: Go doesn't support interfaces like Java. We can only 56 // query a single type, not an interface 57 var haveNames []*Dog 58 q := session.QueryIndex(index.IndexName) 59 q = q.WaitForNonStaleResults(time.Second * 10) 60 q = q.OrderBy("name") 61 err = q.GetResults(&haveNames) 62 assert.NoError(t, err) 63 64 assert.Equal(t, len(haveNames), 2) 65 66 assert.Equal(t, haveNames[0].Name, "Oscar") 67 assert.Equal(t, haveNames[1].Name, "Tom") 68 69 session.Close() 70 } 71 } 72 73 // Note: in Go IndexCreationTask covers functionality of 74 // AbstractMultiMapIndexCreationTask 75 func NewCatsAndDogs() *ravendb.IndexCreationTask { 76 res := ravendb.NewIndexCreationTask("CatsAndDogs") 77 res.Maps = []string{ 78 "from cat in docs.Cats select new { cat.name }", 79 "from dog in docs.Dogs select new { dog.name }", 80 } 81 return res 82 } 83 84 type Cat struct { 85 Name string `json:"name"` 86 } 87 88 // Note: re-using a Dog structure from other test, which also has Name field 89 90 func TestSimpleMultiMap(t *testing.T) { 91 driver := createTestDriver(t) 92 destroy := func() { destroyDriver(t, driver) } 93 defer recoverTest(t, destroy) 94 95 // matches order of Java tests 96 simpleMultiMap_canCreateMultiMapIndex(t, driver) 97 simpleMultiMap_canQueryUsingMultiMap(t, driver) 98 }