OpenDDS  Snapshot(2023/04/28-20:55)
Classes | Public Member Functions | Private Member Functions | Private Attributes | List of all members
OpenDDS::DCPS::FilterEvaluator Class Reference

#include <FilterEvaluator.h>

Inheritance diagram for OpenDDS::DCPS::FilterEvaluator:
Inheritance graph
[legend]
Collaboration diagram for OpenDDS::DCPS::FilterEvaluator:
Collaboration graph
[legend]

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
 

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
 
size_t number_parameters () const
 
bool has_non_key_fields (const TypeSupportImpl &ts) const
 
template<typename T >
bool eval (const T &sample, const DDS::StringSeq &params) const
 
bool eval (ACE_Message_Block *serializedSample, Encoding encoding, const TypeSupportImpl &typeSupport, const DDS::StringSeq &params) const
 
- Public Member Functions inherited from OpenDDS::DCPS::RcObject
virtual ~RcObject ()
 
virtual void _add_ref ()
 
virtual void _remove_ref ()
 
long ref_count () const
 
WeakObject_get_weak_object () const
 

Private Member Functions

 FilterEvaluator (const FilterEvaluator &)
 
FilterEvaluatoroperator= (const FilterEvaluator &)
 
EvalNodewalkAst (const AstNodeWrapper &node)
 
OperandwalkOperand (const AstNodeWrapper &node)
 
bool eval_i (DataForEval &data) const
 
 OPENDDS_VECTOR (OPENDDS_STRING) order_bys_
 

Private Attributes

bool extended_grammar_
 
EvalNodefilter_root_
 
size_t number_parameters_
 

Additional Inherited Members

- Protected Member Functions inherited from OpenDDS::DCPS::RcObject
 RcObject ()
 

Detailed Description

Definition at line 91 of file FilterEvaluator.h.

Constructor & Destructor Documentation

◆ FilterEvaluator() [1/3]

OpenDDS::DCPS::FilterEvaluator::FilterEvaluator ( const char *  filter,
bool  allowOrderBy 
)

Definition at line 43 of file FilterEvaluator.cpp.

References filter_root_, OpenDDS::DCPS::reportErrors(), OpenDDS::DCPS::toString(), and walkAst().

44  : extended_grammar_(false)
45  , filter_root_(0)
47 {
48  const char* out = filter + std::strlen(filter);
49  yard::SimpleTextParser parser(filter, out);
50  if (!(allowOrderBy ? parser.Parse<QueryCompleteInput>()
51  : parser.Parse<FilterCompleteInput>())) {
52  reportErrors(parser, filter);
53  }
54 
55  bool found_order_by = false;
56  for (AstNode* iter = parser.GetAstRoot()->GetFirstChild(); iter;
57  iter = iter->GetSibling()) {
58  if (iter->TypeMatches<ORDERBY>()) {
59  found_order_by = true;
60  } else if (found_order_by && iter->TypeMatches<FieldName>()) {
61  order_bys_.push_back(toString(iter));
62  } else {
63  filter_root_ = walkAst(iter);
64  }
65  }
66 }
yard::TreeBuildingParser< char >::Node AstNode
OPENDDS_STRING toString(yard::TreeBuildingParser< char >::Node *iter)
EvalNode * walkAst(const AstNodeWrapper &node)
void reportErrors(yard::SimpleTextParser &parser, const char *input)
called after parsing has failed, throws std::exception with details

◆ FilterEvaluator() [2/3]

OpenDDS::DCPS::FilterEvaluator::FilterEvaluator ( const AstNodeWrapper yardNode)
explicit

Definition at line 68 of file FilterEvaluator.cpp.

69  : extended_grammar_(false)
70  , filter_root_(walkAst(yardNode))
72 {
73 }
EvalNode * walkAst(const AstNodeWrapper &node)

◆ ~FilterEvaluator()

OpenDDS::DCPS::FilterEvaluator::~FilterEvaluator ( )

Definition at line 165 of file FilterEvaluator.cpp.

References filter_root_.

166 {
167  delete filter_root_;
168 }

◆ FilterEvaluator() [3/3]

OpenDDS::DCPS::FilterEvaluator::FilterEvaluator ( const FilterEvaluator )
private

Member Function Documentation

◆ eval() [1/2]

template<typename T >
bool OpenDDS::DCPS::FilterEvaluator::eval ( const T &  sample,
const DDS::StringSeq params 
) const
inline

Returns true if the unserialized sample matches the filter.

Definition at line 116 of file FilterEvaluator.h.

