fix: Fix geometry parsing
This commit is contained in:
@@ -125,12 +125,15 @@ func (r *stubDatasetRepo) MarkConverted(_ context.Context, id uuid.UUID, cogKey
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *stubDatasetRepo) SetProperties(_ context.Context, id uuid.UUID, properties []byte) error {
|
||||
func (r *stubDatasetRepo) SetProperties(_ context.Context, id uuid.UUID, properties, geometry []byte) error {
|
||||
d, ok := r.store[id]
|
||||
if !ok {
|
||||
return domain.ErrNotFound
|
||||
}
|
||||
d.Properties = properties
|
||||
if len(geometry) > 0 {
|
||||
d.Geometry = geometry
|
||||
}
|
||||
d.Status = domain.DatasetStatusReady
|
||||
r.store[id] = d
|
||||
return nil
|
||||
@@ -192,10 +195,12 @@ func (s *stubEnqueuer) EnqueueConvert(_ context.Context, id uuid.UUID) error {
|
||||
|
||||
// stubConverter records raster conversions.
|
||||
type stubConverter struct {
|
||||
cogCalls int
|
||||
toCOGErr error
|
||||
footprint []byte
|
||||
footprintFn func(src string) ([]byte, error)
|
||||
cogCalls int
|
||||
toCOGErr error
|
||||
footprint []byte
|
||||
footprintFn func(src string) ([]byte, error)
|
||||
vectorGeom []byte
|
||||
vectorGeomFn func(src string) ([]byte, error)
|
||||
}
|
||||
|
||||
func (c *stubConverter) ToCOG(_ context.Context, _, dst string) error {
|
||||
@@ -213,6 +218,13 @@ func (c *stubConverter) Footprint(_ context.Context, src string) ([]byte, error)
|
||||
return c.footprint, nil
|
||||
}
|
||||
|
||||
func (c *stubConverter) VectorGeometry(_ context.Context, src string) ([]byte, error) {
|
||||
if c.vectorGeomFn != nil {
|
||||
return c.vectorGeomFn(src)
|
||||
}
|
||||
return c.vectorGeom, nil
|
||||
}
|
||||
|
||||
var (
|
||||
noopParser ColumnParser = func(string, []byte) ([]domain.AttributeColumn, error) { return nil, nil }
|
||||
noopRowParser RowParser = func(string, []byte) ([]map[string]string, error) { return nil, nil }
|
||||
@@ -428,7 +440,9 @@ func TestDatasetService_ExtractProperties(t *testing.T) {
|
||||
{"name": "Almaty", "pop": "2000"},
|
||||
}
|
||||
rp := RowParser(func(string, []byte) ([]map[string]string, error) { return rows, nil })
|
||||
svc := NewDatasetService(repo, &stubStore{}, stubCategoryReader{exists: true}, &stubEnqueuer{}, noopParser, rp, &stubConverter{})
|
||||
geom := []byte(`{"type":"GeometryCollection","geometries":[]}`)
|
||||
conv := &stubConverter{vectorGeom: geom}
|
||||
svc := NewDatasetService(repo, &stubStore{}, stubCategoryReader{exists: true}, &stubEnqueuer{}, noopParser, rp, conv)
|
||||
|
||||
if err := svc.ExtractProperties(context.Background(), id); err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
@@ -444,6 +458,40 @@ func TestDatasetService_ExtractProperties(t *testing.T) {
|
||||
if len(parsed) != 2 {
|
||||
t.Fatalf("want 2 rows in properties, got %d", len(parsed))
|
||||
}
|
||||
if string(got.Geometry) != string(geom) {
|
||||
t.Fatalf("want geometry %s, got %s", geom, got.Geometry)
|
||||
}
|
||||
}
|
||||
|
||||
func TestDatasetService_ExtractProperties_GeometryBestEffort(t *testing.T) {
|
||||
id := uuid.New()
|
||||
repo := newStubDatasetRepo()
|
||||
repo.store[id] = domain.Dataset{
|
||||
ID: id, FileType: domain.FileTypeVector,
|
||||
Filename: "d.geojson", StorageKey: "k", Status: domain.DatasetStatusProcessing,
|
||||
}
|
||||
rp := RowParser(func(string, []byte) ([]map[string]string, error) {
|
||||
return []map[string]string{{"name": "Astana"}}, nil
|
||||
})
|
||||
// Geometry extraction fails; the job must still succeed with properties set.
|
||||
conv := &stubConverter{vectorGeomFn: func(string) ([]byte, error) {
|
||||
return nil, errors.New("ogr2ogr boom")
|
||||
}}
|
||||
svc := NewDatasetService(repo, &stubStore{}, stubCategoryReader{exists: true}, &stubEnqueuer{}, noopParser, rp, conv)
|
||||
|
||||
if err := svc.ExtractProperties(context.Background(), id); err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
got := repo.store[id]
|
||||
if got.Status != domain.DatasetStatusReady {
|
||||
t.Fatalf("want ready, got %q", got.Status)
|
||||
}
|
||||
if got.Geometry != nil {
|
||||
t.Fatalf("expected nil geometry on extraction failure, got %s", got.Geometry)
|
||||
}
|
||||
if got.Properties == nil {
|
||||
t.Fatalf("expected properties to be set despite geometry failure")
|
||||
}
|
||||
}
|
||||
|
||||
func TestDatasetService_ExtractProperties_NoTable(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user