Skip to content

Commit 3552758

Browse files
committed
Support AMQP SQL Filter Expressions
Instead of the JMS message selector syntax, support a subset of the AMQP SQL Filter Expressions synatx as defined in AMQP Filter Expressions Version 1.0 Committee Specification Draft 01 https://docs.oasis-open.org/amqp/filtex/v1.0/csd01/filtex-v1.0-csd01.html#_Toc67929276 This commit changes the descriptors.
1 parent ee652cb commit 3552758

File tree

4 files changed

+16
-29
lines changed

4 files changed

+16
-29
lines changed

deps/amqp10_common/include/amqp10_filter.hrl

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,15 @@
44
%%
55
%% Copyright (c) 2007-2025 Broadcom. All Rights Reserved. The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. All rights reserved.
66

7-
%% A filter with this name contains a JMS message selector.
8-
%% We use the same name as sent by the Qpid JMS client in
9-
%% https://github.com/apache/qpid-jms/blob/2.7.0/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/AmqpSupport.java#L75
10-
-define(FILTER_NAME_JMS, <<"jms-selector">>).
11-
12-
%% A filter with this name contains an SQL expression.
13-
%% In the current version, such a filter must comply with the JMS message selector syntax.
14-
%% However, we use a name other than "jms-selector" in case we want to extend the allowed syntax
15-
%% in the future, for example allowing for some of the extended grammar described in
16-
%% §6 "SQL Filter Expressions" of
17-
%% https://groups.oasis-open.org/higherlogic/ws/public/document?document_id=66227
18-
-define(FILTER_NAME_SQL, <<"sql-filter">>).
19-
20-
%% SQL-based filtering syntax
21-
%% These descriptors are defined in
22-
%% https://www.amqp.org/specification/1.0/filters
23-
-define(DESCRIPTOR_NAME_SELECTOR_FILTER, <<"apache.org:selector-filter:string">>).
24-
-define(DESCRIPTOR_CODE_SELECTOR_FILTER, 16#0000468C00000004).
25-
26-
%% AMQP Filter Expressions Version 1.0 Working Draft 09
27-
%% https://groups.oasis-open.org/higherlogic/ws/public/document?document_id=66227
7+
%% AMQP Filter Expressions Version 1.0 Committee Specification Draft 01
8+
%% https://docs.oasis-open.org/amqp/filtex/v1.0/csd01/filtex-v1.0-csd01.html#_Toc67929266
289
-define(DESCRIPTOR_NAME_PROPERTIES_FILTER, <<"amqp:properties-filter">>).
2910
-define(DESCRIPTOR_CODE_PROPERTIES_FILTER, 16#173).
3011
-define(DESCRIPTOR_NAME_APPLICATION_PROPERTIES_FILTER, <<"amqp:application-properties-filter">>).
3112
-define(DESCRIPTOR_CODE_APPLICATION_PROPERTIES_FILTER, 16#174).
13+
14+
%% A filter with this name contains an AMQP SQL expression.
15+
-define(FILTER_NAME_SQL, <<"sql-filter">>).
16+
%% https://docs.oasis-open.org/amqp/filtex/v1.0/csd01/filtex-v1.0-csd01.html#_Toc67929276
17+
-define(DESCRIPTOR_NAME_SQL_FILTER, <<"amqp:sql-filter">>).
18+
-define(DESCRIPTOR_CODE_SQL_FILTER, 16#120).

deps/rabbit/src/rabbit_amqp_filter_jms.erl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,9 +291,9 @@ get_field_value(Name, Msg) ->
291291
undefined
292292
end.
293293

294-
check_descriptor({symbol, ?DESCRIPTOR_NAME_SELECTOR_FILTER}) ->
294+
check_descriptor({symbol, ?DESCRIPTOR_NAME_SQL_FILTER}) ->
295295
ok;
296-
check_descriptor({ulong, ?DESCRIPTOR_CODE_SELECTOR_FILTER}) ->
296+
check_descriptor({ulong, ?DESCRIPTOR_CODE_SQL_FILTER}) ->
297297
ok;
298298
check_descriptor(_) ->
299299
error.

deps/rabbit/test/amqp_filter_sql_SUITE.erl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ invalid_filter(Config) ->
338338
#{arguments => #{<<"x-queue-type">> => {utf8, <<"stream">>}}}),
339339

340340
%% Trigger a lexer error.
341-
Filter1 = #{?FILTER_NAME_SQL => #filter{descriptor = ?DESCRIPTOR_CODE_SELECTOR_FILTER,
341+
Filter1 = #{?FILTER_NAME_SQL => #filter{descriptor = ?DESCRIPTOR_CODE_SQL_FILTER,
342342
value = {utf8, <<"@#$%^&">>}}},
343343
{ok, Receiver1} = amqp10_client:attach_receiver_link(
344344
Session, <<"receiver 1">>, Address,
@@ -356,7 +356,7 @@ invalid_filter(Config) ->
356356
ok = detach_link_sync(Receiver1),
357357

358358
%% Trigger a parser error. We use allowed tokens here, but the grammar is incorrect.
359-
Filter2 = #{?FILTER_NAME_SQL => #filter{descriptor = ?DESCRIPTOR_CODE_SELECTOR_FILTER,
359+
Filter2 = #{?FILTER_NAME_SQL => #filter{descriptor = ?DESCRIPTOR_CODE_SQL_FILTER,
360360
value = {utf8, <<"FALSE FALSE">>}}},
361361
{ok, Receiver2} = amqp10_client:attach_receiver_link(
362362
Session, <<"receiver 2">>, Address,
@@ -375,7 +375,7 @@ invalid_filter(Config) ->
375375
PropsFilter = [{{symbol, <<"subject">>}, {utf8, <<"some subject">>}}],
376376
Filter3 = #{<<"prop name">> => #filter{descriptor = ?DESCRIPTOR_NAME_PROPERTIES_FILTER,
377377
value = {map, PropsFilter}},
378-
?FILTER_NAME_SQL => #filter{descriptor = ?DESCRIPTOR_CODE_SELECTOR_FILTER,
378+
?FILTER_NAME_SQL => #filter{descriptor = ?DESCRIPTOR_CODE_SQL_FILTER,
379379
value = {utf8, <<"TRUE">>}}},
380380
{ok, Receiver3} = amqp10_client:attach_receiver_link(
381381
Session, <<"receiver 3">>, Address,
@@ -393,7 +393,7 @@ invalid_filter(Config) ->
393393

394394
%% Send invalid UTF-8 in the SQL expression.
395395
InvalidUTF8 = <<255>>,
396-
Filter4 = #{?FILTER_NAME_SQL => #filter{descriptor = ?DESCRIPTOR_CODE_SELECTOR_FILTER,
396+
Filter4 = #{?FILTER_NAME_SQL => #filter{descriptor = ?DESCRIPTOR_CODE_SQL_FILTER,
397397
value = {utf8, InvalidUTF8}}},
398398
{ok, Receiver4} = amqp10_client:attach_receiver_link(
399399
Session, <<"receiver 4">>, Address,
@@ -432,7 +432,7 @@ filter(String)
432432
when is_binary(String) ->
433433
#{<<"from start">> => #filter{descriptor = <<"rabbitmq:stream-offset-spec">>,
434434
value = {symbol, <<"first">>}},
435-
?FILTER_NAME_SQL => #filter{descriptor = ?DESCRIPTOR_NAME_SELECTOR_FILTER,
435+
?FILTER_NAME_SQL => #filter{descriptor = ?DESCRIPTOR_NAME_SQL_FILTER,
436436
value = {utf8, String}}}.
437437

438438
assert_credit_exhausted(Receiver, Line) ->

deps/rabbit/test/amqp_jms_unit_SUITE.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -884,7 +884,7 @@ match(Selector, Header, Props, AppProps)
884884
rabbit_amqp_filter_jms:eval(ParsedSelector, Mc).
885885

886886
parse(Selector) ->
887-
Descriptor = {ulong, ?DESCRIPTOR_CODE_SELECTOR_FILTER},
887+
Descriptor = {ulong, ?DESCRIPTOR_CODE_SQL_FILTER},
888888
Filter = {described, Descriptor, {utf8, Selector}},
889889
rabbit_amqp_filter_jms:parse(Filter).
890890

0 commit comments

Comments
 (0)