@@ -882,8 +882,16 @@ ColumnsStatistics IMergeTreeDataPart::loadStatistics() const
882882 ColumnsStatistics result;
883883 for (auto & stat : total_statistics)
884884 {
885- String file_name = stat->getFileName () + STATS_FILE_SUFFIX ;
886- String file_path = fs::path (getDataPartStorage ().getRelativePath ()) / file_name;
885+ String escaped_name = escapeForFileName (stat->getStatisticName ());
886+ auto stream_name = getStreamNameOrHash (escaped_name, STATS_FILE_SUFFIX , checksums);
887+
888+ if (!stream_name.has_value ())
889+ {
890+ LOG_INFO (storage.log , " File for statistics with name '{}' is not found" , escaped_name);
891+ continue ;
892+ }
893+
894+ String file_name = *stream_name + STATS_FILE_SUFFIX ;
887895
888896 if (auto stat_file = readFileIfExists (file_name))
889897 {
@@ -892,11 +900,30 @@ ColumnsStatistics IMergeTreeDataPart::loadStatistics() const
892900 result.push_back (stat);
893901 }
894902 else
895- LOG_INFO (storage.log , " Cannot find stats file {}" , file_path);
903+ {
904+ String file_path = fs::path (getDataPartStorage ().getRelativePath ()) / file_name;
905+ LOG_INFO (storage.log , " Cannot read stats file {}" , file_path);
906+ }
896907 }
897908 return result;
898909}
899910
911+ Estimates IMergeTreeDataPart::getEstimates () const
912+ {
913+ std::lock_guard lock (estimates_mutex);
914+
915+ if (estimates.has_value ())
916+ return *estimates;
917+
918+ estimates = Estimates ();
919+ auto statistics = loadStatistics ();
920+
921+ for (const auto & stat : statistics)
922+ estimates->emplace (stat->getColumnName (), stat->getEstimate ());
923+
924+ return *estimates;
925+ }
926+
900927void IMergeTreeDataPart::loadColumnsChecksumsIndexes (bool require_columns_checksums, bool check_consistency, bool load_metadata_version)
901928{
902929 // / Memory should not be limited during ATTACH TABLE query.
@@ -2566,13 +2593,14 @@ String IMergeTreeDataPart::getNewPartBlockID(std::string_view token) const
25662593
25672594std::optional<String> IMergeTreeDataPart::getStreamNameOrHash (
25682595 const String & stream_name,
2596+ const String & extension,
25692597 const Checksums & checksums_)
25702598{
2571- if (checksums_.files .contains (stream_name + " .bin " ))
2599+ if (checksums_.files .contains (stream_name + extension ))
25722600 return stream_name;
25732601
25742602 auto hash = sipHash128String (stream_name);
2575- if (checksums_.files .contains (hash + " .bin " ))
2603+ if (checksums_.files .contains (hash + extension ))
25762604 return hash;
25772605
25782606 return {};
@@ -2596,19 +2624,21 @@ std::optional<String> IMergeTreeDataPart::getStreamNameOrHash(
25962624std::optional<String> IMergeTreeDataPart::getStreamNameForColumn (
25972625 const String & column_name,
25982626 const ISerialization::SubstreamPath & substream_path,
2627+ const String & extension,
25992628 const Checksums & checksums_)
26002629{
26012630 auto stream_name = ISerialization::getFileNameForStream (column_name, substream_path);
2602- return getStreamNameOrHash (stream_name, checksums_);
2631+ return getStreamNameOrHash (stream_name, extension, checksums_);
26032632}
26042633
26052634std::optional<String> IMergeTreeDataPart::getStreamNameForColumn (
26062635 const NameAndTypePair & column,
26072636 const ISerialization::SubstreamPath & substream_path,
2637+ const String & extension,
26082638 const Checksums & checksums_)
26092639{
26102640 auto stream_name = ISerialization::getFileNameForStream (column, substream_path);
2611- return getStreamNameOrHash (stream_name, checksums_);
2641+ return getStreamNameOrHash (stream_name, extension, checksums_);
26122642}
26132643
26142644std::optional<String> IMergeTreeDataPart::getStreamNameForColumn (
0 commit comments