github.com/altipla-consulting/ravendb-go-client@v0.1.3/tests/spatial_queries_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 func NewSpatialQueriesInMemoryTestIdx() *ravendb.IndexCreationTask { 11 res := ravendb.NewIndexCreationTask("SpatialQueriesInMemoryTestIdx") 12 res.Map = "docs.Listings.Select(listingItem => new {\n" + 13 " classCodes = listingItem.classCodes,\n" + 14 " latitude = listingItem.latitude,\n" + 15 " longitude = listingItem.longitude,\n" + 16 " coordinates = this.CreateSpatialField(((double ? )((double)(listingItem.latitude))), ((double ? )((double)(listingItem.longitude))))\n" + 17 "})" 18 return res 19 } 20 21 func spatialQueriesCanRunSpatialQueriesInMemory(t *testing.T, driver *RavenTestDriver) { 22 var err error 23 store := driver.getDocumentStoreMust(t) 24 defer store.Close() 25 26 err = NewSpatialQueriesInMemoryTestIdx().Execute(store, nil, "") 27 assert.NoError(t, err) 28 } 29 30 type Listing struct { 31 ClassCodes string `json:"classCodes"` 32 Latitude int64 `json:"latitude"` 33 Longitude int64 `json:"longitude"` 34 } 35 36 func (l *Listing) getClassCodes() string { 37 return l.ClassCodes 38 } 39 40 func (l *Listing) setClassCodes(classCodes string) { 41 l.ClassCodes = classCodes 42 } 43 44 func (l *Listing) getLatitude() int64 { 45 return l.Latitude 46 } 47 48 func (l *Listing) setLatitude(latitude int64) { 49 l.Latitude = latitude 50 } 51 52 func (l *Listing) getLongitude() int64 { 53 return l.Longitude 54 } 55 56 func (l *Listing) setLongitude(longitude int64) { 57 l.Longitude = longitude 58 } 59 60 func spatialQueriesCanSuccessfullyDoSpatialQueryOfNearbyLocations(t *testing.T, driver *RavenTestDriver) { 61 var err error 62 store := driver.getDocumentStoreMust(t) 63 defer store.Close() 64 65 areaOneDocOne := NewDummyGeoDoc(55.6880508001, 13.5717346673) 66 areaOneDocTwo := NewDummyGeoDoc(55.6821978456, 13.6076183965) 67 areaOneDocThree := NewDummyGeoDoc(55.673251569, 13.5946697607) 68 69 // This item is 12 miles (approx 19 km) from the closest in areaOne 70 closeButOutsideAreaOne := NewDummyGeoDoc(55.8634157297, 13.5497731987) 71 72 // This item is about 3900 miles from areaOne 73 newYork := NewDummyGeoDoc(40.7137578228, -74.0126901936) 74 75 { 76 session := openSessionMust(t, store) 77 78 err = session.Store(areaOneDocOne) 79 assert.NoError(t, err) 80 err = session.Store(areaOneDocTwo) 81 assert.NoError(t, err) 82 err = session.Store(areaOneDocThree) 83 assert.NoError(t, err) 84 err = session.Store(closeButOutsideAreaOne) 85 assert.NoError(t, err) 86 err = session.Store(newYork) 87 assert.NoError(t, err) 88 err = session.SaveChanges() 89 assert.NoError(t, err) 90 91 indexDefinition := ravendb.NewIndexDefinition() 92 indexDefinition.Name = "FindByLatLng" 93 indexDefinition.Maps = []string{"from doc in docs select new { coordinates = CreateSpatialField(doc.latitude, doc.longitude) }"} 94 95 op := ravendb.NewPutIndexesOperation(indexDefinition) 96 err = store.Maintenance().Send(op) 97 assert.NoError(t, err) 98 99 // Wait until the index is built 100 var notUsed []*DummyGeoDoc 101 q := session.QueryIndex("FindByLatLng") 102 q = q.WaitForNonStaleResults(0) 103 err = q.GetResults(¬Used) 104 assert.NoError(t, err) 105 106 lat := float64(55.6836422426) 107 lng := float64(13.5871808352) // in the middle of AreaOne 108 radius := float64(5.0) 109 110 var nearbyDocs []*DummyGeoDoc 111 q = session.QueryIndex("FindByLatLng") 112 q = q.WithinRadiusOf("coordinates", radius, lat, lng) 113 q = q.WaitForNonStaleResults(0) 114 err = q.GetResults(&nearbyDocs) 115 assert.NoError(t, err) 116 117 assert.Equal(t, len(nearbyDocs), 3) 118 119 session.Close() 120 } 121 } 122 123 func spatialQueriesCanSuccessfullyQueryByMiles(t *testing.T, driver *RavenTestDriver) { 124 var err error 125 store := driver.getDocumentStoreMust(t) 126 defer store.Close() 127 128 myHouse := NewDummyGeoDoc(44.757767, -93.355322) 129 130 // The gym is about 7.32 miles (11.79 kilometers) from my house. 131 gym := NewDummyGeoDoc(44.682861, -93.25) 132 { 133 session := openSessionMust(t, store) 134 135 err = session.Store(myHouse) 136 assert.NoError(t, err) 137 err = session.Store(gym) 138 assert.NoError(t, err) 139 err = session.SaveChanges() 140 assert.NoError(t, err) 141 142 indexDefinition := ravendb.NewIndexDefinition() 143 indexDefinition.Name = "FindByLatLng" 144 indexDefinition.Maps = []string{"from doc in docs select new { coordinates = CreateSpatialField(doc.latitude, doc.longitude) }"} 145 146 op := ravendb.NewPutIndexesOperation(indexDefinition) 147 err = store.Maintenance().Send(op) 148 assert.NoError(t, err) 149 150 // Wait until the index is built 151 var notUsed []*DummyGeoDoc 152 q := session.QueryIndex("FindByLatLng") 153 q = q.WaitForNonStaleResults(0) 154 err = q.GetResults(¬Used) 155 assert.NoError(t, err) 156 157 radius := float64(8) 158 159 // Find within 8 miles. 160 // We should find both my house and the gym. 161 162 var matchesWithinMiles []*DummyGeoDoc 163 q = session.QueryIndex("FindByLatLng") 164 q = q.WithinRadiusOfWithUnits("coordinates", radius, myHouse.Latitude, myHouse.Longitude, ravendb.SpatialUnitsMiles) 165 q = q.WaitForNonStaleResults(0) 166 err = q.GetResults(&matchesWithinMiles) 167 assert.NoError(t, err) 168 assert.Equal(t, len(matchesWithinMiles), 2) 169 170 // Find within 8 kilometers. 171 // We should find only my house, since the gym is ~11 kilometers out. 172 173 var matchesWithinKilometers []*DummyGeoDoc 174 q = session.QueryIndex("FindByLatLng") 175 q = q.WithinRadiusOfWithUnits("coordinates", radius, myHouse.Latitude, myHouse.Longitude, ravendb.SpatialUnitsKilometers) 176 q = q.WaitForNonStaleResults(0) 177 err = q.GetResults(&matchesWithinKilometers) 178 assert.NoError(t, err) 179 assert.Equal(t, len(matchesWithinKilometers), 1) 180 181 session.Close() 182 } 183 } 184 185 type DummyGeoDoc struct { 186 ID string 187 Latitude float64 `json:"latitude"` 188 Longitude float64 `json:"longitude"` 189 } 190 191 func NewDummyGeoDoc(latitude float64, longitude float64) *DummyGeoDoc { 192 return &DummyGeoDoc{ 193 Latitude: latitude, 194 Longitude: longitude, 195 } 196 } 197 198 func TestSpatialQueries(t *testing.T) { 199 driver := createTestDriver(t) 200 destroy := func() { destroyDriver(t, driver) } 201 defer recoverTest(t, destroy) 202 203 // matches order of Java tests 204 spatialQueriesCanRunSpatialQueriesInMemory(t, driver) 205 spatialQueriesCanSuccessfullyQueryByMiles(t, driver) 206 spatialQueriesCanSuccessfullyDoSpatialQueryOfNearbyLocations(t, driver) 207 }