152a38012Sejakowatz //---------------------------------------------------------------------- 2*2ca13760SColdfirex // This software is part of the Haiku distribution and is covered 3b6f76ebeSAugustin Cavalier // by the MIT License. 452a38012Sejakowatz //--------------------------------------------------------------------- 552a38012Sejakowatz /*! 652a38012Sejakowatz \file QueryPredicate.h 752a38012Sejakowatz BQuery predicate helper classes interface declaration. 852a38012Sejakowatz */ 982b75665STyler Dauwalder #ifndef _QUERY_PREDICATE_H 1082b75665STyler Dauwalder #define _QUERY_PREDICATE_H 1152a38012Sejakowatz 1252a38012Sejakowatz #include <stdio.h> 1352a38012Sejakowatz 1452a38012Sejakowatz #include <List.h> 1552a38012Sejakowatz #include <Query.h> 1652a38012Sejakowatz #include <String.h> 1752a38012Sejakowatz 1809d84e61STyler Dauwalder namespace BPrivate { 1909d84e61STyler Dauwalder namespace Storage { 2052a38012Sejakowatz 2152a38012Sejakowatz // QueryNode 2252a38012Sejakowatz class QueryNode { 2352a38012Sejakowatz public: 2452a38012Sejakowatz QueryNode(); 2552a38012Sejakowatz virtual ~QueryNode(); 2652a38012Sejakowatz 2752a38012Sejakowatz virtual uint32 Arity() const = 0; 2852a38012Sejakowatz virtual status_t SetChildAt(QueryNode *child, int32 index) = 0; 2952a38012Sejakowatz virtual QueryNode *ChildAt(int32 index) = 0; 3052a38012Sejakowatz 3152a38012Sejakowatz virtual status_t GetString(BString &predicate) = 0; 3252a38012Sejakowatz }; 3352a38012Sejakowatz 3452a38012Sejakowatz // LeafNode 3552a38012Sejakowatz class LeafNode : public QueryNode { 3652a38012Sejakowatz public: 3752a38012Sejakowatz LeafNode(); 3852a38012Sejakowatz virtual ~LeafNode(); 3952a38012Sejakowatz 4052a38012Sejakowatz virtual uint32 Arity() const; 4152a38012Sejakowatz virtual status_t SetChildAt(QueryNode *child, int32 index); 4252a38012Sejakowatz virtual QueryNode *ChildAt(int32 index); 4352a38012Sejakowatz }; 4452a38012Sejakowatz 4552a38012Sejakowatz // UnaryNode 4652a38012Sejakowatz class UnaryNode : public QueryNode { 4752a38012Sejakowatz public: 4852a38012Sejakowatz UnaryNode(); 4952a38012Sejakowatz virtual ~UnaryNode(); 5052a38012Sejakowatz 5152a38012Sejakowatz virtual uint32 Arity() const; 5252a38012Sejakowatz virtual status_t SetChildAt(QueryNode *child, int32 index); 5352a38012Sejakowatz virtual QueryNode *ChildAt(int32 index); 5452a38012Sejakowatz 5552a38012Sejakowatz protected: 5652a38012Sejakowatz QueryNode *fChild; 5752a38012Sejakowatz }; 5852a38012Sejakowatz 5952a38012Sejakowatz // BinaryNode 6052a38012Sejakowatz class BinaryNode : public QueryNode { 6152a38012Sejakowatz public: 6252a38012Sejakowatz BinaryNode(); 6352a38012Sejakowatz virtual ~BinaryNode(); 6452a38012Sejakowatz 6552a38012Sejakowatz virtual uint32 Arity() const; 6652a38012Sejakowatz virtual status_t SetChildAt(QueryNode *child, int32 index); 6752a38012Sejakowatz virtual QueryNode *ChildAt(int32 index); 6852a38012Sejakowatz 6952a38012Sejakowatz protected: 7052a38012Sejakowatz QueryNode *fChild1; 7152a38012Sejakowatz QueryNode *fChild2; 7252a38012Sejakowatz }; 7352a38012Sejakowatz 7452a38012Sejakowatz // AttributeNode 7552a38012Sejakowatz class AttributeNode : public LeafNode { 7652a38012Sejakowatz public: 7752a38012Sejakowatz AttributeNode(const char *attribute); 7852a38012Sejakowatz 7952a38012Sejakowatz virtual status_t GetString(BString &predicate); 8052a38012Sejakowatz 8152a38012Sejakowatz private: 8252a38012Sejakowatz BString fAttribute; 8352a38012Sejakowatz }; 8452a38012Sejakowatz 8552a38012Sejakowatz // StringNode 8652a38012Sejakowatz class StringNode : public LeafNode { 8752a38012Sejakowatz public: 8852a38012Sejakowatz StringNode(const char *value, bool caseInsensitive = false); 8952a38012Sejakowatz 9052a38012Sejakowatz virtual status_t GetString(BString &predicate); 9152a38012Sejakowatz Value()9252a38012Sejakowatz inline const char *Value() const { return fValue.String(); } 9352a38012Sejakowatz 9452a38012Sejakowatz private: 9552a38012Sejakowatz BString fValue; 9652a38012Sejakowatz }; 9752a38012Sejakowatz 9852a38012Sejakowatz // DateNode 9952a38012Sejakowatz class DateNode : public LeafNode { 10052a38012Sejakowatz public: 10152a38012Sejakowatz DateNode(const char *value); 10252a38012Sejakowatz 10352a38012Sejakowatz virtual status_t GetString(BString &predicate); 10452a38012Sejakowatz 10552a38012Sejakowatz private: 10652a38012Sejakowatz BString fValue; 10752a38012Sejakowatz }; 10852a38012Sejakowatz 10952a38012Sejakowatz // ValueNode 11052a38012Sejakowatz template<typename ValueType> 11152a38012Sejakowatz class ValueNode : public LeafNode { 11252a38012Sejakowatz public: 11352a38012Sejakowatz ValueNode(const ValueType &value); 11452a38012Sejakowatz 11552a38012Sejakowatz virtual status_t GetString(BString &predicate); 11652a38012Sejakowatz 11752a38012Sejakowatz private: 11852a38012Sejakowatz ValueType fValue; 11952a38012Sejakowatz }; 12052a38012Sejakowatz 12152a38012Sejakowatz // constructor 12252a38012Sejakowatz template<typename ValueType> ValueNode(const ValueType & value)12352a38012SejakowatzValueNode<ValueType>::ValueNode(const ValueType &value) 12452a38012Sejakowatz : LeafNode(), 12552a38012Sejakowatz fValue(value) 12652a38012Sejakowatz { 12752a38012Sejakowatz } 12852a38012Sejakowatz 12952a38012Sejakowatz // GetString 13052a38012Sejakowatz template<typename ValueType> 13152a38012Sejakowatz status_t GetString(BString & predicate)13252a38012SejakowatzValueNode<ValueType>::GetString(BString &predicate) 13352a38012Sejakowatz { 13452a38012Sejakowatz predicate.SetTo(""); 13552a38012Sejakowatz predicate << fValue; 13652a38012Sejakowatz return B_OK; 13752a38012Sejakowatz } 13852a38012Sejakowatz 13952a38012Sejakowatz // specializations for float and double 14052a38012Sejakowatz template<> status_t ValueNode<float>::GetString(BString &predicate); 14152a38012Sejakowatz template<> status_t ValueNode<double>::GetString(BString &predicate); 14252a38012Sejakowatz 14352a38012Sejakowatz 14452a38012Sejakowatz // short hands 14552a38012Sejakowatz typedef ValueNode<int32> Int32ValueNode; 14652a38012Sejakowatz typedef ValueNode<uint32> UInt32ValueNode; 14752a38012Sejakowatz typedef ValueNode<int64> Int64ValueNode; 14852a38012Sejakowatz typedef ValueNode<uint64> UInt64ValueNode; 14952a38012Sejakowatz typedef ValueNode<float> FloatValueNode; 15052a38012Sejakowatz typedef ValueNode<double> DoubleValueNode; 15152a38012Sejakowatz 15252a38012Sejakowatz 15352a38012Sejakowatz // SpecialOpNode 15452a38012Sejakowatz class SpecialOpNode : public LeafNode { 15552a38012Sejakowatz public: 15652a38012Sejakowatz SpecialOpNode(query_op op); 15752a38012Sejakowatz 15852a38012Sejakowatz virtual status_t GetString(BString &predicate); 15952a38012Sejakowatz 16052a38012Sejakowatz private: 16152a38012Sejakowatz query_op fOp; 16252a38012Sejakowatz }; 16352a38012Sejakowatz 16452a38012Sejakowatz // UnaryOpNode 16552a38012Sejakowatz class UnaryOpNode : public UnaryNode { 16652a38012Sejakowatz public: 16752a38012Sejakowatz UnaryOpNode(query_op op); 16852a38012Sejakowatz 16952a38012Sejakowatz virtual status_t GetString(BString &predicate); 17052a38012Sejakowatz 17152a38012Sejakowatz private: 17252a38012Sejakowatz query_op fOp; 17352a38012Sejakowatz }; 17452a38012Sejakowatz 17552a38012Sejakowatz // BinaryOpNode 17652a38012Sejakowatz class BinaryOpNode : public BinaryNode { 17752a38012Sejakowatz public: 17852a38012Sejakowatz BinaryOpNode(query_op op); 17952a38012Sejakowatz 18052a38012Sejakowatz virtual status_t GetString(BString &predicate); 18152a38012Sejakowatz 18252a38012Sejakowatz private: 18352a38012Sejakowatz query_op fOp; 18452a38012Sejakowatz }; 18552a38012Sejakowatz 18652a38012Sejakowatz 18752a38012Sejakowatz // QueryStack 18852a38012Sejakowatz class QueryStack { 18952a38012Sejakowatz public: 19052a38012Sejakowatz QueryStack(); 19152a38012Sejakowatz virtual ~QueryStack(); 19252a38012Sejakowatz 19352a38012Sejakowatz status_t PushNode(QueryNode *node); 19452a38012Sejakowatz QueryNode *PopNode(); 19552a38012Sejakowatz 19652a38012Sejakowatz status_t ConvertToTree(QueryNode *&rootNode); 19752a38012Sejakowatz 19852a38012Sejakowatz private: 19952a38012Sejakowatz status_t _GetSubTree(QueryNode *&rootNode); 20052a38012Sejakowatz 20152a38012Sejakowatz private: 20252a38012Sejakowatz BList fNodes; 20352a38012Sejakowatz }; 20452a38012Sejakowatz 20509d84e61STyler Dauwalder }; // namespace Storage 20609d84e61STyler Dauwalder }; // namespace BPrivate 20752a38012Sejakowatz 20882b75665STyler Dauwalder #endif // _QUERY_PREDICATE_H 20909d84e61STyler Dauwalder 21009d84e61STyler Dauwalder 211