1//---------------------------------------------------------------------- 2// This software is part of the Haiku distribution and is covered 3// by the MIT License. 4//--------------------------------------------------------------------- 5/*! 6 \file QueryPredicate.h 7 BQuery predicate helper classes interface declaration. 8*/ 9#ifndef _QUERY_PREDICATE_H 10#define _QUERY_PREDICATE_H 11 12#include <stdio.h> 13 14#include <List.h> 15#include <Query.h> 16#include <String.h> 17 18namespace BPrivate { 19namespace Storage { 20 21// QueryNode 22class QueryNode { 23public: 24 QueryNode(); 25 virtual ~QueryNode(); 26 27 virtual uint32 Arity() const = 0; 28 virtual status_t SetChildAt(QueryNode *child, int32 index) = 0; 29 virtual QueryNode *ChildAt(int32 index) = 0; 30 31 virtual status_t GetString(BString &predicate) = 0; 32}; 33 34// LeafNode 35class LeafNode : public QueryNode { 36public: 37 LeafNode(); 38 virtual ~LeafNode(); 39 40 virtual uint32 Arity() const; 41 virtual status_t SetChildAt(QueryNode *child, int32 index); 42 virtual QueryNode *ChildAt(int32 index); 43}; 44 45// UnaryNode 46class UnaryNode : public QueryNode { 47public: 48 UnaryNode(); 49 virtual ~UnaryNode(); 50 51 virtual uint32 Arity() const; 52 virtual status_t SetChildAt(QueryNode *child, int32 index); 53 virtual QueryNode *ChildAt(int32 index); 54 55protected: 56 QueryNode *fChild; 57}; 58 59// BinaryNode 60class BinaryNode : public QueryNode { 61public: 62 BinaryNode(); 63 virtual ~BinaryNode(); 64 65 virtual uint32 Arity() const; 66 virtual status_t SetChildAt(QueryNode *child, int32 index); 67 virtual QueryNode *ChildAt(int32 index); 68 69protected: 70 QueryNode *fChild1; 71 QueryNode *fChild2; 72}; 73 74// AttributeNode 75class AttributeNode : public LeafNode { 76public: 77 AttributeNode(const char *attribute); 78 79 virtual status_t GetString(BString &predicate); 80 81private: 82 BString fAttribute; 83}; 84 85// StringNode 86class StringNode : public LeafNode { 87public: 88 StringNode(const char *value, bool caseInsensitive = false); 89 90 virtual status_t GetString(BString &predicate); 91 92 inline const char *Value() const { return fValue.String(); } 93 94private: 95 BString fValue; 96}; 97 98// DateNode 99class DateNode : public LeafNode { 100public: 101 DateNode(const char *value); 102 103 virtual status_t GetString(BString &predicate); 104 105private: 106 BString fValue; 107}; 108 109// ValueNode 110template<typename ValueType> 111class ValueNode : public LeafNode { 112public: 113 ValueNode(const ValueType &value); 114 115 virtual status_t GetString(BString &predicate); 116 117private: 118 ValueType fValue; 119}; 120 121// constructor 122template<typename ValueType> 123ValueNode<ValueType>::ValueNode(const ValueType &value) 124 : LeafNode(), 125 fValue(value) 126{ 127} 128 129// GetString 130template<typename ValueType> 131status_t 132ValueNode<ValueType>::GetString(BString &predicate) 133{ 134 predicate.SetTo(""); 135 predicate << fValue; 136 return B_OK; 137} 138 139// specializations for float and double 140template<> status_t ValueNode<float>::GetString(BString &predicate); 141template<> status_t ValueNode<double>::GetString(BString &predicate); 142 143 144// short hands 145typedef ValueNode<int32> Int32ValueNode; 146typedef ValueNode<uint32> UInt32ValueNode; 147typedef ValueNode<int64> Int64ValueNode; 148typedef ValueNode<uint64> UInt64ValueNode; 149typedef ValueNode<float> FloatValueNode; 150typedef ValueNode<double> DoubleValueNode; 151 152 153// SpecialOpNode 154class SpecialOpNode : public LeafNode { 155public: 156 SpecialOpNode(query_op op); 157 158 virtual status_t GetString(BString &predicate); 159 160private: 161 query_op fOp; 162}; 163 164// UnaryOpNode 165class UnaryOpNode : public UnaryNode { 166public: 167 UnaryOpNode(query_op op); 168 169 virtual status_t GetString(BString &predicate); 170 171private: 172 query_op fOp; 173}; 174 175// BinaryOpNode 176class BinaryOpNode : public BinaryNode { 177public: 178 BinaryOpNode(query_op op); 179 180 virtual status_t GetString(BString &predicate); 181 182private: 183 query_op fOp; 184}; 185 186 187// QueryStack 188class QueryStack { 189public: 190 QueryStack(); 191 virtual ~QueryStack(); 192 193 status_t PushNode(QueryNode *node); 194 QueryNode *PopNode(); 195 196 status_t ConvertToTree(QueryNode *&rootNode); 197 198private: 199 status_t _GetSubTree(QueryNode *&rootNode); 200 201private: 202 BList fNodes; 203}; 204 205}; // namespace Storage 206}; // namespace BPrivate 207 208#endif // _QUERY_PREDICATE_H 209 210 211