Apply clang-format

This commit is contained in:
Luis Ángel San Martín 2019-09-23 18:02:23 +02:00 committed by Luis Ángel San Martín
parent 9a660350d2
commit 7ccb338455
2 changed files with 135 additions and 102 deletions

View File

@ -5,17 +5,17 @@
#include <type_traits>
#include <numeric>
const std::map<QueryParser::FieldType, std::vector<std::string>> QueryParser::fieldNames {
{ FieldType::numeric, { "numpages", "number", "count", "arcnumber", "arccount" } },
{FieldType::text, {"title", "volume", "storyarc", "genere", "writer", "penciller", "inker", "colorist", "letterer",
"coverartist", "publisher", "format", "agerating", "synopsis", "characters", "notes"}},
{ FieldType::text, { "title", "volume", "storyarc", "genere", "writer", "penciller", "inker", "colorist", "letterer", "coverartist", "publisher", "format", "agerating", "synopsis", "characters", "notes" } },
{ FieldType::boolean, { "isbis", "color" } },
{ FieldType::date, { "date" } },
{ FieldType::filename, { "filename" } },
{FieldType::folder, {"folder"}} };
{ FieldType::folder, { "folder" } }
};
int QueryParser::TreeNode::buildSqlString(std::string& sqlString, int bindPosition) const {
int QueryParser::TreeNode::buildSqlString(std::string &sqlString, int bindPosition) const
{
if (t == "token") {
++bindPosition;
std::ostringstream oss;
@ -51,7 +51,8 @@ int QueryParser::TreeNode::buildSqlString(std::string& sqlString, int bindPositi
return bindPosition;
}
int QueryParser::TreeNode::bindValues(QSqlQuery& selectQuery, int bindPosition) const {
int QueryParser::TreeNode::bindValues(QSqlQuery &selectQuery, int bindPosition) const
{
if (t == "token") {
std::ostringstream oss;
oss << ":bindPosition" << ++bindPosition;
@ -70,8 +71,9 @@ int QueryParser::TreeNode::buildSqlString(std::string& sqlString, int bindPositi
return bindPosition;
}
QueryParser::QueryParser(): lexScanner(0) {
QueryParser::QueryParser()
: lexScanner(0)
{
lexScanner.push("[()]", static_cast<std::underlying_type<TokenType>::type>(TokenType::opcode));
lexScanner.push("@[^:]+:[^\\\")\\s]+", static_cast<std::underlying_type<TokenType>::type>(TokenType::atWord));
@ -82,7 +84,8 @@ QueryParser::QueryParser(): lexScanner(0) {
lexertl::generator::build(lexScanner, sm);
}
QueryParser::TreeNode QueryParser::parse(const std::string& expr) {
QueryParser::TreeNode QueryParser::parse(const std::string &expr)
{
tokenize(expr);
auto prog = orExpression();
@ -93,13 +96,15 @@ QueryParser::TreeNode QueryParser::parse(const std::string& expr) {
return prog;
}
std::string QueryParser::toLower(const std::string& string) {
std::string QueryParser::toLower(const std::string &string)
{
std::string res(string);
std::transform(res.begin(), res.end(), res.begin(), ::tolower);
return res;
}
std::string QueryParser::token(bool advance) {
std::string QueryParser::token(bool advance)
{
if (isEof()) {
return "";
}
@ -110,7 +115,8 @@ std::string QueryParser::token(bool advance) {
return res;
}
std::string QueryParser::lcaseToken(bool advance) {
std::string QueryParser::lcaseToken(bool advance)
{
if (isEof()) {
return "";
}
@ -121,23 +127,28 @@ std::string QueryParser::lcaseToken(bool advance) {
return toLower(res);
}
QueryParser::TokenType QueryParser::tokenType() {
QueryParser::TokenType QueryParser::tokenType()
{
if (isEof()) {
return TokenType::eof;
}
return TokenType(iter->id);
}
bool QueryParser::isEof() const {
bool QueryParser::isEof() const
{
return iter == end;
}
void QueryParser::advance() {
void QueryParser::advance()
{
++iter;
if (tokenType() == TokenType::space) advance();
if (tokenType() == TokenType::space)
advance();
}
QueryParser::FieldType QueryParser::fieldType(const std::string& str) {
QueryParser::FieldType QueryParser::fieldType(const std::string &str)
{
for (const auto &names : fieldNames) {
if (std::find(names.second.begin(), names.second.end(), toLower(str)) != names.second.end()) {
return names.first;
@ -147,18 +158,21 @@ QueryParser::FieldType QueryParser::fieldType(const std::string& str) {
return FieldType::unknown;
}
void QueryParser::tokenize (const std::string& expr) {
void QueryParser::tokenize(const std::string &expr)
{
iter = lexertl::siterator(expr.begin(), expr.end(), sm);
}
std::string QueryParser::join(const std::vector<std::string>& strings, const std::string& delim) {
std::string QueryParser::join(const std::vector<std::string> &strings, const std::string &delim)
{
return std::accumulate(strings.begin(), strings.end(), std::string(),
[&delim](const std::string &a, const std::string &b) -> std::string {
return a + (a.length() > 0 && b.length() > 0 ? delim : "") + b;
});
}
std::vector<std::string> QueryParser::split(const std::string& string, char delim) {
std::vector<std::string> QueryParser::split(const std::string &string, char delim)
{
std::istringstream iss(string);
std::vector<std::string> words;
while (iss) {
@ -169,7 +183,8 @@ std::vector<std::string> QueryParser::split(const std::string& string, char deli
return words;
}
QueryParser::TreeNode QueryParser::orExpression() {
QueryParser::TreeNode QueryParser::orExpression()
{
auto lhs = andExpression();
if (lcaseToken() == "or") {
advance();
@ -178,7 +193,8 @@ QueryParser::TreeNode QueryParser::orExpression() {
return lhs;
}
QueryParser::TreeNode QueryParser::andExpression() {
QueryParser::TreeNode QueryParser::andExpression()
{
auto lhs = notExpression();
if (lcaseToken() == "and") {
advance();
@ -192,7 +208,8 @@ QueryParser::TreeNode QueryParser::andExpression() {
return lhs;
}
QueryParser::TreeNode QueryParser::notExpression() {
QueryParser::TreeNode QueryParser::notExpression()
{
if (lcaseToken() == "not") {
advance();
return { "not", { notExpression() } };
@ -200,7 +217,8 @@ QueryParser::TreeNode QueryParser::notExpression() {
return locationExpression();
}
QueryParser::TreeNode QueryParser::locationExpression() {
QueryParser::TreeNode QueryParser::locationExpression()
{
if (tokenType() == TokenType::opcode && token() == "(") {
advance();
auto res = orExpression();
@ -215,7 +233,8 @@ QueryParser::TreeNode QueryParser::locationExpression() {
return baseToken();
}
QueryParser::TreeNode QueryParser::baseToken() {
QueryParser::TreeNode QueryParser::baseToken()
{
if (tokenType() == TokenType::quotedWord) {
return { "token", { { "all", {} }, { token(true), {} } } };
}

View File

@ -38,10 +38,15 @@
*
* selectQuery.exec();
*/
class QueryParser {
class QueryParser
{
public:
enum class TokenType {eof, opcode, atWord, word, quotedWord, space};
enum class TokenType { eof,
opcode,
atWord,
word,
quotedWord,
space };
struct TreeNode {
std::string t;
@ -64,9 +69,18 @@ private:
void advance();
template<typename First, typename... T>
static bool isIn(First &&first, T && ... t) {return ((first == t) || ...);}
static bool isIn(First &&first, T &&... t)
{
return ((first == t) || ...);
}
enum class FieldType {unknown, numeric, text, boolean, date, folder, filename};
enum class FieldType { unknown,
numeric,
text,
boolean,
date,
folder,
filename };
static FieldType fieldType(const std::string &str);
void tokenize(const std::string &expr);