Skip to content
This repository was archived by the owner on May 9, 2024. It is now read-only.

Commit a59f799

Browse files
committed
Stop using chunk stats for expression ranges.
Signed-off-by: ienkovich <[email protected]>
1 parent 37b45c3 commit a59f799

File tree

1 file changed

+4
-82
lines changed

1 file changed

+4
-82
lines changed

omniscidb/QueryEngine/ExpressionRange.cpp

Lines changed: 4 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -446,39 +446,6 @@ ExpressionRange getExpressionRange(const hdk::ir::Constant* constant_expr) {
446446
return ExpressionRange::makeInvalidRange();
447447
}
448448

449-
#define FIND_STAT_FRAG(stat_name) \
450-
const auto stat_name##_frag_index = std::stat_name##_element( \
451-
nonempty_fragment_indices.begin(), \
452-
nonempty_fragment_indices.end(), \
453-
[&fragments, &has_nulls, col_id, col_type](const size_t lhs_idx, \
454-
const size_t rhs_idx) { \
455-
const auto& lhs = fragments[lhs_idx]; \
456-
const auto& rhs = fragments[rhs_idx]; \
457-
auto lhs_meta_it = lhs.getChunkMetadataMap().find(col_id); \
458-
if (lhs_meta_it == lhs.getChunkMetadataMap().end()) { \
459-
return false; \
460-
} \
461-
auto rhs_meta_it = rhs.getChunkMetadataMap().find(col_id); \
462-
CHECK(rhs_meta_it != rhs.getChunkMetadataMap().end()); \
463-
if (lhs_meta_it->second->chunkStats().has_nulls || \
464-
rhs_meta_it->second->chunkStats().has_nulls) { \
465-
has_nulls = true; \
466-
} \
467-
if (col_type->isFloatingPoint()) { \
468-
return extract_##stat_name##_stat_fp_type(lhs_meta_it->second->chunkStats(), \
469-
col_type) < \
470-
extract_##stat_name##_stat_fp_type(rhs_meta_it->second->chunkStats(), \
471-
col_type); \
472-
} \
473-
return extract_##stat_name##_stat_int_type(lhs_meta_it->second->chunkStats(), \
474-
col_type) < \
475-
extract_##stat_name##_stat_int_type(rhs_meta_it->second->chunkStats(), \
476-
col_type); \
477-
}); \
478-
if (stat_name##_frag_index == nonempty_fragment_indices.end()) { \
479-
return ExpressionRange::makeInvalidRange(); \
480-
}
481-
482449
namespace {
483450

484451
int64_t get_conservative_datetrunc_bucket(const hdk::ir::DateTruncField datetrunc_field) {
@@ -546,7 +513,6 @@ ExpressionRange getLeafColumnRange(const hdk::ir::ColumnVar* col_expr,
546513
}
547514
CHECK(ti_idx);
548515
const auto& query_info = query_infos[*ti_idx].info;
549-
const auto& fragments = query_info.fragments;
550516
if (query_info.getNumTuples() == 0) {
551517
// The column doesn't contain any values, synthesize an empty range.
552518
if (col_type->isFloatingPoint()) {
@@ -561,67 +527,25 @@ ExpressionRange getLeafColumnRange(const hdk::ir::ColumnVar* col_expr,
561527
return ExpressionRange::makeIntRange(
562528
0, std::max(num_tuples - 1, int64_t(0)), 0, has_nulls);
563529
}
564-
std::vector<size_t> nonempty_fragment_indices;
565-
for (size_t i = 0; i < fragments.size(); ++i) {
566-
const auto& fragment = fragments[i];
567-
if (!fragment.isEmptyPhysicalFragment()) {
568-
nonempty_fragment_indices.push_back(i);
569-
}
570-
}
571-
FIND_STAT_FRAG(min);
572-
FIND_STAT_FRAG(max);
573-
const auto& min_frag = fragments[*min_frag_index];
574-
const auto min_it = min_frag.getChunkMetadataMap().find(col_id);
575-
if (min_it == min_frag.getChunkMetadataMap().end()) {
576-
return ExpressionRange::makeInvalidRange();
577-
}
578-
const auto& max_frag = fragments[*max_frag_index];
579-
const auto max_it = max_frag.getChunkMetadataMap().find(col_id);
580-
CHECK(max_it != max_frag.getChunkMetadataMap().end());
581-
for (const auto& fragment : fragments) {
582-
const auto it = fragment.getChunkMetadataMap().find(col_id);
583-
if (it != fragment.getChunkMetadataMap().end()) {
584-
if (it->second->chunkStats().has_nulls) {
585-
has_nulls = true;
586-
break;
587-
}
588-
}
589-
}
590530

591531
auto& table_stats = query_info.getTableStats();
592532
auto col_stats_it = table_stats.find(col_id);
593533
CHECK(col_stats_it != table_stats.end())
594534
<< query_infos[*ti_idx].db_id << ":" << query_infos[*ti_idx].table_id << ":"
595535
<< col_id << " " << table_stats.size();
596-
if (col_stats_it == table_stats.end()) {
597-
return ExpressionRange::makeInvalidRange();
598-
}
599536

600537
auto& col_stats = col_stats_it->second;
601-
CHECK_EQ(col_stats.has_nulls || is_outer_join_proj, has_nulls);
602538
has_nulls = has_nulls || col_stats.has_nulls;
603539

604540
if (col_type->isFloatingPoint()) {
605-
const auto min_val =
606-
extract_min_stat_fp_type(min_it->second->chunkStats(), col_type);
607-
const auto max_val =
608-
extract_max_stat_fp_type(max_it->second->chunkStats(), col_type);
609-
const auto new_min_val = extract_min_stat_fp_type(col_stats, col_type);
610-
const auto new_max_val = extract_max_stat_fp_type(col_stats, col_type);
611-
CHECK_EQ(new_min_val, min_val);
612-
CHECK_EQ(new_max_val, max_val);
541+
const auto min_val = extract_min_stat_fp_type(col_stats, col_type);
542+
const auto max_val = extract_max_stat_fp_type(col_stats, col_type);
613543
return col_type->size() == 4
614544
? ExpressionRange::makeFloatRange(min_val, max_val, has_nulls)
615545
: ExpressionRange::makeDoubleRange(min_val, max_val, has_nulls);
616546
}
617-
const auto min_val =
618-
extract_min_stat_int_type(min_it->second->chunkStats(), col_type);
619-
const auto max_val =
620-
extract_max_stat_int_type(max_it->second->chunkStats(), col_type);
621-
const auto new_min_val = extract_min_stat_int_type(col_stats, col_type);
622-
const auto new_max_val = extract_max_stat_int_type(col_stats, col_type);
623-
CHECK_EQ(new_min_val, min_val);
624-
CHECK_EQ(new_max_val, max_val);
547+
const auto min_val = extract_min_stat_int_type(col_stats, col_type);
548+
const auto max_val = extract_max_stat_int_type(col_stats, col_type);
625549
if (max_val < min_val) {
626550
// The column doesn't contain any non-null values, synthesize an empty range.
627551
CHECK_GT(min_val, 0);
@@ -639,8 +563,6 @@ ExpressionRange getLeafColumnRange(const hdk::ir::ColumnVar* col_expr,
639563
return ExpressionRange::makeInvalidRange();
640564
}
641565

642-
#undef FIND_STAT_FRAG
643-
644566
ExpressionRange getExpressionRange(
645567
const hdk::ir::ColumnVar* col_expr,
646568
const std::vector<InputTableInfo>& query_infos,

0 commit comments

Comments
 (0)