rename Table/ColumnSpec to row/valueBuilder
parent
677b306d22
commit
d439c21623
|
@ -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
|
||||
|
|
|
@ -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{}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue