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 }