Skip to content

Commit 9f4df6d

Browse files
committed
Add Field_Framework class
1 parent e772f1d commit 9f4df6d

File tree

23 files changed

+516
-476
lines changed

23 files changed

+516
-476
lines changed

src/Data_Element.hxx

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,68 @@
11
#pragma once
22

3-
#include <boost/property_tree/ptree.hpp>
4-
#include <boost/property_tree/xml_parser.hpp>
5-
63
#include "Column.hxx"
7-
8-
// JTODO: Create struct to hold commonly used (columns, offsets) pair?
4+
#include "Field_Framework.hxx"
95

106
namespace tablator {
117

128
class Data_Element {
139
public:
14-
Data_Element(const std::vector<Column> &columns, const std::vector<size_t> &offsets,
10+
Data_Element(const Field_Framework &field_framework,
1511
const std::vector<uint8_t> &data)
16-
: columns_(columns), offsets_(offsets), data_(data) {}
12+
: field_framework_(field_framework), data_(data) {}
13+
14+
Data_Element(const Field_Framework &field_framework)
15+
: Data_Element(field_framework, std::vector<uint8_t>()) {}
16+
1717

1818
// accessors
19-
inline const std::vector<Column> &get_columns() const { return columns_; }
20-
inline std::vector<Column> &get_columns() { return columns_; }
19+
const Field_Framework &get_field_framework() const { return field_framework_; }
20+
21+
Field_Framework &get_field_framework() { return field_framework_; }
22+
23+
24+
inline const std::vector<Column> &get_columns() const {
25+
return field_framework_.get_columns();
26+
}
2127

22-
inline const std::vector<size_t> &get_offsets() const { return offsets_; }
23-
inline std::vector<size_t> &get_offsets() { return offsets_; }
28+
// Non-const to allow query_server to modify field_properties.
29+
inline std::vector<Column> &get_columns() { return field_framework_.get_columns(); }
30+
31+
inline const std::vector<size_t> &get_offsets() const {
32+
return field_framework_.get_offsets();
33+
}
34+
35+
size_t get_row_size() const { return field_framework_.get_row_size(); }
36+
37+
size_t get_num_rows() const {
38+
if (get_row_size() == 0) {
39+
return 0;
40+
}
41+
return data_.size() / get_row_size();
42+
}
43+
44+
// called by query_server to trim result set
45+
void resize_data(size_t &new_num_rows) {
46+
data_.resize(get_row_size() * new_num_rows);
47+
}
48+
49+
void reserve_data(size_t &new_num_rows) {
50+
data_.reserve(get_row_size() * new_num_rows);
51+
}
2452

2553

2654
inline const std::vector<uint8_t> &get_data() const { return data_; }
55+
56+
// Non-const to support append_rows().
2757
inline std::vector<uint8_t> &get_data() { return data_; }
2858

2959
inline void set_data(const std::vector<uint8_t> &d) { data_ = d; }
3060

3161
private:
32-
std::vector<Column> columns_;
33-
std::vector<size_t> offsets_ = {0};
62+
// Non-const to allow query_server to update column's field_properties.
63+
Field_Framework field_framework_;
64+
65+
// Non-const because of append_rows().
3466
std::vector<uint8_t> data_;
3567
};
3668

src/Field_Framework.hxx

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#pragma once
2+
3+
#include "Column.hxx"
4+
#include "Utils/Null_Utils.hxx"
5+
6+
namespace tablator {
7+
8+
class Field_Framework {
9+
public:
10+
Field_Framework(const std::vector<Column> &incoming_columns,
11+
bool got_null_bitfields_column = false)
12+
: offsets_({0}) {
13+
if ((got_null_bitfields_column && incoming_columns.size() == 1) ||
14+
incoming_columns.empty()) {
15+
throw std::runtime_error(
16+
"Field_Framework constructor: <visible_columns> must be "
17+
"non-empty.");
18+
}
19+
// JTODO avoid copies
20+
if (!got_null_bitfields_column) {
21+
const size_t null_flags_size = bits_to_bytes(incoming_columns.size() + 1);
22+
append_column(null_bitfield_flags_name, Data_Type::UINT8_LE,
23+
null_flags_size,
24+
Field_Properties::Builder()
25+
.add_description(null_bitfield_flags_description)
26+
.build());
27+
}
28+
29+
for (auto &col : incoming_columns) {
30+
append_column(col);
31+
}
32+
}
33+
34+
// accessors
35+
36+
inline size_t get_row_size() const {
37+
if (offsets_.empty()) {
38+
throw std::runtime_error("<offsets> is empty");
39+
}
40+
return offsets_.back();
41+
}
42+
43+
inline const std::vector<Column> &get_columns() const { return columns_; }
44+
inline std::vector<Column> &get_columns() { return columns_; }
45+
46+
inline const std::vector<size_t> &get_offsets() const { return offsets_; }
47+
inline std::vector<size_t> &get_offsets() { return offsets_; }
48+
49+
50+
private:
51+
void append_column(const Column &column) {
52+
columns_.emplace_back(column);
53+
size_t old_row_size = *offsets_.rbegin();
54+
size_t new_row_size = old_row_size + columns_.rbegin()->get_data_size();
55+
offsets_.push_back(new_row_size);
56+
}
57+
58+
inline void append_column(const std::string &name, const Data_Type &type,
59+
const size_t &array_size,
60+
const Field_Properties &field_properties,
61+
bool dynamic_array_flag) {
62+
append_column(
63+
Column(name, type, array_size, field_properties, dynamic_array_flag));
64+
}
65+
66+
inline void append_column(const std::string &name, const Data_Type &type,
67+
const size_t &array_size,
68+
const Field_Properties &field_properties) {
69+
append_column(Column(name, type, array_size, field_properties));
70+
}
71+
72+
inline void append_column(const std::string &name, const Data_Type &type,
73+
const size_t &array_size, bool dynamic_array_flag) {
74+
append_column(Column(name, type, array_size, dynamic_array_flag));
75+
}
76+
77+
inline void append_column(const std::string &name, const Data_Type &type,
78+
const size_t &size) {
79+
append_column(Column(name, type, size));
80+
}
81+
82+
inline void append_column(const std::string &name, const Data_Type &type,
83+
const Field_Properties &field_properties) {
84+
append_column(Column(name, type, field_properties));
85+
}
86+
87+
88+
inline void append_column(const std::string &name, const Data_Type &type) {
89+
append_column(Column(name, type));
90+
}
91+
92+
std::vector<Column> columns_;
93+
std::vector<size_t> offsets_;
94+
};
95+
96+
} // namespace tablator

src/Resource_Element.hxx

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -373,23 +373,43 @@ public:
373373
return get_table_elements().at(MAIN_TABLE_ELEMENT_IDX);
374374
}
375375

376+
const Field_Framework &get_field_framework() const {
377+
return get_main_table_element().get_field_framework();
378+
}
379+
380+
Field_Framework &get_field_framework() {
381+
return get_main_table_element().get_field_framework();
382+
}
383+
376384
const std::vector<Column> &get_columns() const {
377385
return get_main_table_element().get_columns();
378386
}
387+
379388
std::vector<Column> &get_columns() {
380389
return get_main_table_element().get_columns();
381390
}
382391

383392
const std::vector<size_t> &get_offsets() const {
384393
return get_main_table_element().get_offsets();
385394
}
386-
std::vector<size_t> &get_offsets() {
387-
return get_main_table_element().get_offsets();
395+
396+
size_t get_row_size() const { return get_main_table_element().get_row_size(); }
397+
size_t get_num_rows() const { return get_main_table_element().get_num_rows(); }
398+
399+
// called by query_server to trim result set
400+
void resize_data(size_t &new_num_rows) {
401+
get_main_table_element().resize_data(new_num_rows);
402+
}
403+
404+
// called by query_server to trim result set
405+
void reserve_data(size_t &new_num_rows) {
406+
get_main_table_element().reserve_data(new_num_rows);
388407
}
389408

390409
std::vector<Field> &get_table_element_params() {
391410
return get_main_table_element().get_params();
392411
}
412+
393413
const std::vector<Field> &get_table_element_params() const {
394414
return get_main_table_element().get_params();
395415
}

0 commit comments

Comments
 (0)