Skip to content

Commit bbbc825

Browse files
juanlofer-eprosimamergify[bot]
authored andcommitted
Support aliases in Content Filtered Topic (#6032)
* Refs #23689. Regression test Signed-off-by: Juan Lopez Fernandez <[email protected]> * Refs #23689. Support aliases in Content Filtered Topic Signed-off-by: Juan Lopez Fernandez <[email protected]> * Refs #23689. Update versions.md Signed-off-by: Juan Lopez Fernandez <[email protected]> * Refs #23689. Uncrustify Signed-off-by: Juan Lopez Fernandez <[email protected]> * Refs #23689. Beautify Signed-off-by: Juan Lopez Fernandez <[email protected]> * Refs #23689. Apply suggestion Signed-off-by: Juan Lopez Fernandez <[email protected]> --------- Signed-off-by: Juan Lopez Fernandez <[email protected]> (cherry picked from commit 3af813b) # Conflicts: # src/cpp/fastdds/topic/DDSSQLFilter/DDSFilterExpressionParserImpl/identifiers.hpp # src/cpp/fastdds/topic/DDSSQLFilter/DDSFilterField.cpp # test/unittest/dds/topic/DDSSQLFilter/data_types/ContentFilterTestType.h # test/unittest/dds/topic/DDSSQLFilter/data_types/ContentFilterTestTypeCdrAux.hpp # test/unittest/dds/topic/DDSSQLFilter/data_types/ContentFilterTestTypeCdrAux.ipp # test/unittest/dds/topic/DDSSQLFilter/data_types/ContentFilterTestTypePubSubTypes.hpp # test/unittest/dds/topic/DDSSQLFilter/data_types/ContentFilterTestTypeTypeObjectSupport.cxx # test/unittest/dds/topic/DDSSQLFilter/data_types/ContentFilterTestTypeTypeObjectSupport.hpp # versions.md
1 parent 2868bde commit bbbc825

File tree

11 files changed

+6445
-171
lines changed

11 files changed

+6445
-171
lines changed

src/cpp/fastdds/topic/DDSSQLFilter/DDSFilterExpressionParserImpl/identifiers.hpp

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,47 @@ struct identifier_processor
4848
return process_bound(bound_seq[0]);
4949
}
5050

