HappenLee commented on code in PR #23236:
URL: https://github.com/apache/doris/pull/23236#discussion_r1308349211


##########
be/src/vec/sink/vtablet_sink.cpp:
##########
@@ -1328,30 +1538,114 @@ Status VOlapTableSink::send(RuntimeState* state, 
vectorized::Block* input_block,
     _row_distribution_watch.start();
     auto num_rows = block->rows();
     size_t partition_num = _vpartition->get_partitions().size();
-    if (partition_num == 1 && _tablet_finder->is_find_tablet_every_sink()) {
+    if (!_vpartition->is_auto_partition() && partition_num == 1 &&
+        _tablet_finder->is_find_tablet_every_sink()) {
         RETURN_IF_ERROR(_single_partition_generate(state, block.get(), 
channel_to_payload, num_rows,
                                                    has_filtered_rows));
     } else {
-        for (int i = 0; i < num_rows; ++i) {
-            if (UNLIKELY(has_filtered_rows) && 
_block_convertor->filter_bitmap().Get(i)) {
-                continue;
+        if (_vpartition->is_auto_partition()) {
+            std::vector<uint16_t> partition_keys = 
_vpartition->get_partition_keys();
+            //TODO: use loop to create missing_vals for multi column.
+            CHECK(partition_keys.size() == 1)
+                    << "now support only 1 partition column for auto 
partitions.";
+            auto partition_col = block->get_by_position(partition_keys[0]);
+
+            auto missing_vals_col = partition_col.clone_empty();
+
+            // try to find tablet and save missing value
+            for (int i = 0; i < num_rows; ++i) {
+                if (UNLIKELY(has_filtered_rows) && 
_block_convertor->filter_bitmap().Get(i)) {
+                    continue;
+                }
+                const VOlapTablePartition* partition = nullptr;
+                bool is_continue = false;
+                uint32_t tablet_index = 0;
+                bool missing_this = false;
+                RETURN_IF_ERROR(_tablet_finder->find_tablet(state, 
block.get(), i, &partition,
+                                                            tablet_index, 
stop_processing,
+                                                            is_continue, 
&missing_this));
+                if (missing_this) {
+                    
missing_vals_col.column->assume_mutable()->insert_from(*partition_col.column,
+                                                                           i);
+                } else {
+                    _generate_row_distribution_payload(channel_to_payload, 
partition, tablet_index,
+                                                       i, 1);
+                }
             }
-            const VOlapTablePartition* partition = nullptr;
-            bool is_continue = false;
-            uint32_t tablet_index = 0;
-            RETURN_IF_ERROR(_tablet_finder->find_tablet(
-                    state, block.get(), i, &partition, tablet_index, 
stop_processing, is_continue));
-            if (is_continue) {
-                continue;
+
+            // for missing partition keys, calc the missing partition and save 
in _partitions_need_create
+            auto type = missing_vals_col.type;
+            if (missing_vals_col.column->size() > 0) {
+                vectorized::Block tmp_block = {missing_vals_col};
+                auto [part_ctx, part_func] = _get_partition_function();
+                int result_idx;
+                // calc the start value of missing partition ranges.
+                part_func->prepare(_state, *_output_row_desc, part_ctx.get());
+                part_func->execute(part_ctx.get(), &tmp_block, &result_idx);
+                VLOG_DEBUG << tmp_block.dump_data();
+
+                char convert_buffer[30];
+                // expose the data column
+                vectorized::ColumnPtr col = 
tmp_block.get_by_position(result_idx).column;
+                if (auto* nullable = 
check_and_get_column<vectorized::ColumnNullable>(*col)) {
+                    col = nullable->get_nested_column_ptr();
+                }
+                // calc the end value and save them.
+                if (type->get_type_id() == vectorized::TypeIndex::DateV2) {
+                    auto* arg_col = assert_cast<const 
vectorized::ColumnDateV2*>(col.get());
+                    for (int row = 0; row < arg_col->size(); row++) {
+                        
_save_a_missing_val<vectorized::DateV2Value<vectorized::DateV2ValueType>>(
+                                arg_col, row, convert_buffer, 
PrimitiveType::TYPE_DATEV2);
+                    }
+                } else if (type->get_type_id() == 
vectorized::TypeIndex::DateTimeV2) {
+                    auto* arg_col = assert_cast<const 
vectorized::ColumnDateTimeV2*>(col.get());
+                    for (int row = 0; row < arg_col->size(); row++) {
+                        _save_a_missing_val<
+                                
vectorized::DateV2Value<vectorized::DateTimeV2ValueType>>(
+                                arg_col, row, convert_buffer, 
PrimitiveType::TYPE_DATETIMEV2);
+                    }
+                } else if (type->get_type_id() == vectorized::TypeIndex::Date) 
{
+                    auto* arg_col = assert_cast<const 
vectorized::ColumnDate*>(col.get());
+                    for (int row = 0; row < arg_col->size(); row++) {
+                        _save_a_missing_val<vectorized::VecDateTimeValue>(
+                                arg_col, row, convert_buffer, 
PrimitiveType::TYPE_DATE);
+                    }
+                } else if (type->get_type_id() == 
vectorized::TypeIndex::DateTime) {
+                    auto* arg_col = assert_cast<const 
vectorized::ColumnDateTime*>(col.get());
+                    for (int row = 0; row < arg_col->size(); row++) {
+                        _save_a_missing_val<vectorized::VecDateTimeValue>(
+                                arg_col, row, convert_buffer, 
PrimitiveType::TYPE_DATETIME);
+                    }
+                }
+                // then call FE to create it. then FragmentExecutor will redo 
the load.
+                _automatic_create_partition();

Review Comment:
   here need to check the ` _automatic_create_partition` status



-- 
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: commits-unsubscr...@doris.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to