jt2594838 commented on code in PR #643:
URL: https://github.com/apache/tsfile/pull/643#discussion_r2575443997


##########
cpp/src/reader/tsfile_reader.cc:
##########
@@ -107,15 +107,90 @@ 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, tag_filter, 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;

Review Comment:
   device_names -> device_ids
   device_ids -> satisfied_device_ids



##########
cpp/test/reader/tree_view/tsfile_reader_tree_test.cc:
##########
@@ -108,6 +196,187 @@ TEST_F(TsFileTreeReaderTest, BasicTest) {
     reader.close();
 }
 
+TEST_F(TsFileTreeReaderTest, ReadTreeByTable) {
+    TsFileTreeWriter writer(&write_file_);
+    std::vector<std::string> device_ids = {"root.db1.t1", "root.db2.t1",
+                                           "root.db3.t2.t3", "root.db3.t3",
+                                           "device"};
+    std::vector<std::string> measurement_ids = {"temperature", "hudi", 
"level"};
+    for (auto& device_id : device_ids) {
+        TsRecord record(device_id, 0);
+        TsRecord record1(device_id, 1);
+        for (auto const& measurement : measurement_ids) {
+            auto schema =
+                new storage::MeasurementSchema(measurement, TSDataType::INT32);
+            ASSERT_EQ(E_OK, writer.register_timeseries(device_id, schema));
+            delete schema;
+            record.add_point(measurement, static_cast<int64_t>(1));
+            record1.add_point(measurement, static_cast<int64_t>(2));
+        }
+        ASSERT_EQ(E_OK, writer.write(record));
+        ASSERT_EQ(E_OK, writer.write(record1));
+    }
+    writer.flush();
+    writer.close();
+
+    TsFileReader reader;
+    reader.open(file_name_);
+    ResultSet* result;
+    int ret = reader.query_table_on_tree({"temperature", "hudi"}, INT64_MIN,
+                                         INT64_MAX, result);
+    ASSERT_EQ(ret, E_OK);
+
+    auto* table_result_set = (storage::TableResultSet*)result;
+    bool has_next = false;
+    int num = table_result_set->get_metadata()->get_column_count();
+    std::unordered_map<std::string, std::string> res;
+    std::unordered_set<std::string> result_set;
+    result_set.insert("rootdb1t1null");
+    result_set.insert("rootdb2t1null");
+    result_set.insert("rootdb3t2t3");
+    result_set.insert("rootdb3t3null");
+    result_set.insert("devicenullnullnull");
+    int cnt = 0;
+    while (IS_SUCC(table_result_set->next(has_next)) && has_next) {
+        auto t = table_result_set->get_value<int64_t>(1);
+        ASSERT_TRUE(t == 0 || t == 1);
+        std::string device_id_string;
+        for (int i = 1; i < num + 1; ++i) {
+            switch (table_result_set->get_metadata()->get_column_type(i)) {
+                case INT64:
+                    ASSERT_TRUE(table_result_set->get_value<int64_t>(i) == 1 ||
+                                table_result_set->get_value<int64_t>(i) == 0);
+                    break;
+                case INT32:
+                    ASSERT_TRUE(table_result_set->get_value<int32_t>(i) == 1 ||
+                                table_result_set->get_value<int32_t>(i) == 2);
+                    break;
+                case STRING: {
+                    common::String* str =
+                        table_result_set->get_value<common::String*>(i);
+                    std::string device_id_str;
+                    if (str == nullptr) {
+                        device_id_str = "null";
+                    } else {
+                        device_id_str = std::string(str->buf_, str->len_);
+                    }
+                    device_id_string += device_id_str;
+                } break;
+                default:
+                    break;
+            }
+        }
+        ASSERT_TRUE(result_set.find(device_id_string) != result_set.end());
+        cnt++;
+    }
+    ASSERT_EQ(cnt, 10);
+    reader.destroy_query_data_set(result);
+    reader.close();
+}
+
+TEST_F(TsFileTreeReaderTest, ReadTreeByTableIrrergular) {
+    TsFileTreeWriter writer(&write_file_);
+    std::vector<std::string> device_ids = {"root.db1.t1",
+                                           "root.db2.t1",
+                                           "root.db3.t2.t3",
+                                           "root.db3.t3",
+                                           "device",
+                                           "device.ln",
+                                           "device2.ln1.tmp",
+                                           "device3.ln2.tmp.v1.v2",
+                                           "device3.ln2.tmp.v1.v3"};
+    std::vector<std::string> measurement_ids1 = {"temperature", "hudi",
+                                                 "level"};
+    std::vector<std::string> measurement_ids2 = {"level", "vol"};
+    for (int i = 0; i < device_ids.size(); ++i) {
+        std::string device_id = device_ids[i];
+        TsRecord record(device_id, 0);
+        TsRecord record1(device_id, 1);
+        std::vector<std::string> measurements =
+            (i % 2 == 0) ? measurement_ids1 : measurement_ids2;
+        for (auto const& measurement : measurements) {
+            auto schema =
+                new storage::MeasurementSchema(measurement, TSDataType::INT32);
+            ASSERT_EQ(E_OK, writer.register_timeseries(device_id, schema));
+            delete schema;
+            record.add_point(measurement, static_cast<int64_t>(1));
+            record1.add_point(measurement, static_cast<int64_t>(2));
+        }
+        ASSERT_EQ(E_OK, writer.write(record));
+        ASSERT_EQ(E_OK, writer.write(record1));
+    }
+    writer.flush();
+    writer.close();
+
+    TsFileReader reader;
+    reader.open(file_name_);
+    ResultSet* result;
+    int ret = reader.query_table_on_tree({"level", "hudi"}, INT64_MIN,
+                                         INT64_MAX, result);
+    ASSERT_EQ(ret, E_OK);
+
+    auto* table_result_set = (storage::TableResultSet*)result;
+    bool has_next = false;
+    int num = table_result_set->get_metadata()->get_column_count();
+    ASSERT_EQ(num, 8);
+    int cnt = 0;

Review Comment:
   row_cnt
   



##########
cpp/src/common/device_id.h:
##########
@@ -192,9 +198,36 @@ class StringArrayDeviceID : public IDeviceID {
         return !(*this == other);
     }
 
+    void should_split_table_name() override { init_prefix_segments(); }

Review Comment:
   should_split_table_name -> split_table_name



##########
cpp/test/reader/tree_view/tsfile_reader_tree_test.cc:
##########
@@ -108,6 +196,187 @@ TEST_F(TsFileTreeReaderTest, BasicTest) {
     reader.close();
 }
 
+TEST_F(TsFileTreeReaderTest, ReadTreeByTable) {
+    TsFileTreeWriter writer(&write_file_);
+    std::vector<std::string> device_ids = {"root.db1.t1", "root.db2.t1",
+                                           "root.db3.t2.t3", "root.db3.t3",
+                                           "device"};
+    std::vector<std::string> measurement_ids = {"temperature", "hudi", 
"level"};
+    for (auto& device_id : device_ids) {
+        TsRecord record(device_id, 0);
+        TsRecord record1(device_id, 1);
+        for (auto const& measurement : measurement_ids) {
+            auto schema =
+                new storage::MeasurementSchema(measurement, TSDataType::INT32);
+            ASSERT_EQ(E_OK, writer.register_timeseries(device_id, schema));
+            delete schema;
+            record.add_point(measurement, static_cast<int64_t>(1));
+            record1.add_point(measurement, static_cast<int64_t>(2));
+        }
+        ASSERT_EQ(E_OK, writer.write(record));
+        ASSERT_EQ(E_OK, writer.write(record1));
+    }
+    writer.flush();
+    writer.close();
+
+    TsFileReader reader;
+    reader.open(file_name_);
+    ResultSet* result;
+    int ret = reader.query_table_on_tree({"temperature", "hudi"}, INT64_MIN,
+                                         INT64_MAX, result);
+    ASSERT_EQ(ret, E_OK);
+
+    auto* table_result_set = (storage::TableResultSet*)result;
+    bool has_next = false;
+    int num = table_result_set->get_metadata()->get_column_count();
+    std::unordered_map<std::string, std::string> res;
+    std::unordered_set<std::string> result_set;
+    result_set.insert("rootdb1t1null");
+    result_set.insert("rootdb2t1null");
+    result_set.insert("rootdb3t2t3");
+    result_set.insert("rootdb3t3null");
+    result_set.insert("devicenullnullnull");
+    int cnt = 0;
+    while (IS_SUCC(table_result_set->next(has_next)) && has_next) {
+        auto t = table_result_set->get_value<int64_t>(1);
+        ASSERT_TRUE(t == 0 || t == 1);
+        std::string device_id_string;
+        for (int i = 1; i < num + 1; ++i) {
+            switch (table_result_set->get_metadata()->get_column_type(i)) {
+                case INT64:
+                    ASSERT_TRUE(table_result_set->get_value<int64_t>(i) == 1 ||
+                                table_result_set->get_value<int64_t>(i) == 0);
+                    break;
+                case INT32:
+                    ASSERT_TRUE(table_result_set->get_value<int32_t>(i) == 1 ||
+                                table_result_set->get_value<int32_t>(i) == 2);
+                    break;
+                case STRING: {
+                    common::String* str =
+                        table_result_set->get_value<common::String*>(i);
+                    std::string device_id_str;
+                    if (str == nullptr) {
+                        device_id_str = "null";
+                    } else {
+                        device_id_str = std::string(str->buf_, str->len_);
+                    }
+                    device_id_string += device_id_str;
+                } break;
+                default:
+                    break;
+            }
+        }
+        ASSERT_TRUE(result_set.find(device_id_string) != result_set.end());
+        cnt++;
+    }
+    ASSERT_EQ(cnt, 10);
+    reader.destroy_query_data_set(result);
+    reader.close();
+}
+
+TEST_F(TsFileTreeReaderTest, ReadTreeByTableIrrergular) {
+    TsFileTreeWriter writer(&write_file_);
+    std::vector<std::string> device_ids = {"root.db1.t1",
+                                           "root.db2.t1",
+                                           "root.db3.t2.t3",
+                                           "root.db3.t3",
+                                           "device",
+                                           "device.ln",
+                                           "device2.ln1.tmp",
+                                           "device3.ln2.tmp.v1.v2",
+                                           "device3.ln2.tmp.v1.v3"};
+    std::vector<std::string> measurement_ids1 = {"temperature", "hudi",
+                                                 "level"};
+    std::vector<std::string> measurement_ids2 = {"level", "vol"};
+    for (int i = 0; i < device_ids.size(); ++i) {
+        std::string device_id = device_ids[i];
+        TsRecord record(device_id, 0);
+        TsRecord record1(device_id, 1);
+        std::vector<std::string> measurements =
+            (i % 2 == 0) ? measurement_ids1 : measurement_ids2;
+        for (auto const& measurement : measurements) {
+            auto schema =
+                new storage::MeasurementSchema(measurement, TSDataType::INT32);
+            ASSERT_EQ(E_OK, writer.register_timeseries(device_id, schema));
+            delete schema;
+            record.add_point(measurement, static_cast<int64_t>(1));
+            record1.add_point(measurement, static_cast<int64_t>(2));
+        }
+        ASSERT_EQ(E_OK, writer.write(record));
+        ASSERT_EQ(E_OK, writer.write(record1));
+    }
+    writer.flush();
+    writer.close();
+
+    TsFileReader reader;
+    reader.open(file_name_);
+    ResultSet* result;
+    int ret = reader.query_table_on_tree({"level", "hudi"}, INT64_MIN,
+                                         INT64_MAX, result);
+    ASSERT_EQ(ret, E_OK);
+
+    auto* table_result_set = (storage::TableResultSet*)result;
+    bool has_next = false;
+    int num = table_result_set->get_metadata()->get_column_count();

Review Comment:
   col_cnt



##########
cpp/src/reader/tsfile_reader.cc:
##########
@@ -107,15 +107,90 @@ 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, tag_filter, 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;
+    std::unordered_set<std::string> measurement_names_set_to_query;
+    size_t max_len = 0;

Review Comment:
   max_len -> device_max_len



-- 
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]

Reply via email to