Flex  0.17.9
app_base.h
Go to the documentation of this file.
1 
16 #ifndef GRAPHSCOPE_APP_BASE_H_
17 #define GRAPHSCOPE_APP_BASE_H_
18 
19 #include "flex/utils/app_utils.h"
20 
21 #include <dlfcn.h>
22 #include <string.h>
23 
24 #include <iostream>
25 #include <limits>
26 #include <string>
27 #include <vector>
28 
29 #include <glog/logging.h>
30 
31 namespace gs {
32 
33 class GraphDBSession;
34 class GraphDB;
35 class AppBase {
36  public:
37  enum class AppType : uint8_t {
38  kCppProcedure = 0,
39  kCypherProcedure = 1,
40  kCypherAdhoc = 2,
41  kBuiltIn = 3,
42  };
43 
44  enum class AppMode : uint8_t {
45  kRead = 0,
46  kWrite = 1,
47  };
48 
49  virtual AppType type() const = 0;
50  virtual AppMode mode() const = 0;
51  virtual bool run(GraphDBSession& db, Decoder& input, Encoder& output) = 0;
52  virtual ~AppBase() {}
53 };
54 
55 class ReadAppBase : public AppBase {
56  public:
57  AppMode mode() const override;
58 
59  AppType type() const override;
60 
61  bool run(GraphDBSession& db, Decoder& input, Encoder& output) override;
62 
63  virtual bool Query(const GraphDBSession& db, Decoder& input,
64  Encoder& output) = 0;
65 };
66 
67 class WriteAppBase : public AppBase {
68  public:
69  AppMode mode() const override;
70 
71  AppType type() const override;
72 
73  bool run(GraphDBSession& db, Decoder& input, Encoder& output) override;
74 
75  virtual bool Query(GraphDBSession& db, Decoder& input, Encoder& output) = 0;
76 };
77 
78 class AppWrapper {
79  public:
80  AppWrapper() : app_(NULL), func_deletor_(NULL) {}
81  AppWrapper(AppBase* app, void (*func_deletor)(void*))
82  : app_(app), func_deletor_(func_deletor) {}
84  app_ = rhs.app_;
85  func_deletor_ = rhs.func_deletor_;
86  rhs.app_ = NULL;
87  rhs.func_deletor_ = NULL;
88  }
90  if (app_ != NULL && func_deletor_ != NULL) {
92  } else if (app_ != NULL) {
93  delete app_;
94  }
95  }
96 
98  app_ = rhs.app_;
99  func_deletor_ = rhs.func_deletor_;
100  rhs.app_ = NULL;
101  rhs.func_deletor_ = NULL;
102  return *this;
103  }
104 
105  AppBase* app() { return app_; }
106  const AppBase* app() const { return app_; }
107 
108  private:
110  void (*func_deletor_)(void*);
111 };
112 
113 class GraphDBSession;
114 
116  public:
118  virtual ~AppFactoryBase() {}
119 
120  virtual AppWrapper CreateApp(const GraphDB& db) = 0;
121 };
122 
124  public:
125  SharedLibraryAppFactory(const std::string& path);
126 
128 
129  AppWrapper CreateApp(const GraphDB& db) override;
130 
131  private:
132  std::string app_path_;
133  void* app_handle_;
134 
135  void* (*func_creator_)(const GraphDB&);
136  void (*func_deletor_)(void*);
137 };
138 
139 struct AppMetric {
141  : total_(0),
142  min_val_(std::numeric_limits<int64_t>::max()),
143  max_val_(0),
144  count_(0) {}
146 
147  void add_record(int64_t val) {
148  total_ += val;
149  min_val_ = std::min(min_val_, val);
150  max_val_ = std::max(max_val_, val);
151  ++count_;
152  }
153 
154  bool empty() const { return (count_ == 0); }
155 
157  total_ += rhs.total_;
158  min_val_ = std::min(min_val_, rhs.min_val_);
159  max_val_ = std::max(max_val_, rhs.max_val_);
160  count_ += rhs.count_;
161 
162  return *this;
163  }
164 
165  void output(const std::string& name) const {
166  LOG(INFO) << "Query - " << name << ":";
167  LOG(INFO) << "\tcount: " << count_;
168  LOG(INFO) << "\tmin: " << min_val_;
169  LOG(INFO) << "\tmax: " << max_val_;
170  LOG(INFO) << "\tavg: "
171  << static_cast<double>(total_) / static_cast<double>(count_);
172  }
173 
174  int64_t total_;
175  int64_t min_val_;
176  int64_t max_val_;
177  int64_t count_;
178 };
179 
180 } // namespace gs
181 
182 namespace std {
183 std::istream& operator>>(std::istream& in, gs::AppBase::AppType& type);
184 std::ostream& operator<<(std::ostream& out, const gs::AppBase::AppType& type);
185 
186 std::istream& operator>>(std::istream& in, gs::AppBase::AppMode& mode);
187 std::ostream& operator<<(std::ostream& out, const gs::AppBase::AppMode& mode);
188 
189 } // namespace std
190 
191 #endif // GRAPHSCOPE_APP_BASE_H_
gs::AppWrapper::app_
AppBase * app_
Definition: app_base.h:109
gs::WriteAppBase::run
bool run(GraphDBSession &db, Decoder &input, Encoder &output) override
Definition: app_base.cc:35
app_utils.h
gs::AppBase::AppMode::kRead
@ kRead
gs::AppWrapper::AppWrapper
AppWrapper()
Definition: app_base.h:80
gs::AppBase::AppType::kCppProcedure
@ kCppProcedure
gs::AppBase::~AppBase
virtual ~AppBase()
Definition: app_base.h:52
gs::AppBase::AppType::kBuiltIn
@ kBuiltIn
gs::AppBase::AppMode
AppMode
Definition: app_base.h:44
gs::AppBase::AppType::kCypherProcedure
@ kCypherProcedure
gs::AppMetric::max_val_
int64_t max_val_
Definition: app_base.h:176
gs::AppWrapper::AppWrapper
AppWrapper(AppBase *app, void(*func_deletor)(void *))
Definition: app_base.h:81
gs::AppBase::run
virtual bool run(GraphDBSession &db, Decoder &input, Encoder &output)=0
gs::SharedLibraryAppFactory
Definition: app_base.h:123
gs
Definition: adj_list.h:23
gs::AppMetric::output
void output(const std::string &name) const
Definition: app_base.h:165
gs::AppFactoryBase::AppFactoryBase
AppFactoryBase()
Definition: app_base.h:117
gs::AppWrapper::operator=
AppWrapper & operator=(AppWrapper &&rhs)
Definition: app_base.h:97
gs::AppWrapper::app
const AppBase * app() const
Definition: app_base.h:106
gs::Encoder
Definition: app_utils.h:25
gs::SharedLibraryAppFactory::CreateApp
AppWrapper CreateApp(const GraphDB &db) override
Definition: app_base.cc:68
gs::ReadAppBase::mode
AppMode mode() const override
Definition: app_base.cc:23
gs::Decoder
Definition: app_utils.h:65
gs::AppMetric::~AppMetric
~AppMetric()
Definition: app_base.h:145
gs::AppMetric::min_val_
int64_t min_val_
Definition: app_base.h:175
gs::AppFactoryBase::CreateApp
virtual AppWrapper CreateApp(const GraphDB &db)=0
gs::AppBase
Definition: app_base.h:35
gs::SharedLibraryAppFactory::SharedLibraryAppFactory
SharedLibraryAppFactory(const std::string &path)
Definition: app_base.cc:39
gs::ReadAppBase::Query
virtual bool Query(const GraphDBSession &db, Decoder &input, Encoder &output)=0
gs::WriteAppBase
Definition: app_base.h:67
gs::WriteAppBase::mode
AppMode mode() const override
Definition: app_base.cc:31
gs::WriteAppBase::Query
virtual bool Query(GraphDBSession &db, Decoder &input, Encoder &output)=0
gs::WriteAppBase::type
AppType type() const override
Definition: app_base.cc:33
gs::AppMetric::total_
int64_t total_
Definition: app_base.h:174
gs::SharedLibraryAppFactory::~SharedLibraryAppFactory
~SharedLibraryAppFactory()
Definition: app_base.cc:62
gs::GraphDBSession
Definition: graph_db_session.h:36
gs::GraphDB
Definition: graph_db.h:70
gs::AppMetric::operator+=
AppMetric & operator+=(const AppMetric &rhs)
Definition: app_base.h:156
std::operator>>
std::istream & operator>>(std::istream &is, gs::AppBase::AppType &type)
Definition: app_base.cc:82
gs::AppBase::mode
virtual AppMode mode() const =0
gs::AppWrapper::func_deletor_
void(* func_deletor_)(void *)
Definition: app_base.h:110
gs::SharedLibraryAppFactory::func_deletor_
void(* func_deletor_)(void *)
Definition: app_base.h:136
gs::AppMetric::add_record
void add_record(int64_t val)
Definition: app_base.h:147
gs::AppWrapper::~AppWrapper
~AppWrapper()
Definition: app_base.h:89
std::operator<<
ostream & operator<<(ostream &os, const gs::BulkLoadMethod &method)
Definition: loading_config.h:234
gs::ReadAppBase
Definition: app_base.h:55
gs::AppBase::type
virtual AppType type() const =0
std
Definition: loading_config.h:232
gs::AppWrapper::app
AppBase * app()
Definition: app_base.h:105
gs::AppFactoryBase::~AppFactoryBase
virtual ~AppFactoryBase()
Definition: app_base.h:118
gs::SharedLibraryAppFactory::app_path_
std::string app_path_
Definition: app_base.h:132
gs::ReadAppBase::type
AppType type() const override
Definition: app_base.cc:25
gs::AppBase::AppMode::kWrite
@ kWrite
gs::AppWrapper
Definition: app_base.h:78
gs::AppBase::AppType::kCypherAdhoc
@ kCypherAdhoc
gs::AppMetric::empty
bool empty() const
Definition: app_base.h:154
gs::AppMetric::count_
int64_t count_
Definition: app_base.h:177
gs::AppBase::AppType
AppType
Definition: app_base.h:37
gs::ReadAppBase::run
bool run(GraphDBSession &db, Decoder &input, Encoder &output) override
Definition: app_base.cc:27
gs::AppMetric::AppMetric
AppMetric()
Definition: app_base.h:140
gs::AppWrapper::AppWrapper
AppWrapper(AppWrapper &&rhs)
Definition: app_base.h:83
gs::AppFactoryBase
Definition: app_base.h:115
gs::AppMetric
Definition: app_base.h:139
gs::SharedLibraryAppFactory::app_handle_
void * app_handle_
Definition: app_base.h:133