16 #include "eckit/config/Resource.h"
17 #include "eckit/parser/StringTools.h"
18 #include "eckit/io/PartFileHandle.h"
20 #include "odb_api/FileCollector.h"
21 #include "odb_api/FileMapper.h"
22 #include "odb_api/InMemoryDataHandle.h"
23 #include "odb_api/Partition.h"
24 #include "odb_api/Writer.h"
25 #include "odb_api/Reader.h"
26 #include "odb_api/Retriever.h"
29 using namespace eckit;
35 typedef std::map<std::string,std::vector<std::string> > ms;
37 for (ms::const_iterator it (request.begin()); it != request.end(); ++it)
38 r[eckit::StringTools::lower(it->first)] = it->second;
40 for (
size_t i (0);
i < keywords.size(); ++
i)
42 const vector<string>& values ( r[ keywords[
i] ]);
43 if (values.size() < 1)
44 throw eckit::UserError(
"At least one value required for keyword '" + keywords[
i] +
"'");
45 Log::info() <<
":: - " << keywords[
i] <<
" " << values << endl;
49 void Retriever::retrieve(MultiHandle& output,
50 const std::vector<std::string>& keywords,
51 const std::map<std::string,std::vector<std::string> >& r)
53 std::map<std::string,std::vector<std::string> > request(unquoteValues(r));
55 if (r.count(
"odbpathnameschema") == 0)
56 throw UserError(
"RETRIEVE: odbpathnameschema not set");
58 FileMapper mapper(r.at(
"odbpathnameschema")[0]);
60 vector<string> odbServerRoots (eckit::StringTools::split(
":", r.at(
"odbserverroots")[0]));
61 for (
size_t i(0);
i < odbServerRoots.size(); ++
i)
63 mapper.addRoots(odbServerRoots);
68 const vector<string> partitionNumbers ( request[
"part_number"] );
70 if (partitionNumbers.size())
75 for (
size_t i(0);
i < partitionNumbers.size(); ++
i)
76 parts.push_back( atoll(partitionNumbers[
i].c_str()) );
78 sendPartitions (output, PathName(partitionsInfo), parts);
84 vector<string> serverSide (request [
"server_side"]);
85 if (serverSide.size())
87 Log::error() <<
"ODB API server side no longer exists" << endl;
88 throw UserError(
"ODB API server side no longer exists");
92 Log::debug() <<
"No server side processing" << endl;
94 fileCollector.findFiles(keywords, request);
96 if(output.estimate() == Length(0))
97 Log::userWarning() <<
"Data not found" << endl;
102 void Retriever::sendSavedPartitions(MultiHandle& output,
const PathName& savedPartitionsListFile,
const std::vector<size_t>& partitionNumbers)
104 vector<std::string> files (StringTool::readLines(savedPartitionsListFile,
true));
105 for (
size_t i (0);
i < files.size(); ++
i)
107 if (std::find(partitionNumbers.begin(), partitionNumbers.end(),
i) != partitionNumbers.end())
108 output += PathName(files[
i]).fileHandle();
112 void Retriever::sendPartitions(MultiHandle& output,
const PathName& partitionsInfo,
const std::vector<size_t>& partitionNumbers)
114 for (
size_t i(0);
i < partitionNumbers.size(); ++
i)
116 Partition partition (partitionsInfo, partitionNumbers[
i]);
118 InMemoryDataHandle* dh (
new InMemoryDataHandle);
121 partition.write(*dh);
128 std::map<std::string,std::vector<std::string> > Retriever::unquoteValues(
const std::map<std::string,std::vector<std::string> >& request)
130 std::map<std::string,std::vector<std::string> > r;
132 for ( std::map<std::string,std::vector<std::string> >::const_iterator it (request.begin()); it != request.end(); ++it)
134 const std::string&
key (it->first);
135 const std::vector<std::string>& values (it->second);
136 std::vector<std::string> vs;
137 for (
size_t i(0);
i < values.size(); ++
i)
138 vs.push_back(StringTool::unQuote(values[
i]));
static std::string expandTilde(const std::string &s)
void checkKeywordsHaveValues(const RequestDict &request, const std::vector< std::string > &keywords)