AWS Level 2 Provider FindKey

This commit is contained in:
Dan Paulat 2022-05-22 08:48:40 -05:00
parent 80310029e5
commit bde8d288bd
5 changed files with 90 additions and 1 deletions

View file

@ -7,6 +7,32 @@ namespace scwx
namespace provider
{
TEST(AwsLevel2DataProvider, FindKeyFixed)
{
using namespace std::chrono;
using sys_days = time_point<system_clock, days>;
const auto date = sys_days {2021y / May / 27d};
const auto time = date + 17h + 59min;
AwsLevel2DataProvider provider("KLSX");
provider.ListObjects(date);
std::string key = provider.FindKey(time);
EXPECT_EQ(key, "2021/05/27/KLSX/KLSX20210527_175717_V06");
}
TEST(AwsLevel2DataProvider, FindKeyNow)
{
AwsLevel2DataProvider provider("KLSX");
provider.Refresh();
std::string key = provider.FindKey(std::chrono::system_clock::now());
EXPECT_GT(key.size(), 0);
}
TEST(AwsLevel2DataProvider, LoadObjectByKey)
{
const std::string key = "2022/04/21/KLSX/KLSX20220421_160055_V06";

View file

@ -30,6 +30,7 @@ public:
size_t cache_size() const;
std::string FindKey(std::chrono::system_clock::time_point time);
size_t ListObjects(std::chrono::system_clock::time_point date);
std::shared_ptr<wsr88d::Ar2vFile> LoadObjectByKey(const std::string& key);
void Refresh();

View file

@ -0,0 +1,41 @@
#pragma once
#include <map>
#include <optional>
namespace scwx
{
namespace util
{
template<class Key, class T>
std::optional<T> GetBoundedElement(std::map<Key, T>& map, Key key)
{
std::optional<T> element = std::nullopt;
// Find the first element greater than the key requested
auto it = map.upper_bound(key);
// An element with a key greater was found
if (it != map.cend())
{
// Are there elements prior to this element?
if (it != map.cbegin())
{
// Get the element immediately preceding, this the element we are
// looking for
element = (--it)->second;
}
}
else if (map.size() > 0)
{
// An element with a key greater was not found. If it exists, it must be
// the last element.
element = map.rbegin()->second;
}
return element;
}
} // namespace util
} // namespace scwx

View file

@ -1,5 +1,7 @@
#include <scwx/provider/aws_level2_data_provider.hpp>
#include <scwx/util/logger.hpp>
#include <scwx/util/map.hpp>
#include <scwx/util/time.hpp>
#include <scwx/wsr88d/nexrad_file_factory.hpp>
#include <shared_mutex>
@ -76,6 +78,24 @@ size_t AwsLevel2DataProvider::cache_size() const
return p->objects_.size();
}
std::string
AwsLevel2DataProvider::FindKey(std::chrono::system_clock::time_point time)
{
logger_->debug("FindKey: {}", util::TimeString(time));
std::string key {};
std::optional<std::string> element =
util::GetBoundedElement(p->objects_, time);
if (element.has_value())
{
key = *element;
}
return key;
}
size_t
AwsLevel2DataProvider::ListObjects(std::chrono::system_clock::time_point date)
{

View file

@ -39,6 +39,7 @@ set(SRC_PROVIDER source/scwx/provider/aws_level2_data_provider.cpp)
set(HDR_UTIL include/scwx/util/float.hpp
include/scwx/util/iterator.hpp
include/scwx/util/logger.hpp
include/scwx/util/map.hpp
include/scwx/util/rangebuf.hpp
include/scwx/util/streams.hpp
include/scwx/util/threads.hpp