github.com/altipla-consulting/ravendb-go-client@v0.1.3/tests/spatial_test.go (about) 1 package tests 2 3 import ( 4 "reflect" 5 "testing" 6 "time" 7 8 ravendb "github.com/altipla-consulting/ravendb-go-client" 9 "github.com/stretchr/testify/assert" 10 ) 11 12 type MyDocumentItem struct { 13 Date time.Time `json:"date"` 14 Latitude float64 `json:"latitude"` 15 Longitude float64 `json:"longitude"` 16 } 17 18 type MyDocument struct { 19 ID string 20 Items []*MyDocumentItem `json:"items"` 21 } 22 23 type MyProjection struct { 24 ID string 25 Date time.Time `json:"date"` 26 Latitude float64 `json:"latitude"` 27 Longitude float64 `json:"longitude"` 28 } 29 30 func NewMyIndex() *ravendb.IndexCreationTask { 31 res := ravendb.NewIndexCreationTask("MyIndex") 32 res.Map = "docs.MyDocuments.SelectMany(doc => doc.items, (doc, item) => new {\n" + 33 " doc = doc,\n" + 34 " item = item\n" + 35 "}).Select(this0 => new {\n" + 36 " this0 = this0,\n" + 37 " lat = ((double)(this0.item.latitude ?? 0))\n" + 38 "}).Select(this1 => new {\n" + 39 " this1 = this1,\n" + 40 " lng = ((double)(this1.this0.item.longitude ?? 0))\n" + 41 "}).Select(this2 => new {\n" + 42 " id = Id(this2.this1.this0.doc),\n" + 43 " date = this2.this1.this0.item.date,\n" + 44 " latitude = this2.this1.lat,\n" + 45 " longitude = this2.lng,\n" + 46 " coordinates = this.CreateSpatialField(((double ? ) this2.this1.lat), ((double ? ) this2.lng))\n" + 47 "})" 48 res.Store("id", ravendb.FieldStorageYes) 49 res.Store("date", ravendb.FieldStorageYes) 50 51 res.Store("latitude", ravendb.FieldStorageYes) 52 res.Store("longitude", ravendb.FieldStorageYes) 53 return res 54 } 55 56 func spatialWeirdSpatialResults(t *testing.T, driver *RavenTestDriver) { 57 var err error 58 store := driver.getDocumentStoreMust(t) 59 defer store.Close() 60 61 { 62 session := openSessionMust(t, store) 63 64 myDocument := &MyDocument{} 65 myDocument.ID = "First" 66 67 myDocumentItem := &MyDocumentItem{} 68 myDocumentItem.Date = time.Now() 69 myDocumentItem.Latitude = 10.0 70 myDocumentItem.Longitude = 10.0 71 72 myDocument.Items = []*MyDocumentItem{myDocumentItem} 73 74 err = session.Store(myDocument) 75 assert.NoError(t, err) 76 77 err = session.SaveChanges() 78 assert.NoError(t, err) 79 80 session.Close() 81 } 82 83 index := NewMyIndex() 84 err = index.Execute(store, nil, "") 85 assert.NoError(t, err) 86 87 { 88 session := openSessionMust(t, store) 89 90 var statsRef *ravendb.QueryStatistics 91 92 q := session.Advanced().QueryIndex(index.IndexName) 93 q = q.WaitForNonStaleResults(0) 94 q = q.WithinRadiusOf("coordinates", 0, 12.3456789, 12.3456789) 95 q = q.Statistics(&statsRef) 96 projType := reflect.TypeOf(&MyDocument{}) 97 q = q.SelectFields(projType, "id", "latitude", "longitude") 98 q = q.Take(50) 99 100 var result []*MyDocument 101 err = q.GetResults(&result) 102 assert.NoError(t, err) 103 104 assert.Equal(t, statsRef.TotalResults, 0) 105 106 assert.Equal(t, len(result), 0) 107 108 session.Close() 109 } 110 } 111 112 func spatialMatchSpatialResults(t *testing.T, driver *RavenTestDriver) { 113 var err error 114 store := driver.getDocumentStoreMust(t) 115 defer store.Close() 116 117 { 118 session := openSessionMust(t, store) 119 120 myDocument := &MyDocument{} 121 myDocument.ID = "First" 122 123 myDocumentItem := &MyDocumentItem{} 124 myDocumentItem.Date = time.Now() 125 myDocumentItem.Latitude = 10.0 126 myDocumentItem.Longitude = 10.0 127 128 myDocument.Items = []*MyDocumentItem{myDocumentItem} 129 130 err = session.Store(myDocument) 131 assert.NoError(t, err) 132 133 err = session.SaveChanges() 134 assert.NoError(t, err) 135 136 session.Close() 137 } 138 139 index := NewMyIndex() 140 err = index.Execute(store, nil, "") 141 assert.NoError(t, err) 142 143 { 144 session := openSessionMust(t, store) 145 146 var statsRef *ravendb.QueryStatistics 147 148 q := session.Advanced().QueryIndex(index.IndexName) 149 q = q.WaitForNonStaleResults(0) 150 q = q.WithinRadiusOf("coordinates", 0, 10, 10) 151 q = q.Statistics(&statsRef) 152 projType := reflect.TypeOf(&MyDocument{}) 153 q = q.SelectFields(projType, "id", "latitude", "longitude") 154 q = q.Take(50) 155 156 var result []*MyDocument 157 err = q.GetResults(&result) 158 assert.NoError(t, err) 159 160 assert.Equal(t, statsRef.TotalResults, 1) 161 162 assert.Equal(t, len(result), 1) 163 164 session.Close() 165 } 166 } 167 168 func TestSpatial(t *testing.T) { 169 driver := createTestDriver(t) 170 destroy := func() { destroyDriver(t, driver) } 171 defer recoverTest(t, destroy) 172 173 // matches order of Java tests 174 175 spatialWeirdSpatialResults(t, driver) 176 spatialMatchSpatialResults(t, driver) 177 }