aboutsummaryrefslogblamecommitdiffstats
path: root/yt/cpp/mapreduce/interface/cypress.h
blob: 00deaa08ea46a42b7221a51395437e5ad7b6299c (plain) (tree)
1
2
3
4
5
6



                                              
                                                                                                                                     











                                                                                
                                                                                                                          
















                                                                                                                                           
                                                                             























                                                                                                                            
                                                                             





                                                              
                                                                             





                                                              
                                                                          





                                                        
                                                                          











                                                                                      
                                                                                          











                                                                                                                
                                                                           





                                                          
                                                                           






                                                                  
                                                                           






                                                          
                                                                           






                                                          
                                                                                  






                                                                        
                                                                                  






                                                                                   
                                                                                  





                                                                              
                                                                                                    



















                                                                                            
                                                                                          













                                                                                                                        
                                                                                        


































                                                                                
#pragma once

///
/// @file yt/cpp/mapreduce/interface/cypress.h
///
/// Header containing interface to execute [Cypress](https://ytsaurus.tech/docs/en/user-guide/storage/cypress.html)-related commands.

#include "fwd.h"

#include "client_method_options.h"
#include "common.h"
#include "node.h"

#include <util/generic/maybe.h>

namespace NYT {

////////////////////////////////////////////////////////////////////////////////

/// Client interface to execute [Cypress](https://ytsaurus.tech/docs/en/user-guide/storage/cypress.html)-related commands.
class ICypressClient
{
public:
    virtual ~ICypressClient() = default;

    ///
    /// @brief Create Cypress node of given type.
    ///
    /// @param path Path in Cypress to the new object.
    /// @param type New node type.
    /// @param options Optional parameters.
    ///
    /// @return Id of the created node.
    ///
    /// @note  All but the last components must exist unless @ref NYT::TCreateOptions::Recursive is `true`.
    ///
    /// @note The node itself must not exist unless @ref NYT::TCreateOptions::IgnoreExisting or @ref NYT::TCreateOptions::Force are `true`.
    ///
    /// @see [YT doc](https://ytsaurus.tech/docs/en/api/commands.html#create)
    virtual TNodeId Create(
        const TYPath& path,
        ENodeType type,
        const TCreateOptions& options = TCreateOptions()) = 0;

    ///
    /// @brief Create table with schema inferred from the template argument.
    ///
    /// @tparam TRowType type of C++ representation of the row to be stored in the table.
    /// @param path Path in Cypress to the new table.
    /// @param sortColumns List of columns to mark as sorted in schema.
    /// @param options Optional parameters.
    ///
    /// @return Id of the created node.
    ///
    /// @note If "schema" is passed in `options.Attributes` it has priority over the deduced schema (the latter is ignored).
    template <typename TRowType>
    TNodeId CreateTable(
        const TYPath& path,
        const TSortColumns& sortColumns = TSortColumns(),
        const TCreateOptions& options = TCreateOptions());

    ///
    /// @brief Remove Cypress node.
    ///
    /// @see [YT doc](https://ytsaurus.tech/docs/en/api/commands.html#remove)
    virtual void Remove(
        const TYPath& path,
        const TRemoveOptions& options = TRemoveOptions()) = 0;

    ///
    /// @brief Check if Cypress node exists.
    ///
    /// @see [YT doc](https://ytsaurus.tech/docs/en/api/commands.html#exists)
    virtual bool Exists(
        const TYPath& path,
        const TExistsOptions& options = TExistsOptions()) = 0;

    ///
    /// @brief Get Cypress node contents.
    ///
    /// @see [YT doc](https://ytsaurus.tech/docs/en/api/commands.html#get)
    virtual TNode Get(
        const TYPath& path,
        const TGetOptions& options = TGetOptions()) = 0;

    ///
    /// @brief Set Cypress node contents.
    ///
    /// @see [YT doc](https://ytsaurus.tech/docs/en/api/commands.html#set)
    virtual void Set(
        const TYPath& path,
        const TNode& value,
        const TSetOptions& options = TSetOptions()) = 0;

    ///
    /// @brief Set multiple attributes for cypress path.
    ///
    /// @param path Path to root of the attributes to be set e.g. "//path/to/table/@";
    ///     it is important to make sure that path ends with "/@".
    /// @param attributes Map with attributes
    /// @param options Optional parameters.
    ///
    /// @see [YT doc](https://ytsaurus.tech/docs/en/api/commands.html#multiset_attributes)
    virtual void MultisetAttributes(
        const TYPath& path,
        const TNode::TMapType& attributes,
        const TMultisetAttributesOptions& options = TMultisetAttributesOptions()) = 0;

    ///
    /// @brief List Cypress map or attribute node keys.
    ///
    /// @param path Path in the tree to the node in question.
    /// @param options Optional parameters.
    ///
    /// @return List of keys with attributes (if they were required in @ref NYT::TListOptions::AttributeFilter).
    ///
    /// @see [YT doc](https://ytsaurus.tech/docs/en/api/commands.html#list)
    virtual TNode::TListType List(
        const TYPath& path,
        const TListOptions& options = TListOptions()) = 0;

