Refactor code add comments

This commit is contained in:
alesapin 2020-04-03 13:40:46 +03:00
parent 763669f3dc
commit 20d40b8bce
5 changed files with 36 additions and 17 deletions

View File

@ -57,7 +57,8 @@ public:
/// `column_name` can be a Nested column name; /// `column_name` can be a Nested column name;
void remove(const String & column_name); void remove(const String & column_name);
/// TODO(alesap) /// Rename column. column_from and column_to cannot be nested columns.
/// TODO add ability to rename nested columns
void rename(const String & column_from, const String & column_to); void rename(const String & column_from, const String & column_to);
void flattenNested(); /// TODO: remove, insert already flattened Nested columns. void flattenNested(); /// TODO: remove, insert already flattened Nested columns.

View File

@ -125,9 +125,18 @@ public:
STRONG_TYPEDEF(String, PartitionID) STRONG_TYPEDEF(String, PartitionID)
/// Alter conversions which should be applied on-fly for part. Build from of
/// the most recent mutation commands for part. Now we have only rename_map
/// here (from ALTER_RENAME) command, because for all other type of alters
/// we can deduce conversions for part from difference between
/// part->getColumns() and storage->getColumns().
struct AlterConversions struct AlterConversions
{ {
/// Rename map new_name -> old_name
std::unordered_map<String, String> rename_map; std::unordered_map<String, String> rename_map;
bool isColumnRenamed(const String & new_name) const { return rename_map.count(new_name) > 0; }
String getColumnOldName(const String & new_name) const { return rename_map.at(new_name); }
}; };
struct LessDataPart struct LessDataPart
@ -652,6 +661,7 @@ public:
/// Reserves 0 bytes /// Reserves 0 bytes
ReservationPtr makeEmptyReservationOnLargestDisk() { return getStoragePolicy()->makeEmptyReservationOnLargestDisk(); } ReservationPtr makeEmptyReservationOnLargestDisk() { return getStoragePolicy()->makeEmptyReservationOnLargestDisk(); }
/// Return alter conversions for part which must be applied on fly.
AlterConversions getAlterConversionsForPart(const MergeTreeDataPartPtr part) const; AlterConversions getAlterConversionsForPart(const MergeTreeDataPartPtr part) const;
MergeTreeDataFormatVersion format_version; MergeTreeDataFormatVersion format_version;
@ -915,6 +925,10 @@ protected:
/// mechanisms for parts locking /// mechanisms for parts locking
virtual bool partIsAssignedToBackgroundOperation(const DataPartPtr & part) const = 0; virtual bool partIsAssignedToBackgroundOperation(const DataPartPtr & part) const = 0;
/// Return most recent mutations commands for part which weren't applied
/// Used to receive AlterConversions for part and apply them on fly. This
/// method has different implementations for replicated and non replicated
/// MergeTree because they store mutations in different way.
virtual MutationCommands getFirtsAlterMutationCommandsForPart(const DataPartPtr & part) const = 0; virtual MutationCommands getFirtsAlterMutationCommandsForPart(const DataPartPtr & part) const = 0;
/// Moves part to specified space, used in ALTER ... MOVE ... queries /// Moves part to specified space, used in ALTER ... MOVE ... queries
bool movePartsToSpace(const DataPartsVector & parts, SpacePtr space); bool movePartsToSpace(const DataPartsVector & parts, SpacePtr space);

View File

@ -81,12 +81,10 @@ MergeTreeReaderCompact::MergeTreeReaderCompact(
const auto & [name, type] = *name_and_type; const auto & [name, type] = *name_and_type;
auto position = data_part->getColumnPosition(name); auto position = data_part->getColumnPosition(name);
if (!position) if (!position && alter_conversions.isColumnRenamed(name))
{ {
auto renamed_it = alter_conversions.rename_map.find(name); String old_name = alter_conversions.getColumnOldName(name);
position = data_part->getColumnPosition(old_name);
if (renamed_it != alter_conversions.rename_map.end())
position = data_part->getColumnPosition(renamed_it->second);
} }
if (!position && typeid_cast<const DataTypeArray *>(type.get())) if (!position && typeid_cast<const DataTypeArray *>(type.get()))
@ -136,11 +134,11 @@ size_t MergeTreeReaderCompact::readRows(size_t from_mark, bool continue_reading,
auto [name, type] = *name_and_type; auto [name, type] = *name_and_type;
if (alter_conversions.rename_map.count(name)) if (alter_conversions.isColumnRenamed(name))
{ {
String original_name = alter_conversions.rename_map[name]; String old_name = alter_conversions.getColumnOldName(name);
if (!data_part->getColumnPosition(name) && data_part->getColumnPosition(original_name)) if (!data_part->getColumnPosition(name) && data_part->getColumnPosition(old_name))
name = original_name; name = old_name;
} }
auto & column = mutable_columns[pos]; auto & column = mutable_columns[pos];

View File

@ -52,15 +52,19 @@ MergeTreeReaderWide::MergeTreeReaderWide(
} }
else else
{ {
auto renamed_it = alter_conversions.rename_map.find(column.name); if (alter_conversions.isColumnRenamed(column.name))
if (renamed_it != alter_conversions.rename_map.end() {
&& columns_from_part.count(renamed_it->second)) String old_name = alter_conversions.getColumnOldName(column.name);
addStreams(renamed_it->second, *columns_from_part[renamed_it->second], profile_callback_, clock_type_); if (columns_from_part.count(old_name))
addStreams(old_name, *columns_from_part[old_name], profile_callback_, clock_type_);
}
else else
{
addStreams(column.name, *column.type, profile_callback_, clock_type_); addStreams(column.name, *column.type, profile_callback_, clock_type_);
} }
} }
} }
}
catch (...) catch (...)
{ {
storage.reportBrokenPart(data_part->name); storage.reportBrokenPart(data_part->name);
@ -90,9 +94,9 @@ size_t MergeTreeReaderWide::readRows(size_t from_mark, bool continue_reading, si
for (size_t pos = 0; pos < num_columns; ++pos, ++name_and_type) for (size_t pos = 0; pos < num_columns; ++pos, ++name_and_type)
{ {
String name = name_and_type->name; String name = name_and_type->name;
if (alter_conversions.rename_map.count(name)) if (alter_conversions.isColumnRenamed(name))
{ {
String original_name = alter_conversions.rename_map[name]; String original_name = alter_conversions.getColumnOldName(name);
if (!columns_from_part.count(name) && columns_from_part.count(original_name)) if (!columns_from_part.count(name) && columns_from_part.count(original_name))
name = original_name; name = original_name;
} }

View File

@ -331,7 +331,9 @@ public:
MutationCommands getMutationCommands(const MergeTreeData::DataPartPtr & part, Int64 desired_mutation_version) const; MutationCommands getMutationCommands(const MergeTreeData::DataPartPtr & part, Int64 desired_mutation_version) const;
/// TODO(alesap) /// Return mutation commands for part with smallest mutation version bigger
/// than data part version. Used when we apply alter commands on fly,
/// without actual data modification on disk.
MutationCommands getFirstAlterMutationCommandsForPart(const MergeTreeData::DataPartPtr & part) const; MutationCommands getFirstAlterMutationCommandsForPart(const MergeTreeData::DataPartPtr & part) const;
/// Mark finished mutations as done. If the function needs to be called again at some later time /// Mark finished mutations as done. If the function needs to be called again at some later time