Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

implement changes from "fetch-by-bbox" branch #334

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package de.westnordost.streetcomplete.data.osm.geometry

import de.westnordost.streetcomplete.data.ApplicationDbTestCase
import de.westnordost.streetcomplete.data.osm.mapdata.BoundingBox
import de.westnordost.streetcomplete.data.osm.mapdata.ElementKey
import de.westnordost.streetcomplete.data.osm.mapdata.ElementType
import de.westnordost.streetcomplete.data.osm.mapdata.LatLon
Expand Down Expand Up @@ -60,77 +59,6 @@ class ElementGeometryDaoTest : ApplicationDbTestCase() {
assertNull(dao.get(ElementType.NODE, 1))
}

@Test fun getAllKeys() {
dao.putAll(listOf(
ElementGeometryEntry(ElementType.RELATION, 1, createPoint(0.0, 0.0)),
ElementGeometryEntry(ElementType.WAY, 2, createPoint(1.0, 2.0)),
// these are outside
ElementGeometryEntry(ElementType.RELATION, 3, createPoint(-0.5, 1.0)),
ElementGeometryEntry(ElementType.WAY, 4, createPoint(1.5, 1.0)),
))
nodeDao.putAll(listOf(
Node(2, LatLon(0.5, 1.0)),
// these are outside
Node(5, LatLon(0.5, -0.5)),
Node(6, LatLon(0.5, 2.5))
))

assertTrue(dao.getAllKeys(BoundingBox(0.0, 0.0, 1.0, 2.0))
.containsExactlyInAnyOrder(listOf(
ElementKey(ElementType.RELATION, 1),
ElementKey(ElementType.WAY, 2),
ElementKey(ElementType.NODE, 2),
)))
}

@Test fun getAllEntriesForBBox() {
val insideElements = listOf(
ElementGeometryEntry(ElementType.RELATION, 1, createPoint(0.0, 0.0)),
ElementGeometryEntry(ElementType.WAY, 2, createPoint(1.0, 2.0)),
)
val insideNodes = listOf(Node(2, LatLon(0.5, 1.0)))

val outsideElements = listOf(
ElementGeometryEntry(ElementType.RELATION, 3, createPoint(-0.5, 1.0)),
ElementGeometryEntry(ElementType.WAY, 4, createPoint(1.5, 1.0)),
)
val outsideNodes = listOf(
Node(5, LatLon(0.5, -0.5)),
Node(6, LatLon(0.5, 2.5))
)

dao.putAll(insideElements + outsideElements)
nodeDao.putAll(insideNodes + outsideNodes)

assertTrue(dao.getAllEntries(BoundingBox(0.0, 0.0, 1.0, 2.0))
.containsExactlyInAnyOrder(insideElements +
insideNodes.map { ElementGeometryEntry(ElementType.NODE, it.id, ElementPointGeometry(it.position)) }
))
}

@Test fun getAllEntriesWithoutNodesForBBox() {
val insideElements = listOf(
ElementGeometryEntry(ElementType.RELATION, 1, createPoint(0.0, 0.0)),
ElementGeometryEntry(ElementType.WAY, 2, createPoint(1.0, 2.0)),
)
val insideNodes = listOf(Node(2, LatLon(0.5, 1.0)))

val outsideElements = listOf(
ElementGeometryEntry(ElementType.RELATION, 3, createPoint(-0.5, 1.0)),
ElementGeometryEntry(ElementType.WAY, 4, createPoint(1.5, 1.0)),
)
val outsideNodes = listOf(
Node(5, LatLon(0.5, -0.5)),
Node(6, LatLon(0.5, 2.5))
)

dao.putAll(insideElements + outsideElements)
nodeDao.putAll(insideNodes + outsideNodes)

assertTrue(dao.getAllEntriesWithoutNodes(BoundingBox(0.0, 0.0, 1.0, 2.0))
.containsExactlyInAnyOrder(insideElements))
}

