xref: /haiku/headers/private/storage/QueryPredicate.h (revision 268f99dd7dc4bd7474a8bd2742d3f1ec1de6752a)
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)12352a38012Sejakowatz ValueNode<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)13252a38012Sejakowatz ValueNode<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