QueryConditionImpl.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #include "DCPS/DdsDcps_pch.h"
00009
00010 #ifndef OPENDDS_NO_QUERY_CONDITION
00011 #include "QueryConditionImpl.h"
00012 #include "DataReaderImpl.h"
00013
00014 OPENDDS_BEGIN_VERSIONED_NAMESPACE_DECL
00015
00016 namespace OpenDDS {
00017 namespace DCPS {
00018
00019 QueryConditionImpl::QueryConditionImpl(
00020 DataReaderImpl* dr, DDS::SampleStateMask sample_states,
00021 DDS::ViewStateMask view_states, DDS::InstanceStateMask instance_states,
00022 const char* query_expression)
00023 : ReadConditionImpl(dr, sample_states, view_states, instance_states)
00024 , query_expression_(query_expression)
00025 , evaluator_(query_expression, true)
00026 {
00027 if (DCPS_debug_level > 5) {
00028 ACE_DEBUG((LM_DEBUG,
00029 ACE_TEXT("(%P|%t) QueryConditionImpl::QueryConditionImpl() - ")
00030 ACE_TEXT("Creating qc with query <%C> which requires <%d> parameters\n"),
00031 query_expression, evaluator_.number_parameters()));
00032 }
00033 }
00034
00035 char* QueryConditionImpl::get_query_expression()
00036 {
00037 return CORBA::string_dup(query_expression_);
00038 }
00039
00040 DDS::ReturnCode_t
00041 QueryConditionImpl::get_query_parameters(DDS::StringSeq& query_parameters)
00042 {
00043 ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex, guard, lock_, false);
00044 query_parameters = query_parameters_;
00045 return DDS::RETCODE_OK;
00046 }
00047
00048 DDS::ReturnCode_t
00049 QueryConditionImpl::set_query_parameters(const DDS::StringSeq& query_parameters)
00050 {
00051 ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex, guard, lock_, false);
00052
00053
00054
00055
00056
00057 if (query_parameters.length() != evaluator_.number_parameters()) {
00058 if (DCPS_debug_level > 1) {
00059 ACE_ERROR((LM_ERROR,
00060 ACE_TEXT("(%P|%t) QueryConditionImpl::set_expression_parameters() - ")
00061 ACE_TEXT("passed incorrect set of query parameters, expected %d received %d\n"),
00062 evaluator_.number_parameters (), query_parameters.length()));
00063 }
00064 return DDS::RETCODE_ERROR;
00065 }
00066
00067 query_parameters_ = query_parameters;
00068 return DDS::RETCODE_OK;
00069 }
00070
00071 std::vector<OPENDDS_STRING>
00072 QueryConditionImpl::getOrderBys() const
00073 {
00074 return evaluator_.getOrderBys();
00075 }
00076
00077 bool
00078 QueryConditionImpl::hasFilter() const
00079 {
00080 return evaluator_.hasFilter();
00081 }
00082
00083 CORBA::Boolean
00084 QueryConditionImpl::get_trigger_value()
00085 {
00086 if (hasFilter()) {
00087 ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex, guard2, parent_->sample_lock_, false);
00088 ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex, guard, lock_, false);
00089 return parent_->contains_sample_filtered(sample_states_, view_states_,
00090 instance_states_, evaluator_, query_parameters_);
00091 } else {
00092 return ReadConditionImpl::get_trigger_value();
00093 }
00094 }
00095
00096 }
00097 }
00098
00099 OPENDDS_END_VERSIONED_NAMESPACE_DECL
00100
00101 #endif // OPENDDS_NO_QUERY_CONDITION