diff --git a/handlers/admin/bleve.go b/handlers/admin/bleve.go index ff6cd5c..32df091 100644 --- a/handlers/admin/bleve.go +++ b/handlers/admin/bleve.go @@ -117,7 +117,7 @@ func (b *AdminBleveIndex) Store(layer string, feature *geojson.Feature) error { return nil } -func (b *AdminBleveIndex) GeoSearch(f *geojson.Feature) (map[string][]*geojson.Feature, error) { +func (b *AdminBleveIndex) GeoSearch(f *geojson.Feature) (map[string]*geojson.Feature, error) { coordinates := []float64{f.Point().Lon(), f.Point().Lat()} query, err := bleve.NewGeoShapeQuery( [][][][]float64{{{coordinates}}}, @@ -140,7 +140,7 @@ func (b *AdminBleveIndex) GeoSearch(f *geojson.Feature) (map[string][]*geojson.F log.Debug().Any("region", b.Data[r.ID].Properties.MustString("nom")).Str("type", b.Data[r.ID].Geometry.GeoJSONType()).Msg("hit") } - return map[string][]*geojson.Feature{}, nil + return map[string]*geojson.Feature{}, nil } func (s *AdminBleveIndex) Find(layer, id string) (*geojson.Feature, error) { diff --git a/handlers/admin/memory_rtree.go b/handlers/admin/memory_rtree.go index 24e7872..fd76c80 100644 --- a/handlers/admin/memory_rtree.go +++ b/handlers/admin/memory_rtree.go @@ -27,10 +27,18 @@ func NewAdminMemoryRTreeIndex(cfg *viper.Viper) (*AdminMemoryRTreeIndex, error) } layers := cfg.GetStringMapString("data.layers") + + // var wg sync.WaitGroup for layer, url := range layers { - storage.IndexLayer(layer, url) + // wg.Add(1) + go func() { + // defer wg.Done() + storage.IndexLayer(layer, url) + }() } + // wg.Wait() + return storage, nil } @@ -62,32 +70,33 @@ func (s *AdminMemoryRTreeIndex) IndexLayer(layer, url string) error { s.Indexes[layer].Insert(bound.Min, bound.Max, id) s.Documents[layer][id] = feature } + log.Info().Str("layer", layer).Msg("finished indexing") return nil } -func (s *AdminMemoryRTreeIndex) GeoSearch(feature *geojson.Feature) (map[string][]*geojson.Feature, error) { - results := map[string][]*geojson.Feature{} +func (s *AdminMemoryRTreeIndex) GeoSearch(feature *geojson.Feature) (map[string]*geojson.Feature, error) { + results := map[string]*geojson.Feature{} point := feature.Point() for _, layer := range s.Layers { - results[layer] = []*geojson.Feature{} rt := s.Indexes[layer] rt.Search([2]float64{point.Lon(), point.Lat()}, [2]float64{point.Lon(), point.Lat()}, func(min, max [2]float64, id any) bool { resp, found := s.Documents[layer][id.(string)] if !found { - return false + log.Error().Msg("document not found") + return true } if poly, ok := resp.Geometry.(orb.Polygon); ok { if planar.PolygonContains(poly, point) { - results[layer] = append(results[layer], resp) - return true + results[layer] = resp + return false } } else if multipoly, ok := resp.Geometry.(orb.MultiPolygon); ok { if planar.MultiPolygonContains(multipoly, point) { - results[layer] = append(results[layer], resp) - return true + results[layer] = resp + return false } } - return false + return true }) } return results, nil diff --git a/handlers/admin/storage.go b/handlers/admin/storage.go index 0ebfe75..afc4898 100644 --- a/handlers/admin/storage.go +++ b/handlers/admin/storage.go @@ -8,7 +8,7 @@ import ( ) type AdminIndex interface { - GeoSearch(*geojson.Feature) (map[string][]*geojson.Feature, error) + GeoSearch(*geojson.Feature) (map[string]*geojson.Feature, error) Find(layer, id string) (*geojson.Feature, error) } diff --git a/main.go b/main.go index 35486bb..b83aa9f 100644 --- a/main.go +++ b/main.go @@ -31,9 +31,7 @@ func main() { geo := geojson.NewFeature(orb.Point{7.11667, 43.583328}) res, err := adminIdx.GeoSearch(geo) - for layer, features := range res { - for _, f := range features { - log.Info().Str("layer", layer).Str("code", f.Properties.MustString("code")).Str("nom", f.Properties.MustString("nom")).Msg("result") - } + for layer, f := range res { + log.Info().Str("layer", layer).Str("code", f.Properties.MustString("code")).Str("nom", f.Properties.MustString("nom")).Msg("result") } }