JODA  0.13.1 (59b41972)
JSON On-Demand Analysis
ValueAccepter.h
Go to the documentation of this file.
1 //
2 // Created by Nico on 21/08/2019.
3 //
4 
6 #include <joda/misc/RJFwd.h>
9 #include <variant>
10 
11 #ifndef JODA_VALUEACCEPTER_H
12 #define JODA_VALUEACCEPTER_H
13 
14 namespace joda::query {
15 
17  public:
18  explicit ValueAccepter(
19  const std::unique_ptr<joda::query::IValueProvider> &ival) {
20  auto pProvider = dynamic_cast<PointerProvider *>(ival.get());
21  if (pProvider != nullptr) {
22  pp = pProvider;
23  } else {
24  def = ival.get();
25  }
26  DCHECK(pp != nullptr || def != nullptr);
27  }
28 
30 
31  template <class Handler>
32  bool Accept(const RapidJsonDocument &json, RJMemoryPoolAlloc &alloc,
33  Handler &h) const {
34  if (pp != nullptr) {
35  return pp->Accept(json, alloc, h);
36  } else {
37  return DefaultAccept(json, alloc, h);
38  }
39  }
40 
42  RJMemoryPoolAlloc *alloc_) {
43  this->json_ = json_;
44  this->alloc_ = alloc_;
45  }
46 
47  template <typename Handler>
48  bool operator()(Handler &handler) {
49  return Accept(*json_, *alloc_, handler);
50  }
51 
52  template <class Handler>
53  static bool Accept(const std::unique_ptr<IValueProvider> &ival,
54  const RapidJsonDocument &json, RJMemoryPoolAlloc &alloc,
55  Handler &h) {
56  if (dynamic_cast<PointerProvider *>(ival.get()) != nullptr) {
57  auto *pp = dynamic_cast<PointerProvider *>(ival.get());
58  return pp->Accept(json, alloc, h);
59  } else {
60  return DefaultAccept<Handler>(ival, json, alloc, h);
61  }
62  }
63 
71  std::variant<const RJValue, std::optional<const RJValue *>,
72  const VirtualObject *>
74  RJMemoryPoolAlloc &alloc) const {
75  if (def != nullptr) {
76  if (def->isAtom()) {
77  RJValue val = def->getAtomValue(json, alloc);
78 
79  return std::move(val);
80  } else {
81  auto *val = def->getValue(json, alloc);
82  if (val == nullptr) return (std::nullptr_t) nullptr;
83  return val;
84  }
85  }
86  if (pp != nullptr) {
87  return pp->getPointerIfExists(json, alloc);
88  }
89  return std::optional<const RJValue *>(nullptr);
90  }
91 
92  private:
93  PointerProvider *pp = nullptr;
94  IValueProvider *def = nullptr;
95  const RapidJsonDocument *json_ = nullptr;
96  RJMemoryPoolAlloc *alloc_ = nullptr;
97 
98  template <class Handler>
99  static bool DefaultAccept(const std::unique_ptr<IValueProvider> &ival,
100  const RapidJsonDocument &json,
101  RJMemoryPoolAlloc &alloc, Handler &h) {
102  if (ival->isAtom()) {
103  auto val = ival->getAtomValue(json, alloc);
104  return val.Accept(h);
105  } else {
106  auto *val = ival->getValue(json, alloc);
107  return val->Accept(h);
108  }
109  }
110 
111  template <class Handler>
112  bool DefaultAccept(const RapidJsonDocument &json, RJMemoryPoolAlloc &alloc,
113  Handler &h) const {
114  if (def->isAtom()) {
115  auto val = def->getAtomValue(json, alloc);
116  return val.Accept(h);
117  } else {
118  auto *val = def->getValue(json, alloc);
119  return val->Accept(h);
120  }
121  }
122 
123  /*
124  * Object
125  */
126  public:
128  RJMemoryPoolAlloc &alloc) const {
129  if (def != nullptr) return def->getValue(json, alloc);
130  if (pp != nullptr && pp->objIsPointerEvaluatable(json))
131  return pp->getValue(json, alloc);
132  return nullptr;
133  }
134 
136  RJMemoryPoolAlloc &alloc) const {
137  if (pp != nullptr) {
138  return pp->getVO(json);
139  }
140  return nullptr;
141  }
142 
143  /*
144  * Materialization
145  */
146 
147  std::vector<std::string> getMaterializeAttributes() const {
148  if (pp != nullptr) {
149  return {};
150  } else {
151  return def->getAttributes();
152  }
153  }
154 };
155 
156 } // namespace joda::query
157 
158 #endif // JODA_VALUEACCEPTER_H
rapidjson::MemoryPoolAllocator< RJBaseAlloc > RJMemoryPoolAlloc
Definition: RJFwd.h:26
rapidjson::GenericValue< RJChar, RJMemoryPoolAlloc > RJValue
Definition: RJFwd.h:29
Definition: RapidJsonDocument.h:22
bool Accept(Handler &handler) const
Definition: RapidJsonDocument.h:121
Definition: VirtualObject.h:13
Definition: IValueProvider.h:143
virtual bool isAtom() const
Definition: IValueProvider.h:215
virtual RJValue getAtomValue(const RapidJsonDocument &json, RJMemoryPoolAlloc &alloc) const =0
virtual RJValue const * getValue(const RapidJsonDocument &json, RJMemoryPoolAlloc &alloc) const =0
virtual std::vector< std::string > getAttributes() const
Definition: IValueProvider.h:222
Definition: PointerProvider.h:17
const RJValue * getValue(const RapidJsonDocument &json, RJMemoryPoolAlloc &alloc) const override
Definition: PointerProvider.cpp:31
bool objIsPointerEvaluatable(const RapidJsonDocument &json) const
Definition: PointerProvider.cpp:60
const VirtualObject * getVO(const RapidJsonDocument &json) const
Definition: PointerProvider.cpp:65
bool Accept(const RapidJsonDocument &json, RJMemoryPoolAlloc &alloc, Handler &h) const
Definition: PointerProvider.h:59
std::variant< const RJValue, std::optional< const RJValue * >, const VirtualObject * > getPointerIfExists(const RapidJsonDocument &json, RJMemoryPoolAlloc &alloc) const
Definition: PointerProvider.cpp:75
Definition: ValueAccepter.h:16
const RJValue * getPointer(const RapidJsonDocument &json, RJMemoryPoolAlloc &alloc) const
Definition: ValueAccepter.h:127
void prepareGenerator(const RapidJsonDocument *json_, RJMemoryPoolAlloc *alloc_)
Definition: ValueAccepter.h:41
std::vector< std::string > getMaterializeAttributes() const
Definition: ValueAccepter.h:147
bool Accept(const RapidJsonDocument &json, RJMemoryPoolAlloc &alloc, Handler &h) const
Definition: ValueAccepter.h:32
static bool Accept(const std::unique_ptr< IValueProvider > &ival, const RapidJsonDocument &json, RJMemoryPoolAlloc &alloc, Handler &h)
Definition: ValueAccepter.h:53
ValueAccepter(const std::unique_ptr< joda::query::IValueProvider > &ival)
Definition: ValueAccepter.h:18
const VirtualObject * getObjVO(const RapidJsonDocument &json, RJMemoryPoolAlloc &alloc) const
Definition: ValueAccepter.h:135
ValueAccepter()
Definition: ValueAccepter.h:29
std::variant< const RJValue, std::optional< const RJValue * >, const VirtualObject * > getPointerIfExists(const RapidJsonDocument &json, RJMemoryPoolAlloc &alloc) const
Definition: ValueAccepter.h:73
bool operator()(Handler &handler)
Definition: ValueAccepter.h:48
Definition: AttributeStatAggregator.h:12