analytical_engine/core/context/i_context.h (226 lines of code) (raw):

/** Copyright 2020 Alibaba Group Holding Limited. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANALYTICAL_ENGINE_CORE_CONTEXT_I_CONTEXT_H_ #define ANALYTICAL_ENGINE_CORE_CONTEXT_I_CONTEXT_H_ #include <cstdint> #include <iostream> #include <map> #include <memory> #include <string> #include <utility> #include <vector> #include "boost/leaf/result.hpp" #include "vineyard/common/util/uuid.h" #include "vineyard/graph/fragment/property_graph_types.h" #include "core/error.h" #include "core/object/gs_object.h" #ifdef ENABLE_JAVA_SDK #define CONTEXT_TYPE_JAVA_PIE_PROPERTY "java_pie_property" #define CONTEXT_TYPE_JAVA_PIE_PROJECTED "java_pie_projected" #endif namespace bl = boost::leaf; namespace arrow { class Array; } namespace grape { class CommSpec; class InArchive; } // namespace grape namespace vineyard { class Client; } namespace gs { class IFragmentWrapper; class LabeledSelector; class Selector; namespace rpc { class GSParams; } /** * @brief IContextWrapper is the base class for any kind of ContextWrapper. * The ContextWrapper provides a series of methods to serialize the data hold by * the context. A specific ContextWrapper class can only be instantiated by the * CtxWrapperBuilder. */ class IContextWrapper : public GSObject { public: explicit IContextWrapper(const std::string& id) : GSObject(id, ObjectType::kContextWrapper) {} virtual std::string context_type() = 0; // Return the schema of context, in human readable format. // This is consistent with the syntax of selector. // For simplicity, only return those parts that cannot be known // from client. // Those context who need it may override this method. virtual std::string schema() { return ""; } virtual std::shared_ptr<IFragmentWrapper> fragment_wrapper() = 0; }; /** * @brief A base class for VertexDataContextWrapper. */ class IVertexDataContextWrapper : public IContextWrapper { public: explicit IVertexDataContextWrapper(const std::string& id) : IContextWrapper(id) {} virtual bl::result<std::unique_ptr<grape::InArchive>> ToNdArray( const grape::CommSpec& comm_spec, const Selector& selector, const std::pair<std::string, std::string>& range) = 0; virtual bl::result<std::unique_ptr<grape::InArchive>> ToDataframe( const grape::CommSpec& comm_spec, const std::vector<std::pair<std::string, Selector>>& selectors, const std::pair<std::string, std::string>& range) = 0; virtual bl::result<vineyard::ObjectID> ToVineyardTensor( const grape::CommSpec& comm_spec, vineyard::Client& client, const Selector& selector, const std::pair<std::string, std::string>& range) = 0; virtual bl::result<vineyard::ObjectID> ToVineyardDataframe( const grape::CommSpec& comm_spec, vineyard::Client& client, const std::vector<std::pair<std::string, Selector>>& selectors, const std::pair<std::string, std::string>& range) = 0; virtual bl::result< std::vector<std::pair<std::string, std::shared_ptr<arrow::Array>>>> ToArrowArrays( const grape::CommSpec& comm_spec, const std::vector<std::pair<std::string, Selector>>& selectors) = 0; virtual bl::result<std::string> GetContextData(const rpc::GSParams& params) { RETURN_GS_ERROR(vineyard::ErrorCode::kInvalidOperationError, "Not implemented operation: GetContextData"); } }; /** * @brief A base class for LabeledVertexDataContext. The data in the context are * group by the label. */ class ILabeledVertexDataContextWrapper : public IContextWrapper { using label_id_t = vineyard::property_graph_types::LABEL_ID_TYPE; public: explicit ILabeledVertexDataContextWrapper(const std::string& id) : IContextWrapper(id) {} virtual bl::result<std::unique_ptr<grape::InArchive>> ToNdArray( const grape::CommSpec& comm_spec, const LabeledSelector& selector, const std::pair<std::string, std::string>& range) = 0; virtual bl::result<std::unique_ptr<grape::InArchive>> ToDataframe( const grape::CommSpec& comm_spec, const std::vector<std::pair<std::string, LabeledSelector>>& selectors, const std::pair<std::string, std::string>& range) = 0; virtual bl::result<vineyard::ObjectID> ToVineyardTensor( const grape::CommSpec& comm_spec, vineyard::Client& client, const LabeledSelector& selector, const std::pair<std::string, std::string>& range) = 0; virtual bl::result<vineyard::ObjectID> ToVineyardDataframe( const grape::CommSpec& comm_spec, vineyard::Client& client, const std::vector<std::pair<std::string, LabeledSelector>>& selectors, const std::pair<std::string, std::string>& range) = 0; /** * @brief Output the data in the context to ArrowArray. * * @param comm_spec * @param selectors example: {"col1_label0": "v:label0.id", "col1_label1": * "v:label1.id", "col2_result": "r:label0"} * @return */ virtual bl::result<std::map< label_id_t, std::vector<std::pair<std::string, std::shared_ptr<arrow::Array>>>>> ToArrowArrays(const grape::CommSpec& comm_spec, const std::vector<std::pair<std::string, LabeledSelector>>& selectors) = 0; }; /** * @brief A base class for vertex property context. Differs from * ILabeledVertexDataContextWrapper, its columns can be added at runtime. */ class IVertexPropertyContextWrapper : public IContextWrapper { public: explicit IVertexPropertyContextWrapper(const std::string& id) : IContextWrapper(id) {} virtual bl::result<std::unique_ptr<grape::InArchive>> ToNdArray( const grape::CommSpec& comm_spec, const Selector& selector, const std::pair<std::string, std::string>& range) = 0; virtual bl::result<std::unique_ptr<grape::InArchive>> ToDataframe( const grape::CommSpec& comm_spec, const std::vector<std::pair<std::string, Selector>>& selectors, const std::pair<std::string, std::string>& range) = 0; virtual bl::result<vineyard::ObjectID> ToVineyardTensor( const grape::CommSpec& comm_spec, vineyard::Client& client, const Selector& selector, const std::pair<std::string, std::string>& range) = 0; virtual bl::result<vineyard::ObjectID> ToVineyardDataframe( const grape::CommSpec& comm_spec, vineyard::Client& client, const std::vector<std::pair<std::string, Selector>>& selectors, const std::pair<std::string, std::string>& range) = 0; virtual bl::result< std::vector<std::pair<std::string, std::shared_ptr<arrow::Array>>>> ToArrowArrays( const grape::CommSpec& comm_spec, const std::vector<std::pair<std::string, Selector>>& selectors) = 0; }; /** * @brief A base class for LabeledVertexPropertyContext. Compared with * ILabeledVertexDataContextWrapper, columns can be added at runtime. */ class ILabeledVertexPropertyContextWrapper : public IContextWrapper { using label_id_t = vineyard::property_graph_types::LABEL_ID_TYPE; public: explicit ILabeledVertexPropertyContextWrapper(const std::string& id) : IContextWrapper(id) {} virtual bl::result<std::unique_ptr<grape::InArchive>> ToNdArray( const grape::CommSpec& comm_spec, const LabeledSelector& selector, const std::pair<std::string, std::string>& range) = 0; virtual bl::result<std::unique_ptr<grape::InArchive>> ToDataframe( const grape::CommSpec& comm_spec, const std::vector<std::pair<std::string, LabeledSelector>>& selectors, const std::pair<std::string, std::string>& range) = 0; virtual bl::result<vineyard::ObjectID> ToVineyardTensor( const grape::CommSpec& comm_spec, vineyard::Client& client, const LabeledSelector& selector, const std::pair<std::string, std::string>& range) = 0; virtual bl::result<vineyard::ObjectID> ToVineyardDataframe( const grape::CommSpec& comm_spec, vineyard::Client& client, const std::vector<std::pair<std::string, LabeledSelector>>& selectors, const std::pair<std::string, std::string>& range) = 0; virtual bl::result<std::map< label_id_t, std::vector<std::pair<std::string, std::shared_ptr<arrow::Array>>>>> ToArrowArrays(const grape::CommSpec& comm_spec, const std::vector<std::pair<std::string, LabeledSelector>>& selectors) = 0; }; #ifdef ENABLE_JAVA_SDK /** * @brief A base class for JavaPropertyDefaultContext. It holds an inner * ctxWrapper, and redirect function calls to the inner ctxWrapper. */ class IJavaPIEPropertyContextWrapper : public IContextWrapper { using label_id_t = vineyard::property_graph_types::LABEL_ID_TYPE; public: explicit IJavaPIEPropertyContextWrapper(const std::string& id) : IContextWrapper(id) {} virtual bl::result<std::unique_ptr<grape::InArchive>> ToNdArray( const grape::CommSpec& comm_spec, const LabeledSelector& selector, const std::pair<std::string, std::string>& range) = 0; virtual bl::result<std::unique_ptr<grape::InArchive>> ToDataframe( const grape::CommSpec& comm_spec, const std::vector<std::pair<std::string, LabeledSelector>>& selectors, const std::pair<std::string, std::string>& range) = 0; virtual bl::result<vineyard::ObjectID> ToVineyardTensor( const grape::CommSpec& comm_spec, vineyard::Client& client, const LabeledSelector& selector, const std::pair<std::string, std::string>& range) = 0; virtual bl::result<vineyard::ObjectID> ToVineyardDataframe( const grape::CommSpec& comm_spec, vineyard::Client& client, const std::vector<std::pair<std::string, LabeledSelector>>& selectors, const std::pair<std::string, std::string>& range) = 0; virtual bl::result<std::map< label_id_t, std::vector<std::pair<std::string, std::shared_ptr<arrow::Array>>>>> ToArrowArrays(const grape::CommSpec& comm_spec, const std::vector<std::pair<std::string, LabeledSelector>>& selectors) = 0; }; /** * @brief A base class for JavaProjectedDefaultContext. It holds an inner * ctxWrapper,and redirect function calls to the inner ctxWrapper. */ class IJavaPIEProjectedContextWrapper : public IContextWrapper { public: explicit IJavaPIEProjectedContextWrapper(const std::string& id) : IContextWrapper(id) {} virtual bl::result<std::unique_ptr<grape::InArchive>> ToNdArray( const grape::CommSpec& comm_spec, const Selector& selector, const std::pair<std::string, std::string>& range) = 0; virtual bl::result<std::unique_ptr<grape::InArchive>> ToDataframe( const grape::CommSpec& comm_spec, const std::vector<std::pair<std::string, Selector>>& selectors, const std::pair<std::string, std::string>& range) = 0; virtual bl::result<vineyard::ObjectID> ToVineyardTensor( const grape::CommSpec& comm_spec, vineyard::Client& client, const Selector& selector, const std::pair<std::string, std::string>& range) = 0; virtual bl::result<vineyard::ObjectID> ToVineyardDataframe( const grape::CommSpec& comm_spec, vineyard::Client& client, const std::vector<std::pair<std::string, Selector>>& selectors, const std::pair<std::string, std::string>& range) = 0; virtual bl::result< std::vector<std::pair<std::string, std::shared_ptr<arrow::Array>>>> ToArrowArrays( const grape::CommSpec& comm_spec, const std::vector<std::pair<std::string, Selector>>& selectors) = 0; }; #endif /** * @brief An abstract ContextWrapper for the data not assigned to vertex/edges. */ class ITensorContextWrapper : public IContextWrapper { public: explicit ITensorContextWrapper(const std::string& id) : IContextWrapper(id) {} virtual bl::result<std::unique_ptr<grape::InArchive>> ToNdArray( const grape::CommSpec& comm_spec, uint32_t axis) = 0; virtual bl::result<std::unique_ptr<grape::InArchive>> ToDataframe( const grape::CommSpec& comm_spec) = 0; virtual bl::result<vineyard::ObjectID> ToVineyardTensor( const grape::CommSpec& comm_spec, vineyard::Client& client, uint32_t axis) = 0; virtual bl::result<vineyard::ObjectID> ToVineyardDataframe( const grape::CommSpec& comm_spec, vineyard::Client& client) = 0; virtual bl::result< std::vector<std::pair<std::string, std::shared_ptr<arrow::Array>>>> ToArrowArrays( const grape::CommSpec& comm_spec, const std::vector<std::pair<std::string, Selector>>& selectors) = 0; }; } // namespace gs #endif // ANALYTICAL_ENGINE_CORE_CONTEXT_I_CONTEXT_H_