From 0713ea2b68a075cfd644f654e0ea783edb16ade6 Mon Sep 17 00:00:00 2001 From: kriz Date: Tue, 6 Jul 2021 04:07:19 +0200 Subject: [PATCH 1/5] Add JSONB column support --- database/postgis/columns.go | 1 + mapping/columns.go | 30 +++++++++++++++++++++++ mapping/columns_test.go | 48 +++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) diff --git a/database/postgis/columns.go b/database/postgis/columns.go index b062ee49..118e5cc1 100644 --- a/database/postgis/columns.go +++ b/database/postgis/columns.go @@ -74,6 +74,7 @@ func init() { "int64": &simpleColumnType{"BIGINT"}, "float32": &simpleColumnType{"REAL"}, "hstore_string": &simpleColumnType{"HSTORE"}, + "jsonb_string": &simpleColumnType{"JSONB"}, "geometry": &geometryType{"GEOMETRY"}, "validated_geometry": &validatedGeometryType{geometryType{"GEOMETRY"}}, } diff --git a/mapping/columns.go b/mapping/columns.go index 7575adf7..e5d57632 100644 --- a/mapping/columns.go +++ b/mapping/columns.go @@ -1,6 +1,7 @@ package mapping import ( + "encoding/json" "math" "regexp" "strconv" @@ -33,6 +34,7 @@ func init() { "geometry": {"geometry", "geometry", Geometry, nil, nil, false}, "validated_geometry": {"validated_geometry", "validated_geometry", Geometry, nil, nil, false}, "hstore_tags": {"hstore_tags", "hstore_string", nil, MakeHStoreString, nil, false}, + "jsonb_tags": {"jsonb_tags", "jsonb_string", nil, MakeJSONBString, nil, false}, "wayzorder": {"wayzorder", "int32", nil, MakeWayZOrder, nil, false}, "pseudoarea": {"pseudoarea", "float32", nil, MakePseudoArea, nil, false}, "area": {"area", "float32", Area, nil, nil, false}, @@ -195,6 +197,34 @@ func MakeHStoreString(columnName string, columnType ColumnType, column config.Co return hstoreString, nil } + +func MakeJSONBString(columnName string, columnType ColumnType, column config.Column) (MakeValue, error) { + var includeAll bool + var err error + var include map[string]int + if _, ok := column.Args["include"]; !ok { + includeAll = true + } else { + include, err = decodeEnumArg(column, "include") + if err != nil { + return nil, err + } + + } + + jsonbString := func(val string, elem *osm.Element, geom *geom.Geometry, match Match) interface{} { + tags := make(map[string]string) + for k, v := range elem.Tags { + if includeAll || include[k] != 0 { + tags[k] = v + } + } + json, _ := json.Marshal(tags) + return string(json); + } + return jsonbString, nil +} + func MakeWayZOrder(columnName string, columnType ColumnType, column config.Column) (MakeValue, error) { if _, ok := column.Args["ranks"]; !ok { return DefaultWayZOrder, nil diff --git a/mapping/columns_test.go b/mapping/columns_test.go index 5a930d9f..aa83df28 100644 --- a/mapping/columns_test.go +++ b/mapping/columns_test.go @@ -352,3 +352,51 @@ func TestHstoreString(t *testing.T) { } } + +func TestJSONBString(t *testing.T) { + column := config.Column{ + Name: "tags", + Type: "jsonb_tags", + } + jsonbAll, err := MakeJSONBString("tags", ColumnType{}, column) + if err != nil { + t.Fatal(err) + } + + column = config.Column{ + Name: "tags", + Type: "jsonb_tags", + Args: map[string]interface{}{"include": []interface{}{"key1", "key2"}}, + } + jsonbInclude, err := MakeJSONBString("tags", ColumnType{}, column) + if err != nil { + t.Fatal(err) + } + + for _, test := range []struct { + column MakeValue + tags osm.Tags + expected interface{} + }{ + {jsonbAll, osm.Tags{}, `{}`}, + {jsonbAll, osm.Tags{"key": "value"}, `{"key":"value"}`}, + {jsonbAll, osm.Tags{`"key"`: `'"value"'`}, `{"\"key\"":"'\"value\"'"}`}, + {jsonbAll, osm.Tags{`\`: `\\\\`}, `{"\\":"\\\\\\\\"}`}, + {jsonbAll, osm.Tags{"Ümlåütê:": ""}, `{"Ümlåütê:":""}`}, + {jsonbInclude, osm.Tags{"key": "value"}, `{}`}, + {jsonbInclude, osm.Tags{"key1": "value"}, `{"key1":"value"}`}, + {jsonbInclude, osm.Tags{"key": "value", "key2": "value"}, `{"key2":"value"}`}, + } { + actual := test.column("", &osm.Element{Tags: test.tags}, nil, Match{}) + if actual.(string) != test.expected { + t.Errorf("%#v != %#v for %#v", actual, test.expected, test.tags) + } + } + + actual := jsonbAll("{}", &osm.Element{Tags: osm.Tags{"key1": "value", "key2": "value"}}, nil, Match{}) + // check mutliple tags, can be in any order + if actual.(string) != `{"key1":"value","key2":"value"}` && actual.(string) != `{"key2":"value","key1":"value"}` { + t.Error("unexpected value", actual) + } + +} \ No newline at end of file From 3bd97caee4ef91929f3c8370a9899d0d9c42a594 Mon Sep 17 00:00:00 2001 From: Kristjan Date: Wed, 7 Jul 2021 15:37:01 +0200 Subject: [PATCH 2/5] Update go.mod --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 9c5f238c..d06bc553 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/omniscale/imposm3 +module github.com/Krizz/imposm3 go 1.12 From 160ca665a61b6d9261436e4bbd2c109e8ae55f49 Mon Sep 17 00:00:00 2001 From: Kristjan Date: Wed, 7 Jul 2021 16:02:10 +0200 Subject: [PATCH 3/5] Update go.mod --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index d06bc553..9c5f238c 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/Krizz/imposm3 +module github.com/omniscale/imposm3 go 1.12 From faa285a072dcf7689a50f94b11628c6dcf49fcf1 Mon Sep 17 00:00:00 2001 From: Kristjan Date: Wed, 7 Jul 2021 16:05:19 +0200 Subject: [PATCH 4/5] Update go.mod --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 9c5f238c..d06bc553 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/omniscale/imposm3 +module github.com/Krizz/imposm3 go 1.12 From f069907dfa221917db178006c465fa9438f87475 Mon Sep 17 00:00:00 2001 From: Kristjan Date: Thu, 16 Feb 2023 12:03:40 +0100 Subject: [PATCH 5/5] Update go.mod --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index d06bc553..9c5f238c 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/Krizz/imposm3 +module github.com/omniscale/imposm3 go 1.12