From d439c216234779a85ba3a41d895cd4daec879702 Mon Sep 17 00:00:00 2001 From: Oliver Tonnhofer Date: Thu, 11 May 2017 13:32:28 +0200 Subject: [PATCH] rename Table/ColumnSpec to row/valueBuilder --- mapping/columns.go | 48 ------------------------------- mapping/mapping.go | 22 +++++++-------- mapping/matcher.go | 70 ++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 70 insertions(+), 70 deletions(-) diff --git a/mapping/columns.go b/mapping/columns.go index 5f8108d..b6ef72d 100644 --- a/mapping/columns.go +++ b/mapping/columns.go @@ -53,54 +53,6 @@ type MakeMakeValue func(string, ColumnType, config.Column) (MakeValue, error) type Key string type Value string -type ColumnSpec struct { - Key Key - Type ColumnType -} - -func (f *ColumnSpec) Value(elem *element.OSMElem, geom *geom.Geometry, match Match) interface{} { - if f.Type.Func != nil { - return f.Type.Func(elem.Tags[string(f.Key)], elem, geom, match) - } - return nil -} - -func (f *ColumnSpec) MemberValue(rel *element.Relation, member *element.Member, geom *geom.Geometry, match Match) interface{} { - if f.Type.Func != nil { - if f.Type.FromMember { - if member.Elem == nil { - return nil - } - return f.Type.Func(member.Elem.Tags[string(f.Key)], member.Elem, geom, match) - } - return f.Type.Func(rel.Tags[string(f.Key)], &rel.OSMElem, geom, match) - } - if f.Type.MemberFunc != nil { - return f.Type.MemberFunc(rel, member, match) - } - return nil -} - -type TableSpec struct { - columns []ColumnSpec -} - -func (t *TableSpec) MakeRow(elem *element.OSMElem, geom *geom.Geometry, match Match) []interface{} { - var row []interface{} - for _, column := range t.columns { - row = append(row, column.Value(elem, geom, match)) - } - return row -} - -func (t *TableSpec) MakeMemberRow(rel *element.Relation, member *element.Member, geom *geom.Geometry, match Match) []interface{} { - var row []interface{} - for _, column := range t.columns { - row = append(row, column.MemberValue(rel, member, geom, match)) - } - return row -} - type ColumnType struct { Name string GoType string diff --git a/mapping/mapping.go b/mapping/mapping.go index 3750c33..0e8d6e9 100644 --- a/mapping/mapping.go +++ b/mapping/mapping.go @@ -10,8 +10,6 @@ import ( "gopkg.in/yaml.v2" ) -type ElementFilter func(tags element.Tags, key Key, closed bool) bool - type orderedDestTable struct { DestTable order int @@ -143,26 +141,26 @@ func (m *Mapping) mappings(tableType TableType, mappings TagTableMapping) { } } -func (m *Mapping) tables(tableType TableType) map[string]*TableSpec { - result := make(map[string]*TableSpec) +func (m *Mapping) tables(tableType TableType) map[string]*rowBuilder { + result := make(map[string]*rowBuilder) for name, t := range m.Conf.Tables { if TableType(t.Type) == tableType || TableType(t.Type) == GeometryTable { - result[name] = makeTableSpec(t) + result[name] = makeRowBuilder(t) } } return result } -func makeTableSpec(tbl *config.Table) *TableSpec { - result := TableSpec{} +func makeRowBuilder(tbl *config.Table) *rowBuilder { + result := rowBuilder{} for _, mappingColumn := range tbl.Columns { - column := ColumnSpec{} - column.Key = Key(mappingColumn.Key) + column := valueBuilder{} + column.key = Key(mappingColumn.Key) columnType := MakeColumnType(mappingColumn) if columnType != nil { - column.Type = *columnType + column.colType = *columnType } else { log.Warn("unhandled type: ", mappingColumn.Type) } @@ -222,7 +220,9 @@ func (m *Mapping) extraTags(tableType TableType, tags map[Key]bool) { tags["area"] = true } -type tableElementFilters map[string][]ElementFilter +type elementFilter func(tags element.Tags, key Key, closed bool) bool + +type tableElementFilters map[string][]elementFilter func (m *Mapping) addTypedFilters(tableType TableType, filters tableElementFilters) { var areaTags map[Key]struct{} diff --git a/mapping/matcher.go b/mapping/matcher.go index 309fb6d..15c38f0 100644 --- a/mapping/matcher.go +++ b/mapping/matcher.go @@ -103,23 +103,23 @@ type RelWayMatcher interface { } type Match struct { - Key string - Value string - Table DestTable - tableSpec *TableSpec + Key string + Value string + Table DestTable + builder *rowBuilder } func (m *Match) Row(elem *element.OSMElem, geom *geom.Geometry) []interface{} { - return m.tableSpec.MakeRow(elem, geom, *m) + return m.builder.MakeRow(elem, geom, *m) } func (m *Match) MemberRow(rel *element.Relation, member *element.Member, geom *geom.Geometry) []interface{} { - return m.tableSpec.MakeMemberRow(rel, member, geom, *m) + return m.builder.MakeMemberRow(rel, member, geom, *m) } type tagMatcher struct { mappings TagTableMapping - tables map[string]*TableSpec + tables map[string]*rowBuilder filters tableElementFilters relFilters tableElementFilters matchAreas bool @@ -165,10 +165,10 @@ func (tm *tagMatcher) match(tags element.Tags, closed bool, relation bool) []Mat for _, t := range tbls { this := orderedMatch{ Match: Match{ - Key: k, - Value: v, - Table: t.DestTable, - tableSpec: tm.tables[t.Name], + Key: k, + Value: v, + Table: t.DestTable, + builder: tm.tables[t.Name], }, order: t.order, } @@ -227,6 +227,54 @@ func (tm *tagMatcher) match(tags element.Tags, closed bool, relation bool) []Mat return matches } +type valueBuilder struct { + key Key + colType ColumnType +} + +func (v *valueBuilder) Value(elem *element.OSMElem, geom *geom.Geometry, match Match) interface{} { + if v.colType.Func != nil { + return v.colType.Func(elem.Tags[string(v.key)], elem, geom, match) + } + return nil +} + +func (v *valueBuilder) MemberValue(rel *element.Relation, member *element.Member, geom *geom.Geometry, match Match) interface{} { + if v.colType.Func != nil { + if v.colType.FromMember { + if member.Elem == nil { + return nil + } + return v.colType.Func(member.Elem.Tags[string(v.key)], member.Elem, geom, match) + } + return v.colType.Func(rel.Tags[string(v.key)], &rel.OSMElem, geom, match) + } + if v.colType.MemberFunc != nil { + return v.colType.MemberFunc(rel, member, match) + } + return nil +} + +type rowBuilder struct { + columns []valueBuilder +} + +func (r *rowBuilder) MakeRow(elem *element.OSMElem, geom *geom.Geometry, match Match) []interface{} { + var row []interface{} + for _, column := range r.columns { + row = append(row, column.Value(elem, geom, match)) + } + return row +} + +func (r *rowBuilder) MakeMemberRow(rel *element.Relation, member *element.Member, geom *geom.Geometry, match Match) []interface{} { + var row []interface{} + for _, column := range r.columns { + row = append(row, column.MemberValue(rel, member, geom, match)) + } + return row +} + // SelectRelationPolygons returns a slice of all members that are already // imported as part of the relation. // Outer members are "imported" if they share the same destination table. Inner members