QueryConditionImpl.cpp

Go to the documentation of this file.
00001 /*
00002  *
00003  *
00004  * Distributed under the OpenDDS License.
00005  * See: http://www.opendds.org/license.html
00006  */
00007 
00008 #include "DCPS/DdsDcps_pch.h" //Only the _pch include should start with DCPS/
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   // Check sequence of strings that give values to the ‘parameters’ (i.e., "%n" tokens)
00054   // in the query_expression matches the size of the parameter sequence.
00055   // The tokens start with 0 which means that when the maximum number used is 1 we need
00056   // two parameters, (zero and one)
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 } // namespace DCPS
00097 } // namespace OpenDDS
00098 
00099 OPENDDS_END_VERSIONED_NAMESPACE_DECL
00100 
00101 #endif // OPENDDS_NO_QUERY_CONDITION
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

Generated on 10 Aug 2018 for OpenDDS by  doxygen 1.6.1