1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
#pragma once
/*
* Copyright (C) 2013 Team XBMC
* http://xbmc.org
*
* This Program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This Program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with XBMC; see the file COPYING. If not, see
* <http://www.gnu.org/licenses/>.
*
*/
#include <set>
#include <string>
#include <vector>
#include <memory>
#define DATABASEQUERY_RULE_VALUE_SEPARATOR " / "
class CDatabase;
class CVariant;
class TiXmlNode;
class CDatabaseQueryRule
{
public:
CDatabaseQueryRule();
virtual ~CDatabaseQueryRule() { };
enum SEARCH_OPERATOR { OPERATOR_START = 0,
OPERATOR_CONTAINS,
OPERATOR_DOES_NOT_CONTAIN,
OPERATOR_EQUALS,
OPERATOR_DOES_NOT_EQUAL,
OPERATOR_STARTS_WITH,
OPERATOR_ENDS_WITH,
OPERATOR_GREATER_THAN,
OPERATOR_LESS_THAN,
OPERATOR_AFTER,
OPERATOR_BEFORE,
OPERATOR_IN_THE_LAST,
OPERATOR_NOT_IN_THE_LAST,
OPERATOR_TRUE,
OPERATOR_FALSE,
OPERATOR_BETWEEN,
OPERATOR_END
};
enum FIELD_TYPE { TEXT_FIELD = 0,
NUMERIC_FIELD,
DATE_FIELD,
PLAYLIST_FIELD,
SECONDS_FIELD,
BOOLEAN_FIELD,
TEXTIN_FIELD
};
virtual bool Load(const TiXmlNode *node, const std::string &encoding = "UTF-8");
virtual bool Load(const CVariant &obj);
virtual bool Save(TiXmlNode *parent) const;
virtual bool Save(CVariant &obj) const;
static std::string GetLocalizedOperator(SEARCH_OPERATOR oper);
static void GetAvailableOperators(std::vector<std::string> &operatorList);
std::string GetParameter() const;
void SetParameter(const std::string &value);
void SetParameter(const std::vector<std::string> &values);
virtual std::string GetWhereClause(const CDatabase &db, const std::string& strType) const;
int m_field;
SEARCH_OPERATOR m_operator;
std::vector<std::string> m_parameter;
protected:
virtual std::string GetField(int field, const std::string& type) const=0;
virtual FIELD_TYPE GetFieldType(int field) const=0;
virtual int TranslateField(const char *field) const=0;
virtual std::string TranslateField(int field) const=0;
std::string ValidateParameter(const std::string ¶meter) const;
virtual std::string FormatParameter(const std::string &negate, const std::string &oper, const CDatabase &db, const std::string &type) const;
virtual std::string FormatWhereClause(const std::string &negate, const std::string &oper, const std::string ¶m,
const CDatabase &db, const std::string &type) const;
virtual SEARCH_OPERATOR GetOperator(const std::string &type) const { return m_operator; };
virtual std::string GetOperatorString(SEARCH_OPERATOR op) const;
virtual std::string GetBooleanQuery(const std::string &negate, const std::string &strType) const { return ""; }
static SEARCH_OPERATOR TranslateOperator(const char *oper);
static std::string TranslateOperator(SEARCH_OPERATOR oper);
};
class CDatabaseQueryRuleCombination;
typedef std::vector< std::shared_ptr<CDatabaseQueryRule> > CDatabaseQueryRules;
typedef std::vector< std::shared_ptr<CDatabaseQueryRuleCombination> > CDatabaseQueryRuleCombinations;
class IDatabaseQueryRuleFactory
{
public:
virtual CDatabaseQueryRule *CreateRule() const=0;
virtual CDatabaseQueryRuleCombination *CreateCombination() const=0;
};
class CDatabaseQueryRuleCombination
{
public:
CDatabaseQueryRuleCombination();
virtual ~CDatabaseQueryRuleCombination() { };
typedef enum {
CombinationOr = 0,
CombinationAnd
} Combination;
void clear();
virtual bool Load(const TiXmlNode *node, const std::string &encoding = "UTF-8") { return false; }
virtual bool Load(const CVariant &obj, const IDatabaseQueryRuleFactory *factory);
virtual bool Save(TiXmlNode *parent) const;
virtual bool Save(CVariant &obj) const;
std::string GetWhereClause(const CDatabase &db, const std::string& strType) const;
std::string TranslateCombinationType() const;
Combination GetType() const { return m_type; }
void SetType(Combination combination) { m_type = combination; }
bool empty() const { return m_combinations.empty() && m_rules.empty(); }
protected:
friend class CGUIDialogSmartPlaylistEditor;
friend class CGUIDialogMediaFilter;
Combination m_type;
CDatabaseQueryRuleCombinations m_combinations;
CDatabaseQueryRules m_rules;
};
|