query/include/matador/query/expression/expression_operators.hpp

118 lines
4.5 KiB
C++

#ifndef MATADOR_EXPRESSION_OPERATORS_HPP
#define MATADOR_EXPRESSION_OPERATORS_HPP
#include "matador/query/expression/binary_column_expression.hpp"
#include "matador/query/expression/table_column_expression.hpp"
#include "matador/query/expression/value_expression.hpp"
#include "matador/query/expression/column_expression.hpp"
#include "matador/utils/placeholder.hpp"
namespace matador::query {
template<typename Type>
column_expression operator+(const table_column& col, Type&& val) {
return column_expression{std::make_unique<binary_column_expression>(
std::make_unique<table_column_expression>(col),
binary_expression_operator::Plus,
std::make_unique<value_expression>(std::forward<Type>(val))
)};
}
template<typename Type>
column_expression operator+(Type&& val, const table_column& col) {
return column_expression{std::make_unique<binary_column_expression>(
std::make_unique<value_expression>(std::forward<Type>(val)),
binary_expression_operator::Plus,
std::make_unique<table_column_expression>(col)
)};
}
column_expression operator+(const table_column& col, utils::placeholder /*val*/);
column_expression operator+(utils::placeholder /*val*/, const table_column& col);
template<typename Type>
column_expression operator-(const table_column& col, Type&& val) {
return column_expression{std::make_unique<binary_column_expression>(
std::make_unique<table_column_expression>(col),
binary_expression_operator::Minus,
std::make_unique<value_expression>(std::forward<Type>(val))
)};
}
template<typename Type>
column_expression operator-(Type&& val, const table_column& col) {
return column_expression{std::make_unique<binary_column_expression>(
std::make_unique<value_expression>(std::forward<Type>(val)),
binary_expression_operator::Minus,
std::make_unique<table_column_expression>(col)
)};
}
column_expression operator-(const table_column& col, utils::placeholder /*val*/);
column_expression operator-(utils::placeholder /*val*/, const table_column& col);
template<typename Type>
column_expression operator*(const table_column& col, Type&& val) {
return column_expression{std::make_unique<binary_column_expression>(
std::make_unique<table_column_expression>(col),
binary_expression_operator::Multiply,
std::make_unique<value_expression>(std::forward<Type>(val))
)};
}
template<typename Type>
column_expression operator*(Type&& val, const table_column& col) {
return std::make_unique<binary_column_expression>(
std::make_unique<value_expression>(std::forward<Type>(val)),
binary_expression_operator::Multiply,
std::make_unique<table_column_expression>(col)
);
}
column_expression operator*(const table_column& col, utils::placeholder /*val*/);
column_expression operator*(utils::placeholder /*val*/, const table_column& col);
column_expression operator*(column_expression&& left, column_expression&& right);
template<typename Type>
column_expression operator/(const table_column& col, Type&& val) {
return column_expression{std::make_unique<binary_column_expression>(
std::make_unique<table_column_expression>(col),
binary_expression_operator::Divide,
std::make_unique<value_expression>(std::forward<Type>(val))
)};
}
template<typename Type>
column_expression operator/(Type&& val, const table_column& col) {
return column_expression{std::make_unique<binary_column_expression>(
std::make_unique<value_expression>(std::forward<Type>(val)),
binary_expression_operator::Divide,
std::make_unique<table_column_expression>(col)
)};
}
column_expression operator/(const table_column& col, utils::placeholder /*val*/);
column_expression operator/(utils::placeholder /*val*/, const table_column& col);
template<typename Type>
column_expression operator%(const table_column& col, Type&& val) {
return column_expression{std::make_unique<binary_column_expression>(
std::make_unique<table_column_expression>(col),
binary_expression_operator::Modulo,
std::make_unique<value_expression>(std::forward<Type>(val))
)};
}
template<typename Type>
column_expression operator%(Type&& val, const table_column& col) {
return column_expression{std::make_unique<binary_column_expression>(
std::make_unique<value_expression>(std::forward<Type>(val)),
binary_expression_operator::Modulo,
std::make_unique<table_column_expression>(col)
)};
}
column_expression operator%(const table_column& col, utils::placeholder /*val*/);
column_expression operator%(utils::placeholder /*val*/, const table_column& col);
}
#endif //MATADOR_EXPRESSION_OPERATORS_HPP