    ///
    /// @brief Copy Cypress node.
    ///
    /// @see [YT doc](https://ytsaurus.tech/docs/en/api/commands.html#copy)
    virtual TNodeId Copy(
        const TYPath& sourcePath,
        const TYPath& destinationPath,
        const TCopyOptions& options = TCopyOptions()) = 0;

    ///
    /// @brief Move Cypress node (equivalent to copy-then-remove).
    ///
    /// @see [YT doc](https://ytsaurus.tech/docs/en/api/commands.html#move)
    virtual TNodeId Move(
        const TYPath& sourcePath,
        const TYPath& destinationPath,
        const TMoveOptions& options = TMoveOptions()) = 0;

    ///
    /// @brief Create link to Cypress node.
    ///
    /// @see [YT doc](https://ytsaurus.tech/docs/en/api/commands.html#link)
    virtual TNodeId Link(
        const TYPath& targetPath,
        const TYPath& linkPath,
        const TLinkOptions& options = TLinkOptions()) = 0;

    ///
    /// @brief Concatenate several tables into one.
    ///
    /// @see [YT doc](https://ytsaurus.tech/docs/en/api/commands.html#concatenate)
    virtual void Concatenate(
        const TVector<TRichYPath>& sourcePaths,
        const TRichYPath& destinationPath,
        const TConcatenateOptions& options = TConcatenateOptions()) = 0;

    ///
    /// @brief Concatenate several tables into one.
    ///
    /// @see [YT doc](https://ytsaurus.tech/docs/en/api/commands.html#concatenate)
    virtual void Concatenate(
        const TVector<TYPath>& sourcePaths,
        const TYPath& destinationPath,
        const TConcatenateOptions& options = TConcatenateOptions());

    ///
    /// @brief Canonize YPath, moving all the complex YPath features to attributes.
    ///
    /// @see [YT doc](https://ytsaurus.tech/docs/en/api/commands.html#parse_ypath)
    virtual TRichYPath CanonizeYPath(const TRichYPath& path) = 0;

    ///
    /// @brief Get statistics for given sets of columns in given table ranges.
    ///
    /// @note Paths must contain column selectors.
    ///
    /// @see [YT doc](https://ytsaurus.tech/docs/en/api/commands.html#get_table_columnar_statistics)
    virtual TVector<TTableColumnarStatistics> GetTableColumnarStatistics(
        const TVector<TRichYPath>& paths,
        const TGetTableColumnarStatisticsOptions& options = {}) = 0;

    ///
    /// @brief Divide input tables into disjoint partitions.
    ///
    /// Resulted partitions are vectors of rich YPaths.
    /// Each partition can be given to a separate worker for further independent processing.
    ///
    virtual TMultiTablePartitions GetTablePartitions(
        const TVector<TRichYPath>& paths,
        const TGetTablePartitionsOptions& options) = 0;

    ///
    /// @brief Get file from file cache.
    ///
    /// @param md5Signature MD5 digest of the file.
    /// @param cachePath Path to the file cache.
    /// @param options Optional parameters.
    ///
    /// @see [YT doc](https://ytsaurus.tech/docs/en/api/commands.html#get_file_from_cache)
    virtual TMaybe<TYPath> GetFileFromCache(
        const TString& md5Signature,
        const TYPath& cachePath,
        const TGetFileFromCacheOptions& options = TGetFileFromCacheOptions()) = 0;

    ///
    /// @brief Put file to file cache.
    ///
    /// @param filePath Path in Cypress to the file to cache.
    /// @param md5Signature Expected MD5 digest of the file.
    /// @param cachePath Path to the file cache.
    /// @param options Optional parameters.
    ///
    /// @note The file in `filePath` must have been written with @ref NYT::TFileWriterOptions::ComputeMD5 set to `true`.
    ///
    /// @see [YT doc](https://ytsaurus.tech/docs/en/api/commands.html#put_file_to_cache)
    virtual TYPath PutFileToCache(
        const TYPath& filePath,
        const TString& md5Signature,
        const TYPath& cachePath,
        const TPutFileToCacheOptions& options = TPutFileToCacheOptions()) = 0;
};

////////////////////////////////////////////////////////////////////////////////

template <typename TRowType>
TNodeId ICypressClient::CreateTable(
    const TYPath& path,
    const TSortColumns& sortColumns,
    const TCreateOptions& options)
{
    static_assert(
        std::is_base_of_v<::google::protobuf::Message, TRowType>,
        "TRowType must be inherited from google::protobuf::Message");

    TCreateOptions actualOptions = options;
    if (!actualOptions.Attributes_) {
        actualOptions.Attributes_ = TNode::CreateMap();
    }

    if (!actualOptions.Attributes_->HasKey("schema")) {
        actualOptions.Attributes_->AsMap().emplace(
            "schema",
            CreateTableSchema<TRowType>(sortColumns).ToNode());
    }

    return Create(path, ENodeType::NT_TABLE, actualOptions);
}

////////////////////////////////////////////////////////////////////////////////

} // namespace NYT