@Test fun getAllEntriesForElementKeys() {
val entries = listOf(
ElementGeometryEntry(ElementType.WAY, 1, createSimpleGeometry()),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package de.westnordost.streetcomplete.data.osm.geometry

import de.westnordost.streetcomplete.data.ApplicationDbTestCase
import de.westnordost.streetcomplete.data.osm.mapdata.BoundingBox
import de.westnordost.streetcomplete.data.osm.mapdata.ElementType
import de.westnordost.streetcomplete.data.osm.mapdata.LatLon
import de.westnordost.streetcomplete.ktx.containsExactlyInAnyOrder
Expand Down Expand Up @@ -52,38 +51,6 @@ class RelationGeometryDaoTest : ApplicationDbTestCase() {
assertNotNull(dao.get(1))
}

@Test fun getAllIds() {
dao.putAll(listOf(
ElementGeometryEntry(ElementType.RELATION, 1, createPoint(0.0, 0.0)),
ElementGeometryEntry(ElementType.RELATION, 2, createPoint(1.0, 2.0)),
// these are outside
ElementGeometryEntry(ElementType.RELATION, 3, createPoint(-0.5, 1.0)),
ElementGeometryEntry(ElementType.RELATION, 4, createPoint(1.5, 1.0)),
ElementGeometryEntry(ElementType.RELATION, 5, createPoint(0.5, -0.5)),
ElementGeometryEntry(ElementType.RELATION, 6, createPoint(0.5, 2.5))
))

assertTrue(dao.getAllIds(BoundingBox(0.0, 0.0, 1.0, 2.0))
.containsExactlyInAnyOrder(listOf(1L,2L)))
}

@Test fun getAllEntriesForBBox() {
val insideElements = listOf(
ElementGeometryEntry(ElementType.RELATION, 1, createPoint(0.0, 0.0)),
ElementGeometryEntry(ElementType.RELATION, 2, createPoint(1.0, 2.0)),
)
val outsideElements = listOf(
ElementGeometryEntry(ElementType.RELATION, 3, createPoint(-0.5, 1.0)),
ElementGeometryEntry(ElementType.RELATION, 4, createPoint(1.5, 1.0)),
ElementGeometryEntry(ElementType.RELATION, 5, createPoint(0.5, -0.5)),
ElementGeometryEntry(ElementType.RELATION, 6, createPoint(0.5, 2.5))
)
dao.putAll(insideElements + outsideElements)

assertTrue(dao.getAllEntries(BoundingBox(0.0, 0.0, 1.0, 2.0))
.containsExactlyInAnyOrder(insideElements))
}

@Test fun getAllEntriesForElementIds() {
val entries = listOf(
ElementGeometryEntry(ElementType.RELATION, 1, createSimpleGeometry()),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,38 +52,6 @@ class WayGeometryDaoTest : ApplicationDbTestCase() {
assertNotNull(dao.get(1))
}

@Test fun getAllIds() {
dao.putAll(listOf(
ElementGeometryEntry(ElementType.WAY, 1, createPoint(0.0, 0.0)),
ElementGeometryEntry(ElementType.WAY, 2, createPoint(1.0, 2.0)),
// these are outside
ElementGeometryEntry(ElementType.WAY, 3, createPoint(-0.5, 1.0)),
ElementGeometryEntry(ElementType.WAY, 4, createPoint(1.5, 1.0)),
ElementGeometryEntry(ElementType.WAY, 5, createPoint(0.5, -0.5)),
ElementGeometryEntry(ElementType.WAY, 6, createPoint(0.5, 2.5))
))

assertTrue(dao.getAllIds(BoundingBox(0.0, 0.0, 1.0, 2.0))
.containsExactlyInAnyOrder(listOf(1L, 2L)))
}

@Test fun getAllEntriesForBBox() {
val insideElements = listOf(
ElementGeometryEntry(ElementType.WAY, 1, createPoint(0.0, 0.0)),
ElementGeometryEntry(ElementType.WAY, 2, createPoint(1.0, 2.0)),
)
val outsideElements = listOf(
ElementGeometryEntry(ElementType.WAY, 3, createPoint(-0.5, 1.0)),
ElementGeometryEntry(ElementType.WAY, 4, createPoint(1.5, 1.0)),
ElementGeometryEntry(ElementType.WAY, 5, createPoint(0.5, -0.5)),
ElementGeometryEntry(ElementType.WAY, 6, createPoint(0.5, 2.5))
)
dao.putAll(insideElements + outsideElements)

assertTrue(dao.getAllEntries(BoundingBox(0.0, 0.0, 1.0, 2.0))
.containsExactlyInAnyOrder(insideElements))
}

@Test fun getAllEntriesForElementIds() {
val entries = listOf(
ElementGeometryEntry(ElementType.WAY, 1, createSimpleGeometry()),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,28 +108,13 @@ class NodeDaoTest : ApplicationDbTestCase() {
assertTrue(ids.containsExactlyInAnyOrder(inside.map { it.id }))
}

@Test fun getAllEntriesForBBox() {
val inside = listOf(
nd(1, lat = 0.0, lon = 0.0),
nd(2, lat = 0.5, lon = 1.5),
nd(3, lat = 1.0, lon = 1.0)
)
val outside = listOf(
nd(4, lat = -1.0, lon = 1.0),
nd(5, lat = 0.3, lon = 2.1)
)
dao.putAll(inside + outside)

val elementGeometries = dao.getAllEntries(BoundingBox(0.0, 0.0, 1.0, 2.0))
assertTrue(elementGeometries.map { it.elementId }.containsExactlyInAnyOrder(inside.map { it.id }))
}

@Test fun getAllEntriesForIds() {
val e1 = nd(1)
val e2 = nd(2)
val e3 = nd(3)
dao.putAll(listOf(e1, e2, e3))
assertEquals(listOf(e1, e2).map { it.id }, dao.getAllEntries(listOf(1, 2, 4)).map { it.elementId })
assertEquals(listOf(e1, e2).map { it.id }, dao.getAllAsGeometryEntries(listOf(1, 2, 4)).map { it.elementId })
}

@Test fun getAllForBBox() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,15 @@ class RelationDaoTest : ApplicationDbTestCase() {
listOf(e3),
dao.getAllForRelation(3).sortedBy { it.id }
)

assertEquals(
listOf(e1, e2, e3),
dao.getAllForElements(
nodeIds = listOf(0),
wayIds = listOf(1),
relationIds = listOf(3)
).sortedBy { it.id }
)
}

@Test fun getUnusedAndOldIds() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,10 @@ class WayDaoTest : ApplicationDbTestCase() {
listOf(e1, e2),
dao.getAllForNode(1).sortedBy { it.id }
)
assertEquals(
listOf(e2, e3),
dao.getAllForNodes(listOf(5,8)).sortedBy { it.id }
)
}

@Test fun getUnusedAndOldIds() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,7 @@ class StreetCompleteSQLiteOpenHelper(context: Context, dbName: String) :

// OSM map data
db.execSQL(WayGeometryTable.CREATE)
db.execSQL(WayGeometryTable.SPATIAL_INDEX_CREATE)
db.execSQL(RelationGeometryTable.CREATE)
db.execSQL(RelationGeometryTable.SPATIAL_INDEX_CREATE)

db.execSQL(NodeTable.CREATE)
db.execSQL(NodeTable.SPATIAL_INDEX_CREATE)
Expand Down Expand Up @@ -129,9 +127,7 @@ class StreetCompleteSQLiteOpenHelper(context: Context, dbName: String) :
if (oldVersion <= 4 && newVersion > 4) {
db.execSQL(NodeTable.SPATIAL_INDEX_CREATE)
db.execSQL(WayGeometryTable.CREATE)
db.execSQL(WayGeometryTable.SPATIAL_INDEX_CREATE)
db.execSQL(RelationGeometryTable.CREATE)
db.execSQL(RelationGeometryTable.SPATIAL_INDEX_CREATE)
val oldGeometryTableName = "elements_geometry"
val oldTypeName = "element_type"
val oldIdName = "element_id"
Expand All @@ -141,21 +137,13 @@ class StreetCompleteSQLiteOpenHelper(context: Context, dbName: String) :
${WayGeometryTable.Columns.GEOMETRY_POLYLINES},
${WayGeometryTable.Columns.GEOMETRY_POLYGONS},
${WayGeometryTable.Columns.CENTER_LATITUDE},
${WayGeometryTable.Columns.CENTER_LONGITUDE},
${WayGeometryTable.Columns.MIN_LATITUDE},
${WayGeometryTable.Columns.MAX_LATITUDE},
${WayGeometryTable.Columns.MIN_LONGITUDE},
${WayGeometryTable.Columns.MAX_LONGITUDE}
${WayGeometryTable.Columns.CENTER_LONGITUDE}
) SELECT
$oldIdName,
${WayGeometryTable.Columns.GEOMETRY_POLYLINES},
${WayGeometryTable.Columns.GEOMETRY_POLYGONS},
${WayGeometryTable.Columns.CENTER_LATITUDE},
${WayGeometryTable.Columns.CENTER_LONGITUDE},
${WayGeometryTable.Columns.MIN_LATITUDE},
${WayGeometryTable.Columns.MAX_LATITUDE},
${WayGeometryTable.Columns.MIN_LONGITUDE},
${WayGeometryTable.Columns.MAX_LONGITUDE}
${WayGeometryTable.Columns.CENTER_LONGITUDE}
FROM
$oldGeometryTableName
WHERE
Expand All @@ -168,21 +156,13 @@ class StreetCompleteSQLiteOpenHelper(context: Context, dbName: String) :
${RelationGeometryTable.Columns.GEOMETRY_POLYLINES},
${RelationGeometryTable.Columns.GEOMETRY_POLYGONS},
${RelationGeometryTable.Columns.CENTER_LATITUDE},
${RelationGeometryTable.Columns.CENTER_LONGITUDE},
${RelationGeometryTable.Columns.MIN_LATITUDE},
${RelationGeometryTable.Columns.MAX_LATITUDE},
${RelationGeometryTable.Columns.MIN_LONGITUDE},
${RelationGeometryTable.Columns.MAX_LONGITUDE}
${RelationGeometryTable.Columns.CENTER_LONGITUDE}
) SELECT
$oldIdName,
${RelationGeometryTable.Columns.GEOMETRY_POLYLINES},
${RelationGeometryTable.Columns.GEOMETRY_POLYGONS},
${RelationGeometryTable.Columns.CENTER_LATITUDE},
${RelationGeometryTable.Columns.CENTER_LONGITUDE},
${RelationGeometryTable.Columns.MIN_LATITUDE},
${RelationGeometryTable.Columns.MAX_LATITUDE},
${RelationGeometryTable.Columns.MIN_LONGITUDE},
${RelationGeometryTable.Columns.MAX_LONGITUDE}
${RelationGeometryTable.Columns.CENTER_LONGITUDE}
FROM
$oldGeometryTableName
WHERE
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package de.westnordost.streetcomplete.data.osm.geometry

import de.westnordost.streetcomplete.data.osm.mapdata.BoundingBox
import de.westnordost.streetcomplete.data.osm.mapdata.ElementKey
import de.westnordost.streetcomplete.data.osm.mapdata.ElementType
import de.westnordost.streetcomplete.data.osm.mapdata.NodeDao
Expand Down Expand Up @@ -39,23 +38,9 @@ class ElementGeometryDao(
relationGeometryDao.putAll(entries.filter { it.elementType == RELATION })
}

fun getAllKeys(bbox: BoundingBox): List<ElementKey> {
val results = mutableListOf<ElementKey>()
results.addAll(nodeDao.getAllIds(bbox).map { ElementKey(NODE, it) })
results.addAll(wayGeometryDao.getAllIds(bbox).map { ElementKey(WAY, it) })
results.addAll(relationGeometryDao.getAllIds(bbox).map { ElementKey(RELATION, it) })
return results
}

fun getAllEntries(bbox: BoundingBox): List<ElementGeometryEntry> =
nodeDao.getAllEntries(bbox) + getAllEntriesWithoutNodes(bbox)

fun getAllEntriesWithoutNodes(bbox: BoundingBox): List<ElementGeometryEntry> =
wayGeometryDao.getAllEntries(bbox) + relationGeometryDao.getAllEntries(bbox)

fun getAllEntries(keys: Collection<ElementKey>): List<ElementGeometryEntry> {
val results = ArrayList<ElementGeometryEntry>(keys.size)
results.addAll(nodeDao.getAllEntries(keys.filterByType(NODE)))
results.addAll(nodeDao.getAllAsGeometryEntries(keys.filterByType(NODE)))
results.addAll(wayGeometryDao.getAllEntries(keys.filterByType(WAY)))
results.addAll(relationGeometryDao.getAllEntries(keys.filterByType(RELATION)))
return results
Expand Down
Loading