forked from facebook/rocksdb
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Summary: This patch stores gps locations in rocksdb. Each object is uniquely identified by an id. Each object has a gps (latitude, longitude) associated with it. The geodb supports looking up an object either by its gps location or by its id. There is a method to retrieve all objects within a circular radius centered at a specified gps location. Test Plan: Simple unit-test attached. Reviewers: leveldb, haobo Reviewed By: haobo CC: leveldb, tecbot, haobo Differential Revision: https://reviews.facebook.net/D15567
- Loading branch information
Showing
5 changed files
with
845 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
// Copyright (c) 2013, Facebook, Inc. All rights reserved. | ||
// This source code is licensed under the BSD-style license found in the | ||
// LICENSE file in the root directory of this source tree. An additional grant | ||
// of patent rights can be found in the PATENTS file in the same directory. | ||
// | ||
|
||
#pragma once | ||
#include <string> | ||
#include <vector> | ||
|
||
#include "utilities/stackable_db.h" | ||
#include "rocksdb/status.h" | ||
|
||
namespace rocksdb { | ||
|
||
// | ||
// Configurable options needed for setting up a Geo database | ||
// | ||
struct GeoDBOptions { | ||
// Backup info and error messages will be written to info_log | ||
// if non-nullptr. | ||
// Default: nullptr | ||
Logger* info_log; | ||
|
||
explicit GeoDBOptions(Logger* _info_log = nullptr):info_log(_info_log) { } | ||
}; | ||
|
||
// | ||
// A position in the earth's geoid | ||
// | ||
class GeoPosition { | ||
public: | ||
double latitude; | ||
double longitude; | ||
|
||
explicit GeoPosition(double la = 0, double lo = 0) : | ||
latitude(la), longitude(lo) { | ||
} | ||
}; | ||
|
||
// | ||
// Description of an object on the Geoid. It is located by a GPS location, | ||
// and is identified by the id. The value associated with this object is | ||
// an opaque string 'value'. Different objects identified by unique id's | ||
// can have the same gps-location associated with them. | ||
// | ||
class GeoObject { | ||
public: | ||
GeoPosition position; | ||
std::string id; | ||
std::string value; | ||
|
||
GeoObject() {} | ||
|
||
GeoObject(const GeoPosition& pos, const std::string& i, | ||
const std::string& val) : | ||
position(pos), id(i), value(val) { | ||
} | ||
}; | ||
|
||
// | ||
// Stack your DB with GeoDB to be able to get geo-spatial support | ||
// | ||
class GeoDB : public StackableDB { | ||
public: | ||
// GeoDBOptions have to be the same as the ones used in a previous | ||
// incarnation of the DB | ||
// | ||
// GeoDB owns the pointer `DB* db` now. You should not delete it or | ||
// use it after the invocation of GeoDB | ||
// GeoDB(DB* db, const GeoDBOptions& options) : StackableDB(db) {} | ||
GeoDB(DB* db, const GeoDBOptions& options) : StackableDB(db) {} | ||
virtual ~GeoDB() {} | ||
|
||
// Insert a new object into the location database. The object is | ||
// uniquely identified by the id. If an object with the same id already | ||
// exists in the db, then the old one is overwritten by the new | ||
// object being inserted here. | ||
virtual Status Insert(const GeoObject& object) = 0; | ||
|
||
// Retrieve the value of the object located at the specified GPS | ||
// location and is identified by the 'id'. | ||
virtual Status GetByPosition(const GeoPosition& pos, | ||
const Slice& id, std::string* value) = 0; | ||
|
||
// Retrieve the value of the object identified by the 'id'. This method | ||
// could be potentially slower than GetByPosition | ||
virtual Status GetById(const Slice& id, GeoObject* object) = 0; | ||
|
||
// Delete the specified object | ||
virtual Status Remove(const Slice& id) = 0; | ||
|
||
// Returns a list of all items within a circular radius from the | ||
// specified gps location. If 'number_of_values' is specified, | ||
// then this call returns at most that many number of objects. | ||
// The radius is specified in 'meters'. | ||
virtual Status SearchRadial(const GeoPosition& pos, | ||
double radius, | ||
std::vector<GeoObject>* values, | ||
int number_of_values = INT_MAX) = 0; | ||
}; | ||
|
||
} // namespace rocksdb |
Oops, something went wrong.