\file QueryPredicate.h
BQuery predicate helper classes interface declaration.
*/
#ifndef _QUERY_PREDICATE_H
#define _QUERY_PREDICATE_H
#include <stdio.h>
#include <List.h>
#include <Query.h>
#include <String.h>
namespace BPrivate {
namespace Storage {
class QueryNode {
public:
QueryNode();
virtual ~QueryNode();
virtual uint32 Arity() const = 0;
virtual status_t SetChildAt(QueryNode *child, int32 index) = 0;
virtual QueryNode *ChildAt(int32 index) = 0;
virtual status_t GetString(BString &predicate) = 0;
};
class LeafNode : public QueryNode {
public:
LeafNode();
virtual ~LeafNode();
virtual uint32 Arity() const;
virtual status_t SetChildAt(QueryNode *child, int32 index);
virtual QueryNode *ChildAt(int32 index);
};
class UnaryNode : public QueryNode {
public:
UnaryNode();
virtual ~UnaryNode();
virtual uint32 Arity() const;
virtual status_t SetChildAt(QueryNode *child, int32 index);
virtual QueryNode *ChildAt(int32 index);
protected:
QueryNode *fChild;
};
class BinaryNode : public QueryNode {
public:
BinaryNode();
virtual ~BinaryNode();
virtual uint32 Arity() const;
virtual status_t SetChildAt(QueryNode *child, int32 index);
virtual QueryNode *ChildAt(int32 index);
protected:
QueryNode *fChild1;
QueryNode *fChild2;
};
class AttributeNode : public LeafNode {
public:
AttributeNode(const char *attribute);
virtual status_t GetString(BString &predicate);
private:
BString fAttribute;
};
class StringNode : public LeafNode {
public:
StringNode(const char *value, bool caseInsensitive = false);
virtual status_t GetString(BString &predicate);
inline const char *Value() const { return fValue.String(); }
private:
BString fValue;
};
class DateNode : public LeafNode {
public:
DateNode(const char *value);
virtual status_t GetString(BString &predicate);
private:
BString fValue;
};
template<typename ValueType>
class ValueNode : public LeafNode {
public:
ValueNode(const ValueType &value);
virtual status_t GetString(BString &predicate);
private:
ValueType fValue;
};
template<typename ValueType>
ValueNode<ValueType>::ValueNode(const ValueType &value)
: LeafNode(),
fValue(value)
{
}
template<typename ValueType>
status_t
ValueNode<ValueType>::GetString(BString &predicate)
{
predicate.SetTo("");
predicate << fValue;
return B_OK;
}
template<> status_t ValueNode<float>::GetString(BString &predicate);
template<> status_t ValueNode<double>::GetString(BString &predicate);
typedef ValueNode<int32> Int32ValueNode;
typedef ValueNode<uint32> UInt32ValueNode;
typedef ValueNode<int64> Int64ValueNode;
typedef ValueNode<uint64> UInt64ValueNode;
typedef ValueNode<float> FloatValueNode;
typedef ValueNode<double> DoubleValueNode;
class SpecialOpNode : public LeafNode {
public:
SpecialOpNode(query_op op);
virtual status_t GetString(BString &predicate);
private:
query_op fOp;
};
class UnaryOpNode : public UnaryNode {
public:
UnaryOpNode(query_op op);
virtual status_t GetString(BString &predicate);
private:
query_op fOp;
};
class BinaryOpNode : public BinaryNode {
public:
BinaryOpNode(query_op op);
virtual status_t GetString(BString &predicate);
private:
query_op fOp;
};
class QueryStack {
public:
QueryStack();
virtual ~QueryStack();
status_t PushNode(QueryNode *node);
QueryNode *PopNode();
status_t ConvertToTree(QueryNode *&rootNode);
private:
status_t _GetSubTree(QueryNode *&rootNode);
private:
BList fNodes;
};
};
};
#endif