store first and last ids

master
Oliver Tonnhofer 2013-04-27 16:24:48 +02:00
parent 66a5e9d964
commit e8a1d59873
1 changed files with 57 additions and 22 deletions

View File

@ -13,39 +13,53 @@ import (
) )
type Entry struct { type Entry struct {
Pos parser.BlockPosition Pos parser.BlockPosition
NodeId int64 NodeFirst, NodeLast int64
WayId int64 WayFirst, WayLast int64
RelId int64 RelFirst, RelLast int64
} }
func CreateEntry(pos parser.BlockPosition) Entry { func CreateEntry(pos parser.BlockPosition) Entry {
block := parser.ReadPrimitiveBlock(pos) block := parser.ReadPrimitiveBlock(pos)
entry := Entry{pos, -1, -1, -1} entry := Entry{pos, -1, -1, -1, -1, -1, -1}
for _, group := range block.Primitivegroup { for _, group := range block.Primitivegroup {
if entry.NodeId == -1 { if entry.NodeFirst == -1 {
dense := group.GetDense() dense := group.GetDense()
if dense != nil && len(dense.Id) > 0 { if dense != nil && len(dense.Id) > 0 {
entry.NodeId = dense.Id[0] entry.NodeFirst = dense.Id[0]
} }
if len(group.Nodes) > 0 { if len(group.Nodes) > 0 {
entry.NodeId = *group.Nodes[0].Id entry.NodeFirst = *group.Nodes[0].Id
} }
} }
if entry.WayId == -1 { dense := group.GetDense()
if dense != nil && len(dense.Id) > 0 {
var id int64
for _, idDelta := range dense.Id {
id += idDelta
}
entry.NodeLast = id
}
if len(group.Nodes) > 0 {
entry.NodeLast = *group.Nodes[len(group.Nodes)-1].Id
}
if entry.WayFirst == -1 {
if len(group.Ways) > 0 { if len(group.Ways) > 0 {
entry.WayId = *group.Ways[0].Id entry.WayFirst = *group.Ways[0].Id
} }
} }
if entry.RelId == -1 { if len(group.Ways) > 0 {
entry.WayLast = *group.Ways[len(group.Ways)-1].Id
}
if entry.RelFirst == -1 {
if len(group.Relations) > 0 { if len(group.Relations) > 0 {
entry.RelId = *group.Relations[0].Id entry.RelFirst = *group.Relations[0].Id
} }
} }
if entry.NodeId == -1 && entry.WayId == -1 && entry.RelId == -1 { if len(group.Relations) > 0 {
break entry.RelLast = *group.Relations[len(group.Relations)-1].Id
} }
} }
return entry return entry
@ -65,19 +79,36 @@ func initIndex(filename string) *IndexCache {
log.Fatal(err) log.Fatal(err)
} }
stmts := []string{ stmts := []string{
"create table indices (id integer not null primary key, node integer, way integer, rel integer, offset integer, size integer)", `create table indices (
"create index indices_node_idx on indices (node)", id integer not null primary key,
"create index indices_way_idx on indices (way)", node_first integer,
"create index indices_rel_idx on indices (rel)", node_last integer,
way_first integer,
way_last integer,
rel_first integer,
rel_last integer,
offset integer,
size integer
)`,
"create index indices_node_idx on indices (node_first)",
"create index indices_way_idx on indices (way_first)",
"create index indices_rel_idx on indices (rel_first)",
} }
for _, stmt := range stmts { for _, stmt := range stmts {
_, err = db.Exec(stmt) _, err = db.Exec(stmt)
if err != nil { if err != nil {
log.Fatal("%q: %s\n", err, stmt) log.Fatalf("%q: %s\n", err, stmt)
} }
} }
insertStmt, err := db.Prepare("insert into indices (node, way, rel, offset, size) values (?, ?, ?, ?, ?)") insertStmt, err := db.Prepare(`
insert into indices (
node_first, node_last,
way_first, way_last,
rel_first, rel_last,
offset, size
)
values (?, ?, ?, ?, ?, ?, ?, ?)`)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@ -86,7 +117,11 @@ func initIndex(filename string) *IndexCache {
} }
func (index *IndexCache) addEntry(entry Entry) { func (index *IndexCache) addEntry(entry Entry) {
_, err := index.insertStmt.Exec(entry.NodeId, entry.WayId, entry.RelId, entry.Pos.Offset, entry.Pos.Size) _, err := index.insertStmt.Exec(
entry.NodeFirst, entry.NodeLast,
entry.WayFirst, entry.WayLast,
entry.RelFirst, entry.RelLast,
entry.Pos.Offset, entry.Pos.Size)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@ -119,7 +154,7 @@ func main() {
} }
go func() { go func() {
for entry := range indices { for entry := range indices {
//index.addEntry(entry) index.addEntry(entry)
fmt.Printf("%+v\n", entry) fmt.Printf("%+v\n", entry)
} }
}() }()