[GIS] bugfix: bypass mbr filter if index key_range is whole range

This commit is contained in:
obdev
2023-04-13 12:49:14 +00:00
committed by ob-robot
parent 1aeb79638d
commit 7051c4697d
3 changed files with 10 additions and 8 deletions

View File

@ -370,7 +370,7 @@ int ObDASScanOp::do_local_index_lookup()
op->set_rowkey_iter(result_);
result_ = op;
if (OB_FAIL(op->init(get_lookup_ctdef(), get_lookup_rtdef(), scan_ctdef_, scan_rtdef_,
trans_desc_, snapshot_, &scan_param_.mbr_filters_))) {
trans_desc_, snapshot_, scan_param_))) {
LOG_WARN("init spatial lookup op failed", K(ret));
} else {
op->set_tablet_id(related_tablet_ids_.at(0));

View File

@ -41,18 +41,21 @@ int ObSpatialIndexLookupOp::init(const ObDASScanCtDef *lookup_ctdef,
ObDASScanRtDef *index_rtdef,
ObTxDesc *tx_desc,
ObTxReadSnapshot *snapshot,
const ObMbrFilterArray *mbr_filters)
ObTableScanParam &scan_param)
{
int ret = OB_SUCCESS;
if (OB_FAIL(ObLocalIndexLookupOp::init(lookup_ctdef, lookup_rtdef, index_ctdef,
index_rtdef, tx_desc, snapshot))) {
LOG_WARN("ObLocalIndexLookupOp init failed", K(ret));
} else if (OB_ISNULL(mbr_filters)) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("mbr filter is null", K(ret));
} else {
mbr_filters_ = mbr_filters;
mbr_filters_ = &scan_param.mbr_filters_;
is_inited_ = false;
for (int64_t i = 0; OB_SUCC(ret) && i < scan_param.key_ranges_.count(); i++) {
if (scan_param.key_ranges_.at(i).is_whole_range()) {
is_whole_range_ = true;
}
}
is_whole_range_ |= (mbr_filters_->count() == 0);
}
return ret;
}
@ -137,7 +140,6 @@ int ObSpatialIndexLookupOp::get_next_row()
if (OB_FAIL(sorter_.init(buf_limit, file_buf_size, expire_timestamp, tenant_id, &comparer_))) {
STORAGE_LOG(WARN, "fail to init external sorter", K(ret));
} else {
is_whole_range_ = (mbr_filters_->count() == 0);
is_inited_ = true;
while (OB_SUCC(ret)) {
index_rtdef_->p_pd_expr_op_->clear_evaluated_flag();

View File

@ -46,7 +46,7 @@ public:
ObDASScanRtDef *index_rtdef,
transaction::ObTxDesc *tx_desc,
transaction::ObTxReadSnapshot *snapshot,
const ObMbrFilterArray *mbr_filters);
storage::ObTableScanParam &scan_param);
int reset_lookup_state();
int filter_by_mbr(const ObObj &mbr_obj, bool &pass_through);
int get_next_row();