in cpp/src/common/tsfile_common.cc [262:327]
int MetaIndexNode::binary_search_children(std::shared_ptr<IComparable> key, bool exact_search,
std::shared_ptr<IMetaIndexEntry> &ret_index_entry,
int64_t &ret_end_offset) {
#if DEBUG_SE
std::cout << "MetaIndexNode::binary_search_children start, name=" << key
<< ", exact_search=" << exact_search
<< ", children_.size=" << children_.size() << std::endl;
for (int i = 0; i < (int)children_.size(); i++) {
std::cout << "Iterating children: " << children_[i]->get_name() << std::endl;
}
#endif
bool is_aligned = false;
if (node_type_ == LEAF_MEASUREMENT && children_.size() == 1 &&
children_[0]->get_compare_key()->to_string().empty()) {
is_aligned = true;
}
// children_[l] <= name < children_[h]
int l = -1;
if (is_aligned) {
l = 0;
} else {
int h = (int)children_.size();
bool found = false;
while (l < h - 1) {
int m = (l + h) / 2;
int cmp = children_[m]->get_compare_key()->compare(*key);
#if DEBUG_SE
std::cout
<< "MetaIndexNode::binary_search_children doing, cmp: cur="
<< children_[m]->get_name() << ", name=" << key
<< ", exact_search=" << exact_search
<< ", children_.size=" << children_.size() << std::endl;
#endif
if (cmp == 0) {
l = m;
found = true;
break;
} else if (cmp > 0) { // children_[m] > name
h = m;
} else { // children_[m] < name
l = m;
}
}
if ((l == -1) || (exact_search && !found)) {
#if DEBUG_SE
std::cout << "MetaIndexNode::binary_search_children end, "
"ret=E_NOT_EXIST, name="
<< key << ", exact_search=" << exact_search << std::endl;
#endif
return E_NOT_EXIST;
}
}
ret_index_entry = children_[l]->clone(pa_);
if (l == (int)children_.size() - 1) {
ret_end_offset = this->end_offset_;
} else {
ret_end_offset = children_[l + 1]->get_offset();
}
#if DEBUG_SE
std::cout << "MetaIndexNode::binary_search_children end, ret_index_entry="
<< ret_index_entry << ", ret_end_offset=" << ret_end_offset
<< ", name=" << key << ", exact_search=" << exact_search
<< std::endl;
#endif
return E_OK;
}