mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 01:40:04 +00:00 
			
		
		
		
	AWS Level 2 Provider FindKey
This commit is contained in:
		
							parent
							
								
									80310029e5
								
							
						
					
					
						commit
						bde8d288bd
					
				
					 5 changed files with 90 additions and 1 deletions
				
			
		|  | @ -7,6 +7,32 @@ namespace scwx | ||||||
| namespace provider | 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) | TEST(AwsLevel2DataProvider, LoadObjectByKey) | ||||||
| { | { | ||||||
|    const std::string key = "2022/04/21/KLSX/KLSX20220421_160055_V06"; |    const std::string key = "2022/04/21/KLSX/KLSX20220421_160055_V06"; | ||||||
|  |  | ||||||
|  | @ -30,6 +30,7 @@ public: | ||||||
| 
 | 
 | ||||||
|    size_t cache_size() const; |    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); |    size_t      ListObjects(std::chrono::system_clock::time_point date); | ||||||
|    std::shared_ptr<wsr88d::Ar2vFile> LoadObjectByKey(const std::string& key); |    std::shared_ptr<wsr88d::Ar2vFile> LoadObjectByKey(const std::string& key); | ||||||
|    void                              Refresh(); |    void                              Refresh(); | ||||||
|  |  | ||||||
							
								
								
									
										41
									
								
								wxdata/include/scwx/util/map.hpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								wxdata/include/scwx/util/map.hpp
									
										
									
									
									
										Normal 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
 | ||||||
|  | @ -1,5 +1,7 @@ | ||||||
| #include <scwx/provider/aws_level2_data_provider.hpp> | #include <scwx/provider/aws_level2_data_provider.hpp> | ||||||
| #include <scwx/util/logger.hpp> | #include <scwx/util/logger.hpp> | ||||||
|  | #include <scwx/util/map.hpp> | ||||||
|  | #include <scwx/util/time.hpp> | ||||||
| #include <scwx/wsr88d/nexrad_file_factory.hpp> | #include <scwx/wsr88d/nexrad_file_factory.hpp> | ||||||
| 
 | 
 | ||||||
| #include <shared_mutex> | #include <shared_mutex> | ||||||
|  | @ -76,6 +78,24 @@ size_t AwsLevel2DataProvider::cache_size() const | ||||||
|    return p->objects_.size(); |    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 | size_t | ||||||
| AwsLevel2DataProvider::ListObjects(std::chrono::system_clock::time_point date) | AwsLevel2DataProvider::ListObjects(std::chrono::system_clock::time_point date) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -39,6 +39,7 @@ set(SRC_PROVIDER source/scwx/provider/aws_level2_data_provider.cpp) | ||||||
| set(HDR_UTIL include/scwx/util/float.hpp | set(HDR_UTIL include/scwx/util/float.hpp | ||||||
|              include/scwx/util/iterator.hpp |              include/scwx/util/iterator.hpp | ||||||
|              include/scwx/util/logger.hpp |              include/scwx/util/logger.hpp | ||||||
|  |              include/scwx/util/map.hpp | ||||||
|              include/scwx/util/rangebuf.hpp |              include/scwx/util/rangebuf.hpp | ||||||
|              include/scwx/util/streams.hpp |              include/scwx/util/streams.hpp | ||||||
|              include/scwx/util/threads.hpp |              include/scwx/util/threads.hpp | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat