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  }