17 #include "eckit/io/FileHandle.h"
18 #include "eckit/io/BufferedHandle.h"
19 #include "eckit/log/Number.h"
20 #include "eckit/log/Timer.h"
21 #include "eckit/exception/Exceptions.h"
22 #include "eckit/sql/SQLParser.h"
23 #include "eckit/sql/SQLSelectFactory.h"
40 using namespace eckit;
49 Reader in(
"concatenated.odb");
53 Writer<> out(
"copy_of_concatenated.odb");
65 "x:INTEGER,y:INTEGER,v:DOUBLE\n"
72 eckit::FileHandle dh(
"selectAggregatedAndNonAggregated.odb");
78 TEST(selectAggregatedAndNonAggregated)
82 odc::Select oda(
"select x,min(v),max(v) from \"selectAggregatedAndNonAggregated.odb\";");
85 double r0 = (*it)[0], r1 = (*it)[1], r2 = (*it)[2];
87 Log::info() <<
"selectAggregatedAndNonAggregated: " << r0 <<
", " << r1 <<
", " << r2 << std::endl;
89 ASSERT(Comparator::same(r0, 1));
90 ASSERT(Comparator::same(r1, 0.2));
91 ASSERT(Comparator::same(r2, 0.3));
99 Log::info() <<
"selectAggregatedAndNonAggregated: " << r0 <<
", " << r1 <<
", " << r2 << std::endl;
106 ASSERT( ! (it !=
oda.end() ));
112 Writer<> out(
"selectAggregatedAndNonAggregated2.odb");
122 for (
size_t row = 0; row < 1000; ++row)
123 for (
size_t x = 0; x < 10; (*o)[0] = ++x)
124 for (
size_t y = 0; y < 10; (*o)[1] = ++y)
125 for (
double v = 0; v < 10; (*o)[2] = ++v)
129 TEST(selectAggregatedAndNonAggregated2)
132 odc::Select oda(
"select x,min(v),y,max(v) from \"selectAggregatedAndNonAggregated2.odb\";");
134 unsigned long counter = 0;
135 for ( ; it !=
oda.end(); ++it, ++counter)
140 Log::info() <<
"selectAggregatedAndNonAggregated2: counter= " << counter << std::endl;
141 ASSERT(counter == 110);
148 "x:STRING,y:INTEGER,v:DOUBLE\n"
155 FileHandle dh(
"selectAggregatedAndNonAggregated3.odb");
161 TEST(selectAggregatedAndNonAggregated3)
165 odc::Select oda(
"select x,count(*) from \"selectAggregatedAndNonAggregated3.odb\";");
167 unsigned long counter = 0;
168 for ( ; it !=
oda.end(); ++it, ++counter)
170 double r0 = (*it)[0], r1 = (*it)[1];
171 Log::info() <<
"selectAggregatedAndNonAggregated3: " << r0 <<
", " << r1 << std::endl;
173 Log::info() <<
"selectAggregatedAndNonAggregated3: counter= " << counter << std::endl;
174 ASSERT(counter == 2);
182 "x:REAL,y:INTEGER,v:DOUBLE\n"
192 FileHandle dh(
"selectAggregatedAndNonAggregatedNULL.odb");
198 TEST(selectAggregatedAndNonAggregatedNULL)
202 odc::Select oda(
"select x,count(*) from \"selectAggregatedAndNonAggregatedNULL.odb\";");
204 unsigned long counter = 0;
205 for ( ; it !=
oda.end(); ++it, ++counter)
207 double r0 = (*it)[0], r1 = (*it)[1];
208 Log::info() <<
"selectAggregatedAndNonAggregatedNULL: " << r0 <<
", " << r1 << std::endl;
210 Log::info() <<
"selectAggregatedAndNonAggregatedNULL: counter= " << counter << std::endl;
211 ASSERT(counter == 3);
222 "aa:INTEGER,ab:INTEGER,ba:INTEGER,bb:INTEGER\n"
228 FileHandle dh(
"regex1.odb");
240 Log::info() <<
"regex1: " << it->
columns() << std::endl;
242 ASSERT(it->
columns().size() == 2);
250 "a:INTEGER,b:INTEGER\n"
264 FileHandle dh(
"vector_syntax.odb");
271 "set $X = [1,2,3,4,5];"
272 "select * from \"vector_syntax.odb\" where a in $X;"
278 unsigned long counter = 0;
279 for ( ; it !=
oda.end(); ++it, ++counter)
281 ASSERT(counter == 5);
287 Log::info() <<
"sizeof(eckit::log::Number::W)" <<
sizeof(eckit::log::Number::W) << std::endl;
288 Log::info() <<
"sizeof(double)" <<
sizeof(double) << std::endl;
300 ASSERT(eckit::log::Number::printBinary(1843).size() == 11);
301 ASSERT(eckit::log::Number::printBinary(1843) ==
"11100110011");
303 ASSERT(eckit::log::Number::printBinary(0).size() == 1);
304 ASSERT(eckit::log::Number::printBinary(0) ==
"0");
308 TEST(bitfieldsPrintHexadecimal)
310 ASSERT(eckit::log::Number::printHexadecimal(1843) == std::string(
"733"));
313 ASSERT(eckit::log::Number::printHexadecimal(10) == std::string(
"a"));
314 ASSERT(eckit::log::Number::printHexadecimal(11) == std::string(
"b"));
315 ASSERT(eckit::log::Number::printHexadecimal(15) == std::string(
"f"));
316 ASSERT(eckit::log::Number::printHexadecimal(255) == std::string(
"ff"));
322 "a:STRING,b:INTEGER\n"
328 FileHandle dh(
"stringInWhere.odb");
337 odc::Select oda(
"select * from 'stringInWhere.odb' where a = 'aaa';");
339 unsigned long counter = 0;
342 ASSERT(counter == 1);
347 const char* sql =
"set $y = 100; set $x = [$y, 'a', 'b', [1, 2]];";
348 eckit::sql::SQLSession session;
349 eckit::sql::SQLParser::parseString(session, sql);
377 const char *inputData =
"a:INTEGER,b:INTEGER\n" "1,1\n" "2,2\n" "3,3\n" "4,4\n" "5,5\n" "6,6\n" "7,7\n" "8,8\n" "9,9\n" "10,10\n";
378 string path(
"Test_rownumber1.odb");
387 string query(
"SELECT rownumber() from \"" + path +
"\";");
394 for (; it != end; ++it)
396 ASSERT((*it)[0] == ++
i);
455 FileHandle dh(
"uv.odb");
464 string path(
"uv.odb");
465 string query(
"SELECT ff(u,v), dd(u,v), speed(u,v),dir(u,v), sqrt(u*u+v*v), fmod(atan2(-u,-v)+360.,360.) from \"" + path +
"\";");
472 for (; it != end; ++it)
474 Log::info() <<
" ff = " << (*it)[0] <<
" speed sqrt= " << (*it)[4] << std::endl;
475 Log::info() <<
" dd = " << (*it)[1] <<
" direction atan= " << (*it)[5] << std::endl;
476 ASSERT((*it)[0] == (*it)[4]);
477 ASSERT((*it)[1] == (*it)[5]);
490 const char * fn =
"selectAggregatedAndNonAggregated.odb";
494 Log::info() <<
"chunks.size():" <<
chunks.size() << std::endl;
495 ASSERT(
chunks.size() == 1 &&
chunks[0].first == Offset(0) &&
chunks[0].second == Length(357));
508 const size_t size = 1024;
509 const size_t n = 1000000;
511 vector<double> v(size);
515 Timer timer(
"std::copy");
516 for (
size_t i = 0;
i < n; ++
i)
521 Timer timer(
"for loop");
522 for (
size_t i = 0;
i < n; ++
i)
523 for (
size_t j = 0; j < size; ++j)
531 static void count(
void *counter,
const double* data,
size_t n) { ++*((
llong*)counter); }
542 *result = (*(
llong *) left) + (*(
llong *) right);
554 TEST(hash_operator_on_select_list)
557 "x:INTEGER,y:INTEGER\n"
579 string sql(
"select x,x#-1,x#1 from \"" +
f +
"\";");
583 for (; it != end; ++it)
585 Log::info() << it << std::endl;
595 "x:INTEGER,y:INTEGER\n"
617 string sql(
"select x,x#-1,x#1 from \"" +
f +
"\" where x=2 and x#1=3;");
621 for (; it != end; ++it)
623 Log::info() << it << std::endl;
629 PathName
f(
"2000010106.4.0.odb");
631 odc::Select select(
"select anflag@body,anflag.final@body,anflag.*@body from \"" +
f +
"\";");
634 for (; it != end; ++it)
636 Log::info() << it << std::endl;
652 unsigned long counter = 0;
653 for ( ; it != o.
end(); ++it, ++counter)
655 Log::info() << it << std::endl;
663 ofstream
f(
"stuff.sql");
666 <<
"set $foo = 10;" << endl
667 <<
"set $bar = 20;" << std::endl;
671 "#include \"stuff.sql\"\n"
673 "select $foo * $bar;"
676 unsigned long counter = 0;
682 Log::info() << it << std::endl;
688 Log::error() <<
"Just a logger test" << std::endl;
714 TEST(meta_data_reader_checks_if_file_truncated)
716 ASSERT(0 == system(
"dd if=disp.7.1.odb of=disp.7.1.odb.truncated bs=1914000 count=1"));
719 for(
auto it(mdr.
begin()), end(mdr.
end()); it != end; ++it)
721 ASSERT(0 &&
"Scanning of truncated file did not fail");
723 Log::info() <<
"Scanning of truncated file disp.7.1.odb.truncated failed as expected." << std::endl;
727 TEST(meta_data_reader_fails_scanning_corrupted_file)
729 ASSERT(0 == system(
"cat disp.7.1.odb disp.7.1.odb.truncated >corrupted.odb"));
732 for(
auto it(mdr.
begin()), end(mdr.
end()); it != end; ++it)
734 ASSERT(0 &&
"Scanning of corrupted.odb did not fail");
736 Log::info() <<
"Scanning of corrupted.odb failed as expected." << std::endl;
743 "a:INTEGER,b:INTEGER\n"
757 FileHandle dh(
"1to10.odb");
763 odc::Select odb(
"select a,b from \"1to10.odb\" where a >= 3;");
764 unsigned long counter = 0;
769 ASSERT(counter == 8);
775 "a:INTEGER,b:INTEGER\n"
788 FileHandle dh(
"1to10.odb");
818 for (
typename T::iterator it = odb.begin(), end = odb.end();
821 if (it->isNewDataset())
887 ASSERT(1 == (*
odc::Select(
"select julian_seconds(19750311,0) < julian_seconds(20140210,0) from dual;").begin())[0]);
890 TEST(CREATE_TABLE_and_SELECT_INTO)
892 const char *inputData =
893 R
"(a:INTEGER,b:INTEGER
906 FileHandle dh("CREATE_TABLE_and_SELECT_INTO.odb");
912 const char* sql = R
"(
913 CREATE TYPE mybitfield AS (
920 CREATE TABLE "foo.odb" AS (
926 SELECT a,b,a*b INTO "foo.odb" FROM "CREATE_TABLE_and_SELECT_INTO.odb";
932 unsigned long counter = 0;
933 Log::info() <<
"Inside select" << std::endl;
934 for ( ; it != o.
end(); ++it, ++counter) {
935 Log::info() <<
"Getting a line..." << std::endl;
938 Log::info() <<
"CREATE_TABLE_and_SELECT_INTO: counter=" << counter << endl;
940 system(
"ls -l foo.odb; ");
941 system((eckit::PathName(
"~/bin/odc").asString() +
" header foo.odb").c_str());
942 system((eckit::PathName(
"~/bin/odc").asString() +
" ls foo.odb").c_str());
969 FileHandle dh(
"select_where_0.odb");
974 odc::Select o(
"SELECT * FROM \"select_where_0.odb\" WHERE 0;");
979 TEST(QuestionMarkHandlingWhenSplittingByStringColumn_ODB235)
981 const char *inFile (
"ODB_235.odb");
983 "a:INTEGER,b:INTEGER,expver:STRING\n"
988 const char* outFileTemplate (
"ODB_235_{a}_{expver}.odb");
991 FileHandle dh(inFile);
1001 outIt->pass1(in.begin(), in.end());
1003 ASSERT(PathName(
"ODB_235_1_?.odb").exists());
1004 ASSERT(PathName(
"ODB_235_2_?.odb").exists());
1005 ASSERT(PathName(
"ODB_235_3_?.odb").exists());
1007 PathName(
"ODB_235_1_?.odb").unlink();
1008 PathName(
"ODB_235_2_?.odb").unlink();
1009 PathName(
"ODB_235_3_?.odb").unlink();
1010 PathName(
"ODB_235.odb").unlink();
1013 TEST(LegacyAPIExecuteSelectTwice)
1015 const std::string fn(
"legacy_execute_select_twice.odb");
1019 AutoClose close(dh);
1022 odc::Select o(std::string(
"SELECT * FROM \"") + fn +
"\";");
1037 TEST(LegacyAPITraverseReaderTwice)
1039 const std::string fn(
"legacy_traverse_reader_twice.odb");
1043 AutoClose close(dh);
1073 Log::info() <<
"." << std::endl;
#define CHECK_EQUAL(expected, actual)
static void createDataForRegex1()
static void count(void *counter, const double *data, size_t n)
TEST(selectAggregatedAndNonAggregated)
static void create_stringInWhere_file()
static void createDataForMixedAggregated3()
static void createDataForMixedAggregatedNULL()
static void SplitTool_chunks()
static void destroy_counter(void *counter)
static void createDataForWindSpeedWindDirection()
static void createDataForMixedAggregated2()
static void test_isNewDataset()
TemporaryPathName ScratchFile
static void createDataForMixedAggregated()
static void create_1to10()
static void copyVectorToArray()
static void * reduce_counter(void *left, void *right)
static void * create_counter()
TemporaryPathName(const string &fn)
bool compare(T1 &it1, const T1 &end1, T2 &it2, const T2 &end2, const std::string &desc1, const std::string &desc2)
static eckit::DataHandle * openForRead(const std::string &)
const iterator end() const
unsigned long pass1(T b, const T e)
const core::MetaData & columns() const
iterator begin(bool openDataHandle=true)
IODA_DL void copy(const ObjectSelection &from, ObjectSelection &to, const ScaleMapping &scale_map)
Generic data copying function.
size_t odbFromCSV(DataHandle &dh_in, DataHandle &dh_out, const std::string &delimiter)
odbFromCSV returns number of lines imported