Referenced by OpenDDS::DCPS::DataReaderImpl_T< DynamicSample >::contains_sample_filtered(), OpenDDS::XTypes::DynamicSample::eval(), OpenDDS::DCPS::Sample_T< NativeType >::eval(), OpenDDS::DCPS::DataWriterImpl::filter_out(), OpenDDS::DCPS::FilterEvaluator::EvalNode::has_non_key_fields(), and has_non_key_fields().

117  {
118  DeserializedForEval data(&sample, getMetaStruct<T>(), params);
119  return eval_i(data);
120  }
bool eval_i(DataForEval &data) const

◆ eval() [2/2]

bool OpenDDS::DCPS::FilterEvaluator::eval ( ACE_Message_Block serializedSample,
Encoding  encoding,
const TypeSupportImpl typeSupport,
const DDS::StringSeq params 
) const
inline

Returns true if the serialized sample matches the filter.

Definition at line 125 of file FilterEvaluator.h.

128  {
129  SerializedForEval data(serializedSample, typeSupport, params, encoding);
130  return eval_i(data);
131  }
bool eval_i(DataForEval &data) const
const DCPS::Encoding encoding(DCPS::Encoding::KIND_UNALIGNED_CDR, DCPS::ENDIAN_BIG)

◆ eval_i()

bool OpenDDS::DCPS::FilterEvaluator::eval_i ( DataForEval data) const
private

◆ has_non_key_fields()

bool OpenDDS::DCPS::FilterEvaluator::has_non_key_fields ( const TypeSupportImpl ts) const

Definition at line 170 of file FilterEvaluator.cpp.

References eval(), fieldName_, filter_root_, OpenDDS::DCPS::FilterEvaluator::EvalNode::has_non_key_fields(), OpenDDS::DCPS::TypeSupportImpl::is_dcps_key(), OpenDDS::DCPS::FilterEvaluator::DataForEval::lookup(), OPENDDS_STRING, OPENDDS_VECTOR(), and OpenDDS::DCPS::toString().

Referenced by OpenDDS::DCPS::DataReaderImpl_T< DynamicSample >::contains_sample_filtered(), and OpenDDS::DCPS::DataWriterImpl::filter_out().

171 {
172  for (OPENDDS_VECTOR(OPENDDS_STRING)::const_iterator i = order_bys_.begin(); i != order_bys_.end(); ++i) {
173  if (!ts.is_dcps_key(i->c_str())) {
174  return true;
175  }
176  }
177 
178  return filter_root_->has_non_key_fields(ts);
179 }
virtual bool has_non_key_fields(const TypeSupportImpl &ts) const
#define OPENDDS_STRING
OPENDDS_VECTOR(OPENDDS_STRING) getOrderBys() const

◆ hasFilter()

bool OpenDDS::DCPS::FilterEvaluator::hasFilter ( ) const

Definition at line 576 of file FilterEvaluator.cpp.

References filter_root_.

Referenced by OpenDDS::DCPS::QueryConditionImpl::hasFilter().

577 {
578  return filter_root_ != 0;
579 }

◆ number_parameters()

size_t OpenDDS::DCPS::FilterEvaluator::number_parameters ( ) const
inline

◆ OPENDDS_VECTOR() [1/2]

OpenDDS::DCPS::FilterEvaluator::OPENDDS_VECTOR ( OPENDDS_STRING  ) const

◆ OPENDDS_VECTOR() [2/2]

OpenDDS::DCPS::FilterEvaluator::OPENDDS_VECTOR ( OPENDDS_STRING  )
private

◆ operator=()

FilterEvaluator& OpenDDS::DCPS::FilterEvaluator::operator= ( const FilterEvaluator )
private

◆ usesExtendedGrammar()

bool OpenDDS::DCPS::FilterEvaluator::usesExtendedGrammar ( ) const
inline

Definition at line 106 of file FilterEvaluator.h.

◆ walkAst()

FilterEvaluator::EvalNode * OpenDDS::DCPS::FilterEvaluator::walkAst ( const AstNodeWrapper node)
private

Definition at line 492 of file FilterEvaluator.cpp.

References OpenDDS::DCPS::arity(), OpenDDS::DCPS::child(), extended_grammar_, OpenDDS::DCPS::FilterEvaluator::Operand::isParameter(), OPENDDS_ASSERT, and walkOperand().

Referenced by FilterEvaluator().

