zwhzzz0821 commented on code in PR #345:
URL: https://github.com/apache/tsfile/pull/345#discussion_r1897589048


##########
cpp/src/common/device_id.h:
##########
@@ -0,0 +1,212 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * License); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef COMMON_DEVICE_ID_H
+#define COMMON_DEVICE_ID_H
+
+#include <algorithm>
+#include <cstdint>
+#include <cstring>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <numeric>
+#include <sstream>
+#include <stdexcept>
+#include <string>
+#include <vector>
+
+#include "common/allocator/byte_stream.h"
+#include "utils/errno_define.h"
+
+class IDeviceID {
+   public:
+    virtual ~IDeviceID() = default;
+    virtual int serialize(common::ByteStream& write_stream) { return 0; }
+    virtual std::string get_table_name() { return ""; }
+    virtual int segment_num() { return 0; }
+    virtual std::vector<std::string> get_segments() const { return {}; }
+    virtual std::string get_device_name() const { return ""; };
+    virtual bool operator<(const IDeviceID& other) { return 0; }
+    virtual bool operator==(const IDeviceID& other) { return false; }
+    virtual bool operator!=(const IDeviceID& other) { return false; }
+};
+
+struct IDeviceIDComparator {
+    bool operator()(const std::shared_ptr<IDeviceID>& lhs,
+                    const std::shared_ptr<IDeviceID>& rhs) const {
+        return *lhs < *rhs;
+    }
+};
+
+class StringArrayDeviceID : public IDeviceID {
+   public:
+    explicit StringArrayDeviceID(const std::vector<std::string>& segments)
+        : segments_(formalize(segments)) {}
+
+    explicit StringArrayDeviceID(const std::string& device_id_string)
+        : segments_(split_device_id_string(device_id_string)) {}
+
+    ~StringArrayDeviceID() override = default;
+
+    std::string get_device_name() const override {
+        return std::accumulate(std::next(segments_.begin()), segments_.end(),
+                               segments_.front(),
+                               [](std::string a, const std::string& b) {
+                                   return std::move(a) + "." + b;
+                               });
+    };
+
+    int serialize(common::ByteStream& write_stream) override {
+        int ret = common::E_OK;
+        if (RET_FAIL(common::SerializationUtil::write_var_int(segment_num(),
+                                                              write_stream))) {
+            return ret;
+        }
+        for (const auto& segment : segments_) {
+            if (RET_FAIL(common::SerializationUtil::write_var_int(
+                    segment.size(), write_stream))) {
+                return ret;
+            } else if (RET_FAIL(write_stream.write_buf(segment.c_str(),
+                                                       segment.size()))) {
+                return ret;
+            }
+        }
+        return ret;
+    }
+
+    std::string get_table_name() override {
+        return segments_.empty() ? "" : segments_[0];
+    }
+
+    int segment_num() override { return static_cast<int>(segments_.size()); }
+
+    std::vector<std::string> get_segments() const override { return segments_; 
}

Review Comment:
   If read only
   you can return `const std::vector<std::string>&`  to avoid copy



##########
cpp/src/common/schema.h:
##########
@@ -84,5 +113,147 @@ struct MeasurementSchemaGroup {
     TimeChunkWriter *time_chunk_writer_ = nullptr;
 };
 
+enum class ColumnCategory { ID, MEASUREMENT };
+
+class TableSchema {
+   public:
+    TableSchema() = default;
+    TableSchema(const std::string &table_name,
+                const std::vector<std::shared_ptr<MeasurementSchema>>
+                    &measurement_schemas,
+                const std::vector<ColumnCategory> &column_categories)
+        : table_name_(table_name),
+          measurement_schemas_(measurement_schemas),
+          column_categories_(column_categories) {
+        int idx = 0;
+        for (auto &measurement_schema : measurement_schemas_) {
+            column_pos_index_.insert(
+                std::make_pair(measurement_schema->measurement_name_, idx++));
+        }
+    }
+
+    TableSchema(TableSchema &&other) noexcept
+        : table_name_(std::move(other.table_name_)),
+          measurement_schemas_(std::move(other.measurement_schemas_)),
+          column_categories_(std::move(other.column_categories_)) {}
+
+    TableSchema(const TableSchema &other) = default;
+
+    int serialize_to(common::ByteStream &out) {
+        int ret = common::E_OK;
+        if (RET_FAIL(common::SerializationUtil::write_var_uint(
+                measurement_schemas_.size(), out))) {
+        } else {
+            for (size_t i = 0; IS_SUCC(ret) && i < measurement_schemas_.size();
+                 i++) {
+                auto column_schema = measurement_schemas_[i];
+                auto column_category = column_categories_[i];
+                // column_schema-
+                common::SerializationUtil::write_i32(
+                    static_cast<int32_t>(column_category), out);
+            }
+        }
+        return ret;
+    }
+
+    ~TableSchema() = default;
+
+    std::string get_table_name() { return table_name_; }

Review Comment:
   same problem as mentioned



##########
cpp/src/common/schema.h:
##########
@@ -84,5 +113,147 @@ struct MeasurementSchemaGroup {
     TimeChunkWriter *time_chunk_writer_ = nullptr;
 };
 
+enum class ColumnCategory { ID, MEASUREMENT };
+
+class TableSchema {
+   public:
+    TableSchema() = default;
+    TableSchema(const std::string &table_name,
+                const std::vector<std::shared_ptr<MeasurementSchema>>
+                    &measurement_schemas,
+                const std::vector<ColumnCategory> &column_categories)
+        : table_name_(table_name),
+          measurement_schemas_(measurement_schemas),
+          column_categories_(column_categories) {
+        int idx = 0;

Review Comment:
   use `size_t` to avoid potential problems



##########
cpp/src/common/device_id.h:
##########
@@ -0,0 +1,212 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * License); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef COMMON_DEVICE_ID_H
+#define COMMON_DEVICE_ID_H
+
+#include <algorithm>
+#include <cstdint>
+#include <cstring>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <numeric>
+#include <sstream>
+#include <stdexcept>
+#include <string>
+#include <vector>
+
+#include "common/allocator/byte_stream.h"
+#include "utils/errno_define.h"
+
+class IDeviceID {
+   public:
+    virtual ~IDeviceID() = default;
+    virtual int serialize(common::ByteStream& write_stream) { return 0; }
+    virtual std::string get_table_name() { return ""; }
+    virtual int segment_num() { return 0; }
+    virtual std::vector<std::string> get_segments() const { return {}; }
+    virtual std::string get_device_name() const { return ""; };
+    virtual bool operator<(const IDeviceID& other) { return 0; }
+    virtual bool operator==(const IDeviceID& other) { return false; }
+    virtual bool operator!=(const IDeviceID& other) { return false; }
+};
+
+struct IDeviceIDComparator {
+    bool operator()(const std::shared_ptr<IDeviceID>& lhs,
+                    const std::shared_ptr<IDeviceID>& rhs) const {
+        return *lhs < *rhs;
+    }
+};
+
+class StringArrayDeviceID : public IDeviceID {
+   public:
+    explicit StringArrayDeviceID(const std::vector<std::string>& segments)
+        : segments_(formalize(segments)) {}
+
+    explicit StringArrayDeviceID(const std::string& device_id_string)
+        : segments_(split_device_id_string(device_id_string)) {}
+
+    ~StringArrayDeviceID() override = default;
+
+    std::string get_device_name() const override {
+        return std::accumulate(std::next(segments_.begin()), segments_.end(),
+                               segments_.front(),
+                               [](std::string a, const std::string& b) {
+                                   return std::move(a) + "." + b;
+                               });
+    };
+
+    int serialize(common::ByteStream& write_stream) override {
+        int ret = common::E_OK;
+        if (RET_FAIL(common::SerializationUtil::write_var_int(segment_num(),
+                                                              write_stream))) {
+            return ret;
+        }
+        for (const auto& segment : segments_) {
+            if (RET_FAIL(common::SerializationUtil::write_var_int(
+                    segment.size(), write_stream))) {
+                return ret;
+            } else if (RET_FAIL(write_stream.write_buf(segment.c_str(),
+                                                       segment.size()))) {
+                return ret;
+            }
+        }
+        return ret;
+    }
+
+    std::string get_table_name() override {
+        return segments_.empty() ? "" : segments_[0];
+    }
+
+    int segment_num() override { return static_cast<int>(segments_.size()); }
+
+    std::vector<std::string> get_segments() const override { return segments_; 
}
+
+    virtual bool operator<(const IDeviceID& other) override {
+        auto other_segments = other.get_segments();
+        return std::lexicographical_compare(segments_.begin(), segments_.end(),
+                                            other_segments.begin(),
+                                            other_segments.end());
+    }
+
+    bool operator==(const IDeviceID& other) override {
+        auto other_segments = other.get_segments();
+        return (segments_.size() == other_segments.size()) &&
+               std::equal(segments_.begin(), segments_.end(),
+                          other_segments.begin());
+    }
+
+    bool operator!=(const IDeviceID& other) override {
+        return !(*this == other);
+    }
+
+   private:
+    std::vector<std::string> segments_;
+
+    static std::vector<std::string> formalize(
+        const std::vector<std::string>& segments) {
+        auto it =
+            std::find_if(segments.rbegin(), segments.rend(),
+                         [](const std::string& seg) { return !seg.empty(); });
+        return std::vector<std::string>(segments.begin(), it.base());
+    }
+
+    static std::vector<std::string> split_device_id_string(
+        std::basic_string<char> device_id_string) {
+        std::vector<std::string> splits;
+        std::istringstream stream(device_id_string);
+        std::string segment;
+        while (std::getline(stream, segment, '.')) {
+            splits.push_back(segment);
+        }
+        return splits;
+    }
+};
+
+class PlainDeviceID : public IDeviceID {
+   public:
+    explicit PlainDeviceID(const std::string& deviceID)
+        : device_id_(deviceID), tableName_(), segments_() {}
+
+    ~PlainDeviceID() override = default;
+
+    bool operator==(const IDeviceID& other) override {
+        return device_id_ == other.get_device_name();
+    }
+
+    bool operator!=(const IDeviceID& other) override {
+        return device_id_ != other.get_device_name();
+    }
+
+    int serialize(common::ByteStream& write_stream) override {
+        int ret = common::E_OK;
+        if 
(RET_FAIL(common::SerializationUtil::write_var_int(device_id_.size(),
+                                                              write_stream))) {
+            return ret;
+        } else if (RET_FAIL(write_stream.write_buf(device_id_.c_str(),
+                                                   device_id_.size()))) {
+            return ret;
+        }
+        return ret;
+    }
+
+    std::string get_device_name() const override { return device_id_; };
+
+    std::string get_table_name() override {

Review Comment:
   You can verify that you need to return a copy



##########
cpp/src/common/device_id.h:
##########
@@ -0,0 +1,212 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * License); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef COMMON_DEVICE_ID_H
+#define COMMON_DEVICE_ID_H
+
+#include <algorithm>
+#include <cstdint>
+#include <cstring>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <numeric>
+#include <sstream>
+#include <stdexcept>
+#include <string>
+#include <vector>
+
+#include "common/allocator/byte_stream.h"
+#include "utils/errno_define.h"
+
+class IDeviceID {
+   public:
+    virtual ~IDeviceID() = default;
+    virtual int serialize(common::ByteStream& write_stream) { return 0; }
+    virtual std::string get_table_name() { return ""; }
+    virtual int segment_num() { return 0; }
+    virtual std::vector<std::string> get_segments() const { return {}; }
+    virtual std::string get_device_name() const { return ""; };
+    virtual bool operator<(const IDeviceID& other) { return 0; }
+    virtual bool operator==(const IDeviceID& other) { return false; }
+    virtual bool operator!=(const IDeviceID& other) { return false; }
+};
+
+struct IDeviceIDComparator {
+    bool operator()(const std::shared_ptr<IDeviceID>& lhs,
+                    const std::shared_ptr<IDeviceID>& rhs) const {
+        return *lhs < *rhs;
+    }
+};
+
+class StringArrayDeviceID : public IDeviceID {
+   public:
+    explicit StringArrayDeviceID(const std::vector<std::string>& segments)
+        : segments_(formalize(segments)) {}
+
+    explicit StringArrayDeviceID(const std::string& device_id_string)
+        : segments_(split_device_id_string(device_id_string)) {}
+
+    ~StringArrayDeviceID() override = default;
+
+    std::string get_device_name() const override {
+        return std::accumulate(std::next(segments_.begin()), segments_.end(),
+                               segments_.front(),
+                               [](std::string a, const std::string& b) {
+                                   return std::move(a) + "." + b;
+                               });
+    };
+
+    int serialize(common::ByteStream& write_stream) override {
+        int ret = common::E_OK;
+        if (RET_FAIL(common::SerializationUtil::write_var_int(segment_num(),
+                                                              write_stream))) {
+            return ret;
+        }
+        for (const auto& segment : segments_) {
+            if (RET_FAIL(common::SerializationUtil::write_var_int(
+                    segment.size(), write_stream))) {
+                return ret;
+            } else if (RET_FAIL(write_stream.write_buf(segment.c_str(),
+                                                       segment.size()))) {
+                return ret;
+            }
+        }
+        return ret;
+    }
+
+    std::string get_table_name() override {
+        return segments_.empty() ? "" : segments_[0];
+    }
+
+    int segment_num() override { return static_cast<int>(segments_.size()); }
+
+    std::vector<std::string> get_segments() const override { return segments_; 
}
+
+    virtual bool operator<(const IDeviceID& other) override {
+        auto other_segments = other.get_segments();
+        return std::lexicographical_compare(segments_.begin(), segments_.end(),
+                                            other_segments.begin(),
+                                            other_segments.end());
+    }
+
+    bool operator==(const IDeviceID& other) override {
+        auto other_segments = other.get_segments();
+        return (segments_.size() == other_segments.size()) &&
+               std::equal(segments_.begin(), segments_.end(),
+                          other_segments.begin());
+    }
+
+    bool operator!=(const IDeviceID& other) override {
+        return !(*this == other);
+    }
+
+   private:
+    std::vector<std::string> segments_;
+
+    static std::vector<std::string> formalize(
+        const std::vector<std::string>& segments) {
+        auto it =
+            std::find_if(segments.rbegin(), segments.rend(),
+                         [](const std::string& seg) { return !seg.empty(); });
+        return std::vector<std::string>(segments.begin(), it.base());
+    }
+
+    static std::vector<std::string> split_device_id_string(
+        std::basic_string<char> device_id_string) {
+        std::vector<std::string> splits;
+        std::istringstream stream(device_id_string);
+        std::string segment;
+        while (std::getline(stream, segment, '.')) {
+            splits.push_back(segment);
+        }
+        return splits;
+    }
+};
+
+class PlainDeviceID : public IDeviceID {
+   public:
+    explicit PlainDeviceID(const std::string& deviceID)
+        : device_id_(deviceID), tableName_(), segments_() {}
+
+    ~PlainDeviceID() override = default;
+
+    bool operator==(const IDeviceID& other) override {
+        return device_id_ == other.get_device_name();
+    }
+
+    bool operator!=(const IDeviceID& other) override {
+        return device_id_ != other.get_device_name();
+    }
+
+    int serialize(common::ByteStream& write_stream) override {
+        int ret = common::E_OK;
+        if 
(RET_FAIL(common::SerializationUtil::write_var_int(device_id_.size(),
+                                                              write_stream))) {
+            return ret;
+        } else if (RET_FAIL(write_stream.write_buf(device_id_.c_str(),
+                                                   device_id_.size()))) {
+            return ret;
+        }
+        return ret;
+    }
+
+    std::string get_device_name() const override { return device_id_; };
+
+    std::string get_table_name() override {
+        if (!tableName_.empty()) {
+            return tableName_;
+        }
+
+        size_t lastSeparatorPos = device_id_.find_last_of('.');

Review Comment:
   use `PATH_SEPARATOR_CHAR` instead of '.'



##########
cpp/src/file/tsfile_io_writer.cc:
##########
@@ -99,9 +108,8 @@ int TsFileIOWriter::start_flush_chunk_group(const 
std::string &device_name,
     use_prev_alloc_cgm_ = false;
     for (auto iter = chunk_group_meta_list_.begin();
          iter != chunk_group_meta_list_.end(); iter++) {
-        common::String cur_device_name((char *)cur_device_name_.c_str(),
-                                       cur_device_name_.size());
-        if (iter.get()->device_name_.equal_to(cur_device_name)) {
+        auto cur_device_name = cur_device_name_;
+        if (*iter.get()->device_name_ == *cur_device_name) {
             use_prev_alloc_cgm_ = true;
             cur_chunk_group_meta_ = iter.get();
             break;

Review Comment:
   why use `cur_device_name`?



##########
cpp/src/writer/tsfile_writer.h:
##########
@@ -93,51 +110,54 @@ class TsFileWriter {
 
     int write_typed_column(storage::ChunkWriter *chunk_writer,
                            int64_t *timestamps, bool *col_values,
-                           common::BitMap &col_notnull_bitmap,
-                           int32_t row_count);
+                           common::BitMap &col_notnull_bitmap, int start_idx,
+                           int end_idx);
     int write_typed_column(storage::ChunkWriter *chunk_writer,
                            int64_t *timestamps, int32_t *col_values,
-                           common::BitMap &col_notnull_bitmap,
-                           int32_t row_count);
+                           common::BitMap &col_notnull_bitmap, int start_idx,
+                           int end_idx);
     int write_typed_column(storage::ChunkWriter *chunk_writer,
                            int64_t *timestamps, int64_t *col_values,
-                           common::BitMap &col_notnull_bitmap,
-                           int32_t row_count);
+                           common::BitMap &col_notnull_bitmap, int start_idx,
+                           int end_idx);
     int write_typed_column(storage::ChunkWriter *chunk_writer,
                            int64_t *timestamps, float *col_values,
-                           common::BitMap &col_notnull_bitmap,
-                           int32_t row_count);
+                           common::BitMap &col_notnull_bitmap, int start_idx,
+                           int end_idx);
     int write_typed_column(storage::ChunkWriter *chunk_writer,
                            int64_t *timestamps, double *col_values,
-                           common::BitMap &col_notnull_bitmap,
-                           int32_t row_count);
+                           common::BitMap &col_notnull_bitmap, int start_idx,
+                           int end_idx);

Review Comment:
   Is it better to use template?



##########
cpp/src/common/schema.h:
##########
@@ -84,5 +113,147 @@ struct MeasurementSchemaGroup {
     TimeChunkWriter *time_chunk_writer_ = nullptr;
 };
 
+enum class ColumnCategory { ID, MEASUREMENT };
+
+class TableSchema {
+   public:
+    TableSchema() = default;
+    TableSchema(const std::string &table_name,
+                const std::vector<std::shared_ptr<MeasurementSchema>>
+                    &measurement_schemas,
+                const std::vector<ColumnCategory> &column_categories)
+        : table_name_(table_name),
+          measurement_schemas_(measurement_schemas),
+          column_categories_(column_categories) {
+        int idx = 0;
+        for (auto &measurement_schema : measurement_schemas_) {

Review Comment:
   `const auto &`



##########
cpp/src/file/tsfile_io_writer.cc:
##########
@@ -84,13 +93,13 @@ int TsFileIOWriter::start_file() {
     return ret;
 }
 
-int TsFileIOWriter::start_flush_chunk_group(const std::string &device_name,
-                                            bool is_aligned) {
+int TsFileIOWriter::start_flush_chunk_group(
+    std::shared_ptr<IDeviceID> device_name, bool is_aligned) {
     int ret = write_byte(CHUNK_GROUP_HEADER_MARKER);
     if (ret != common::E_OK) {
         return ret;
     }
-    ret = write_string(device_name);
+    device_name->serialize(write_stream_);

Review Comment:
   `ret = device_name->serialize(write_stream_);`



##########
cpp/src/common/allocator/my_string.h:
##########
@@ -40,6 +40,9 @@ struct String {
         len_ = 0;
         buf_ = nullptr;
     }
+    std::string to_string() {
+        return std::string(buf_, len_);
+    }

Review Comment:
   There is already one such method. You can view the develop branch



##########
cpp/src/common/schema.h:
##########
@@ -84,5 +113,147 @@ struct MeasurementSchemaGroup {
     TimeChunkWriter *time_chunk_writer_ = nullptr;
 };
 
+enum class ColumnCategory { ID, MEASUREMENT };
+
+class TableSchema {
+   public:
+    TableSchema() = default;
+    TableSchema(const std::string &table_name,
+                const std::vector<std::shared_ptr<MeasurementSchema>>
+                    &measurement_schemas,
+                const std::vector<ColumnCategory> &column_categories)
+        : table_name_(table_name),
+          measurement_schemas_(measurement_schemas),
+          column_categories_(column_categories) {
+        int idx = 0;
+        for (auto &measurement_schema : measurement_schemas_) {
+            column_pos_index_.insert(
+                std::make_pair(measurement_schema->measurement_name_, idx++));
+        }
+    }
+
+    TableSchema(TableSchema &&other) noexcept
+        : table_name_(std::move(other.table_name_)),
+          measurement_schemas_(std::move(other.measurement_schemas_)),
+          column_categories_(std::move(other.column_categories_)) {}
+
+    TableSchema(const TableSchema &other) = default;
+
+    int serialize_to(common::ByteStream &out) {
+        int ret = common::E_OK;
+        if (RET_FAIL(common::SerializationUtil::write_var_uint(
+                measurement_schemas_.size(), out))) {
+        } else {
+            for (size_t i = 0; IS_SUCC(ret) && i < measurement_schemas_.size();
+                 i++) {
+                auto column_schema = measurement_schemas_[i];
+                auto column_category = column_categories_[i];
+                // column_schema-
+                common::SerializationUtil::write_i32(
+                    static_cast<int32_t>(column_category), out);
+            }
+        }
+        return ret;
+    }
+
+    ~TableSchema() = default;
+
+    std::string get_table_name() { return table_name_; }
+
+    std::vector<std::string> get_measurement_names() const {
+        std::vector<std::string> ret;
+        for (const auto &measurement_schema : measurement_schemas_) {
+            ret.emplace_back(measurement_schema->measurement_name_);
+        }
+        return ret;
+    }
+

Review Comment:
   return copy?



##########
cpp/src/common/schema.h:
##########
@@ -68,6 +70,33 @@ struct MeasurementSchema {
           compression_type_(compression_type),
           chunk_writer_(nullptr),
           value_chunk_writer_(nullptr) {}
+
+    int serialize_to(common::ByteStream &out) {
+        int ret = common::E_OK;
+        if (RET_FAIL(
+                common::SerializationUtil::write_str(measurement_name_, out))) 
{
+        } else if (RET_FAIL(
+                       common::SerializationUtil::write_i32(data_type_, out))) 
{
+        } else if (RET_FAIL(
+                       common::SerializationUtil::write_i32(encoding_, out))) {
+        } else if (RET_FAIL(common::SerializationUtil::write_i32(
+                       compression_type_, out))) {
+        }
+        if (ret == common::E_OK) {
+            if 
(RET_FAIL(common::SerializationUtil::write_str(measurement_name_,
+                                                              out))) {
+                for (auto &prop : props_) {

Review Comment:
   `const auto& prop`



##########
cpp/src/common/tablet.h:
##########
@@ -85,17 +88,49 @@ class Tablet {
                            return MeasurementSchema(name, type);
                        });
     }
+
+    Tablet(const std::string &insert_target_name,
+           const std::vector<std::string> &column_names,
+           const std::vector<common::TSDataType> &data_types,
+           const std::vector<ColumnCategory> &column_categories,
+           int max_rows = DEFAULT_MAX_ROWS, bool has_column_categories = true)
+        : max_row_num_(max_rows),
+          cur_row_size_(0),
+          insert_target_name_(insert_target_name),
+          timestamps_(nullptr),
+          value_matrix_(nullptr),
+          bitmaps_(nullptr),
+          owned_schemas_(false) {
+        schema_vec_ = std::make_shared<std::vector<MeasurementSchema>>();
+        for (size_t i = 0; i < column_names.size(); i++) {
+            schema_vec_->emplace_back(
+                MeasurementSchema(column_names[i], data_types[i], 
common::PLAIN,
+                                  common::UNCOMPRESSED));
+        }
+        if (has_column_categories) {
+            set_column_categories(column_categories);
+        }
+    }
+
     ~Tablet() { destroy(); }
 
     int init();
     void destroy();
     size_t get_column_count() const { return schema_vec_->size(); }
+    int get_cur_row_size() const { return cur_row_size_; }
+    void set_row_size(int row_size) { cur_row_size_ = row_size; }
 
     int add_timestamp(uint32_t row_index, int64_t timestamp);
 
+    // int set_value(int row_index, int schema_index, double val);

Review Comment:
   remove it



##########
cpp/src/common/schema.h:
##########
@@ -84,5 +113,147 @@ struct MeasurementSchemaGroup {
     TimeChunkWriter *time_chunk_writer_ = nullptr;
 };
 
+enum class ColumnCategory { ID, MEASUREMENT };
+
+class TableSchema {
+   public:
+    TableSchema() = default;
+    TableSchema(const std::string &table_name,
+                const std::vector<std::shared_ptr<MeasurementSchema>>
+                    &measurement_schemas,
+                const std::vector<ColumnCategory> &column_categories)
+        : table_name_(table_name),
+          measurement_schemas_(measurement_schemas),
+          column_categories_(column_categories) {
+        int idx = 0;
+        for (auto &measurement_schema : measurement_schemas_) {
+            column_pos_index_.insert(
+                std::make_pair(measurement_schema->measurement_name_, idx++));
+        }
+    }
+
+    TableSchema(TableSchema &&other) noexcept
+        : table_name_(std::move(other.table_name_)),
+          measurement_schemas_(std::move(other.measurement_schemas_)),
+          column_categories_(std::move(other.column_categories_)) {}
+
+    TableSchema(const TableSchema &other) = default;
+
+    int serialize_to(common::ByteStream &out) {
+        int ret = common::E_OK;
+        if (RET_FAIL(common::SerializationUtil::write_var_uint(
+                measurement_schemas_.size(), out))) {
+        } else {
+            for (size_t i = 0; IS_SUCC(ret) && i < measurement_schemas_.size();
+                 i++) {
+                auto column_schema = measurement_schemas_[i];
+                auto column_category = column_categories_[i];
+                // column_schema-
+                common::SerializationUtil::write_i32(
+                    static_cast<int32_t>(column_category), out);
+            }
+        }
+        return ret;
+    }
+
+    ~TableSchema() = default;
+
+    std::string get_table_name() { return table_name_; }
+
+    std::vector<std::string> get_measurement_names() const {
+        std::vector<std::string> ret;
+        for (const auto &measurement_schema : measurement_schemas_) {
+            ret.emplace_back(measurement_schema->measurement_name_);
+        }
+        return ret;
+    }
+
+    int find_column_index(std::string column_name) {

Review Comment:
   `const std::string& column_name`



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