17 using namespace eckit;
26 const std::vector<api::ColumnInfo>&
columns,
27 const std::vector<api::ConstStridedData>& data,
28 const std::map<std::string, std::string>& properties) {
30 ASSERT(
columns.size() == data.size());
35 size_t nrows = data[0].nelem();
40 for (
size_t i = 0;
i < ncols; ++
i) {
43 ASSERT(
columns[
i].decodedSize %
sizeof(
double) == 0);
44 md[
i]->dataSizeDoubles(
columns[
i].decodedSize /
sizeof(
double));
46 eckit::sql::BitfieldDef bf;
47 for (
const auto& bit :
columns[
i].bitfield) {
48 bf.first.push_back(bit.name);
49 bf.second.push_back(bit.size);
51 md[
i]->bitfieldDef(bf);
52 md[
i]->missingValue(0);
58 size_t maxRowSize =
sizeof(uint16_t);
60 for (
size_t col = 0; col < ncols; ++col) {
61 ASSERT(data[col].nelem() == nrows);
62 Codec& coder(md[col]->coder());
64 for (
const char*
d : data[col]) {
67 maxRowSize += data[col].dataSize();
82 const std::vector<api::ConstStridedData>& sortedData(data);
83 std::vector<Codec*> coders;
84 for (
const auto& col : md) coders.push_back(&col->coder());
86 Buffer encodedBuffer(maxRowSize * nrows);
89 for (
size_t row = 0; row < nrows; row++) {
93 for (; startCol < ncols; ++startCol) {
94 if (sortedData[startCol].isNewValue(row))
break;
100 static_cast<uint8_t
>((startCol / 256) % 256),
101 static_cast<uint8_t
>(startCol % 256)
103 encodedStream.
writeBytes(marker,
sizeof(marker));
106 char* p = encodedStream.
get();
107 for (
size_t col = startCol; col < ncols; col++) {
108 p = coders[col]->encode(p, *
reinterpret_cast<const double*
>(sortedData[col].get(row)));
110 encodedStream.
set(p);
116 props[
"encoder"] = std::string(
"odc version ") + LibOdc::instance().version();
117 std::pair<Buffer, size_t> encodedHeader = Header::serializeHeader(encodedStream.
position(), nrows, props, md);
121 ASSERT(out.write(encodedHeader.first, encodedHeader.second) ==
long(encodedHeader.second));
122 ASSERT(out.write(encodedBuffer, encodedStream.
position()) == encodedStream.
position());
int setOptimalCodecs(core::MetaData &columns)
virtual void gatherStats(const double &v)
void writeBytes(const void *addr, size_t bytes)
eckit::Offset position() const
std::map< std::string, std::string > Properties
void encodeFrame(eckit::DataHandle &out, const std::vector< api::ColumnInfo > &columns, const std::vector< api::ConstStridedData > &data, const std::map< std::string, std::string > &properties)