493 {
494  if (node->TypeMatches<CompPredDef>()) {
495  Operand* left = walkOperand(child(node, 0));
496  const FilterEvaluator::AstNodeWrapper& op = child(node, 1);
497  Operand* right = walkOperand(child(node, 2));
498  if (left->isParameter() && right->isParameter()) {
499  extended_grammar_ = true;
500  }
501  return new Comparison(op, left, right);
502  } else if (node->TypeMatches<BetweenPredDef>()) {
503  Operand* field = walkOperand(child(node, 0));
504  const FilterEvaluator::AstNodeWrapper& op = child(node, 1);
505  Operand* low = walkOperand(child(node, 2));
506  Operand* high = walkOperand(child(node, 3));
507  return new Between(field, op, low, high);
508  } else if (node->TypeMatches<CondDef>() || node->TypeMatches<Cond>()) {
509  size_t a = arity(node);
510  if (a == 1) {
511  return walkAst(child(node, 0));
512  } else if (a == 2) {
513  OPENDDS_ASSERT(child(node, 0)->TypeMatches<NOT>());
514  return new Logical(walkAst(child(node, 1)));
515  } else if (a == 3) {
516  EvalNode* left = walkAst(child(node, 0));
517  const FilterEvaluator::AstNodeWrapper& op = child(node, 1);
518  EvalNode* right = walkAst(child(node, 2));
519  return new Logical(op, left, right);
520  }
521  }
522 
523  OPENDDS_ASSERT(0);
524  return 0;
525 }
#define OPENDDS_ASSERT(C)
Definition: Definitions.h:72
static FilterEvaluator::AstNodeWrapper child(const FilterEvaluator::AstNodeWrapper &node, size_t idx)
EvalNode * walkAst(const AstNodeWrapper &node)
static size_t arity(const FilterEvaluator::AstNodeWrapper &node)
Operand * walkOperand(const AstNodeWrapper &node)

◆ walkOperand()

FilterEvaluator::Operand * OpenDDS::DCPS::FilterEvaluator::walkOperand ( const AstNodeWrapper node)
private

Definition at line 528 of file FilterEvaluator.cpp.

References OpenDDS::DCPS::arity(), OpenDDS::DCPS::child(), extended_grammar_, number_parameters_, OPENDDS_ASSERT, and OpenDDS::DCPS::toString().

Referenced by walkAst().

529 {
530  if (node->TypeMatches<FieldName>()) {
531  return new FieldLookup(node);
532  } else if (node->TypeMatches<IntVal>()) {
533  return new LiteralInt(node);
534  } else if (node->TypeMatches<CharVal>()) {
535  return new LiteralChar(node);
536  } else if (node->TypeMatches<FloatVal>()) {
537  return new LiteralFloat(node);
538  } else if (node->TypeMatches<StrVal>()) {
539  return new LiteralString(node);
540  } else if (node->TypeMatches<ParamVal>()) {
541  Parameter* retval = new Parameter(node);
542  // Keep track of the highest parameter number
543  if (retval->param() + 1 > number_parameters_) {
544  number_parameters_ = retval->param() + 1;
545  }
546  return retval;
547  } else if (node->TypeMatches<CallDef>()) {
548  if (arity(node) == 1) {
549  return walkOperand(child(node, 0));
550  } else {
551  extended_grammar_ = true;
552  Call* call = new Call(toString(child(node, 0)));
553  for (AstNode* iter = child(node, 1); iter != 0; iter = iter->GetSibling()) {
554  call->addChild(walkOperand(iter));
555  }
556  return call;
557  }
558  }
559  OPENDDS_ASSERT(0);
560  return 0;
561 }
yard::TreeBuildingParser< char >::Node AstNode
#define OPENDDS_ASSERT(C)
Definition: Definitions.h:72
static FilterEvaluator::AstNodeWrapper child(const FilterEvaluator::AstNodeWrapper &node, size_t idx)
OPENDDS_STRING toString(yard::TreeBuildingParser< char >::Node *iter)
static size_t arity(const FilterEvaluator::AstNodeWrapper &node)
Operand * walkOperand(const AstNodeWrapper &node)

Member Data Documentation

◆ extended_grammar_

bool OpenDDS::DCPS::FilterEvaluator::extended_grammar_
private

Definition at line 177 of file FilterEvaluator.h.

Referenced by walkAst(), and walkOperand().

◆ filter_root_

EvalNode* OpenDDS::DCPS::FilterEvaluator::filter_root_
private

◆ number_parameters_

size_t OpenDDS::DCPS::FilterEvaluator::number_parameters_
private

Number of parameters used in the filter, this should match the number of values passed when evaluating the filter

Definition at line 182 of file FilterEvaluator.h.

Referenced by walkOperand().


The documentation for this class was generated from the following files: