#include #include #include "query/backend/cpp/typed_value.hpp" #include "query/plan_interface.hpp" #include "storage/edge_accessor.hpp" #include "storage/vertex_accessor.hpp" #include "using.hpp" #include "query/parameters.hpp" using std::cout; using std::endl; // Query: MATCH (p:profile {profile_id: 112, partner_id: 77}) RETURN p class CPUPlan : public PlanInterface { public: bool run(GraphDbAccessor &db_accessor, const Parameters &args, Stream &stream) { std::vector headers{std::string("p")}; stream.Header(headers); for (auto vertex : db_accessor.vertices()) { if (vertex.has_label(db_accessor.label("profile"))) { TypedValue prop = vertex.PropsAt(db_accessor.property("profile_id")); if (prop.type() == TypedValue::Type::Null) continue; auto cmp = prop == args.At(0); if (cmp.type() != TypedValue::Type::Bool) continue; if (cmp.Value() != true) continue; TypedValue prop2 = vertex.PropsAt(db_accessor.property("partner_id")); if (prop2.type() == TypedValue::Type::Null) continue; auto cmp2 = prop2 == args.At(1); if (cmp2.type() != TypedValue::Type::Bool) continue; if (cmp2.Value() != true) continue; std::vector result{TypedValue(vertex)}; stream.Result(result); } } std::map meta{std::make_pair(std::string("type"), TypedValue(std::string("r")))}; stream.Summary(meta); db_accessor.commit(); return true; } ~CPUPlan() {} }; extern "C" PlanInterface *produce() { return new CPUPlan(); } extern "C" void destruct(PlanInterface *p) { delete p; }