5#include <knowRDF/Literal.h>
7namespace kDB::SPARQL::Algebra::Builders
10#define KDB_SPARQL_ALGEBRA_GENERATE(_KLASS_NAME_, _MEMBER_DEF_) class _KLASS_NAME_;
13#undef KDB_SPARQL_ALGEBRA_GENERATE
19 template<
typename _T_>
23 static constexpr bool isBuilder =
false;
24 static const _T_& build(
const _T_& _t) {
return _t; }
27#define KDB_SPARQL_ALGEBRA_GENERATE(_KLASS_NAME_, _MEMBER_DEF_) \
29 struct field_traits<_KLASS_NAME_> \
31 using type = kDB::SPARQL::Algebra::_KLASS_NAME_##CSP; \
32 static constexpr bool isBuilder = false; \
33 template<typename _T_, typename... _TOther_> \
34 static type build(const _T_& _t, const _TOther_&... _others) \
36 return new kDB::SPARQL::Algebra::_KLASS_NAME_(field_traits<_T_>::build(_t), \
37 field_traits<_TOther_...>::build(_others)...); \
45 static constexpr bool isBuilder =
false;
46 template<
typename _T_>
47 static NodeCSP build(
const _T_& _t)
55 return new Algebra::Value(_t);
58 template<
typename... _T_>
59 struct field_traits<Alternative<_T_...>>
61 using type = Alternative<typename field_traits<_T_>::type::Type...>;
62 static constexpr bool isBuilder =
false;
63 template<
typename _TArg_>
64 requires(field_traits<_TArg_>::isBuilder)
65 static type build(
const _TArg_& _t)
69 template<
typename _TArg_>
70 requires std::is_base_of_v<Node, typename _TArg_::Type>
71 static type build(
const _TArg_& _t)
76 template<
typename _TArg_>
77 requires(not field_traits<_TArg_>::isBuilder
78 and not std::is_base_of_v<Node, typename _TArg_::Type>)
79 static type build(
const _TArg_& _t)
81 static_assert(
true,
"Alternative can only be set with a builder or one of the "
82 "alternative value as argument");
85 template<
typename _T_>
86 struct field_traits<
QList<_T_>>
88 using contained_type =
typename field_traits<_T_>::type;
90 static constexpr bool isBuilder =
false;
91 template<
typename _TArg_,
typename... _TOther_>
92 static type build(
const _TArg_& _t,
const _TOther_&... _others)
95 build(&value, _t, _others...);
98 template<
typename _TArg_>
102 for(
int i = 0; i < _t.size(); ++i)
104 value.append(field_traits<contained_type>::build(_t));
108 static type build(
const QList<_T_>& _t) {
return _t; }
109 static type build(
const TriplesList& _t);
111 static void build(type*) {}
112 template<
typename _TArg_,
typename... _TOther_>
113 static void build(type* _list,
const _TArg_& _t,
const _TOther_&... _others)
115 _list->append(field_traits<contained_type>::build(_t));
116 build(_list, _others...);
120#include "NodesDefs.h"
122#undef KDB_SPARQL_ALGEBRA_GENERATE
125 template<
typename _T_>
128 static constexpr bool has_custom_constructor =
false;
133 static constexpr bool has_custom_constructor =
true;
137#define KDB_SPARQL_ALGEBRA_GENERATE_GENERIC_MEMBER_SETTER(_KLASS_NAME_, _TYPE_, _NAME_, ...) \
138 template<typename... _TOther_> \
139 _KLASS_NAME_& _NAME_(const _TOther_&... _other);
141#define KDB_SPARQL_ALGEBRA_GENERATE_MEMBER_UPDATE(_KLASS_NAME_, _TYPE_, _NAME_, ...) \
142 void update_##_NAME_(const details::field_traits<_TYPE_>::type& _type);
144#define KDB_SPARQL_ALGEBRA_GENERATE(_KLASS_NAME_, _MEMBER_DEF_) \
149 _KLASS_NAME_(const _KLASS_NAME_&) = delete; \
150 _KLASS_NAME_& operator=(const _KLASS_NAME_&) = delete; \
151 template<typename... _TOther_> \
152 requires(details::traits<_KLASS_NAME_>::has_custom_constructor and sizeof...(_TOther_) != 0) \
153 _KLASS_NAME_(const _TOther_&... _other); \
155 QPair<QString, knowCore::ValueHash> toQueryString() const; \
156 kDB::SPARQL::Algebra::_KLASS_NAME_##CSP toNode() const; \
157 operator kDB::SPARQL::Algebra::_KLASS_NAME_##CSP() const { return toNode(); } \
158 operator Node##CSP() const { return toNode(); } \
160 _MEMBER_DEF_(_KLASS_NAME_, KDB_SPARQL_ALGEBRA_GENERATE_GENERIC_MEMBER_SETTER); \
162 _MEMBER_DEF_(_KLASS_NAME_, KDB_SPARQL_ALGEBRA_GENERATE_MEMBER_UPDATE); \
168#include "NodesDefs.h"
170#undef KDB_SPARQL_ALGEBRA_GENERATE_GENERIC_MEMBER_SETTER
171#undef KDB_SPARQL_ALGEBRA_GENERATE_MEMBER_UPDATE
172#undef KDB_SPARQL_ALGEBRA_GENERATE
180 template<
typename _T1_,
typename _T2_,
typename _T3_>
181 void append(
const _T1_& _subject,
const _T2_& _predicate,
const _T3_& _object)
184 builder.subject(toNode(_subject));
185 builder.predicate(toNode(_predicate));
186 builder.object(toNode(_object));
187 m_triples.append(builder.toNode());
201 void customConstructor(Variable* _var_builder,
const QString& _name)
203 _var_builder->name(_name);
207#define KDB_SPARQL_ALGEBRA_GENERATE_GENERIC_MEMBER_SETTER_DEFINITION(_KLASS_NAME_, _TYPE_, _NAME_, \
209 template<typename... _TOther_> \
210 _KLASS_NAME_& _KLASS_NAME_::_NAME_(const _TOther_&... _other) \
212 update_##_NAME_(details::field_traits<_TYPE_>::build(_other...)); \
216#define KDB_SPARQL_ALGEBRA_GENERATE(_KLASS_NAME_, _MEMBER_DEF_) \
217 template<typename... _TOther_> \
218 requires(details::traits<_KLASS_NAME_>::has_custom_constructor and sizeof...(_TOther_) != 0) \
219 _KLASS_NAME_::_KLASS_NAME_(const _TOther_&... _other) : _KLASS_NAME_::_KLASS_NAME_() \
221 details::customConstructor(this, _other...); \
223 _MEMBER_DEF_(_KLASS_NAME_, KDB_SPARQL_ALGEBRA_GENERATE_GENERIC_MEMBER_SETTER_DEFINITION);
225#include "NodesDefs.h"
226#undef KDB_SPARQL_ALGEBRA_GENERATE
227#undef KDB_SPARQL_ALGEBRA_GENERATE_GENERIC_MEMBER_SETTER_DEFINITION
231 template<
typename _T_>
232 typename field_traits<QList<_T_>>::type field_traits<QList<_T_>>::build(
const TriplesList& _t)
Definition Builders.h:178
Definition Builders.h:127