github.com/altipla-consulting/ravendb-go-client@v0.1.3/tests/simon_bartlett_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 simonBartlettLineStringsShouldIntersect(t *testing.T, driver *RavenTestDriver) {
    11  	var err error
    12  	store := driver.getDocumentStoreMust(t)
    13  	defer store.Close()
    14  
    15  	index := NewGeoIndex()
    16  	err = store.ExecuteIndex(index, "")
    17  	assert.NoError(t, err)
    18  
    19  	{
    20  		session := openSessionMust(t, store)
    21  
    22  		geoDocument := &GeoDocument{
    23  			Wkt: "LINESTRING (0 0, 1 1, 2 1)",
    24  		}
    25  		err = session.Store(geoDocument)
    26  		assert.NoError(t, err)
    27  		err = session.SaveChanges()
    28  		assert.NoError(t, err)
    29  
    30  		session.Close()
    31  	}
    32  
    33  	err = driver.waitForIndexing(store, "", 0)
    34  	assert.NoError(t, err)
    35  
    36  	{
    37  		session := openSessionMust(t, store)
    38  
    39  		q := session.QueryIndex(index.IndexName)
    40  		fn := func(f *ravendb.SpatialCriteriaFactory) ravendb.SpatialCriteria {
    41  			return f.RelatesToShape("LINESTRING (1 0, 1 1, 1 2)", ravendb.SpatialRelationIntersects)
    42  		}
    43  		q = q.Spatial3("WKT", fn)
    44  		q = q.WaitForNonStaleResults(0)
    45  		count, err := q.Count()
    46  		assert.NoError(t, err)
    47  
    48  		assert.Equal(t, count, 1)
    49  
    50  		q = session.QueryIndex(index.IndexName)
    51  		q = q.RelatesToShape("WKT", "LINESTRING (1 0, 1 1, 1 2)", ravendb.SpatialRelationIntersects)
    52  		q = q.WaitForNonStaleResults(0)
    53  		count, err = q.Count()
    54  		assert.NoError(t, err)
    55  
    56  		assert.Equal(t, count, 1)
    57  
    58  		session.Close()
    59  	}
    60  }
    61  
    62  func simonBartlettCirclesShouldNotIntersect(t *testing.T, driver *RavenTestDriver) {
    63  	var err error
    64  	store := driver.getDocumentStoreMust(t)
    65  	defer store.Close()
    66  
    67  	index := NewGeoIndex()
    68  	err = store.ExecuteIndex(index, "")
    69  	assert.NoError(t, err)
    70  
    71  	{
    72  		session := openSessionMust(t, store)
    73  
    74  		// 110km is approximately 1 degree
    75  		geoDocument := &GeoDocument{
    76  			Wkt: "CIRCLE(0.000000 0.000000 d=110)",
    77  		}
    78  		err = session.Store(geoDocument)
    79  		assert.NoError(t, err)
    80  		err = session.SaveChanges()
    81  		assert.NoError(t, err)
    82  
    83  		session.Close()
    84  	}
    85  
    86  	driver.waitForIndexing(store, "", 0)
    87  
    88  	{
    89  		session := openSessionMust(t, store)
    90  
    91  		// Should not intersect, as there is 1 Degree between the two shapes
    92  		q := session.QueryIndex(index.IndexName)
    93  		fn := func(f *ravendb.SpatialCriteriaFactory) ravendb.SpatialCriteria {
    94  			return f.RelatesToShape("CIRCLE(0.000000 3.000000 d=110)", ravendb.SpatialRelationIntersects)
    95  		}
    96  
    97  		q = q.Spatial3("WKT", fn)
    98  
    99  		q = q.WaitForNonStaleResults(0)
   100  		count, err := q.Count()
   101  		assert.NoError(t, err)
   102  
   103  		assert.Equal(t, count, 0)
   104  
   105  		q = session.QueryIndex(index.IndexName)
   106  		q = q.RelatesToShape("WKT", "CIRCLE(0.000000 3.000000 d=110)", ravendb.SpatialRelationIntersects)
   107  		q = q.WaitForNonStaleResults(0)
   108  		count, err = q.Count()
   109  		assert.NoError(t, err)
   110  
   111  		assert.Equal(t, count, 0)
   112  
   113  		session.Close()
   114  	}
   115  }
   116  
   117  type GeoDocument struct {
   118  	Wkt string `json:"WKT"`
   119  }
   120  
   121  func NewGeoIndex() *ravendb.IndexCreationTask {
   122  	res := ravendb.NewIndexCreationTask("GeoIndex")
   123  	res.Map = "docs.GeoDocuments.Select(doc => new {\n" +
   124  		"    WKT = this.CreateSpatialField(doc.WKT)\n" +
   125  		"})"
   126  	spatialOptions := ravendb.NewSpatialOptions()
   127  	spatialOptions.Strategy = ravendb.SpatialSearchStrategyGeohashPrefixTree
   128  	res.SpatialOptionsStrings["WKT"] = spatialOptions
   129  	return res
   130  }
   131  
   132  func TestSimonBartlett(t *testing.T) {
   133  	driver := createTestDriver(t)
   134  	destroy := func() { destroyDriver(t, driver) }
   135  	defer recoverTest(t, destroy)
   136  
   137  	// matches the order of Java tests
   138  	simonBartlettCirclesShouldNotIntersect(t, driver)
   139  	simonBartlettLineStringsShouldIntersect(t, driver)
   140  }