AnCH Framework 0.1
Another C++ Hack Framework
 
Loading...
Searching...
No Matches
clausesBuilder.hpp
1/*
2 ANCH Framework: ANother C++ Hack is a C++ framework based on C++11 standard
3 Copyright (C) 2012 Vincent Lachenal
4
5 This file is part of ANCH Framework.
6
7 ANCH Framework is free software: you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11
12 ANCH Framework is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General Public License
18 along with ANCH Framework. If not, see <http://www.gnu.org/licenses/>.
19*/
20#pragma once
21
22#include <string>
23#include <list>
24#include <sstream>
25#include <functional>
26#include <vector>
27#include <optional>
28
29
30#include "sql/builder/sqlQuery.hpp"
31
32
33namespace anch {
34 namespace sql {
35
36 class SelectBuilder;
37 class FromBuilder;
38 class ClausesBuilder;
40
45 using ClauseMaker = std::function<std::string(const std::string&)>;
46
48 template<typename T>
49 using ValueChecker = std::function<std::optional<std::string>(const T&)>;
50
52 using ClausesProvider = std::function<const anch::sql::ClausesBuilder&()>;
53
61 template<typename T>
62 std::optional<std::string> isValidValue(T& value);
63
73 class ClausesBuilder {
74 friend ClausesBuilder anch::sql::clauses();
77
78 // Attributes +
79 private:
81 std::ostringstream _buffer;
82
84 std::list<std::string> _values;
85
87 bool _firstClause;
88 // Attributes -
89
90
91 // Constructors +
92 private:
96 ClausesBuilder();
97
98 public:
104 ClausesBuilder(const ClausesBuilder& other);
105
106 private:
118 template<typename T>
119 ClausesBuilder(ClauseMaker clause, const T& value);
120
121 // /*!
122 // * \ref ClausesBuilder constructor.\n
123 // * This constructor will try to add a first clause if value is valid. Value will
124 // * be validated with \c SQL::isValidValue function.\n
125 // * This constructor can be used to add 'EXISTS' clause.
126 // *
127 // * \tparam T the value type
128 // *
129 // * \param clause the clause maker
130 // * \param value the value
131 // * \param check the value checker to use
132 // */
133 // template<typename T>
134 // ClausesBuilder(ClauseMaker clause, const T& value, ValueChecker<T> checker);
135
136 // /*!
137 // * \ref ClausesBuilder constructor.\n
138 // * This constructor will try to add a first clause if value is valid. Value will
139 // * be validated with \c SQL::isValidValue function.\n
140 // * This constructor can be used to add 'EXISTS' clause.
141 // *
142 // * \tparam T the value type
143 // *
144 // * \param clause the clause maker
145 // * \param value the value
146 // */
147 // template<typename T>
148 // ClausesBuilder(const std::string& column, ClauseMaker clause, const T& value);
149
150 // /*!
151 // * \ref ClausesBuilder constructor.\n
152 // * This constructor will try to add a first clause if value is valid. Value will
153 // * be validated with \c SQL::isValidValue function.\n
154 // * This constructor can be used to add 'EXISTS' clause.
155 // *
156 // * \tparam T the value type
157 // *
158 // * \param clause the clause maker
159 // * \param value the value
160 // * \param check the value checker to use
161 // */
162 // template<typename T>
163 // ClausesBuilder(const std::string& column, ClauseMaker clause, const T& value, ValueChecker<T> checker);
164 // Constructors -
165
166 // Destructor +
167 public:
172 // Destructor -
173
174
175 // SQL commands +
176 public:
177 // No check no prepared statement values +
185 ClausesBuilder& field(const std::string& column);
186
194 ClausesBuilder& NOT(const std::string& clauses);
195
201 ClausesBuilder& isNull();
202
208 ClausesBuilder& isNotNull();
209
215 ClausesBuilder& notEquals();
216
222 ClausesBuilder& equals();
223
231 ClausesBuilder& notExists(const anch::sql::SelectBuilder& query);
232
240 ClausesBuilder& exists(const anch::sql::SelectBuilder& query);
241
255 template<typename T>
256 ClausesBuilder& in(const std::vector<T>& values); // \todo list vector ?
257
270 template<typename T>
271 ClausesBuilder& notIn(const std::vector<T>& values); // \todo list vector ?
272
280 ClausesBuilder& in(const anch::sql::SQLQuery& query);
281
289 ClausesBuilder& notIn(const anch::sql::SQLQuery& query);
290
298 ClausesBuilder& in(const anch::sql::SelectBuilder& query);
299
307 ClausesBuilder& notIn(const anch::sql::SelectBuilder& query);
308
314 ClausesBuilder& greater();
315
321 ClausesBuilder& greaterEquals();
322
328 ClausesBuilder& lesser();
329
335 ClausesBuilder& lesserEquals();
336
342 ClausesBuilder& like();
343
349 ClausesBuilder& notLike();
350
356 ClausesBuilder& between();
357
363 ClausesBuilder& notBetween();
364
370 ClausesBuilder& AND(); // \todo operator ...
371
377 ClausesBuilder& OR(); // \todo operator ...
378 // No check no prepared statement values -
379
380 // Check and add value to prepared statement +
388 ClausesBuilder& AND(anch::sql::ClausesProvider clauses);
389
401 template<typename T>
402 ClausesBuilder& AND(anch::sql::ClauseMaker clause, T& value, anch::sql::ValueChecker<T> checker = anch::sql::isValidValue<T>);
403
416 template<typename T>
417 ClausesBuilder& AND(const std::string& column, anch::sql::ClauseMaker clause, T& value, ValueChecker<T> checker = anch::sql::isValidValue<T>);
418
432 template<typename T>
433 ClausesBuilder& AND(const std::string& column, ClauseMaker clause, T& value1, T& value2, ValueChecker<T> checker = anch::sql::isValidValue<T>);
434
446 template<typename T>
447 ClausesBuilder& OR(ClauseMaker clause, T& value, ValueChecker<T> checker = anch::sql::isValidValue<T>);
448
461 template<typename T>
462 ClausesBuilder& OR(const std::string& column, ClauseMaker clause, T& value, ValueChecker<T> checker = anch::sql::isValidValue<T>);
463
477 template<typename T>
478 ClausesBuilder& OR(const std::string& column, ClauseMaker clause, T& value1, T& value2, ValueChecker<T> checker = anch::sql::isValidValue<T>);
479
487 ClausesBuilder& OR(anch::sql::ClausesProvider clauses);
488 // Check and add value to prepared statement -
489
490 // Parentheses +
491 public:
499 ClausesBuilder& AND(const ClausesBuilder& other);
500
508 ClausesBuilder& OR(const ClausesBuilder& other);
509
517 ClausesBuilder& operator ||(const ClausesBuilder& other);
518 // Parentheses -
519 // SQL commands -
520
521
522 // Methods +
523 private:
532 ClausesBuilder& checkAndAddClauses(const std::string& boolAgg, const ClausesBuilder& other);
533
539 void addBooleanAggregator(const std::string& boolAgg);
540
549 ClausesBuilder& checkAndAddClauses(const std::string& boolAgg, anch::sql::ClausesProvider clauses);
550
564 template<typename T>
565 ClausesBuilder& checkAndAddClause(const std::string& boolAgg, const std::string& column, ClauseMaker clause, T& value, ValueChecker<T> checker);
566
581 template<typename T>
582 ClausesBuilder& checkAndAddClause(const std::string& boolAgg, const std::string& column, ClauseMaker clause, T& value1, T& value2, ValueChecker<T> checker);
583 // Methods -
584
585 };
586
587 // Implementations +
588 template<typename T>
591 return checkAndAddClause("AND", NULL, clause, value, checker);
592 }
593
594 template<typename T>
596 ClausesBuilder::AND(const std::string& column, anch::sql::ClauseMaker clause, T& value, ValueChecker<T> checker) {
597 return checkAndAddClause("AND", column, clause, value, checker);
598 }
599
600 template<typename T>
602 ClausesBuilder::AND(const std::string& column, ClauseMaker clause, T& value1, T& value2, ValueChecker<T> checker) {
603 return checkAndAddClause("AND", column, clause, value1, value2, checker);
604 }
605
606 template<typename T>
608 ClausesBuilder::OR(ClauseMaker clause, T& value, ValueChecker<T> checker) {
609 return checkAndAddClause("OR", NULL, clause, value, checker);
610 }
611
612 template<typename T>
614 ClausesBuilder::OR(const std::string& column, ClauseMaker clause, T& value, ValueChecker<T> checker) {
615 return checkAndAddClause("OR", column, clause, value, checker);
616 }
617
618 template<typename T>
620 ClausesBuilder::OR(const std::string& column, ClauseMaker clause, T& value1, T& value2, ValueChecker<T> checker) {
621 return checkAndAddClause("OR", column, clause, value1, value2, checker);
622 }
623
624 template<typename T>
626 ClausesBuilder::checkAndAddClause(const std::string& boolAgg, const std::string& column, ClauseMaker clause, T& value, ValueChecker<T> checker) {
627 auto optVal = checker(value);
628 if(optVal) {
629 addBooleanAggregator(boolAgg);
630 _buffer << clause(column);
631 _values.push_back(optVal.value());
632 // if(value instanceof Optional<?>) {
633 // // Optional value has already been check at his point
634 // values.add(((Optional<?>)value).get());
635 // } else if(value instanceof Collection) { // For (NOT) IN operators
636 // buffer.append(SQL.toSQLList((Collection<?>)value));
637 // } else if(value instanceof SelectBuilder) { // For (NOT) EXISTS operators
638 // buffer.append('(').append(value).append(')');
639 // values.addAll(((SelectBuilder)value).values);
640 // } else if(value instanceof SQLQuery) { // For (NOT) EXISTS operators
641 // final SQLQuery query = (SQLQuery)value;
642 // buffer.append('(').append(query.getQuery()).append(')');
643 // values.addAll(query.getValues());
644 // } else {
645 // values.add(value);
646 // }
647 _firstClause = false;
648 }
649 return *this;
650 }
651
652 template<typename T>
653 ClausesBuilder&
654 ClausesBuilder::checkAndAddClause(const std::string& boolAgg, const std::string& column, ClauseMaker clause, T& value1, T& value2, ValueChecker<T> checker) {
655 auto optVal1 = checker(value1);
656 auto optVal2 = checker(value2);
657 if(optVal1 && optVal2) {
658 addBooleanAggregator(boolAgg);
659 _buffer << clause(column);
660 _values.push_back(optVal1.value());
661 _values.push_back(optVal2.value());
662 // if(value1 instanceof Optional<?>) {
663 // // Optional value has already been check at his point
664 // values.add(((Optional<?>)value1).get());
665 // } else {
666 // values.add(value1);
667 // }
668 // if(value2 instanceof Optional<?>) {
669 // // Optional value has already been check at his point
670 // values.add(((Optional<?>)value2).get());
671 // } else {
672 // values.add(value2);
673 // }
674 _firstClause = false;
675 }
676 return *this;
677 }
678 // Implementations -
679
680 } // sql
681} // anch
SQL clauses builder.
Definition clausesBuilder.hpp:73
ClausesBuilder & OR(const ClausesBuilder &other)
ClausesBuilder & field(const std::string &column)
ClausesBuilder & notLike()
ClausesBuilder & greater()
ClausesBuilder & notExists(const anch::sql::SelectBuilder &query)
ClausesBuilder & in(const anch::sql::SQLQuery &query)
ClausesBuilder & isNotNull()
ClausesBuilder & like()
ClausesBuilder & in(const anch::sql::SelectBuilder &query)
ClausesBuilder & equals()
ClausesBuilder & OR()
ClausesBuilder & exists(const anch::sql::SelectBuilder &query)
ClausesBuilder & AND(const ClausesBuilder &other)
ClausesBuilder & lesserEquals()
ClausesBuilder & notIn(const anch::sql::SQLQuery &query)
ClausesBuilder & between()
ClausesBuilder & operator||(const ClausesBuilder &other)
ClausesBuilder & NOT(const std::string &clauses)
ClausesBuilder & notEquals()
ClausesBuilder & isNull()
ClausesBuilder & AND(anch::sql::ClausesProvider clauses)
ClausesBuilder & notIn(const std::vector< T > &values)
ClausesBuilder & notBetween()
ClausesBuilder(const ClausesBuilder &other)
ClausesBuilder & greaterEquals()
ClausesBuilder & in(const std::vector< T > &values)
ClausesBuilder & notIn(const anch::sql::SelectBuilder &query)
ClausesBuilder & AND()
ClausesBuilder & lesser()
ClausesBuilder & OR(anch::sql::ClausesProvider clauses)
Definition fromBuilder.hpp:41
SQL query.
Definition sqlQuery.hpp:42
Dynamic SQL select request builder.
Definition selectBuilder.hpp:47
SQL namespace.
Definition clauses.hpp:26
std::optional< std::string > isValidValue(T &value)
std::function< std::optional< std::string >(const T &)> ValueChecker
Definition clausesBuilder.hpp:49
std::function< const anch::sql::ClausesBuilder &()> ClausesProvider
Definition clausesBuilder.hpp:52
ClausesBuilder clauses()
std::function< std::string(const std::string &)> ClauseMaker
Definition clausesBuilder.hpp:45
AnCH framework base namespace.
Definition app.hpp:28