5#include <knowRDF/Literal.h>
7namespace kDB::SPARQL::Algebra::Builders
10#define KDB_SPARQL_ALGEBRA_GENERATE(_KLASS_NAME_, _MEMBER_DEF_) \
12 #include "NodesDefs.h"
14#undef KDB_SPARQL_ALGEBRA_GENERATE
20 template<
typename _T_>
24 static constexpr bool isBuilder =
false;
25 static const _T_& build(
const _T_& _t)
31#define KDB_SPARQL_ALGEBRA_GENERATE(_KLASS_NAME_, _MEMBER_DEF_) \
33 struct field_traits<_KLASS_NAME_> \
35 using type = kDB::SPARQL::Algebra::_KLASS_NAME_ ## CSP; \
36 static constexpr bool isBuilder = false; \
37 template<typename _T_, typename... _TOther_> \
38 static type build(const _T_& _t, const _TOther_&... _others) \
40 return new kDB::SPARQL::Algebra::_KLASS_NAME_(field_traits<_T_>::build(_t), field_traits<_TOther_...>::build(_others)...); \
48 static constexpr bool isBuilder =
false;
49 template<
typename _T_>
50 static NodeCSP build(
const _T_& _t)
58 return new Algebra::Value(_t);
61 template<
typename... _T_>
62 struct field_traits<Alternative<_T_...>>
64 using type = Alternative<typename field_traits<_T_>::type::Type...>;
65 static constexpr bool isBuilder =
false;
66 template<typename _TArg_, std::enable_if_t<field_traits<_TArg_>::isBuilder,
bool> =
true >
67 static type build(
const _TArg_& _t)
71 template<
typename _TArg_, std::enable_if_t<std::is_base_of_v<Node,
typename _TArg_::Type>,
bool> = true >
72 static type build(
const _TArg_& _t)
77 template<typename _TArg_, std::enable_if_t<not field_traits<_TArg_>::isBuilder and not std::is_base_of_v<Node, typename _TArg_::Type>,
bool> =
true >
78 static type build(
const _TArg_& _t)
80 static_assert(
true,
"Alternative can only be set with a builder or one of the alternative value as argument");
83 template<
typename _T_>
84 struct field_traits<
QList<_T_>>
86 using contained_type =
typename field_traits<_T_>::type;
88 static constexpr bool isBuilder =
false;
89 template<
typename _TArg_,
typename... _TOther_>
90 static type build(
const _TArg_& _t,
const _TOther_&... _others)
93 build(&value, _t, _others...);
96 template<
typename _TArg_>
100 for(
int i = 0; i < _t.size(); ++i)
102 value.append(field_traits<contained_type>::build(_t));
110 static type build(
const TriplesList& _t);
112 static void build(type*)
114 template<
typename _TArg_,
typename... _TOther_>
115 static void build(type* _list,
const _TArg_& _t,
const _TOther_&... _others) {
116 _list->append(field_traits<contained_type>::build(_t));
117 build(_list, _others...);
121 #include "NodesDefs.h"
123 #undef KDB_SPARQL_ALGEBRA_GENERATE
127 template<
typename _T_>
130 static constexpr bool has_custom_constructor =
false;
135 static constexpr bool has_custom_constructor =
true;
140#define KDB_SPARQL_ALGEBRA_GENERATE_GENERIC_MEMBER_SETTER(_KLASS_NAME_, _TYPE_, _NAME_,...) \
141 template<typename... _TOther_> \
142 _KLASS_NAME_& _NAME_(const _TOther_&... _other);
144#define KDB_SPARQL_ALGEBRA_GENERATE_MEMBER_UPDATE(_KLASS_NAME_, _TYPE_, _NAME_,...) \
145 void update_ ## _NAME_(const details::field_traits<_TYPE_>::type& _type);
147#define KDB_SPARQL_ALGEBRA_GENERATE(_KLASS_NAME_, _MEMBER_DEF_) \
152 _KLASS_NAME_(const _KLASS_NAME_&) = delete; \
153 _KLASS_NAME_& operator=(const _KLASS_NAME_&) = delete; \
154 template<typename... _TOther_, std::enable_if_t<details::traits<_KLASS_NAME_>::has_custom_constructor and sizeof...(_TOther_) != 0, bool> = true> \
155 _KLASS_NAME_(const _TOther_&... _other); \
157 QPair<QString, knowCore::ValueHash> toQueryString() const; \
158 kDB::SPARQL::Algebra::_KLASS_NAME_ ## CSP toNode() const; \
159 operator kDB::SPARQL::Algebra::_KLASS_NAME_ ## CSP () const { return toNode(); } \
160 operator Node ## CSP () const { return toNode(); } \
162 _MEMBER_DEF_(_KLASS_NAME_, KDB_SPARQL_ALGEBRA_GENERATE_GENERIC_MEMBER_SETTER); \
164 _MEMBER_DEF_(_KLASS_NAME_, KDB_SPARQL_ALGEBRA_GENERATE_MEMBER_UPDATE); \
170#include "NodesDefs.h"
172#undef KDB_SPARQL_ALGEBRA_GENERATE_GENERIC_MEMBER_SETTER
173#undef KDB_SPARQL_ALGEBRA_GENERATE_MEMBER_UPDATE
174#undef KDB_SPARQL_ALGEBRA_GENERATE
182 template<
typename _T1_,
typename _T2_,
typename _T3_>
183 void append(
const _T1_& _subject,
const _T2_& _predicate,
const _T3_& _object)
186 builder.subject(toNode(_subject));
187 builder.predicate(toNode(_predicate));
188 builder.object(toNode(_object));
189 m_triples.append(builder.toNode());
201 return new Algebra::Term(_node);
209 void customConstructor(Variable* _var_builder,
const QString& _name)
211 _var_builder->name(_name);
215#define KDB_SPARQL_ALGEBRA_GENERATE_GENERIC_MEMBER_SETTER_DEFINITION(_KLASS_NAME_, _TYPE_, _NAME_,...) \
216 template<typename... _TOther_> \
217 _KLASS_NAME_& _KLASS_NAME_::_NAME_(const _TOther_&... _other) \
219 update_ ## _NAME_(details::field_traits<_TYPE_>::build(_other...)); \
223#define KDB_SPARQL_ALGEBRA_GENERATE(_KLASS_NAME_, _MEMBER_DEF_) \
224 template<typename... _TOther_, std::enable_if_t<details::traits<_KLASS_NAME_>::has_custom_constructor and sizeof...(_TOther_) != 0, bool>> \
225 _KLASS_NAME_::_KLASS_NAME_(const _TOther_&... _other) : _KLASS_NAME_::_KLASS_NAME_() \
227 details::customConstructor(this, _other...); \
229 _MEMBER_DEF_(_KLASS_NAME_, KDB_SPARQL_ALGEBRA_GENERATE_GENERIC_MEMBER_SETTER_DEFINITION); \
231#include "NodesDefs.h"
232#undef KDB_SPARQL_ALGEBRA_GENERATE
233#undef KDB_SPARQL_ALGEBRA_GENERATE_GENERIC_MEMBER_SETTER_DEFINITION
237 template<
typename _T_>
238 typename field_traits<QList<_T_>>::type field_traits<QList<_T_>>::build(
const TriplesList& _t)
Definition Builders.h:180
Definition Builders.h:129