rename Table/ColumnSpec to row/valueBuilder

master
Oliver Tonnhofer 2017-05-11 13:32:28 +02:00
parent 677b306d22
commit d439c21623
3 changed files with 70 additions and 70 deletions

View File

@ -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

View File

@ -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{}

View File

@ -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