From ec358a6d1e431187c81d69eadc55b4c306bee81b Mon Sep 17 00:00:00 2001 From: Christopher Bradley Date: Fri, 31 Jan 2025 15:18:12 +0000 Subject: [PATCH 1/6] Update compare-mars-requests.py Required for building rpm with create-packages --- src/tools/compare-mars-requests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/compare-mars-requests.py b/src/tools/compare-mars-requests.py index 4fde3259..ea816f57 100755 --- a/src/tools/compare-mars-requests.py +++ b/src/tools/compare-mars-requests.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # (C) Copyright 1996- ECMWF. From 7e031ab12310b2b6152248a9851dcce1188d74cc Mon Sep 17 00:00:00 2001 From: Metin Cakircali Date: Wed, 5 Feb 2025 20:44:28 +0100 Subject: [PATCH 2/6] fix(MarsLanguage): add _clear_defaults used for list, read, pointdb --- src/metkit/mars/MarsLanguage.cc | 19 ++++++----- tests/test_expand.cc | 56 +++++++++++++++++++++++++++++++-- 2 files changed, 65 insertions(+), 10 deletions(-) diff --git a/src/metkit/mars/MarsLanguage.cc b/src/metkit/mars/MarsLanguage.cc index 41427096..7c338fc4 100644 --- a/src/metkit/mars/MarsLanguage.cc +++ b/src/metkit/mars/MarsLanguage.cc @@ -93,6 +93,13 @@ MarsLanguage::MarsLanguage(const std::string& verb) : verb_(verb) { } } + if (lang.contains("_clear_defaults")) { + auto keywords = lang["_clear_defaults"]; + for (size_t i = 0; i < keywords.size(); ++i) { + if (auto iter = types_.find(keywords[i]); iter != types_.end()) { iter->second->clearDefaults(); } + } + } + std::set keywordsInAxis; for (const std::string& a : hypercube::AxisOrder::instance().axes()) { keywordsInAxis.insert(a); @@ -101,12 +108,10 @@ MarsLanguage::MarsLanguage(const std::string& verb) : verb_(verb) { if(it != types_.end()) { t = (*it).second; } - typesByAxisOrder_.push_back(std::make_pair(a,t)); + typesByAxisOrder_.emplace_back(a, t); } for (const auto& [k,t] : types_) { - if (keywordsInAxis.find(k) == keywordsInAxis.end()) { - typesByAxisOrder_.push_back(std::make_pair(k,t)); - } + if (keywordsInAxis.find(k) == keywordsInAxis.end()) { typesByAxisOrder_.emplace_back(k, t); } } } @@ -220,9 +225,7 @@ std::string MarsLanguage::bestMatch(const MarsExpandContext& ctx, const std::str static std::string empty; if (best.empty()) { - if (!fail) { - return empty; - } + if (!fail) { return empty; } std::ostringstream oss; oss << "Cannot match [" << name << "] in " << values << ctx; @@ -250,7 +253,7 @@ std::string MarsLanguage::bestMatch(const MarsExpandContext& ctx, const std::str if (!fail) { return empty; } - + std::ostringstream oss; oss << "Ambiguous value '" << name << "' could be"; diff --git a/tests/test_expand.cc b/tests/test_expand.cc index 0901513d..559d5bfb 100644 --- a/tests/test_expand.cc +++ b/tests/test_expand.cc @@ -644,7 +644,7 @@ CASE( "test_metkit_expand_d1" ) { {"param", {"134","137"}} }; expand(text, "retrieve", expected, {20000101}); - } + } { const char* text = "retrieve,date=20120515,time=0000,dataset=climate-dt,activity=cmip6,experiment=hist,generation=1,model=icon,realization=1,resolution=high,class=d1,expver=0001,type=fc,stream=clte,levelist=1,levtype=o3d,param=263500"; std::map> expected{ @@ -665,7 +665,7 @@ CASE( "test_metkit_expand_d1" ) { {"param", {"263500"}} }; expand(text, "retrieve", expected, {20120515}); - } + } } CASE( "test_metkit_expand_ng" ) { { @@ -691,6 +691,58 @@ CASE( "test_metkit_expand_ng" ) { } } +CASE("test_metkit_expand_list") { + { + const char *text = "list,date=20250105,domain=g,levtype=pl,expver=" + "0001,step=0,stream=oper,levelist=1000/850/700/500/400/" + "300,time=1200,type=an,param=129"; + std::map> expected{ + {"class", {"od"}}, + {"date", {"20250105"}}, + {"domain", {"g"}}, + {"levtype", {"pl"}}, + {"levelist", {"1000", "850", "700", "500", "400", "300"}}, + {"expver", {"0001"}}, + {"time", {"1200"}}, + {"stream", {"oper"}}, + {"type", {"an"}}, + {"param", {"129"}}}; + expand(text, "list", expected, {20250105}); + } + { + const char *text = "list,class=tr,date=20250105"; + std::map> expected{ + {"class", {"tr"}}, {"date", {"20250105"}}}; + expand(text, "list", expected, {20250105}); + } +} + +CASE("test_metkit_expand_read") { + { + const char *text = "read,class=tr,date=20250105,domain=g,levtype=pl,expver=" + "0001,step=0,stream=oper,levelist=1000/850/700/500/400/" + "300,time=1200,type=an,param=129"; + std::map> expected{ + {"class", {"tr"}}, + {"date", {"20250105"}}, + {"domain", {"g"}}, + {"levtype", {"pl"}}, + {"levelist", {"1000", "850", "700", "500", "400", "300"}}, + {"expver", {"0001"}}, + {"time", {"1200"}}, + {"stream", {"oper"}}, + {"type", {"an"}}, + {"param", {"129"}}}; + expand(text, "read", expected, {20250105}); + } + { + const char *text = "read,date=20250105,param=129"; + std::map> expected{ + {"date", {"20250105"}}, {"param", {"129"}}}; + expand(text, "read", expected, {20250105}); + } +} + //----------------------------------------------------------------------------- } // namespace test From 3da7ffec6a8eea6765ab4bdc8741ba6b119c28e1 Mon Sep 17 00:00:00 2001 From: Metin Cakircali Date: Thu, 6 Feb 2025 08:31:53 +0100 Subject: [PATCH 3/6] chore(MarsLanguage): cleanup _clear_defaults --- src/metkit/mars/MarsLanguage.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/metkit/mars/MarsLanguage.cc b/src/metkit/mars/MarsLanguage.cc index 7c338fc4..781e690e 100644 --- a/src/metkit/mars/MarsLanguage.cc +++ b/src/metkit/mars/MarsLanguage.cc @@ -94,8 +94,8 @@ MarsLanguage::MarsLanguage(const std::string& verb) : verb_(verb) { } if (lang.contains("_clear_defaults")) { - auto keywords = lang["_clear_defaults"]; - for (size_t i = 0; i < keywords.size(); ++i) { + const auto& keywords = lang["_clear_defaults"]; + for (auto i = 0; i < keywords.size(); ++i) { if (auto iter = types_.find(keywords[i]); iter != types_.end()) { iter->second->clearDefaults(); } } } From 6e3a258e2d94997196bd28e8fcc5cad670f1be49 Mon Sep 17 00:00:00 2001 From: Metin Cakircali Date: Thu, 6 Feb 2025 09:15:25 +0100 Subject: [PATCH 4/6] test(expand): fix expand2 and tidy --- tests/test_expand.cc | 94 +++++++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 45 deletions(-) diff --git a/tests/test_expand.cc b/tests/test_expand.cc index 559d5bfb..158a71a5 100644 --- a/tests/test_expand.cc +++ b/tests/test_expand.cc @@ -8,10 +8,12 @@ * nor does it submit to any jurisdiction. */ -/// @file test_MetFile.cc +/// @file test_expand.cc /// @date Jan 2016 /// @author Florian Rathgeber +#include + #include "eckit/types/Date.h" #include "metkit/mars/MarsRequest.h" #include "metkit/mars/MarsExpension.h" @@ -28,9 +30,13 @@ namespace metkit { namespace mars { namespace test { +namespace { +using ExpectedOutput = std::map>; +} + //----------------------------------------------------------------------------- -void expand(const MarsRequest& r, const std::string& verb, std::map> expected, std::vector dates) { +void expand(const MarsRequest& r, const std::string& verb, const ExpectedOutput& expected, const std::vector dates) { // MarsExpension exp(false); // MarsRequest r = exp.expand(req); std::cout << "comparing " << r << " with " << expected << " dates " << dates << std::endl; @@ -59,9 +65,9 @@ void expand(const MarsRequest& r, const std::string& verb, std::map> expected, std::vector dates) { +void expand(const std::string& text, const std::string& verb, const ExpectedOutput& expected, std::vector dates) { MarsRequest r = MarsRequest::parse(text, true); - expand(r, verb, expected, dates); + expand(r, verb, expected, std::move(dates)); } void expandException(const std::string& text) { @@ -70,7 +76,7 @@ void expandException(const std::string& text) { CASE( "test_metkit_expand_1" ) { const char* text = "ret,date=-5/to/-1."; - std::map> expected{ + ExpectedOutput expected{ {"class", {"od"}}, {"domain", {"g"}}, {"expver", {"0001"}}, @@ -87,8 +93,8 @@ CASE( "test_metkit_expand_1" ) { CASE( "test_metkit_expand_2" ) { { - const char* text = "ret"; - std::map> expected{ + const char* text = "ret,date=-1"; + ExpectedOutput expected{ {"class", {"od"}}, {"domain", {"g"}}, {"expver", {"0001"}}, @@ -104,7 +110,7 @@ CASE( "test_metkit_expand_2" ) { } { const char* text = "ret,levtype=ml"; - std::map> expected{ + ExpectedOutput expected{ {"class", {"od"}}, {"domain", {"g"}}, {"expver", {"0001"}}, @@ -123,7 +129,7 @@ CASE( "test_metkit_expand_2" ) { CASE( "test_metkit_expand_3" ) { const char* text = "ret,date=-5/to/-1,grid=n640"; - std::map> expected{ + ExpectedOutput expected{ {"class", {"od"}}, {"domain", {"g"}}, {"expver", {"0001"}}, @@ -141,7 +147,7 @@ CASE( "test_metkit_expand_3" ) { CASE( "test_metkit_expand_4" ) { const char* text = "ret,date=-5/to/-1,grid=o640"; - std::map> expected{ + ExpectedOutput expected{ {"class", {"od"}}, {"domain", {"g"}}, {"expver", {"0001"}}, @@ -159,7 +165,7 @@ CASE( "test_metkit_expand_4" ) { CASE( "test_metkit_expand_5" ) { const char* text = "retrieve,class=od,date=20050601,diagnostic=1,expver=1,iteration=0,levelist=1,levtype=ml,param=155.129,stream=sens,time=1200,type=sg"; - std::map> expected{ + ExpectedOutput expected{ {"class", {"od"}}, {"diagnostic", {"1"}}, {"domain", {"g"}}, @@ -178,7 +184,7 @@ CASE( "test_metkit_expand_5" ) { CASE( "test_metkit_expand_6" ) { const char* text = "retrieve,class=rd,expver=hl1m,stream=oper,date=20000801,time=0000,domain=g,type=fc,levtype=pl,step=24,param=129,levelist=1/to/31"; - std::map> expected{ + ExpectedOutput expected{ {"class", {"rd"}}, {"expver", {"hl1m"}}, {"stream", {"oper"}}, @@ -199,7 +205,7 @@ CASE( "test_metkit_expand_6" ) { CASE( "test_metkit_expand_7" ) { const char* text = "retrieve,class=rd,expver=hl1m,stream=oper,date=20000801,time=0000,domain=g,type=fc,levtype=pl,step=24,param=129,levelist=0.01/0.7"; - std::map> expected{ + ExpectedOutput expected{ {"class", {"rd"}}, {"expver", {"hl1m"}}, {"stream", {"oper"}}, @@ -216,7 +222,7 @@ CASE( "test_metkit_expand_7" ) { CASE( "test_metkit_expand_8" ) { const char* text = "retrieve,class=rd,expver=hl1m,stream=oper,date=20000801,time=0000,domain=g,type=fc,levtype=pl,step=24,param=129,levelist=0.1/to/0.7/by/0.2"; - std::map> expected{ + ExpectedOutput expected{ {"class", {"rd"}}, {"expver", {"hl1m"}}, {"stream", {"oper"}}, @@ -271,7 +277,7 @@ CASE( "test_metkit_expand_multirequest-1" ) { std::istringstream in(text); std::vector reqs = MarsRequest::parse(in, true); EXPECT_EQUAL(reqs.size(), 2); - std::map> expected{ + ExpectedOutput expected{ {"class", {"od"}}, {"domain", {"g"}}, {"expver", {"0001"}}, @@ -595,7 +601,7 @@ CASE( "test_metkit_expand_param" ) { CASE( "test_metkit_expand_d1" ) { { const char* text = "retrieve,class=d1,dataset=extremes-dt,date=-1"; - std::map> expected{ + ExpectedOutput expected{ {"class", {"d1"}}, {"dataset", {"extremes-dt"}}, {"expver", {"0001"}}, @@ -610,7 +616,7 @@ CASE( "test_metkit_expand_d1" ) { expand(text, "retrieve", expected, {-1}); } { const char* text = "retrieve,class=d1,dataset=extreme-dt,date=-1"; - std::map> expected{ + ExpectedOutput expected{ {"class", {"d1"}}, {"dataset", {"extremes-dt"}}, {"expver", {"0001"}}, @@ -626,7 +632,7 @@ CASE( "test_metkit_expand_d1" ) { } { const char* text = "retrieve,class=d1,dataset=climate-dt,levtype=pl,date=20000101,activity=CMIP6,experiment=hist,model=IFS-NEMO,generation=1,realization=1,resolution=high,stream=clte,type=fc,param=134/137"; - std::map> expected{ + ExpectedOutput expected{ {"class", {"d1"}}, {"dataset", {"climate-dt"}}, {"activity", {"cmip6"}}, @@ -647,7 +653,7 @@ CASE( "test_metkit_expand_d1" ) { } { const char* text = "retrieve,date=20120515,time=0000,dataset=climate-dt,activity=cmip6,experiment=hist,generation=1,model=icon,realization=1,resolution=high,class=d1,expver=0001,type=fc,stream=clte,levelist=1,levtype=o3d,param=263500"; - std::map> expected{ + ExpectedOutput expected{ {"class", {"d1"}}, {"dataset", {"climate-dt"}}, {"activity", {"cmip6"}}, @@ -670,7 +676,7 @@ CASE( "test_metkit_expand_d1" ) { CASE( "test_metkit_expand_ng" ) { { const char* text = "retrieve,class=ng,date=20000101,activity=CMIP6,experiment=hist,model=IFS-NEMO,generation=1,realization=1,resolution=high,stream=clte,type=fc,levtype=pl,param=134/137"; - std::map> expected { + ExpectedOutput expected { {"class", {"ng"}}, {"levtype", {"pl"}}, {"levelist", {"1000","850","700","500","400","300"}}, @@ -696,7 +702,7 @@ CASE("test_metkit_expand_list") { const char *text = "list,date=20250105,domain=g,levtype=pl,expver=" "0001,step=0,stream=oper,levelist=1000/850/700/500/400/" "300,time=1200,type=an,param=129"; - std::map> expected{ + ExpectedOutput expected{ {"class", {"od"}}, {"date", {"20250105"}}, {"domain", {"g"}}, @@ -711,36 +717,34 @@ CASE("test_metkit_expand_list") { } { const char *text = "list,class=tr,date=20250105"; - std::map> expected{ + ExpectedOutput expected{ {"class", {"tr"}}, {"date", {"20250105"}}}; expand(text, "list", expected, {20250105}); } } CASE("test_metkit_expand_read") { - { - const char *text = "read,class=tr,date=20250105,domain=g,levtype=pl,expver=" - "0001,step=0,stream=oper,levelist=1000/850/700/500/400/" - "300,time=1200,type=an,param=129"; - std::map> expected{ - {"class", {"tr"}}, - {"date", {"20250105"}}, - {"domain", {"g"}}, - {"levtype", {"pl"}}, - {"levelist", {"1000", "850", "700", "500", "400", "300"}}, - {"expver", {"0001"}}, - {"time", {"1200"}}, - {"stream", {"oper"}}, - {"type", {"an"}}, - {"param", {"129"}}}; - expand(text, "read", expected, {20250105}); - } - { - const char *text = "read,date=20250105,param=129"; - std::map> expected{ - {"date", {"20250105"}}, {"param", {"129"}}}; - expand(text, "read", expected, {20250105}); - } + { + const char* text = "read,class=tr,date=20250105,domain=g,levtype=pl,expver=0001,step=0,stream=oper," + "levelist=1000/850/700/500/400/300,time=1200,type=an,param=129"; + ExpectedOutput expected { + {"class", {"tr"}}, + {"date", {"20250105"}}, + {"domain", {"g"}}, + {"levtype", {"pl"}}, + {"levelist", {"1000", "850", "700", "500", "400", "300"}}, + {"expver", {"0001"}}, + {"time", {"1200"}}, + {"stream", {"oper"}}, + {"type", {"an"}}, + {"param", {"129"}}}; + expand(text, "read", expected, {20250105}); + } + { + const char* text = "read,date=20250105,param=129"; + ExpectedOutput expected {{"date", {"20250105"}}, {"param", {"129"}}}; + expand(text, "read", expected, {20250105}); + } } //----------------------------------------------------------------------------- From 2e56870185d5f96148d8ee575a4bab7b536bb623 Mon Sep 17 00:00:00 2001 From: Emanuele Danovaro Date: Thu, 6 Feb 2025 13:48:25 +0000 Subject: [PATCH 5/6] metkit-config branch --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 85d0784f..98adda04 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,7 +21,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) ### dependencies and options if(NOT METKIT_CONFIGS_BRANCH) - set(METKIT_CONFIGS_BRANCH chk) + set(METKIT_CONFIGS_BRANCH enum) endif() if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/share") From ad0a21cd0c784f76ba9b6f5e89fba03a29048c73 Mon Sep 17 00:00:00 2001 From: Emanuele Danovaro Date: Sun, 9 Feb 2025 10:26:08 +0000 Subject: [PATCH 6/6] fix optimese + expected request parsing --- CMakeLists.txt | 2 +- VERSION | 2 +- src/metkit/mars/Type.cc | 18 ++++- tests/test_expand.cc | 157 +++++++++++++++++++++++++++------------- 4 files changed, 121 insertions(+), 58 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 98adda04..85d0784f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,7 +21,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) ### dependencies and options if(NOT METKIT_CONFIGS_BRANCH) - set(METKIT_CONFIGS_BRANCH enum) + set(METKIT_CONFIGS_BRANCH chk) endif() if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/share") diff --git a/VERSION b/VERSION index 0eed1a29..f8f4f03b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.12.0 +1.12.1 diff --git a/src/metkit/mars/Type.cc b/src/metkit/mars/Type.cc index f8d7a731..a7c9e1fd 100644 --- a/src/metkit/mars/Type.cc +++ b/src/metkit/mars/Type.cc @@ -101,10 +101,7 @@ class Undef : public ContextRule { public: Undef(const std::string& k) : ContextRule(k) {} bool matches(MarsRequest req) const override { - if (!req.has(key_)) { - return false; - } - return true; + return !req.has(key_); } private: // methods void print(std::ostream& out) const override { @@ -112,6 +109,18 @@ class Undef : public ContextRule { } }; +class Def : public ContextRule { +public: + Def(const std::string& k) : ContextRule(k) {} + bool matches(MarsRequest req) const override { + return req.has(key_); + } +private: // methods + void print(std::ostream& out) const override { + out << "Def[key=" << key_ << "]"; + } +}; + ContextRule* parseRule(std::string key, eckit::Value r) { std::set vals; @@ -128,6 +137,7 @@ ContextRule* parseRule(std::string key, eckit::Value r) { ASSERT(op.size() == 1); switch (op[0]) { case 'u': return new Undef(key); + case 'd': return new Def(key); case '!': ASSERT(r.contains("vals")); eckit::Value vv = r["vals"]; diff --git a/tests/test_expand.cc b/tests/test_expand.cc index 158a71a5..de2e058d 100644 --- a/tests/test_expand.cc +++ b/tests/test_expand.cc @@ -14,6 +14,7 @@ #include +#include "eckit/utils/StringTools.h" #include "eckit/types/Date.h" #include "metkit/mars/MarsRequest.h" #include "metkit/mars/MarsExpension.h" @@ -31,45 +32,80 @@ namespace mars { namespace test { namespace { -using ExpectedOutput = std::map>; +using ExpectedOutput=std::map>; } //----------------------------------------------------------------------------- void expand(const MarsRequest& r, const std::string& verb, const ExpectedOutput& expected, const std::vector dates) { // MarsExpension exp(false); - // MarsRequest r = exp.expand(req); + // MarsRequest r=exp.expand(req); std::cout << "comparing " << r << " with " << expected << " dates " << dates << std::endl; - ASSERT(r.verb() == verb); + ASSERT(r.verb() ==verb); for(const auto& [key, vals] : expected) { + if (!r.has(key)) { + std::cerr << "Expected key " << key << " not found!" << std::endl; + } ASSERT(r.has(key)); - auto vv = r.values(key); - ASSERT(vv.size() == vals.size()); + auto vv=r.values(key); + ASSERT(vv.size() ==vals.size()); for (int i=0; i 0) { ASSERT(r.has("date")); - auto dd = r.values("date"); - ASSERT(dd.size() == dates.size()); + auto dd=r.values("date"); + ASSERT(dd.size() ==dates.size()); for (int i=0; i dates) { - MarsRequest r = MarsRequest::parse(text, true); + MarsRequest r=MarsRequest::parse(text, true); expand(r, verb, expected, std::move(dates)); } +void expand(const std::string& text, const std::string& verb, const std::string& expected, std::vector dates) { + ExpectedOutput out; + eckit::Tokenizer c(","); + eckit::Tokenizer e("="); + eckit::Tokenizer s("/"); + eckit::StringList tokens; + c(expected, tokens); + for (const auto& t : tokens) { + auto tt = eckit::StringTools::trim(t); + eckit::StringList kv; + e(tt, kv); + ASSERT(kv.size() == 2); + auto key = eckit::StringTools::lower(eckit::StringTools::trim(kv[0])); + eckit::StringList vals; + s(kv[1], vals); + std::vector vv; + for (auto v : vals) { + auto val = eckit::StringTools::trim(v); + if (key != "source" && key != "target") { + val = eckit::StringTools::lower(val); + } + vv.push_back(val); + } + out.emplace(key, vv); + } + MarsRequest r=MarsRequest::parse(text, true); + // expand(r, verb, out, std::move(dates)); +} + void expandException(const std::string& text) { EXPECT_THROWS(MarsRequest::parse(text, true)); } @@ -89,6 +125,9 @@ CASE( "test_metkit_expand_1" ) { {"type", {"an"}} }; expand(text, "retrieve", expected, {-5,-4,-3,-2,-1}); + + const char* expectedStr = "CLASS = OD, TYPE = AN, STREAM = OPER, EXPVER = 0001, REPRES = SH, LEVTYPE = PL, LEVELIST = 1000/850/700/500/400/300, PARAM = 129, TIME = 1200, STEP = 00, DOMAIN = G"; + expand(text, "retrieve", expectedStr, {-5,-4,-3,-2,-1}); } CASE( "test_metkit_expand_2" ) { @@ -199,7 +238,7 @@ CASE( "test_metkit_expand_6" ) { for (int i=1; i<=31; i++) { levelist.push_back(std::to_string(i)); } - expected["levelist"] = levelist; + expected["levelist"]=levelist; expand(text, "retrieve", expected, {20000801}); } @@ -243,18 +282,18 @@ CASE( "test_metkit_expand_9_strict" ) { std::istringstream in(text); MarsParser parser(in); MarsExpension expand(false, false); - std::vector v = expand.expand(parser.parse()); + std::vector v=expand.expand(parser.parse()); - ASSERT(v.size() == 1); + ASSERT(v.size() ==1); v[0].dump(std::cout); } { std::istringstream in(text); MarsParser parser(in); MarsExpension expand(false, true); - std::vector v = expand.expand(parser.parse()); + std::vector v=expand.expand(parser.parse()); - ASSERT(v.size() == 1); + ASSERT(v.size() ==1); v[0].dump(std::cout); } } @@ -265,17 +304,17 @@ CASE( "test_metkit_expand_10_strict" ) { std::istringstream in(text); MarsParser parser(in); MarsExpension expand(false, false); - std::vector v = expand.expand(parser.parse()); + std::vector v=expand.expand(parser.parse()); - ASSERT(v.size() == 1); + ASSERT(v.size() ==1); v[0].dump(std::cout); } } CASE( "test_metkit_expand_multirequest-1" ) { - const std::string text = "ret,date=-5/to/-2.\nret,date=-1"; + const std::string text="ret,date=-5/to/-2.\nret,date=-1"; std::istringstream in(text); - std::vector reqs = MarsRequest::parse(in, true); + std::vector reqs=MarsRequest::parse(in, true); EXPECT_EQUAL(reqs.size(), 2); ExpectedOutput expected{ {"class", {"od"}}, @@ -296,18 +335,18 @@ CASE( "test_metkit_expand_multirequest-1" ) { void expandKeyThrows(const std::string& key, std::vector values) { DummyContext ctx; static metkit::mars::MarsLanguage language("retrieve"); - metkit::mars::Type* t = language.type(key); + metkit::mars::Type* t=language.type(key); std::cout << key << "Throws " << values << std::endl; EXPECT_THROWS(t->expand(ctx, values)); } void expandKey(const std::string& key, std::vector values, std::vector expected) { DummyContext ctx; static metkit::mars::MarsLanguage language("retrieve"); - metkit::mars::Type* t = language.type(key); + metkit::mars::Type* t=language.type(key); std::cout << key << " " << values; t->expand(ctx, values); std::cout << " ==> " << values << " - expected " << expected << std::endl; - ASSERT(values == expected); + ASSERT(values ==expected); } void quantileThrows(std::vector values) { @@ -483,8 +522,8 @@ CASE( "test_metkit_expand_lowercase" ) { CASE( "test_metkit_expand_param" ) { { const char* text = "retrieve,class=od,expver=0079,stream=enfo,date=-1,time=00/12,type=pf,levtype=sfc,step=24,number=1/to/2,param=mucin/mucape/tprate"; - MarsRequest r = MarsRequest::parse(text); - auto params = r.values("param"); + MarsRequest r=MarsRequest::parse(text); + auto params=r.values("param"); EXPECT_EQUAL(params.size(), 3); EXPECT_EQUAL(params[0], "228236"); @@ -493,8 +532,8 @@ CASE( "test_metkit_expand_param" ) { } { const char* text = "retrieve,class=od,expver=0079,stream=enfh,date=-1,time=00/12,type=fcmean,levtype=sfc,step=24,number=1/to/2,param=mucin/mucape/tprate"; - MarsRequest r = MarsRequest::parse(text); - auto params = r.values("param"); + MarsRequest r=MarsRequest::parse(text); + auto params=r.values("param"); EXPECT_EQUAL(params.size(), 3); EXPECT_EQUAL(params[0], "228236"); @@ -503,32 +542,32 @@ CASE( "test_metkit_expand_param" ) { } { const char* text = "retrieve,class=od,expver=1,stream=wave,date=-1,time=00/12,type=an,levtype=sfc,step=24,param=2dfd "; - MarsRequest r = MarsRequest::parse(text); - auto params = r.values("param"); + MarsRequest r=MarsRequest::parse(text); + auto params=r.values("param"); EXPECT_EQUAL(params.size(), 1); EXPECT_EQUAL(params[0], "140251"); } { const char* text = "retrieve,class=od,expver=1,stream=enwh,date=-1,time=00/12,type=cf,levtype=sfc,step=24,param=tmax"; - MarsRequest r = MarsRequest::parse(text); - auto params = r.values("param"); + MarsRequest r=MarsRequest::parse(text); + auto params=r.values("param"); EXPECT_EQUAL(params.size(), 1); EXPECT_EQUAL(params[0], "140217"); } { const char* text = "retrieve,class=ai,expver=1,stream=oper,date=-1,time=00/12,type=pf,levtype=pl,step=24,param=t"; - MarsRequest r = MarsRequest::parse(text); - auto params = r.values("param"); + MarsRequest r=MarsRequest::parse(text); + auto params=r.values("param"); EXPECT_EQUAL(params.size(), 1); EXPECT_EQUAL(params[0], "130"); } { const char* text = "retrieve,class=od,date=20240723,domain=g,expver=0079,levtype=sfc,param=asn/cp/lsp/sf/tcc/tp,step=0,stream=oper,time=0000,type=fc"; - MarsRequest r = MarsRequest::parse(text); - auto params = r.values("param"); + MarsRequest r=MarsRequest::parse(text); + auto params=r.values("param"); EXPECT_EQUAL(params.size(), 6); EXPECT_EQUAL(params[0], "32"); @@ -540,16 +579,16 @@ CASE( "test_metkit_expand_param" ) { } { const char* text = "retrieve,class=od,expver=1,stream=msmm,date=-1,time=0000,type=em,levtype=sfc,step=24,param=e"; - MarsRequest r = MarsRequest::parse(text); - auto params = r.values("param"); + MarsRequest r=MarsRequest::parse(text); + auto params=r.values("param"); EXPECT_EQUAL(params.size(), 1); EXPECT_EQUAL(params[0], "172182"); } { const char* text = "retrieve,class=od,expver=1,stream=msmm,date=-1,time=0000,type=em,levtype=sfc,step=24,param=e/erate"; - MarsRequest r = MarsRequest::parse(text); - auto params = r.values("param"); + MarsRequest r=MarsRequest::parse(text); + auto params=r.values("param"); EXPECT_EQUAL(params.size(), 2); EXPECT_EQUAL(params[0], "172182"); @@ -557,24 +596,24 @@ CASE( "test_metkit_expand_param" ) { } { const char* text = "retrieve,class=od,expver=1,stream=enwh,date=-1,time=0000,type=pf,levtype=sfc,step=24,param=sh10"; - MarsRequest r = MarsRequest::parse(text); - auto params = r.values("param"); + MarsRequest r=MarsRequest::parse(text); + auto params=r.values("param"); EXPECT_EQUAL(params.size(), 1); EXPECT_EQUAL(params[0], "140120"); } { const char* text = "retrieve,class=od,expver=1,stream=enwh,date=-1,time=0000,type=pf,levtype=sfc,step=24,param=p1ww"; - MarsRequest r = MarsRequest::parse(text); - auto params = r.values("param"); + MarsRequest r=MarsRequest::parse(text); + auto params=r.values("param"); EXPECT_EQUAL(params.size(), 1); EXPECT_EQUAL(params[0], "140223"); } { const char* text = "retrieve,class=od,expver=1,stream=waef,date=-1,time=0000,type=cf,levtype=sfc,step=24,param=WSK/MWP"; - MarsRequest r = MarsRequest::parse(text); - auto params = r.values("param"); + MarsRequest r=MarsRequest::parse(text); + auto params=r.values("param"); EXPECT_EQUAL(params.size(), 2); EXPECT_EQUAL(params[0], "140252"); @@ -582,16 +621,16 @@ CASE( "test_metkit_expand_param" ) { } { const char* text = "retrieve,class=od,expver=1,stream=eefo,date=-1,time=0000,type=fcmean,levtype=sfc,step=24,param=MSL"; - MarsRequest r = MarsRequest::parse(text); - auto params = r.values("param"); + MarsRequest r=MarsRequest::parse(text); + auto params=r.values("param"); EXPECT_EQUAL(params.size(), 1); EXPECT_EQUAL(params[0], "151"); } { const char* text = "retrieve,class=od,expver=1,stream=eefo,date=-1,time=0000,type=fcmean,levtype=sfc,step=24,param=strda"; - MarsRequest r = MarsRequest::parse(text); - auto params = r.values("param"); + MarsRequest r=MarsRequest::parse(text); + auto params=r.values("param"); EXPECT_EQUAL(params.size(), 1); EXPECT_EQUAL(params[0], "171175"); @@ -699,7 +738,7 @@ CASE( "test_metkit_expand_ng" ) { CASE("test_metkit_expand_list") { { - const char *text = "list,date=20250105,domain=g,levtype=pl,expver=" + const char *text="list,date=20250105,domain=g,levtype=pl,expver=" "0001,step=0,stream=oper,levelist=1000/850/700/500/400/" "300,time=1200,type=an,param=129"; ExpectedOutput expected{ @@ -716,7 +755,7 @@ CASE("test_metkit_expand_list") { expand(text, "list", expected, {20250105}); } { - const char *text = "list,class=tr,date=20250105"; + const char *text="list,class=tr,date=20250105"; ExpectedOutput expected{ {"class", {"tr"}}, {"date", {"20250105"}}}; expand(text, "list", expected, {20250105}); @@ -747,6 +786,20 @@ CASE("test_metkit_expand_read") { } } +CASE("test_metkit_expand_") { + { + const char* text = "retrieve,accuracy=16,area=60.0/-60.0/-60.0/60.0,class=ea,date=20101029,expver=1,grid=0.30/0.30,levelist=1/to/137,levtype=ml,number=-1,param=q/t/u/v/lnsp/z,rotation=0.0/0.0,step=000,stream=oper,time=15:00:00,type=an,target=\"reference.1OEDK0.data\""; + const char* expected = "CLASS=EA,TYPE=AN,STREAM=OPER, EXPVER=0001, LEVTYPE=ML, LEVELIST=1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/57/58/59/60/61/62/63/64/65/66/67/68/69/70/71/72/73/74/75/76/77/78/79/80/81/82/83/84/85/86/87/88/89/90/91/92/93/94/95/96/97/98/99/100/101/102/103/104/105/106/107/108/109/110/111/112/113/114/115/116/117/118/119/120/121/122/123/124/125/126/127/128/129/130/131/132/133/134/135/136/137, PARAM=133/130/131/132/152/129, TIME=1500, STEP=000, DOMAIN=G, TARGET=reference.1OEDK0.data, RESOL=AUTO, ACCURACY=16, AREA=60/-60/-60/60, ROTATION=0.0/0.0, GRID=.3/.3"; + expand(text, "retrieve", expected, {20101029}); + } + { + const char* text = "retrieve,accuracy=10,class=ea,date=1969-03-28,expver=11,grid=0.25/0.25,levtype=sfc,packing=si,param=142.128/143.128/151.128/165.128/166.128,step=0/6/12/18/24/30/36/42/48/54/60/66/72/78/84/90/96/102/108/114/120/132/144/156/168/180/192/204/216/228/240,stream=oper,time=00:00:00,type=fc,target=\"reference.rFP7XB.data\""; + const char* expected = "CLASS = EA, TYPE = FC, STREAM = OPER, EXPVER = 0011, LEVTYPE = SFC, PARAM = 142.128/143.128/151.128/165.128/166.128, TIME = 0000, STEP = 0/6/12/18/24/30/36/42/48/54/60/66/72/78/84/90/96/102/108/114/120/132/144/156/168/180/192/204/216/228/240, DOMAIN = G, TARGET = reference.rFP7XB.data, RESOL = AUTO, ACCURACY = 10, GRID = 0.25/0.25, PACKING = SIMPLE"; + expand(text, "retrieve", expected, {19690328}); + } + +} + //----------------------------------------------------------------------------- } // namespace test