jt2594838 commented on code in PR #643:
URL: https://github.com/apache/tsfile/pull/643#discussion_r2554538080
##########
cpp/src/reader/table_query_executor.cc:
##########
@@ -85,6 +87,115 @@ int TableQueryExecutor::query(const std::string &table_name,
return ret;
}
-void TableQueryExecutor::destroy_query_data_set(ResultSet *qds) { delete qds; }
+int TableQueryExecutor::query_on_tree(
+ const std::vector<std::shared_ptr<IDeviceID>>& devices,
+ const std::vector<std::string>& tag_columns,
+ const std::vector<std::string>& field_columns, Filter* time_filter,
+ ResultSet*& ret_qds) {
+ common::PageArena pa;
+ pa.init(512, common::MOD_TSFILE_READER);
+ int ret = common::E_OK;
+ TsFileMeta* file_meta = tsfile_io_reader_->get_tsfile_meta();
+ std::vector<MetaIndexNode*> table_inodes;
+ for (auto const& device : devices) {
+ MetaIndexNode* table_inode;
+ if (RET_FAIL(file_meta->get_table_metaindex_node(
+ device->get_table_name(), table_inode))) {
+ };
+ table_inodes.push_back(table_inode);
Review Comment:
Should return the failure?
##########
cpp/src/reader/tsfile_reader.cc:
##########
@@ -99,15 +99,49 @@ int TsFileReader::query(const std::string& table_name,
return E_TABLE_NOT_EXIST;
}
- std::vector<TSDataType> data_types = table_schema->get_data_types();
-
Filter* time_filter = new TimeBetween(start_time, end_time, false);
ret =
table_query_executor_->query(to_lower(table_name), columns_names,
time_filter, nullptr, nullptr,
result_set);
return ret;
}
+int TsFileReader::query_table_on_tree(
+ const std::vector<std::string>& measurement_names, int64_t star_time,
+ int64_t end_time, ResultSet*& result_set) {
+ int ret = E_OK;
+ TsFileMeta* tsfile_meta = tsfile_executor_->get_tsfile_meta();
+ if (tsfile_meta == nullptr) {
+ return E_TSFILE_WRITER_META_ERR;
+ }
+ auto device_names = this->get_all_device_ids();
+ std::vector<std::shared_ptr<IDeviceID>> device_ids;
+ size_t max_len = 0;
+ for (auto& device_name : device_names) {
+ std::vector<MeasurementSchema> schemas;
+ this->get_timeseries_schema(device_name, schemas);
+ for (auto schema : schemas) {
+ if (std::find(measurement_names.begin(), measurement_names.end(),
+ schema.measurement_name_) !=
+ measurement_names.end()) {
+ device_ids.push_back(device_name);
+ if (device_name->get_segments().size() > max_len) {
+ max_len = device_name->get_segments().size();
+ }
+ break;
+ }
+ }
+ }
+ std::vector<std::string> columns_names(max_len);
+ for (int i = 0; i < max_len; i++) {
+ columns_names[i] = "l_" + std::to_string(i);
Review Comment:
Use "__L" to reduce the possiblity of conflicting with the user column.
##########
cpp/src/reader/table_query_executor.cc:
##########
@@ -85,6 +87,115 @@ int TableQueryExecutor::query(const std::string &table_name,
return ret;
}
-void TableQueryExecutor::destroy_query_data_set(ResultSet *qds) { delete qds; }
+int TableQueryExecutor::query_on_tree(
+ const std::vector<std::shared_ptr<IDeviceID>>& devices,
+ const std::vector<std::string>& tag_columns,
+ const std::vector<std::string>& field_columns, Filter* time_filter,
+ ResultSet*& ret_qds) {
+ common::PageArena pa;
+ pa.init(512, common::MOD_TSFILE_READER);
+ int ret = common::E_OK;
+ TsFileMeta* file_meta = tsfile_io_reader_->get_tsfile_meta();
+ std::vector<MetaIndexNode*> table_inodes;
+ for (auto const& device : devices) {
+ MetaIndexNode* table_inode;
+ if (RET_FAIL(file_meta->get_table_metaindex_node(
+ device->get_table_name(), table_inode))) {
+ };
+ table_inodes.push_back(table_inode);
+ }
+
+ std::vector<common::ColumnSchema> col_schema;
+ for (auto const& tag : tag_columns) {
+ col_schema.emplace_back(tag, common::TSDataType::STRING,
+ common::ColumnCategory::TAG);
+ }
+
+ std::unordered_map<std::string, common::TSDataType> column_types_map;
+
+ for (auto const& device : devices) {
+ bool all_collected = true;
+ for (const auto& field_col : field_columns) {
+ if (column_types_map.find(field_col) == column_types_map.end()) {
+ all_collected = false;
+ break;
+ }
Review Comment:
How about type collision?
##########
cpp/src/reader/table_query_executor.cc:
##########
@@ -85,6 +87,115 @@ int TableQueryExecutor::query(const std::string &table_name,
return ret;
}
-void TableQueryExecutor::destroy_query_data_set(ResultSet *qds) { delete qds; }
+int TableQueryExecutor::query_on_tree(
+ const std::vector<std::shared_ptr<IDeviceID>>& devices,
+ const std::vector<std::string>& tag_columns,
+ const std::vector<std::string>& field_columns, Filter* time_filter,
+ ResultSet*& ret_qds) {
+ common::PageArena pa;
+ pa.init(512, common::MOD_TSFILE_READER);
+ int ret = common::E_OK;
+ TsFileMeta* file_meta = tsfile_io_reader_->get_tsfile_meta();
+ std::vector<MetaIndexNode*> table_inodes;
+ for (auto const& device : devices) {
+ MetaIndexNode* table_inode;
+ if (RET_FAIL(file_meta->get_table_metaindex_node(
+ device->get_table_name(), table_inode))) {
+ };
+ table_inodes.push_back(table_inode);
+ }
+
+ std::vector<common::ColumnSchema> col_schema;
+ for (auto const& tag : tag_columns) {
+ col_schema.emplace_back(tag, common::TSDataType::STRING,
+ common::ColumnCategory::TAG);
+ }
+
+ std::unordered_map<std::string, common::TSDataType> column_types_map;
+
+ for (auto const& device : devices) {
+ bool all_collected = true;
+ for (const auto& field_col : field_columns) {
+ if (column_types_map.find(field_col) == column_types_map.end()) {
+ all_collected = false;
+ break;
+ }
+ }
+ if (all_collected) {
+ break;
+ }
+
+ std::unordered_set<std::string> measurements(field_columns.begin(),
+ field_columns.end());
+ std::vector<ITimeseriesIndex*> index(measurements.size());
+ if (RET_FAIL(tsfile_io_reader_->get_timeseries_indexes(
+ device, measurements, index, pa))) {
+ assert(0);
+ }
+
+ for (auto* ts_index : index) {
+ if (ts_index != nullptr) {
+ std::string measurement_name =
+ ts_index->get_measurement_name().to_std_string();
+ if (column_types_map.find(measurement_name) ==
+ column_types_map.end()) {
+ common::TSDataType type = ts_index->get_data_type();
+ // TODO(Colin): Fix type missmatch.
+ // if (type == common::TSDataType::INT32 ||
+ // type == common::TSDataType::INT64 ||
+ // type == common::TSDataType::TIMESTAMP ||
+ // type == common::TSDataType::DATE) {
+ // type = common::TSDataType::INT64;
+ // } else if (type == common::TSDataType::FLOAT) {
+ // type = common::TSDataType::DOUBLE;
+ // }
+ column_types_map[measurement_name] = type;
Review Comment:
Fix it now.
##########
cpp/src/reader/table_query_executor.cc:
##########
@@ -85,6 +87,115 @@ int TableQueryExecutor::query(const std::string &table_name,
return ret;
}
-void TableQueryExecutor::destroy_query_data_set(ResultSet *qds) { delete qds; }
+int TableQueryExecutor::query_on_tree(
+ const std::vector<std::shared_ptr<IDeviceID>>& devices,
+ const std::vector<std::string>& tag_columns,
+ const std::vector<std::string>& field_columns, Filter* time_filter,
+ ResultSet*& ret_qds) {
+ common::PageArena pa;
+ pa.init(512, common::MOD_TSFILE_READER);
+ int ret = common::E_OK;
+ TsFileMeta* file_meta = tsfile_io_reader_->get_tsfile_meta();
+ std::vector<MetaIndexNode*> table_inodes;
+ for (auto const& device : devices) {
+ MetaIndexNode* table_inode;
+ if (RET_FAIL(file_meta->get_table_metaindex_node(
+ device->get_table_name(), table_inode))) {
+ };
+ table_inodes.push_back(table_inode);
+ }
+
+ std::vector<common::ColumnSchema> col_schema;
+ for (auto const& tag : tag_columns) {
+ col_schema.emplace_back(tag, common::TSDataType::STRING,
+ common::ColumnCategory::TAG);
+ }
+
+ std::unordered_map<std::string, common::TSDataType> column_types_map;
+
+ for (auto const& device : devices) {
+ bool all_collected = true;
+ for (const auto& field_col : field_columns) {
+ if (column_types_map.find(field_col) == column_types_map.end()) {
+ all_collected = false;
+ break;
+ }
+ }
+ if (all_collected) {
+ break;
+ }
+
+ std::unordered_set<std::string> measurements(field_columns.begin(),
+ field_columns.end());
+ std::vector<ITimeseriesIndex*> index(measurements.size());
+ if (RET_FAIL(tsfile_io_reader_->get_timeseries_indexes(
+ device, measurements, index, pa))) {
+ assert(0);
+ }
Review Comment:
Should return the failure?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]