#include <FilterEvaluator.h>
Inheritance diagram for OpenDDS::DCPS::FilterEvaluator:
Public Member Functions | |
FilterEvaluator (const char *filter, bool allowOrderBy) | |
FilterEvaluator (const AstNodeWrapper &yardNode) | |
~FilterEvaluator () | |
OPENDDS_VECTOR (OPENDDS_STRING) getOrderBys() const | |
bool | hasFilter () const |
bool | usesExtendedGrammar () const |
template<typename T> | |
bool | eval (const T &sample, const DDS::StringSeq ¶ms) const |
bool | eval (ACE_Message_Block *serializedSample, bool swap_bytes, bool cdr_encap, const MetaStruct &meta, const DDS::StringSeq ¶ms) const |
Private Member Functions | |
FilterEvaluator (const FilterEvaluator &) | |
FilterEvaluator & | operator= (const FilterEvaluator &) |
EvalNode * | walkAst (const AstNodeWrapper &node) |
Operand * | walkOperand (const AstNodeWrapper &node) |
bool | eval_i (DataForEval &data) const |
OPENDDS_VECTOR (OPENDDS_STRING) order_bys_ | |
Private Attributes | |
bool | extended_grammar_ |
EvalNode * | filter_root_ |
Classes | |
struct | AstNodeWrapper |
keeps the details of yard out of the FilterEvaluator header file More... | |
struct | DataForEval |
struct | DeserializedForEval |
class | EvalNode |
class | Operand |
struct | SerializedForEval |
Definition at line 74 of file FilterEvaluator.h.
OpenDDS::DCPS::FilterEvaluator::FilterEvaluator | ( | const char * | filter, | |
bool | allowOrderBy | |||
) |
Definition at line 41 of file FilterEvaluator.cpp.
References filter_root_, FACE::TS::parser, OpenDDS::DCPS::reportErrors(), OpenDDS::DCPS::toString(), and walkAst().
00042 : extended_grammar_(false) 00043 , filter_root_(0) 00044 { 00045 const char* out = filter + std::strlen(filter); 00046 yard::SimpleTextParser parser(filter, out); 00047 if (!(allowOrderBy ? parser.Parse<QueryCompleteInput>() 00048 : parser.Parse<FilterCompleteInput>())) { 00049 reportErrors(parser, filter); 00050 } 00051 00052 bool found_order_by = false; 00053 for (AstNode* iter = parser.GetAstRoot()->GetFirstChild(); iter; 00054 iter = iter->GetSibling()) { 00055 if (iter->TypeMatches<ORDERBY>()) { 00056 found_order_by = true; 00057 } else if (found_order_by && iter->TypeMatches<FieldName>()) { 00058 order_bys_.push_back(toString(iter)); 00059 } else { 00060 filter_root_ = walkAst(iter); 00061 } 00062 } 00063 }
OpenDDS::DCPS::FilterEvaluator::FilterEvaluator | ( | const AstNodeWrapper & | yardNode | ) | [explicit] |
Definition at line 65 of file FilterEvaluator.cpp.
00066 : extended_grammar_(false) 00067 , filter_root_(walkAst(yardNode)) 00068 { 00069 }
OpenDDS::DCPS::FilterEvaluator::~FilterEvaluator | ( | ) |
Definition at line 133 of file FilterEvaluator.cpp.
References filter_root_.
00134 { 00135 delete filter_root_; 00136 }
OpenDDS::DCPS::FilterEvaluator::FilterEvaluator | ( | const FilterEvaluator & | ) | [private] |
bool OpenDDS::DCPS::FilterEvaluator::eval | ( | ACE_Message_Block * | serializedSample, | |
bool | swap_bytes, | |||
bool | cdr_encap, | |||
const MetaStruct & | meta, | |||
const DDS::StringSeq & | params | |||
) | const [inline] |
Definition at line 98 of file FilterEvaluator.h.
00101 { 00102 SerializedForEval data(serializedSample, meta, params, 00103 swap_bytes, cdr_encap); 00104 return eval_i(data); 00105 }
bool OpenDDS::DCPS::FilterEvaluator::eval | ( | const T & | sample, | |
const DDS::StringSeq & | params | |||
) | const [inline] |
Definition at line 92 of file FilterEvaluator.h.
Referenced by OpenDDS::DCPS::DataReaderImpl_T< MessageType >::contains_sample_filtered(), and OpenDDS::DCPS::DataWriterImpl::filter_out().
00093 { 00094 DeserializedForEval data(&sample, getMetaStruct<T>(), params); 00095 return eval_i(data); 00096 }
bool OpenDDS::DCPS::FilterEvaluator::eval_i | ( | DataForEval & | data | ) | const [private] |
Definition at line 497 of file FilterEvaluator.cpp.
References OpenDDS::DCPS::Value::b_, OpenDDS::DCPS::FilterEvaluator::EvalNode::eval(), and filter_root_.
00498 { 00499 return filter_root_->eval(data).b_; 00500 }
bool OpenDDS::DCPS::FilterEvaluator::hasFilter | ( | ) | const |
Definition at line 509 of file FilterEvaluator.cpp.
References filter_root_.
Referenced by OpenDDS::DCPS::QueryConditionImpl::hasFilter().
00510 { 00511 return filter_root_ != 0; 00512 }
OpenDDS::DCPS::FilterEvaluator::OPENDDS_VECTOR | ( | OPENDDS_STRING | ) | [private] |
OpenDDS::DCPS::FilterEvaluator::OPENDDS_VECTOR | ( | OPENDDS_STRING | ) | const |
FilterEvaluator& OpenDDS::DCPS::FilterEvaluator::operator= | ( | const FilterEvaluator & | ) | [private] |
bool OpenDDS::DCPS::FilterEvaluator::usesExtendedGrammar | ( | ) | const [inline] |
FilterEvaluator::EvalNode * OpenDDS::DCPS::FilterEvaluator::walkAst | ( | const AstNodeWrapper & | node | ) | [private] |
Definition at line 430 of file FilterEvaluator.cpp.
References OpenDDS::DCPS::arity(), OpenDDS::DCPS::child(), extended_grammar_, OpenDDS::DCPS::FilterEvaluator::Operand::isParameter(), and walkOperand().
Referenced by FilterEvaluator().
00431 { 00432 if (node->TypeMatches<CompPredDef>()) { 00433 Operand* left = walkOperand(child(node, 0)); 00434 const FilterEvaluator::AstNodeWrapper& op = child(node, 1); 00435 Operand* right = walkOperand(child(node, 2)); 00436 if (left->isParameter() && right->isParameter()) { 00437 extended_grammar_ = true; 00438 } 00439 return new Comparison(op, left, right); 00440 } else if (node->TypeMatches<BetweenPredDef>()) { 00441 Operand* field = walkOperand(child(node, 0)); 00442 const FilterEvaluator::AstNodeWrapper& op = child(node, 1); 00443 Operand* low = walkOperand(child(node, 2)); 00444 Operand* high = walkOperand(child(node, 3)); 00445 return new Between(field, op, low, high); 00446 } else if (node->TypeMatches<CondDef>() || node->TypeMatches<Cond>()) { 00447 size_t a = arity(node); 00448 if (a == 1) { 00449 return walkAst(child(node, 0)); 00450 } else if (a == 2) { 00451 assert(child(node, 0)->TypeMatches<NOT>()); 00452 return new Logical(walkAst(child(node, 1))); 00453 } else if (a == 3) { 00454 EvalNode* left = walkAst(child(node, 0)); 00455 const FilterEvaluator::AstNodeWrapper& op = child(node, 1); 00456 EvalNode* right = walkAst(child(node, 2)); 00457 return new Logical(op, left, right); 00458 } 00459 } 00460 00461 assert(0); 00462 return 0; 00463 }
FilterEvaluator::Operand * OpenDDS::DCPS::FilterEvaluator::walkOperand | ( | const AstNodeWrapper & | node | ) | [private] |
Definition at line 466 of file FilterEvaluator.cpp.
References OpenDDS::DCPS::arity(), OpenDDS::DCPS::child(), extended_grammar_, and OpenDDS::DCPS::toString().
Referenced by walkAst().
00467 { 00468 if (node->TypeMatches<FieldName>()) { 00469 return new FieldLookup(node); 00470 } else if (node->TypeMatches<IntVal>()) { 00471 return new LiteralInt(node); 00472 } else if (node->TypeMatches<CharVal>()) { 00473 return new LiteralChar(node); 00474 } else if (node->TypeMatches<FloatVal>()) { 00475 return new LiteralFloat(node); 00476 } else if (node->TypeMatches<StrVal>()) { 00477 return new LiteralString(node); 00478 } else if (node->TypeMatches<ParamVal>()) { 00479 return new Parameter(node); 00480 } else if (node->TypeMatches<CallDef>()) { 00481 if (arity(node) == 1) { 00482 return walkOperand(child(node, 0)); 00483 } else { 00484 extended_grammar_ = true; 00485 Call* call = new Call(toString(child(node, 0))); 00486 for (AstNode* iter = child(node, 1); iter != 0; iter = iter->GetSibling()) { 00487 call->addChild(walkOperand(iter)); 00488 } 00489 return call; 00490 } 00491 } 00492 assert(0); 00493 return 0; 00494 }
bool OpenDDS::DCPS::FilterEvaluator::extended_grammar_ [private] |
Definition at line 151 of file FilterEvaluator.h.
Referenced by eval_i(), FilterEvaluator(), hasFilter(), and ~FilterEvaluator().