diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2018-04-30 07:55:11 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2018-04-30 07:55:11 +0300 |
commit | 9b1313e8493909cdb7953607cfe1e85d3276937f (patch) | |
tree | 13d8a1520c7c5c4006c0f0a0a3f5951609fef80b | |
parent | 935025f8910ec41c48bcb36b94c41df04f97c99d (diff) | |
download | mariadb-git-9b1313e8493909cdb7953607cfe1e85d3276937f.tar.gz |
rtr_estimate_n_rows_in_range(): Simplify code
-rw-r--r-- | storage/innobase/gis/gis0rtree.cc | 65 |
1 files changed, 25 insertions, 40 deletions
diff --git a/storage/innobase/gis/gis0rtree.cc b/storage/innobase/gis/gis0rtree.cc index 1d2f18a765c..398f70ee5a8 100644 --- a/storage/innobase/gis/gis0rtree.cc +++ b/storage/innobase/gis/gis0rtree.cc @@ -1849,6 +1849,8 @@ rtr_estimate_n_rows_in_range( const dtuple_t* tuple, page_cur_mode_t mode) { + ut_ad(dict_index_is_spatial(index)); + /* Check tuple & mode */ if (tuple->n_fields == 0) { return(HA_POS_ERROR); @@ -1870,35 +1872,31 @@ rtr_estimate_n_rows_in_range( ); /* Read mbr from tuple. */ - const dfield_t* dtuple_field; - ulint dtuple_f_len MY_ATTRIBUTE((unused)); rtr_mbr_t range_mbr; double range_area; - byte* range_mbr_ptr; + const byte* range_mbr_ptr; - dtuple_field = dtuple_get_nth_field(tuple, 0); - dtuple_f_len = dfield_get_len(dtuple_field); - range_mbr_ptr = reinterpret_cast<byte*>(dfield_get_data(dtuple_field)); + const dfield_t* dtuple_field = dtuple_get_nth_field(tuple, 0); + ut_ad(dfield_get_len(dtuple_field) >= DATA_MBR_LEN); + range_mbr_ptr = reinterpret_cast<const byte*>( + dfield_get_data(dtuple_field)); - ut_ad(dtuple_f_len >= DATA_MBR_LEN); rtr_read_mbr(range_mbr_ptr, &range_mbr); range_area = (range_mbr.xmax - range_mbr.xmin) * (range_mbr.ymax - range_mbr.ymin); /* Get index root page. */ mtr_t mtr; - buf_block_t* block; - page_t* page; mtr.start(); index->set_modified(mtr); mtr_s_lock(&index->lock, &mtr); - block = btr_block_get( + buf_block_t* block = btr_block_get( page_id_t(index->table->space->id, index->page), page_size_t(index->table->space->flags), RW_S_LATCH, index, &mtr); - page = buf_block_get_frame(block); + const page_t* page = buf_block_get_frame(block); const unsigned n_recs = page_header_get_field(page, PAGE_N_RECS); if (n_recs == 0) { @@ -1906,27 +1904,16 @@ rtr_estimate_n_rows_in_range( return(HA_POS_ERROR); } - rec_t* rec; - byte* field; - ulint len; - ulint* offsets = NULL; - mem_heap_t* heap; - - heap = mem_heap_create(512); - rec = page_rec_get_next(page_get_infimum_rec(page)); - offsets = rec_get_offsets(rec, index, offsets, page_rec_is_leaf(rec), - ULINT_UNDEFINED, &heap); - /* Scan records in root page and calculate area. */ double area = 0; - while (!page_rec_is_supremum(rec)) { + for (const rec_t* rec = page_rec_get_next( + page_get_infimum_rec(block->frame)); + !page_rec_is_supremum(rec); + rec = page_rec_get_next_const(rec)) { rtr_mbr_t mbr; double rec_area; - field = rec_get_nth_field(rec, offsets, 0, &len); - ut_ad(len == DATA_MBR_LEN); - - rtr_read_mbr(field, &mbr); + rtr_read_mbr(rec, &mbr); rec_area = (mbr.xmax - mbr.xmin) * (mbr.ymax - mbr.ymin); @@ -1943,8 +1930,8 @@ rtr_estimate_n_rows_in_range( case PAGE_CUR_WITHIN: case PAGE_CUR_MBR_EQUAL: if (rtree_key_cmp( - PAGE_CUR_WITHIN, range_mbr_ptr, - DATA_MBR_LEN, field, DATA_MBR_LEN) + PAGE_CUR_WITHIN, range_mbr_ptr, + DATA_MBR_LEN, rec, DATA_MBR_LEN) == 0) { area += 1; } @@ -1958,22 +1945,23 @@ rtr_estimate_n_rows_in_range( switch (mode) { case PAGE_CUR_CONTAIN: case PAGE_CUR_INTERSECT: - area += rtree_area_overlapping(range_mbr_ptr, - field, DATA_MBR_LEN) / rec_area; + area += rtree_area_overlapping( + range_mbr_ptr, rec, DATA_MBR_LEN) + / rec_area; break; case PAGE_CUR_DISJOINT: area += 1; - area -= rtree_area_overlapping(range_mbr_ptr, - field, DATA_MBR_LEN) / rec_area; + area -= rtree_area_overlapping( + range_mbr_ptr, rec, DATA_MBR_LEN) + / rec_area; break; case PAGE_CUR_WITHIN: case PAGE_CUR_MBR_EQUAL: - if (rtree_key_cmp( - PAGE_CUR_WITHIN, range_mbr_ptr, - DATA_MBR_LEN, field, DATA_MBR_LEN) - == 0) { + if (!rtree_key_cmp( + PAGE_CUR_WITHIN, range_mbr_ptr, + DATA_MBR_LEN, rec, DATA_MBR_LEN)) { area += range_area / rec_area; } @@ -1982,12 +1970,9 @@ rtr_estimate_n_rows_in_range( ut_error; } } - - rec = page_rec_get_next(rec); } mtr.commit(); - mem_heap_free(heap); if (!isfinite(area)) { return(HA_POS_ERROR); |