51+
static std::shared_ptr<xtypes::TypeIdentifier> resolve_type(
52+
const xtypes::TypeIdentifier& ti,
53+
const position& pos)
54+
{
55+
if (xtypes::EK_COMPLETE != ti._d())
56+
{
57+
return std::make_shared<xtypes::TypeIdentifier>(ti);
58+
}
59+
60+
std::shared_ptr<xtypes::TypeObject> type_object = std::make_shared<xtypes::TypeObject>();
61+
if (RETCODE_OK == DomainParticipantFactory::get_instance()->type_object_registry().get_type_object(
62+
ti, *type_object) && xtypes::EK_COMPLETE == type_object->_d())
63+
{
64+
if (xtypes::TK_ALIAS == type_object->complete()._d())
65+
{
66+
const xtypes::TypeIdentifier& aliased_id =
67+
type_object->complete().alias_type().body().common().related_type();
68+
return resolve_type(aliased_id, pos);
69+
}
70+
return std::make_shared<xtypes::TypeIdentifier>(ti);
71+
}
72+
throw parse_error("could not find type object definition", pos);
73+
}
74+
5175
static bool type_should_be_indexed(
76+
<<<<<<< HEAD
5277
const TypeIdentifier& ti,
5378
const TypeIdentifier*& out_type,
5479
size_t& max_size)
80+
=======
81+
const xtypes::TypeIdentifier& ti,
82+
std::shared_ptr<xtypes::TypeIdentifier>& out_type,
83+
size_t& max_size,
84+
const position& pos)
85+
>>>>>>> 3af813b0 (Support aliases in Content Filtered Topic (#6032))
5586
{
5687
max_size = 0;
5788

5889
switch (ti._d())
5990
{
91+
<<<<<<< HEAD
6092
case TI_PLAIN_ARRAY_SMALL:
6193
out_type = ti.array_sdefn().element_identifier();
6294
max_size = process_bounds(ti.array_sdefn().array_bound_seq());
@@ -74,6 +106,25 @@ struct identifier_processor
74106

75107
case TI_PLAIN_SEQUENCE_LARGE:
76108
out_type = ti.seq_ldefn().element_identifier();
109+
=======
110+
case xtypes::TI_PLAIN_ARRAY_SMALL:
111+
out_type = resolve_type(*ti.array_sdefn().element_identifier(), pos);
112+
max_size = process_bounds(ti.array_sdefn().array_bound_seq());
113+
return true;
114+
115+
case xtypes::TI_PLAIN_ARRAY_LARGE:
116+
out_type = resolve_type(*ti.array_ldefn().element_identifier(), pos);
117+
max_size = process_bounds(ti.array_ldefn().array_bound_seq());
118+
return true;
119+
120+
case xtypes::TI_PLAIN_SEQUENCE_SMALL:
121+
out_type = resolve_type(*ti.seq_sdefn().element_identifier(), pos);
122+
max_size = process_bound(ti.seq_sdefn().bound());
123+
return true;
124+
125+
case xtypes::TI_PLAIN_SEQUENCE_LARGE:
126+
out_type = resolve_type(*ti.seq_ldefn().element_identifier(), pos);
127+
>>>>>>> 3af813b0 (Support aliases in Content Filtered Topic (#6032))
77128
max_size = process_bound(ti.seq_ldefn().bound());
78129
return true;
79130
}
@@ -109,11 +160,15 @@ struct identifier_processor
109160
throw parse_error("field not found", name_node.begin());
110161
}
111162

163+
<<<<<<< HEAD
112164
const TypeIdentifier& ti = members[member_index].common().member_type_id();
165+
=======
166+
auto ti = resolve_type(members[member_index].common().member_type_id(), name_node.begin());
167+
>>>>>>> 3af813b0 (Support aliases in Content Filtered Topic (#6032))
113168
bool has_index = n->children.size() > 1;
114169
size_t max_size = 0;
115170
size_t array_index = std::numeric_limits<size_t>::max();
116-
if (type_should_be_indexed(ti, identifier_state.current_type, max_size))
171+
if (type_should_be_indexed(*ti, identifier_state.current_type, max_size, name_node.begin()))
117172
{
118173
if (!has_index)
119174
{
@@ -178,7 +233,15 @@ struct identifier_processor
178233
const TypeObject* type_object = TypeObjectFactory::get_instance()->get_type_object(&ti);
179234
if (TK_ENUM == type_object->complete()._d())
180235
{
236+
<<<<<<< HEAD
181237
return DDSFilterValue::ValueKind::ENUM;
238+
=======
239+
assert(xtypes::TK_ALIAS != type_object->complete()._d()); // should be resolved already at this point
240+
if (xtypes::TK_ENUM == type_object->complete()._d())
241+
{
242+
return DDSFilterValue::ValueKind::ENUM;
243+
}
244+
>>>>>>> 3af813b0 (Support aliases in Content Filtered Topic (#6032))
182245
}
183246
if (TK_ALIAS == type_object->complete()._d())
184247
{
@@ -201,6 +264,11 @@ struct identifier_processor
201264
{
202265
if (n->is<fieldname>())
203266
{
267+
if (!state.current_type)
268+
{
269+
throw parse_error("undefined type identifier", n->begin());
270+
}
271+
204272
// Set data for fieldname node
205273
n->field_kind = get_value_kind(*state.current_type, n->end());
206274
n->field_access_path = state.access_path;
@@ -214,6 +282,10 @@ struct identifier_processor
214282
{
215283
if (nullptr == state.current_type)
216284
{
285+
if (!state.type_object)
286+
{
287+
throw parse_error("undefined type object", n->begin());
288+
}
217289
add_member_access(n, state, state.type_object->complete());
218290
}
219291
else

src/cpp/fastdds/topic/DDSSQLFilter/DDSFilterField.cpp

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,10 +180,110 @@ bool DDSFilterField::set_value(
180180
ret = false;
181181
break;
182182
}
183+
<<<<<<< HEAD
183184
}
184185
catch (...)
185186
{
186187
ret = false;
188+
=======
189+
break;
190+
191+
case eprosima::fastdds::dds::xtypes::TK_INT8:
192+
{
193+
int8_t value8 {0};
194+
ret = RETCODE_OK == data->get_int8_value(value8, member_id);
195+
signed_integer_value = value8;
196+
}
197+
break;
198+
199+
case eprosima::fastdds::dds::xtypes::TK_INT16:
200+
{
201+
int16_t value16 {0};
202+
ret = RETCODE_OK == data->get_int16_value(value16, member_id);
203+
signed_integer_value = value16;
204+
}
205+
break;
206+
207+
case eprosima::fastdds::dds::xtypes::TK_INT32:
208+
{
209+
int32_t value32 {0};
210+
ret = RETCODE_OK == data->get_int32_value(value32, member_id);
211+
signed_integer_value = value32;
212+
}
213+
break;
214+
215+
case eprosima::fastdds::dds::xtypes::TK_INT64:
216+
ret = RETCODE_OK == data->get_int64_value(signed_integer_value, member_id);
217+
break;
218+
219+
case eprosima::fastdds::dds::xtypes::TK_BYTE:
220+
{
221+
fastdds::rtps::octet byte {0};
222+
ret = RETCODE_OK == data->get_byte_value(byte, member_id);
223+
unsigned_integer_value = byte;
224+
}
225+
break;
226+
227+
case eprosima::fastdds::dds::xtypes::TK_UINT8:
228+
{
229+
uint8_t valueu8 {0};
230+
ret = RETCODE_OK == data->get_uint8_value(valueu8, member_id);
231+
unsigned_integer_value = valueu8;
232+
}
233+
break;
234+
235+
case eprosima::fastdds::dds::xtypes::TK_UINT16:
236+
{
237+
uint16_t valueu16 {0};
238+
ret = RETCODE_OK == data->get_uint16_value(valueu16, member_id);
239+
unsigned_integer_value = valueu16;
240+
}
241+
break;
242+
243+
case eprosima::fastdds::dds::xtypes::TK_UINT32:
244+
{
245+
uint32_t valueu32 {0};
246+
ret = RETCODE_OK == data->get_uint32_value(valueu32, member_id);
247+
unsigned_integer_value = valueu32;
248+
}
249+
break;
250+
251+
case eprosima::fastdds::dds::xtypes::TK_UINT64:
252+
ret = RETCODE_OK == data->get_uint64_value(unsigned_integer_value, member_id);
253+
break;
254+
255+
case eprosima::fastdds::dds::xtypes::TK_FLOAT32:
256+
{
257+
float valuef32 {0};
258+
ret = RETCODE_OK == data->get_float32_value(valuef32, member_id);
259+
float_value = valuef32;
260+
}
261+
break;
262+
263+
case eprosima::fastdds::dds::xtypes::TK_FLOAT64:
264+
{
265+
double valuef64 {0};
266+
ret = RETCODE_OK == data->get_float64_value(valuef64, member_id);
267+
float_value = valuef64;
268+
}
269+
break;
270+
271+
case eprosima::fastdds::dds::xtypes::TK_FLOAT128:
272+
ret = RETCODE_OK == data->get_float128_value(float_value, member_id);
273+
break;
274+
275+
case eprosima::fastdds::dds::xtypes::EK_COMPLETE:
276+
{
277+
// WARNING: this assumes EK_COMPLETE is always an enumeration, aliases should be resolved when parsing
278+
int32_t valueenum {0};
279+
ret = RETCODE_OK == data->get_int32_value(valueenum, member_id);
280+
signed_integer_value = valueenum;
281+
}
282+
break;
283+
284+
default:
285+
break;
286+
>>>>>>> 3af813b0 (Support aliases in Content Filtered Topic (#6032))
187287
}
188288

189289
return ret;

0 commit comments

Comments
 (0)