If they are defined, they can override table-level settings.
const DataPartsVector & source_parts,
        const MergeListEntry * merge_entry);
    
    
    
    virtual bool partIsAssignedToBackgroundOperation(const DataPartPtr & part) const = 0;
    
    
    
    
    virtual MutationCommands getFirstAlterMutationCommandsForPart(const DataPartPtr & part) const = 0;
    
    bool movePartsToSpace(const DataPartsVector & parts, SpacePtr space);
private:
    
    
    
    struct CurrentlyMovingPartsTagger
    {
        MergeTreeMovingParts parts_to_move;
        MergeTreeData & data;
        CurrentlyMovingPartsTagger(MergeTreeMovingParts && moving_parts_, MergeTreeData & data_);
        ~CurrentlyMovingPartsTagger();
    };
    using CurrentlyMovingPartsTaggerPtr = std::shared_ptr<CurrentlyMovingPartsTagger>;
    
    bool moveParts(const CurrentlyMovingPartsTaggerPtr & moving_tagger);
    
    CurrentlyMovingPartsTaggerPtr selectPartsForMove();