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(&notUsed)
   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(&notUsed)
   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  }