This is an automated email from the ASF dual-hosted git repository. colinlee pushed a commit to branch colin_python_V4_bak in repository https://gitbox.apache.org/repos/asf/tsfile.git
commit 7f880dfe1cbc7229f8b58cb7217b458086f75f70 Author: ColinLee <[email protected]> AuthorDate: Thu Feb 27 18:48:18 2025 +0800 revoer modify on cwrapper. --- cpp/src/cwrapper/tsfile_cwrapper.cc | 203 +++++++----------------------------- cpp/src/cwrapper/tsfile_cwrapper.h | 68 +++++++----- cpp/test/cwrapper/cwrapper_test.cc | 99 +++++++++--------- 3 files changed, 129 insertions(+), 241 deletions(-) diff --git a/cpp/src/cwrapper/tsfile_cwrapper.cc b/cpp/src/cwrapper/tsfile_cwrapper.cc index b7442d5c..dbd85b52 100644 --- a/cpp/src/cwrapper/tsfile_cwrapper.cc +++ b/cpp/src/cwrapper/tsfile_cwrapper.cc @@ -35,135 +35,6 @@ extern "C" { static bool is_init = false; -Tablet tablet_new_with_device(const char *device_id, char **column_name_list, - TSDataType *data_types, ColumnCategory *category, - int column_num, int max_rows) { - std::vector<std::string> measurement_list; - std::vector<common::TSDataType> data_type_list; - - for (int i = 0; i < column_num; i++) { - measurement_list.emplace_back(column_name_list[i]); - data_type_list.push_back( - static_cast<common::TSDataType>(*(data_types + i))); - } - storage::Tablet *tablet = nullptr; - if (category == nullptr) { - tablet = new storage::Tablet(device_id, &measurement_list, - &data_type_list, max_rows); - } else { - std::vector<storage::ColumnCategory> column_category_list; - column_category_list.reserve(column_num); - for (int i = 0; i < column_num; i++) { - column_category_list.emplace_back( - static_cast<storage::ColumnCategory>(*(category + i))); - } - tablet = - new storage::Tablet(device_id, measurement_list, data_type_list, - column_category_list, max_rows); - } - tablet->init(); - return tablet; -} - -Tablet tablet_new(const char **column_name_list, TSDataType *data_types, - uint32_t column_num) { - std::vector<std::string> measurement_list; - std::vector<common::TSDataType> data_type_list; - for (int i = 0; i < column_num; i++) { - measurement_list.emplace_back(column_name_list[i]); - data_type_list.push_back( - static_cast<common::TSDataType>(*(data_types + i))); - } - auto *tablet = new storage::Tablet("", &measurement_list, &data_type_list); - return tablet; -} - -uint32_t tablet_get_cur_row_size(Tablet tablet) { - return static_cast<storage::Tablet *>(tablet)->get_cur_row_size(); -} - -ERRNO tablet_add_timestamp(Tablet tablet, uint32_t row_index, - timestamp timestamp) { - return static_cast<storage::Tablet *>(tablet)->add_timestamp(row_index, - timestamp); -} - -#define TABLET_ADD_VALUE_BY_NAME_DEF(type) \ - ERRNO tablet_add_value_by_name_##type(Tablet tablet, uint32_t row_index, \ - const char *column_name, \ - type value) { \ - return static_cast<storage::Tablet *>(tablet)->add_value( \ - row_index, column_name, value); \ - } - -TABLET_ADD_VALUE_BY_NAME_DEF(int32_t); -TABLET_ADD_VALUE_BY_NAME_DEF(int64_t); -TABLET_ADD_VALUE_BY_NAME_DEF(float); -TABLET_ADD_VALUE_BY_NAME_DEF(double); -TABLET_ADD_VALUE_BY_NAME_DEF(bool); - -ERRNO tablet_add_value_by_name_string(Tablet tablet, uint32_t row_index, - const char* column_name, char* value) { - common::String str = common::String(value, strlen(value)); - return static_cast<storage::Tablet *>(tablet)->add_value( - row_index, column_name, str); -} - -ERRNO tablet_add_value_by_index_string(Tablet tablet, uint32_t row_index, - uint32_t column_index, char* value) { - common::String str = common::String(value, strlen(value)); - return static_cast<storage::Tablet *>(tablet)->add_value( - row_index, column_index, str); -} - - -#define TABLE_ADD_VALUE_BY_INDEX_DEF(type) \ - ERRNO tablet_add_value_by_index_##type(Tablet tablet, uint32_t row_index, \ - uint32_t column_index, \ - type value) { \ - return static_cast<storage::Tablet *>(tablet)->add_value( \ - row_index, column_index, value); \ - } - -TABLE_ADD_VALUE_BY_INDEX_DEF(int32_t); -TABLE_ADD_VALUE_BY_INDEX_DEF(int64_t); -TABLE_ADD_VALUE_BY_INDEX_DEF(float); -TABLE_ADD_VALUE_BY_INDEX_DEF(double); -TABLE_ADD_VALUE_BY_INDEX_DEF(bool); - -void *tablet_get_value(Tablet tablet, uint32_t row_index, uint32_t schema_index, - TSDataType *type) { - common::TSDataType data_type; - void *result = static_cast<storage::Tablet *>(tablet)->get_value( - row_index, schema_index, data_type); - *type = static_cast<TSDataType>(data_type); - return result; -} - -// TsRecord API -TsRecord ts_record_new(const char *device_id, timestamp timestamp, - int timeseries_num) { - auto *record = new storage::TsRecord(timestamp, device_id, timeseries_num); - return record; -} - -#define INSERT_DATA_INTO_TS_RECORD_BY_NAME_DEF(type) \ - ERRNO insert_data_into_ts_record_by_name_##type( \ - TsRecord data, const char *measurement_name, const type value) { \ - auto *record = (storage::TsRecord *)data; \ - storage::DataPoint point(measurement_name, value); \ - if (record->points_.size() + 1 > record->points_.capacity()) \ - return common::E_BUF_NOT_ENOUGH; \ - record->points_.push_back(point); \ - return common::E_OK; \ - } - -INSERT_DATA_INTO_TS_RECORD_BY_NAME_DEF(int32_t); -INSERT_DATA_INTO_TS_RECORD_BY_NAME_DEF(int64_t); -INSERT_DATA_INTO_TS_RECORD_BY_NAME_DEF(bool); -INSERT_DATA_INTO_TS_RECORD_BY_NAME_DEF(float); -INSERT_DATA_INTO_TS_RECORD_BY_NAME_DEF(double); - void init_tsfile_config() { if (!is_init) { common::init_config_value(); @@ -421,45 +292,55 @@ ERRNO tsfile_writer_write(TsFileWriter writer, Tablet tablet) { return w->write_table(*tbl); } -ERRNO tsfile_writer_write_table(TsFileWriter writer, Tablet tablet) { - auto *w = static_cast<storage::TsFileWriter *>(writer); - const auto *tbl = static_cast<storage::Tablet *>(tablet); - return w->write_table(*tbl); -} - -ERRNO tsfile_writer_flush_data(TsFileWriter writer) { - auto *w = static_cast<storage::TsFileWriter *>(writer); - return w->flush(); -} +// ERRNO tsfile_writer_flush_data(TsFileWriter writer) { +// auto *w = static_cast<storage::TsFileWriter *>(writer); +// return w->flush(); +// } // Query -ResultSet tsfile_reader_query_table(TsFileReader reader, const char *table_name, - char **columns, uint32_t column_num, - timestamp start_time, timestamp end_time) { - // TODO: Implement query table with tsfile reader. - return nullptr; -} - -ResultSet tsfile_reader_query_device(TsFileReader reader, - const char *device_name, - char **sensor_name, uint32_t sensor_num, - timestamp start_time, timestamp end_time) { +ResultSet tsfile_query_table(TsFileReader reader, const char *table_name, + char **columns, uint32_t column_num, + Timestamp start_time, Timestamp end_time, + ERRNO *err_code) { auto *r = static_cast<storage::TsFileReader *>(reader); - std::vector<std::string> selected_paths; - selected_paths.reserve(sensor_num); - for (int i = 0; i < sensor_num; i++) { - selected_paths.push_back(std::string(device_name) + "." + - std::string(sensor_name[i])); + storage::ResultSet *table_result_set = nullptr; + std::vector<std::string> column_names; + for (uint32_t i = 0; i < column_num; i++) { + column_names.emplace_back(columns[i]); } *err_code = r->query(table_name, column_names, start_time, end_time, table_result_set); return table_result_set; } -bool tsfile_result_set_next(ResultSet result_set) { - auto *r = static_cast<storage::QDSWithoutTimeGenerator *>(result_set); - return r->next(); +// ResultSet tsfile_reader_query_device(TsFileReader reader, +// const char *device_name, +// char **sensor_name, uint32_t sensor_num, +// Timestamp start_time, Timestamp +// end_time) { +// auto *r = static_cast<storage::TsFileReader *>(reader); +// std::vector<std::string> selected_paths; +// selected_paths.reserve(sensor_num); +// for (uint32_t i = 0; i < sensor_num; i++) { +// selected_paths.push_back(std::string(device_name) + "." + +// std::string(sensor_name[i])); +// } +// storage::ResultSet *qds = nullptr; +// r->query(selected_paths, start_time, end_time, qds); +// return qds; +// } + +bool tsfile_result_set_next(ResultSet result_set, ERRNO *err_code) { + auto *r = static_cast<storage::TableResultSet *>(result_set); + bool has_next = true; + int ret = common::E_OK; + ret = r->next(has_next); + *err_code = ret; + if (ret != common::E_OK) { + return false; + } + return has_next; } #define TSFILE_RESULT_SET_GET_VALUE_BY_NAME_DEF(type) \ @@ -603,12 +484,6 @@ int tsfile_result_set_metadata_get_column_num(ResultSetMetaData result_set) { TableSchema tsfile_reader_get_table_schema(TsFileReader reader, const char *table_name) { - // TODO: Implement get table schema with tsfile reader. - return TableSchema(); -} - -DeviceSchema tsfile_reader_get_device_schema(TsFileReader reader, - const char *device_id) { auto *r = static_cast<storage::TsFileReader *>(reader); auto table_shcema = r->get_table_schema(table_name); TableSchema ret_schema; diff --git a/cpp/src/cwrapper/tsfile_cwrapper.h b/cpp/src/cwrapper/tsfile_cwrapper.h index 2555db00..af1c9c29 100644 --- a/cpp/src/cwrapper/tsfile_cwrapper.h +++ b/cpp/src/cwrapper/tsfile_cwrapper.h @@ -184,9 +184,6 @@ ERRNO tsfile_writer_close(TsFileWriter writer); ERRNO tsfile_reader_close(TsFileReader reader); /*--------------------------Tablet API------------------------ */ -Tablet tablet_new_with_device(const char* device_id, char** column_name_list, - TSDataType* data_types, ColumnCategory* category, - int column_num, int max_rows); /** * @brief Creates a Tablet for batch data. @@ -241,22 +238,34 @@ TABLET_ADD_VALUE_BY_NAME(float); TABLET_ADD_VALUE_BY_NAME(double); TABLET_ADD_VALUE_BY_NAME(bool); +/** + * @brief Adds a string value to a Tablet row by column name. + * + * @param value [in] Null-terminated string. Ownership remains with caller. + * @return ERRNO. + */ ERRNO tablet_add_value_by_name_string(Tablet tablet, uint32_t row_index, - const char* column_name, char* value); + const char* column_name, + const char* value); -#define TABLET_ADD_VALUE_BY_INDEX(type) \ +/** + * @brief Adds a value to a Tablet row by column index (generic types). + * + * @param column_index [in] Column position (0 ≤ index < column_num). + * @return ERRNO - E_OK(0) or check errno_define.h. + * + * @note Generated for types: int32_t, int64_t, float, double, bool + */ +#define TABLE_ADD_VALUE_BY_INDEX(type) \ ERRNO tablet_add_value_by_index_##type(Tablet tablet, uint32_t row_index, \ uint32_t column_index, \ const type value); -TABLET_ADD_VALUE_BY_INDEX(int32_t); -TABLET_ADD_VALUE_BY_INDEX(int64_t); -TABLET_ADD_VALUE_BY_INDEX(float); -TABLET_ADD_VALUE_BY_INDEX(double); -TABLET_ADD_VALUE_BY_INDEX(bool); - -ERRNO tablet_add_value_by_index_string(Tablet tablet, uint32_t row_index, - uint32_t column_index, char* value); +TABLE_ADD_VALUE_BY_INDEX(int32_t); +TABLE_ADD_VALUE_BY_INDEX(int64_t); +TABLE_ADD_VALUE_BY_INDEX(float); +TABLE_ADD_VALUE_BY_INDEX(double); +TABLE_ADD_VALUE_BY_INDEX(bool); /** * @brief Adds a string value to a Tablet row by column index. @@ -273,8 +282,8 @@ TsRecord ts_record_new(const char* device_id, Timestamp timestamp, int timeseries_num); #define INSERT_DATA_INTO_TS_RECORD_BY_NAME(type) \ - ERRNO insert_data_into_ts_record_by_name_##type( \ - TsRecord data, const char* measurement_name, const type value); + ERRNO insert_data_into_ts_record_by_name_##type( \ + TsRecord data, const char* measurement_name, type value); INSERT_DATA_INTO_TS_RECORD_BY_NAME(int32_t); INSERT_DATA_INTO_TS_RECORD_BY_NAME(int64_t); @@ -293,21 +302,24 @@ ERRNO tsfile_writer_register_device(TsFileWriter writer, const DeviceSchema* device_schema); */ -/*-------------------TsFile Writer write and flush data------------------ */ -ERRNO tsfile_writer_write_tablet(TsFileWriter writer, Tablet tablet); -ERRNO tsfile_writer_write_table(TsFileWriter writer, Tablet tablet); -ERRNO tsfile_writer_write_ts_record(TsFileWriter writer, TsRecord record); -ERRNO tsfile_writer_flush_data(TsFileWriter writer); +/*-------------------TsFile Writer write data------------------ */ + +/** + * @brief Writes data from a Tablet to the TsFile. + * + * @param writer [in] Valid TsFileWriter handle. Must be initialized. + * @param tablet [in] Tablet containing data. Should be freed after successful + * write. + * @return ERRNO - E_OK(0), or check error code in errno_define.h. + * + */ + +ERRNO tsfile_writer_write(TsFileWriter writer, Tablet tablet); +// ERRNO tsfile_writer_write_tablet(TsFileWriter writer, Tablet tablet); +// ERRNO tsfile_writer_write_ts_record(TsFileWriter writer, TsRecord record); +// ERRNO tsfile_writer_flush_data(TsFileWriter writer); /*-------------------TsFile reader query data------------------ */ -ResultSet tsfile_reader_query_table(TsFileReader reader, const char* table_name, - char** columns, uint32_t column_num, - timestamp start_time, timestamp end_time); -ResultSet tsfile_reader_query_device(TsFileReader reader, - const char* device_name, - char** sensor_name, uint32_t sensor_num, - timestamp start_time, timestamp end_time); -bool tsfile_result_set_next(ResultSet result_set); /** * @brief Queries time series data from a specific table within time range. diff --git a/cpp/test/cwrapper/cwrapper_test.cc b/cpp/test/cwrapper/cwrapper_test.cc index 398e7984..224257e2 100644 --- a/cpp/test/cwrapper/cwrapper_test.cc +++ b/cpp/test/cwrapper/cwrapper_test.cc @@ -63,34 +63,53 @@ TEST_F(CWrapperTest, WriterFlushTabletAndReadData) { TS_DATATYPE_STRING, TS_COMPRESSION_UNCOMPRESSED, TS_ENCODING_PLAIN, TAG}; } - int max_rows = 100; - for (int i = 0; i < device_num; i++) { - char* device_name = strdup(("device" + std::to_string(i)).c_str()); - char** measurements_name = - static_cast<char**>(malloc(measurement_num * sizeof(char*))); - TSDataType* data_types = static_cast<TSDataType*>( - malloc(sizeof(TSDataType) * measurement_num)); - for (int j = 0; j < measurement_num; j++) { - measurements_name[j] = - strdup(("measurement" + std::to_string(j)).c_str()); - data_types[j] = TS_DATATYPE_INT64; - } - Tablet tablet = - tablet_new_with_device(device_name, measurements_name, data_types, - nullptr, measurement_num, max_rows); - free(device_name); - free(data_types); - for (int j = 0; j < measurement_num; j++) { - free(measurements_name[j]); - } - free(measurements_name); - for (int j = 0; j < measurement_num; j++) { - for (int row = 0; row < max_rows; row++) { - tablet_add_timestamp(tablet, row, 16225600 + row); - } - for (int row = 0; row < max_rows; row++) { - tablet_add_value_by_index_int64_t( - tablet, row, j, static_cast<int64_t>(row + j)); + for (int i = 0; i < field_schema_num; i++) { + schema.column_schemas[i + id_schema_num] = + ColumnSchema{strdup(std::string("s" + std::to_string(i)).c_str()), + TS_DATATYPE_INT64, TS_COMPRESSION_UNCOMPRESSED, + TS_ENCODING_PLAIN, FIELD}; + } + WriteFile file = + write_file_new("cwrapper_write_flush_and_read.tsfile", &code); + TsFileWriter writer = tsfile_writer_new(file, &schema, &code); + ASSERT_EQ(code, RET_OK); + + char** column_names = + static_cast<char**>(malloc(column_num * sizeof(char*))); + TSDataType* data_types = + static_cast<TSDataType*>(malloc(sizeof(TSDataType) * column_num)); + for (int i = 0; i < id_schema_num; i++) { + column_names[i] = strdup(std::string("id" + std::to_string(i)).c_str()); + data_types[i] = TS_DATATYPE_STRING; + } + + for (int i = 0; i < field_schema_num; i++) { + column_names[i + id_schema_num] = + strdup(std::string("s" + std::to_string(i)).c_str()); + data_types[i + id_schema_num] = TS_DATATYPE_INT64; + } + + Tablet tablet = tablet_new(column_names, data_types, column_num, 10); + + int num_timestamp = 10; + char* literal = new char[std::strlen("device_id") + 1]; + std::strcpy(literal, "device_id"); + + for (int l = 0; l < num_timestamp; l++) { + tablet_add_timestamp(tablet, l, l); + for (int i = 0; i < schema.column_num; i++) { + switch (schema.column_schemas[i].data_type) { + case TS_DATATYPE_STRING: + tablet_add_value_by_name_string( + tablet, l, schema.column_schemas[i].column_name, + literal); + break; + case TS_DATATYPE_INT64: + tablet_add_value_by_name_int64_t( + tablet, l, schema.column_schemas[i].column_name, l); + break; + default: + break; } } } @@ -151,27 +170,9 @@ TEST_F(CWrapperTest, WriterFlushTabletAndReadData) { } } - ResultSetMetaData metadata = tsfile_result_set_get_metadata(result_set); - ASSERT_EQ(metadata.column_num, measurement_num); - ASSERT_EQ(std::string(metadata.column_names[4]), - std::string("device0.measurement4")); - ASSERT_EQ(metadata.data_types[9], TS_DATATYPE_INT64); - for (int i = 0; i < measurement_num - 1; i++) { - ASSERT_TRUE(tsfile_result_set_next(result_set)); - ASSERT_FALSE(tsfile_result_set_is_null_by_index(result_set, i)); - ASSERT_EQ(tsfile_result_set_get_value_by_index_int64_t(result_set, i), - i * 2); - ASSERT_EQ(tsfile_result_set_get_value_by_name_int64_t( - result_set, - std::string("measurement" + std::to_string(i)).c_str()), - i * 2); - } - free_tsfile_result_set(&result_set); - free_result_set_meta_data(metadata); - for (int i = 0; i < measurement_num; i++) { - free(sensor_list[i]); - } - free(sensor_list); + ASSERT_EQ(5, count_int64_t); + ASSERT_EQ(5, count_string); + free_tablet(&tablet); tsfile_reader_close(reader); free_tsfile_result_set(&result_set); free_table_schema(schema);
