OpenDDS  Snapshot(2023/01/24-11:31)
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 MetaStruct &meta) const
 
template<typename T >
bool eval (const T &sample, const DDS::StringSeq &params) const
 
bool eval (ACE_Message_Block *serializedSample, bool swap_bytes, bool cdr_encap, const MetaStruct &meta, const DDS::StringSeq &params, Extensibility exten) const
 
- Public Member Functions inherited from OpenDDS::DCPS::RcObject
virtual ~RcObject ()
 
virtual void _add_ref ()
 
virtual void _remove_ref ()
 
long ref_count () const
 This accessor is purely for debugging purposes. More...
 
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 90 of file FilterEvaluator.h.

Constructor & Destructor Documentation

◆ FilterEvaluator() [1/3]

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

Definition at line 42 of file FilterEvaluator.cpp.

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

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

◆ FilterEvaluator() [2/3]

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

Definition at line 67 of file FilterEvaluator.cpp.

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

◆ ~FilterEvaluator()

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

Definition at line 153 of file FilterEvaluator.cpp.

References filter_root_.

154 {
155  delete filter_root_;
156 }

◆ 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 115 of file FilterEvaluator.h.

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

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

◆ eval() [2/2]

bool OpenDDS::DCPS::FilterEvaluator::eval ( ACE_Message_Block serializedSample,
bool  swap_bytes,
bool  cdr_encap,
const MetaStruct meta,
const DDS::StringSeq params,
Extensibility  exten 
) const
inline

Returns true if the serialized sample matches the filter.

Definition at line 124 of file FilterEvaluator.h.

127  {
128  SerializedForEval data(serializedSample, meta, params,
129  swap_bytes, cdr_encap, exten);
130  return eval_i(data);
131  }
bool eval_i(DataForEval &data) const

◆ 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 MetaStruct meta) const

Definition at line 158 of file FilterEvaluator.cpp.

References eval(), fieldName_, filter_root_, OpenDDS::DCPS::FilterEvaluator::EvalNode::has_non_key_fields(), OpenDDS::DCPS::MetaStruct::isDcpsKey(), 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().

159 {
160  for (OPENDDS_VECTOR(OPENDDS_STRING)::const_iterator i = order_bys_.begin(); i != order_bys_.end(); ++i) {
161  if (!meta.isDcpsKey(i->c_str())) {
162  return true;
163  }
164  }
165 
166  return filter_root_->has_non_key_fields(meta);
167 }
OPENDDS_VECTOR(OPENDDS_STRING) getOrderBys() const
#define OPENDDS_STRING
virtual bool has_non_key_fields(const MetaStruct &meta) const

◆ hasFilter()

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

Definition at line 564 of file FilterEvaluator.cpp.

References filter_root_.

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

565 {
566  return filter_root_ != 0;
567 }

◆ 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 105 of file FilterEvaluator.h.

◆ walkAst()

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

Definition at line 480 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().

481 {
482  if (node->TypeMatches<CompPredDef>()) {
483  Operand* left = walkOperand(child(node, 0));
484  const FilterEvaluator::AstNodeWrapper& op = child(node, 1);
485  Operand* right = walkOperand(child(node, 2));
486  if (left->isParameter() && right->isParameter()) {
487  extended_grammar_ = true;
488  }
489  return new Comparison(op, left, right);
490  } else if (node->TypeMatches<BetweenPredDef>()) {
491  Operand* field = walkOperand(child(node, 0));
492  const FilterEvaluator::AstNodeWrapper& op = child(node, 1);
493  Operand* low = walkOperand(child(node, 2));
494  Operand* high = walkOperand(child(node, 3));
495  return new Between(field, op, low, high);
496  } else if (node->TypeMatches<CondDef>() || node->TypeMatches<Cond>()) {
497  size_t a = arity(node);
498  if (a == 1) {
499  return walkAst(child(node, 0));
500  } else if (a == 2) {
501  OPENDDS_ASSERT(child(node, 0)->TypeMatches<NOT>());
502  return new Logical(walkAst(child(node, 1)));
503  } else if (a == 3) {
504  EvalNode* left = walkAst(child(node, 0));
505  const FilterEvaluator::AstNodeWrapper& op = child(node, 1);
506  EvalNode* right = walkAst(child(node, 2));
507  return new Logical(op, left, right);
508  }
509  }
510 
511  OPENDDS_ASSERT(0);
512  return 0;
513 }
static FilterEvaluator::AstNodeWrapper child(const FilterEvaluator::AstNodeWrapper &node, size_t idx)
#define OPENDDS_ASSERT(C)
Definition: Definitions.h:66
Operand * walkOperand(const AstNodeWrapper &node)
static size_t arity(const FilterEvaluator::AstNodeWrapper &node)
EvalNode * walkAst(const AstNodeWrapper &node)

◆ walkOperand()

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

Definition at line 516 of file FilterEvaluator.cpp.

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

Referenced by walkAst().

517 {
518  if (node->TypeMatches<FieldName>()) {
519  return new FieldLookup(node);
520  } else if (node->TypeMatches<IntVal>()) {
521  return new LiteralInt(node);
522  } else if (node->TypeMatches<CharVal>()) {
523  return new LiteralChar(node);
524  } else if (node->TypeMatches<FloatVal>()) {
525  return new LiteralFloat(node);
526  } else if (node->TypeMatches<StrVal>()) {
527  return new LiteralString(node);
528  } else if (node->TypeMatches<ParamVal>()) {
529  Parameter* retval = new Parameter(node);
530  // Keep track of the highest parameter number
531  if (retval->param() + 1 > number_parameters_) {
532  number_parameters_ = retval->param() + 1;
533  }
534  return retval;
535  } else if (node->TypeMatches<CallDef>()) {
536  if (arity(node) == 1) {
537  return walkOperand(child(node, 0));
538  } else {
539  extended_grammar_ = true;
540  Call* call = new Call(toString(child(node, 0)));
541  for (AstNode* iter = child(node, 1); iter != 0; iter = iter->GetSibling()) {
542  call->addChild(walkOperand(iter));
543  }
544  return call;
545  }
546  }
547  OPENDDS_ASSERT(0);
548  return 0;
549 }
static FilterEvaluator::AstNodeWrapper child(const FilterEvaluator::AstNodeWrapper &node, size_t idx)
OPENDDS_STRING toString(yard::TreeBuildingParser< char >::Node *iter)
#define OPENDDS_ASSERT(C)
Definition: Definitions.h:66
Operand * walkOperand(const AstNodeWrapper &node)
yard::TreeBuildingParser< char >::Node AstNode
static size_t arity(const FilterEvaluator::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 parameter 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: