diff --git a/src/observer/table/fts/ob_table_fts_cg_service.cpp b/src/observer/table/fts/ob_table_fts_cg_service.cpp index 43548e7486..ac1d6f530f 100644 --- a/src/observer/table/fts/ob_table_fts_cg_service.cpp +++ b/src/observer/table/fts/ob_table_fts_cg_service.cpp @@ -451,12 +451,16 @@ int ObTableFtsDmlCgService::generate_scan_with_doc_id_ctdef_if_need(ObTableCtx & int ret = OB_SUCCESS; bool need_doc_id_merge_iter = ctx.has_fts_index(); + ObArray domain_types; + ObArray domain_tids; ObArray result_outputs; - ObDASDocIdMergeCtDef *doc_id_merge_ctdef = nullptr; + ObDASDomainIdMergeCtDef *doc_id_merge_ctdef = nullptr; ObDASScanCtDef *rowkey_doc_scan_ctdef = nullptr; if (!need_doc_id_merge_iter) { // just skip, nothing to do - } else if (OB_FAIL(ObDASTaskFactory::alloc_das_ctdef(DAS_OP_DOC_ID_MERGE, allocator, doc_id_merge_ctdef))) { + } else if (OB_FAIL(ObTableFtsUtil::check_domain_index(ctx, domain_types, domain_tids))) { + LOG_WARN("fail to check need domain id merge iter", K(ret)); + } else if (OB_FAIL(ObDASTaskFactory::alloc_das_ctdef(DAS_OP_DOMAIN_ID_MERGE, allocator, doc_id_merge_ctdef))) { LOG_WARN("fail to allocate to doc id merge ctdef", K(ret)); } else if (OB_ISNULL(doc_id_merge_ctdef->children_ = OB_NEW_ARRAY(ObDASBaseCtDef*, &allocator, 2))) { ret = OB_ALLOCATE_MEMORY_FAILED; @@ -468,9 +472,12 @@ int ObTableFtsDmlCgService::generate_scan_with_doc_id_ctdef_if_need(ObTableCtx & } else if (OB_UNLIKELY(result_outputs.empty())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected error, result outputs is nullptr", K(ret)); + } else if (OB_FAIL(doc_id_merge_ctdef->domain_types_.prepare_allocate(1))) { + LOG_WARN("fail to allocate domain types array memory", K(ret)); } else { doc_id_merge_ctdef->children_cnt_ = 2; doc_id_merge_ctdef->children_[0] = &scan_ctdef; + doc_id_merge_ctdef->domain_types_.at(0) = domain_types.at(0); doc_id_merge_ctdef->children_[1] = rowkey_doc_scan_ctdef; if (OB_FAIL(doc_id_merge_ctdef->result_output_.assign(result_outputs))) { LOG_WARN("fail to assign result output", K(ret)); @@ -1135,19 +1142,25 @@ int ObTableFtsTscCgService::generate_das_scan_ctdef_with_doc_id(ObIAllocator &al const ObTableCtx &ctx, ObTableApiScanCtDef &tsc_ctdef, ObDASScanCtDef *scan_ctdef, - ObDASDocIdMergeCtDef *&doc_id_merge_ctdef) + ObDASDomainIdMergeCtDef *&doc_id_merge_ctdef) { int ret = OB_SUCCESS; ObArray result_outputs; ObDASScanCtDef *rowkey_doc_scan_ctdef = nullptr; + ObArray domain_types; + ObArray domain_tids; if (OB_ISNULL(scan_ctdef)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid arguments", K(ret), KPC(scan_ctdef)); - } else if (OB_FAIL(ObDASTaskFactory::alloc_das_ctdef(DAS_OP_DOC_ID_MERGE, alloc, doc_id_merge_ctdef))) { + } else if (OB_FAIL(ObTableFtsUtil::check_domain_index(ctx, domain_types, domain_tids))) { + LOG_WARN("fail to check need domain id merge iter", K(ret)); + } else if (OB_FAIL(ObDASTaskFactory::alloc_das_ctdef(DAS_OP_DOMAIN_ID_MERGE, alloc, doc_id_merge_ctdef))) { LOG_WARN("fail to allocate to doc id merge ctdef", K(ret)); } else if (OB_ISNULL(doc_id_merge_ctdef->children_ = OB_NEW_ARRAY(ObDASBaseCtDef*, &alloc, 2))) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("fail to allocate doc id merge ctdef child array memory", K(ret)); + } else if (OB_FAIL(doc_id_merge_ctdef->domain_types_.prepare_allocate(1))) { + LOG_WARN("fail to allocate domain types array memory", K(ret)); } else if (OB_FAIL(generate_rowkey_doc_ctdef(alloc, ctx, tsc_ctdef, rowkey_doc_scan_ctdef))) { LOG_WARN("fail to generate rowkey doc ctdef", K(ret)); } else if (OB_FAIL(result_outputs.assign(scan_ctdef->result_output_))) { @@ -1158,6 +1171,7 @@ int ObTableFtsTscCgService::generate_das_scan_ctdef_with_doc_id(ObIAllocator &al } else { doc_id_merge_ctdef->children_cnt_ = 2; doc_id_merge_ctdef->children_[0] = scan_ctdef; + doc_id_merge_ctdef->domain_types_.at(0) = domain_types.at(0); doc_id_merge_ctdef->children_[1] = rowkey_doc_scan_ctdef; if (OB_FAIL(doc_id_merge_ctdef->result_output_.assign(result_outputs))) { LOG_WARN("fail to assign result output", K(ret)); @@ -1274,5 +1288,84 @@ int ObTableFtsTscCgService::extract_doc_rowkey_exprs(const ObTableCtx &ctx, return ret; } +int ObTableFtsUtil::check_domain_index(const ObTableCtx &ctx, + ObIArray &domain_types, + ObIArray &domain_tids) +{ + int ret = OB_SUCCESS; + const ObTableSchema *table_schema = ctx.get_table_schema(); + domain_types.reset(); + domain_tids.reset(); + if (OB_ISNULL(table_schema)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("table schema is null", K(ret), K(table_schema)); + } else if (OB_FAIL(ObDomainIdUtils::check_has_domain_index(table_schema, domain_types, domain_tids))) { + LOG_WARN("failed to check has domain index", K(ret)); + } else if (domain_types.count() != domain_tids.count()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected domain types and tids", K(ret), K(domain_types), K(domain_tids)); + } else if (domain_types.count() != 1 || + domain_types.at(0) != ObDomainIdUtils::ObDomainIDType::DOC_ID) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("has unsupported domain index types", K(ret), K(domain_types)); + } + return ret; +} + +int ObTableFtsUtil::init_fts_domain_info(const ObTableCtx &ctx, + const ObIArray &tsc_out_cols, + ObDASScanCtDef &das_tsc_ctdef) +{ + int ret = OB_SUCCESS; + uint64_t doc_id_col_id = OB_INVALID_ID; + uint64_t ft_col_id = OB_INVALID_ID; + const ObTableSchema *rowkey_doc_schema = nullptr; + const ObTableFtsCtx *fts_ctx = ctx.get_fts_ctx(); + const ObTableSchema *table_schema = ctx.get_table_schema(); + if (OB_ISNULL(table_schema)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("table schema is NULL", K(ret)); + } else if (OB_ISNULL(fts_ctx)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fts_ctx is NULL", K(ret)); + } else if (OB_ISNULL(rowkey_doc_schema = fts_ctx->get_rowkey_doc_schema())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("rowkey doc schema is NULL", K(ret)); + } else if (OB_FAIL(das_tsc_ctdef.domain_tids_.init(1))) { + LOG_WARN("fail to init domain tid", K(ret)); + } else if (OB_FAIL(das_tsc_ctdef.domain_types_.init(1))) { + LOG_WARN("fail to init domain type", K(ret)); + } else if (OB_FAIL(das_tsc_ctdef.domain_id_idxs_.init(1))) { + LOG_WARN("fail to init domain id idx", K(ret)); + } else if (OB_FAIL(das_tsc_ctdef.domain_tids_.push_back(rowkey_doc_schema->get_table_id()))) { + LOG_WARN("fail to push back table id", K(ret)); + } else if (OB_FAIL(das_tsc_ctdef.domain_types_.push_back(ObDomainIdUtils::ObDomainIDType::DOC_ID))) { + LOG_WARN("fail to push back domain type", K(ret)); + } else if (OB_FAIL(table_schema->get_fulltext_column_ids(doc_id_col_id, ft_col_id))) { + LOG_WARN("fail to get fulltext column ids", K(ret)); + } else if (OB_INVALID_ID == doc_id_col_id) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get doc id column", K(ret)); + } else { + bool is_found = false; + DomainIdxs domain_idx; + for (int64_t i = 0; OB_SUCC(ret) && i < tsc_out_cols.count() && !is_found; ++i) { + if (tsc_out_cols.at(i) == doc_id_col_id) { + if (OB_FAIL(domain_idx.push_back(i))) { + LOG_WARN("fail to push back domain idx", K(ret)); + } + is_found = true; + } + } + if (is_found && OB_SUCC(ret)) { + if (OB_FAIL(das_tsc_ctdef.domain_id_idxs_.push_back(domain_idx))) { + LOG_WARN("fail to push back domain idx", K(ret)); + } + } + } + + return ret; +} + } // namespace table } // namespace oceanbase diff --git a/src/observer/table/fts/ob_table_fts_cg_service.h b/src/observer/table/fts/ob_table_fts_cg_service.h index 9d3c7ca274..64856f207c 100644 --- a/src/observer/table/fts/ob_table_fts_cg_service.h +++ b/src/observer/table/fts/ob_table_fts_cg_service.h @@ -71,7 +71,7 @@ public: const ObTableCtx &ctx, ObTableApiScanCtDef &tsc_ctdef, ObDASScanCtDef *scan_ctdef, - ObDASDocIdMergeCtDef *&doc_id_merge_ctdef); + ObDASDomainIdMergeCtDef *&doc_id_merge_ctdef); static int get_fts_schema(const ObTableCtx &ctx, uint64_t table_id, const ObTableSchema *&index_schema); static int extract_text_ir_access_columns(const ObTableCtx &ctx, ObDASScanCtDef &scan_ctdef, @@ -104,6 +104,17 @@ private: DISALLOW_COPY_AND_ASSIGN(ObTableFtsTscCgService); }; +class ObTableFtsUtil +{ +public: + static int check_domain_index(const ObTableCtx &ctx, + ObIArray &domain_types, + ObIArray &domain_tids); + static int init_fts_domain_info(const ObTableCtx &ctx, + const ObIArray &tsc_out_cols, + ObDASScanCtDef &das_tsc_ctdef); +}; + } // end namespace table } // end namespace oceanbase diff --git a/src/observer/table/ob_table_cg_service.cpp b/src/observer/table/ob_table_cg_service.cpp index 08d1fe7095..6acfc9a909 100644 --- a/src/observer/table/ob_table_cg_service.cpp +++ b/src/observer/table/ob_table_cg_service.cpp @@ -2338,14 +2338,8 @@ int ObTableDmlCgService::generate_tsc_ctdef(ObTableCtx &ctx, LOG_WARN("fail to get column ids", K(ret)); } else if (OB_FAIL(tsc_ctdef.access_column_ids_.assign(column_ids))) { LOG_WARN("fail to assign column ids", K(ret), K(column_ids)); - } else if (need_doc_id) { - uint64_t rowkey_doc_col_id = OB_INVALID_ID; - uint64_t ft_col_id = OB_INVALID_ID; - if (OB_FAIL(table_schema->get_fulltext_column_ids(rowkey_doc_col_id, ft_col_id))) { - LOG_WARN("fail to get fulltext column ids", K(ret)); - } else { - tsc_ctdef.doc_id_idx_ = table_schema->get_column_idx(rowkey_doc_col_id); - } + } else if (need_doc_id && OB_FAIL(ObTableFtsUtil::init_fts_domain_info(ctx, column_ids, tsc_ctdef))) { + LOG_WARN("fail to fts domain info", K(ret), K(column_ids)); } if (OB_SUCC(ret)) { @@ -3395,21 +3389,8 @@ int ObTableTscCgService::extract_select_output_column_ids(const ObTableCtx &ctx, ret = OB_ERR_UNEXPECTED; LOG_WARN("table schema is NULL", K(ret)); } else if (ctx.is_tsc_with_doc_id() && index_schema->is_user_table()) { - uint64_t doc_id_col_id = OB_INVALID_ID; - uint64_t ft_col_id = OB_INVALID_ID; - if (OB_FAIL(index_schema->get_fulltext_column_ids(doc_id_col_id, ft_col_id))) { - LOG_WARN("fail to get fulltext column ids", K(ret)); - } else if (OB_INVALID_ID == doc_id_col_id) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("fail to get doc id column", K(ret)); - } else { - bool is_found = false; - for (int64_t i = 0; OB_SUCC(ret) && i < tsc_out_cols.count() && !is_found; ++i) { - if (tsc_out_cols.at(i) == doc_id_col_id) { - das_tsc_ctdef.doc_id_idx_ = i; - is_found = true; - } - } + if (OB_FAIL(ObTableFtsUtil::init_fts_domain_info(ctx, tsc_out_cols, das_tsc_ctdef))) { + LOG_WARN("fail to fts domain info", K(ret), K(tsc_out_cols)); } } LOG_DEBUG("[table cg service] extract das output column ids", K(ret), K(table_id), @@ -3567,7 +3548,7 @@ int ObTableTscCgService::generate_tsc_ctdef(const ObTableCtx &ctx, const int64_t filter_exprs_cnt = ctx.get_filter_exprs().count(); bool query_cs_replica = false; ObDASBaseCtDef *root_ctdef = nullptr; - ObDASDocIdMergeCtDef *doc_id_merge_ctdef = nullptr; + ObDASDomainIdMergeCtDef *doc_id_merge_ctdef = nullptr; bool need_attach = false; // init scan_ctdef_.ref_table_id_ // when scan primary index, index_table_id == ref_table_id diff --git a/src/observer/table/ob_table_context.cpp b/src/observer/table/ob_table_context.cpp index cda25d0406..0e9bddac55 100644 --- a/src/observer/table/ob_table_context.cpp +++ b/src/observer/table/ob_table_context.cpp @@ -2456,7 +2456,7 @@ const ObDASScanCtDef* ObTableApiScanCtDef::get_lookup_ctdef() const const ObDASBaseCtDef *attach_ctdef = attach_spec_.attach_ctdef_; if (nullptr == attach_ctdef) { lookup_ctdef = lookup_ctdef_; - } else if (DAS_OP_DOC_ID_MERGE == attach_ctdef->op_type_) { + } else if (DAS_OP_DOMAIN_ID_MERGE == attach_ctdef->op_type_) { OB_ASSERT(2 == attach_ctdef->children_cnt_ && attach_ctdef->children_ != nullptr); if (OB_NOT_NULL(lookup_ctdef_)) { lookup_ctdef = static_cast(attach_ctdef->children_[0]); @@ -2465,7 +2465,7 @@ const ObDASScanCtDef* ObTableApiScanCtDef::get_lookup_ctdef() const OB_ASSERT(2 == attach_ctdef->children_cnt_ && attach_ctdef->children_ != nullptr); if (DAS_OP_TABLE_SCAN == attach_ctdef->children_[1]->op_type_) { lookup_ctdef = static_cast(attach_ctdef->children_[1]); - } else if (DAS_OP_DOC_ID_MERGE == attach_ctdef->children_[1]->op_type_) { + } else if (DAS_OP_DOMAIN_ID_MERGE == attach_ctdef->children_[1]->op_type_) { ObDASDocIdMergeCtDef *doc_id_merge_ctdef = static_cast(attach_ctdef->children_[1]); OB_ASSERT(2 == doc_id_merge_ctdef->children_cnt_ && doc_id_merge_ctdef->children_ != nullptr); lookup_ctdef = static_cast(doc_id_merge_ctdef->children_[0]); diff --git a/src/observer/table/ob_table_scan_executor.cpp b/src/observer/table/ob_table_scan_executor.cpp index f3b08206de..a5cbb69458 100644 --- a/src/observer/table/ob_table_scan_executor.cpp +++ b/src/observer/table/ob_table_scan_executor.cpp @@ -215,7 +215,7 @@ int ObTableApiScanExecutor::pushdown_attach_task_to_das(ObDASScanOp &target_op) ObDASAttachRtInfo *attach_rtinfo = tsc_rtdef_.attach_rtinfo_; const ObTableApiScanCtDef &tsc_ctdef = scan_spec_.get_ctdef(); if (tb_ctx_.is_global_index_scan() && nullptr != tsc_ctdef.lookup_ctdef_ - && DAS_OP_DOC_ID_MERGE == tsc_ctdef.attach_spec_.attach_ctdef_->op_type_) { + && DAS_OP_DOMAIN_ID_MERGE == tsc_ctdef.attach_spec_.attach_ctdef_->op_type_) { // just skip, and doc id merge will be attach into global lookup iter. } else if (OB_FAIL(target_op.reserve_related_buffer(attach_rtinfo->related_scan_cnt_))) { LOG_WARN("reserve related buffer failed", K(ret), K(attach_rtinfo->related_scan_cnt_));