@@ -37,11 +37,11 @@ namespace mtconnect::pipeline {
3737 public:
3838 Validator (const Validator &) = default ;
3939 Validator (PipelineContextPtr context)
40- : Transform(" Validator" ), m_contract(context->m_contract.get())
40+ : Transform(" Validator" ), m_contract(context->m_contract.get())
4141 {
4242 m_guard = TypeGuard<observation::Observation>(RUN) || TypeGuard<entity::Entity>(SKIP);
4343 }
44-
44+
4545 // / @brief validate the Event
4646 // / @param entity The Event entity
4747 // / @returns modified entity with quality and deprecated properties
@@ -50,78 +50,78 @@ namespace mtconnect::pipeline {
5050 using namespace observation ;
5151 using namespace mtconnect ::validation::observations;
5252 auto obs = std::dynamic_pointer_cast<Observation>(entity);
53-
53+ auto &value = obs->getValue ();
54+
55+ bool valid = true ;
5456 auto di = obs->getDataItem ();
55- if (obs->isUnavailable () || di->isDataSet ())
56- {
57- obs->setProperty (" quality" , std::string (" VALID" ));
58- }
59- else if (auto evt = std::dynamic_pointer_cast<observation::Event>(obs))
57+ if (!obs->isUnavailable () && !di->isDataSet ())
6058 {
61- auto &value = evt->getValue <std::string>();
62-
63- // Optimize
64- auto vocab = ControlledVocabularies.find (evt->getName ());
65- if (vocab != ControlledVocabularies.end ())
59+ if (auto evt = std::dynamic_pointer_cast<observation::Event>(obs))
6660 {
67- auto &lits = vocab-> second ;
68- if (lits. size () != 0 )
61+ auto vocab = ControlledVocabularies. find (evt-> getName ()) ;
62+ if (vocab != ControlledVocabularies. end () )
6963 {
70- auto lit = lits.find (value);
71- if (lit != lits.end ())
64+ auto sv = std::get_if<std::string>(&value);
65+ auto &lits = vocab->second ;
66+ if (lits.size () != 0 && sv != nullptr )
7267 {
73- // Check if it has not been introduced yet
74- if (lit-> second . first > 0 && m_contract-> getSchemaVersion () < lit-> second . first )
68+ auto lit = lits. find (*sv);
69+ if (lit != lits. end () )
7570 {
76- evt->setProperty (" quality" , std::string (" INVALID" ));
71+ // Check if it has not been introduced yet
72+ if (lit->second .first > 0 && m_contract->getSchemaVersion () < lit->second .first )
73+ valid = false ;
74+
75+ // Check if deprecated
76+ if (lit->second .second > 0 && m_contract->getSchemaVersion () >= lit->second .second )
77+ {
78+ evt->setProperty (" deprecated" , true );
79+ }
7780 }
7881 else
7982 {
80- evt->setProperty (" quality" , std::string (" VALID" ));
81- }
82-
83- // Check if deprecated
84- if (lit->second .second > 0 && m_contract->getSchemaVersion () >= lit->second .second )
85- {
86- evt->setProperty (" deprecated" , true );
83+ valid = false ;
8784 }
8885 }
89- else
86+ else if (lits. size () != 0 )
9087 {
91- evt->setProperty (" quality" , std::string (" INVALID" ));
92- // Log once
93- auto &id = di->getId ();
94- if (m_logOnce.count (id) < 1 )
95- {
96- LOG (warning) << " DataItem '" << id << " ': Invalid value for '" << evt->getName ()
97- << " ': '" << evt->getValue <std::string>() << ' \' ' ;
98- m_logOnce.insert (id);
99- }
100- else
101- {
102- LOG (trace) << " DataItem '" << id << " ': Invalid value for '" << evt->getName ()
103- << " ': '" << evt->getValue <std::string>() << ' \' ' ;
104- }
88+ valid = false ;
10589 }
10690 }
10791 else
10892 {
109- evt->setProperty (" quality" , std::string (" VALID " ));
93+ evt->setProperty (" quality" , std::string (" UNVERIFIABLE " ));
11094 }
11195 }
112- else
96+ else if ( auto spl = std::dynamic_pointer_cast<observation::Sample>(obs))
11397 {
114- evt->setProperty (" quality" , std::string (" UNVERIFIABLE" ));
98+ if (!(spl->hasProperty (" quality" ) || std::holds_alternative<double >(value) ||
99+ std::holds_alternative<int64_t >(value)))
100+ valid = false ;
115101 }
116102 }
117- else if (auto spl = std::dynamic_pointer_cast<observation::Sample>(obs))
103+
104+ if (!valid)
118105 {
106+ obs->setProperty (" quality" , std::string (" INVALID" ));
107+ // Log once
108+ auto &id = di->getId ();
109+ if (m_logOnce.count (id) < 1 )
110+ {
111+ LOG (warning) << " DataItem '" << id << " ': Invalid value for '" << obs->getName ()
112+ << " ': '" << value << ' \' ' ;
113+ m_logOnce.insert (id);
114+ }
115+ else
116+ {
117+ LOG (trace) << " DataItem '" << id << " ': Invalid value for '" << obs->getName ();
118+ }
119119 }
120- else
120+ else if (!obs-> hasProperty ( " quality " ))
121121 {
122122 obs->setProperty (" quality" , std::string (" VALID" ));
123123 }
124-
124+
125125 return next (std::move (obs));
126126 }
127127
0 commit comments