summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2016-04-27 12:10:00 -0700
committerMinh Nguyễn <mxn@1ec5.org>2016-04-27 13:41:29 -0700
commitb39f22e6b6bbea745be5bbac700040001af86baa (patch)
tree5d9e2aaa4f1b63c7e39c0883aa5e0540b33a59b6
parenta706a2a48d6ca2076c9c81a0cb0c088ae50d1496 (diff)
downloadqtlocation-mapboxgl-b39f22e6b6bbea745be5bbac700040001af86baa.tar.gz
[core] Refactor getRegionCompletedStatus; add completedTileCount; add tests
-rw-r--r--include/mbgl/storage/offline.hpp12
-rw-r--r--platform/default/mbgl/storage/offline_database.cpp52
-rw-r--r--platform/default/mbgl/storage/offline_database.hpp3
-rw-r--r--test/storage/offline_database.cpp34
4 files changed, 76 insertions, 25 deletions
diff --git a/include/mbgl/storage/offline.hpp b/include/mbgl/storage/offline.hpp
index 2c6ca05eec..fc0bf7f01e 100644
--- a/include/mbgl/storage/offline.hpp
+++ b/include/mbgl/storage/offline.hpp
@@ -93,12 +93,20 @@ public:
uint64_t completedResourceCount = 0;
/**
- * The cumulative size, in bytes, of all resources (inclusive of tiles) that have been fully downloaded.
+ * The cumulative size, in bytes, of all resources (inclusive of tiles) that have
+ * been fully downloaded.
*/
uint64_t completedResourceSize = 0;
-
+
+ /**
+ * The number of tiles that are known to be required for this region. This is a
+ * subset of `completedResourceCount`.
+ */
+ uint64_t completedTileCount = 0;
+
/**
* The cumulative size, in bytes, of all tiles that have been fully downloaded.
+ * This is a subset of `completedResourceSize`.
*/
uint64_t completedTileSize = 0;
diff --git a/platform/default/mbgl/storage/offline_database.cpp b/platform/default/mbgl/storage/offline_database.cpp
index 9bd731df74..7826d140a1 100644
--- a/platform/default/mbgl/storage/offline_database.cpp
+++ b/platform/default/mbgl/storage/offline_database.cpp
@@ -608,33 +608,39 @@ OfflineRegionDefinition OfflineDatabase::getRegionDefinition(int64_t regionID) {
OfflineRegionStatus OfflineDatabase::getRegionCompletedStatus(int64_t regionID) {
OfflineRegionStatus result;
- Statement stmtRes = getStatement(
- "SELECT COUNT(*), SUM(size) FROM ( "
- " SELECT LENGTH(data) as size "
- " FROM region_resources, resources "
- " WHERE region_id = ?1 "
- " AND resource_id = resources.id "
- ") ");
- stmtRes->bind(1, regionID);
- stmtRes->run();
-
- Statement stmtTile = getStatement(
- "SELECT COUNT(*), SUM(size) FROM ( "
- " SELECT LENGTH(data) as size "
- " FROM region_tiles, tiles "
- " WHERE region_id = ?1 "
- " AND tile_id = tiles.id "
- ") ");
- stmtTile->bind(1, regionID);
- stmtTile->run();
-
- result.completedTileSize = stmtTile->get<int64_t>(1);
- result.completedResourceCount = stmtTile->get<int64_t>(0) + stmtRes->get<int64_t>(0);
- result.completedResourceSize = result.completedTileSize + stmtRes->get<int64_t>(1);
+ std::tie(result.completedResourceCount, result.completedResourceSize)
+ = getCompletedResourceCountAndSize(regionID);
+ std::tie(result.completedTileCount, result.completedTileSize)
+ = getCompletedTileCountAndSize(regionID);
+
+ result.completedResourceCount += result.completedTileCount;
+ result.completedResourceSize += result.completedTileSize;
return result;
}
+std::pair<int64_t, int64_t> OfflineDatabase::getCompletedResourceCountAndSize(int64_t regionID) {
+ Statement stmt = getStatement(
+ "SELECT COUNT(*), SUM(LENGTH(data)) "
+ "FROM region_resources, resources "
+ "WHERE region_id = ?1 "
+ "AND resource_id = resources.id ");
+ stmt->bind(1, regionID);
+ stmt->run();
+ return { stmt->get<int64_t>(0), stmt->get<int64_t>(1) };
+}
+
+std::pair<int64_t, int64_t> OfflineDatabase::getCompletedTileCountAndSize(int64_t regionID) {
+ Statement stmt = getStatement(
+ "SELECT COUNT(*), SUM(LENGTH(data)) "
+ "FROM region_tiles, tiles "
+ "WHERE region_id = ?1 "
+ "AND tile_id = tiles.id ");
+ stmt->bind(1, regionID);
+ stmt->run();
+ return { stmt->get<int64_t>(0), stmt->get<int64_t>(1) };
+}
+
template <class T>
T OfflineDatabase::getPragma(const char * sql) {
Statement stmt = getStatement(sql);
diff --git a/platform/default/mbgl/storage/offline_database.hpp b/platform/default/mbgl/storage/offline_database.hpp
index 1e77d560d4..06c44c80be 100644
--- a/platform/default/mbgl/storage/offline_database.hpp
+++ b/platform/default/mbgl/storage/offline_database.hpp
@@ -92,6 +92,9 @@ private:
// Return value is true iff the resource was previously unused by any other regions.
bool markUsed(int64_t regionID, const Resource&);
+ std::pair<int64_t, int64_t> getCompletedResourceCountAndSize(int64_t regionID);
+ std::pair<int64_t, int64_t> getCompletedTileCountAndSize(int64_t regionID);
+
const std::string path;
std::unique_ptr<::mapbox::sqlite::Database> db;
std::unordered_map<const char *, std::unique_ptr<::mapbox::sqlite::Statement>> statements;
diff --git a/test/storage/offline_database.cpp b/test/storage/offline_database.cpp
index 6833a058a9..0f95e927de 100644
--- a/test/storage/offline_database.cpp
+++ b/test/storage/offline_database.cpp
@@ -449,6 +449,40 @@ TEST(OfflineDatabase, PutFailsWhenEvictionInsuffices) {
EXPECT_FALSE(bool(db.get(Resource::style("http://example.com/big"))));
}
+TEST(OfflineDatabase, GetRegionCompletedStatus) {
+ using namespace mbgl;
+
+ OfflineDatabase db(":memory:");
+ OfflineRegionDefinition definition { "http://example.com/style", LatLngBounds::hull({1, 2}, {3, 4}), 5, 6, 2.0 };
+ OfflineRegionMetadata metadata;
+ OfflineRegion region = db.createRegion(definition, metadata);
+
+ OfflineRegionStatus status1 = db.getRegionCompletedStatus(region.getID());
+ EXPECT_EQ(0, status1.completedResourceCount);
+ EXPECT_EQ(0, status1.completedResourceSize);
+ EXPECT_EQ(0, status1.completedTileCount);
+ EXPECT_EQ(0, status1.completedTileSize);
+
+ Response response;
+ response.data = std::make_shared<std::string>("data");
+
+ uint64_t styleSize = db.putRegionResource(region.getID(), Resource::style("http://example.com/"), response);
+
+ OfflineRegionStatus status2 = db.getRegionCompletedStatus(region.getID());
+ EXPECT_EQ(1, status2.completedResourceCount);
+ EXPECT_EQ(styleSize, status2.completedResourceSize);
+ EXPECT_EQ(0, status2.completedTileCount);
+ EXPECT_EQ(0, status2.completedTileSize);
+
+ uint64_t tileSize = db.putRegionResource(region.getID(), Resource::tile("http://example.com/", 1.0, 0, 0, 0), response);
+
+ OfflineRegionStatus status3 = db.getRegionCompletedStatus(region.getID());
+ EXPECT_EQ(2, status3.completedResourceCount);
+ EXPECT_EQ(styleSize + tileSize, status3.completedResourceSize);
+ EXPECT_EQ(1, status3.completedTileCount);
+ EXPECT_EQ(tileSize, status3.completedTileSize);
+}
+
TEST(OfflineDatabase, OfflineMapboxTileCount) {
using namespace mbgl;