MT#58762 harmonize restapi wildcard filters

- all standard LIKE search are migrated
- will avoid LIKE unless a pattern (* wildcard) is
  used as a search term. this encourage db index
  usage, will be faster
- supports wildcard escape sequence \\*
- harmonize swagger UI descriptions of filters

Change-Id: Iea155871c9be6c284e6970a562d4e6af73fedc4b
(cherry picked from commit 308a974059)
mr10.5.7
Rene Krenn 1 year ago committed by Marco Capetta
parent ce35d341dd
commit aacf44c605

@ -29,8 +29,8 @@ sub query_params {
},
{
param => 'login',
description => 'Filter for admins with a specific login (wildcards possible)',
query_type => 'string_like',
description => 'Filter for admins with a specific login', # (wildcards possible)',
query_type => 'wildcard',
},
];
}

@ -61,14 +61,9 @@ sub query_params {
{
param => 'external_id',
description => 'Filter for contracts with a specific external id',
query => {
first => sub {
my $q = shift;
{ 'me.external_id' => { like => $q } };
},
second => sub {},
},
}, ];
query_type => 'wildcard',
},
];
}
use parent qw/NGCP::Panel::Role::Entities NGCP::Panel::Role::API::BalanceIntervals/;

@ -48,13 +48,7 @@ sub query_params {
{
param => 'name',
description => 'Filter for billing networks matching a name pattern',
query => {
first => sub {
my $q = shift;
{ name => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
];
}

@ -36,24 +36,12 @@ sub query_params {
{
param => 'handle',
description => 'Filter for billing profiles with a specific handle',
query => {
first => sub {
my $q = shift;
{ handle => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
{
param => 'name',
description => 'Filter for billing profiles with a specific name',
query => {
first => sub {
my $q = shift;
{ name => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
];
}

@ -34,13 +34,7 @@ sub query_params {
{
param => 'zone',
description => 'Filter for zone name',
query => {
first => sub {
my $q = shift;
{ zone => { like => '%'.$q.'%' } };
},
second => sub {},
},
query_type => 'wildcard',
},
];
}

@ -37,13 +37,7 @@ sub query_params {
{
param => 'name',
description => 'Filter for items matching a B-Number Set name pattern',
query => {
first => sub {
my $q = shift;
{ name => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
];
}

@ -38,13 +38,7 @@ sub query_params {
{
param => 'name',
description => 'Filter for contacts matching a destination set name pattern',
query => {
first => sub {
my $q = shift;
{ name => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
];
}

@ -37,13 +37,7 @@ sub query_params {
{
param => 'name',
description => 'Filter for items matching a source set name pattern',
query => {
first => sub {
my $q = shift;
{ name => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
];
}

@ -37,13 +37,7 @@ sub query_params {
{
param => 'name',
description => 'Filter for contacts matching a timeset name pattern',
query => {
first => sub {
my $q = shift;
{ name => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
];
}

@ -49,13 +49,7 @@ sub query_params {
{
param => 'external_id',
description => 'Filter for contracts with a specific external id',
query => {
first => sub {
my $q = shift;
{ 'me.external_id' => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
{
param => 'type',

@ -60,13 +60,7 @@ sub query_params {
{
param => 'external_id',
description => 'Filter for contracts with a specific external id',
query => {
first => sub {
my $q = shift;
{ 'me.external_id' => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
{
param => 'domain',

@ -23,14 +23,8 @@ sub query_params {
return [
{
param => 'email',
description => 'Filter for contacts matching an email pattern',
query => {
first => sub {
my $q = shift;
{ email => { like => $q } };
},
second => sub {},
},
description => 'Filter for contacts for the email address',
query_type => 'wildcard',
},
{
param => 'reseller_id',

@ -35,14 +35,8 @@ sub query_params {
},
{
param => 'name',
description => 'Filter for customer locations matching a name pattern',
query => {
first => sub {
my $q = shift;
{ name => { like => $q } };
},
second => sub {},
},
description => 'Filter for customer locations by name',
query_type => 'wildcard',
},
];
}

@ -74,13 +74,7 @@ sub query_params {
{
param => 'external_id',
description => 'Filter for customer with specific external_id',
query => {
first => sub {
my $q = shift;
{ 'me.external_id' => { like => $q } };
},
second => sub { },
},
query_type => 'wildcard',
},
{
param => 'contact_id',

@ -28,14 +28,8 @@ sub query_params {
},
{
param => 'domain',
description => 'Filter for domains matching the given pattern',
query => {
first => sub {
my $q = shift;
{ domain => { like => $q } };
},
second => sub { },
},
description => 'Filter for for a domain name',
query_type => 'wildcard',
},
];
}

@ -34,13 +34,7 @@ sub query_params {
{
param => 'name',
description => 'Filter for email templates with a specific name',
query => {
first => sub {
my $q = shift;
{ 'me.name' => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
];
}

@ -23,14 +23,8 @@ sub query_params {
return [
{
param => 'name',
description => 'Filter for emergency mapping containers with a specific name (wildcards possible)',
query => {
first => sub {
my $q = shift;
{ name => { like => $q } };
},
second => sub {},
},
description => 'Filter for emergency mapping containers with a specific name',
query_type => 'wildcard',
},
{
param => 'reseller_id',

@ -51,14 +51,8 @@ sub query_params {
},
{
param => 'code',
description => 'Filter for mappings with a specific code (wildcards possible)',
query => {
first => sub {
my $q = shift;
{ code => { like => $q } };
},
second => sub {},
},
description => 'Filter for mappings with a specific code',
query_type => 'wildcard',
},
];
}

@ -46,13 +46,7 @@ sub query_params {
{
param => 'type',
description => 'Filter for events of a specific type.',
query => {
first => sub {
my $q = shift;
{ type => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
{
param => 'timestamp_from',

@ -24,7 +24,7 @@ sub query_params {
description => 'Filter for items (subscribers) where name or password field match given pattern',
query => {
first => sub {
my $q = shift;
my ($q,$is_pattern) = escape_search_string_pattern(shift);
return { '-or' => [
{ 'voip_fax_preference.name' => { like => $q } },
{ 'voip_fax_preference.password' => { like => $q } },

@ -35,13 +35,13 @@ sub query_params {
},
{
param => 'name',
description => 'Filter for header rule sets with a specific name (wildcard pattern allowed)',
query_type => 'string_like',
description => 'Filter for header rule sets with a specific name',
query_type => 'wildcard',
},
{
param => 'description',
description => 'Filter header rule sets for a certain description (wildcard pattern allowed).',
query_type => 'string_like',
description => 'Filter header rule sets for a certain description',
query_type => 'wildcard',
},
];
}

@ -24,21 +24,13 @@ sub query_params {
return [
{
param => 'name',
description => 'Filter for header rules with a specific name (wildcard pattern allowed)',
query => {
first => sub {
+{ 'me.name' => { like => shift } };
}
},
description => 'Filter for header rules with a specific name',
query_type => 'wildcard',
},
{
param => 'description',
description => 'Filter rules for a certain description (wildcards possible).',
query => {
first => sub {
+{ 'me.description' => { like => shift } };
}
},
description => 'Filter rules for a certain description',
query_type => 'wildcard',
},
{
param => 'set_id',

@ -34,13 +34,7 @@ sub query_params {
{
param => 'name',
description => 'Filter for invoice templates with a specific name',
query => {
first => sub {
my $q = shift;
{ 'me.name' => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
];
}

@ -66,8 +66,8 @@ sub query_params {
},
{
param => 'serial',
description => 'Filter for invoices matching a serial (patterns allowed)',
query_type => 'string_like',
description => 'Filter for invoices matching a serial',
query_type => 'wildcard',
},
];
}

@ -23,25 +23,13 @@ sub query_params {
return [
{
param => 'prefix',
description => 'Filter for LNP carriers with a specific prefix (wildcards possible)',
query => {
first => sub {
my $q = shift;
{ prefix => { like => $q } };
},
second => sub {},
},
description => 'Filter for LNP carriers with a specific prefix',
query_type => 'wildcard',
},
{
param => 'name',
description => 'Filter for LNP carriers with a specific name (wildcards possible)',
query => {
first => sub {
my $q = shift;
{ name => { like => $q } };
},
second => sub {},
},
description => 'Filter for LNP carriers with a specific name',
query_type => 'wildcard',
},
];
}

@ -37,14 +37,8 @@ sub query_params {
},
{
param => 'number',
description => 'Filter for LNP numbers with a specific number (wildcards possible)',
query => {
first => sub {
my $q = shift;
{ 'me.number' => { like => $q } };
},
second => sub {},
},
description => 'Filter for LNP numbers with a specific number',
query_type => 'wildcard',
},
{
param => 'actual',

@ -34,13 +34,7 @@ sub query_params {
{
param => 'level',
description => 'Filter for levels matching the given pattern',
query => {
first => sub {
my $q = shift;
{ level => { like => $q } };
},
second => sub { },
},
query_type => 'wildcard',
},
];
}

@ -60,17 +60,17 @@ sub query_params {
{
param => 'ac',
description => 'Filter for ac field of the number.',
query_type => 'string_like',
query_type => 'wildcard',
},
{
param => 'cc',
description => 'Filter for cc field c the number.',
query_type => 'string_like',
query_type => 'wildcard',
},
{
param => 'sn',
description => 'Filter for sn field c the number.',
query_type => 'string_like',
query_type => 'wildcard',
},
{
param => 'type',

@ -42,8 +42,8 @@ sub query_params {
},
{
param => 'model',
description => 'Filter for models matching a model name pattern',
query_type => 'string_like',
description => 'Filter for models by name',
query_type => 'wildcard',
},
];
}

@ -22,25 +22,13 @@ sub query_params {
return [
{
param => 'name',
description => 'Filter for profiles matching a name pattern',
query => {
first => sub {
my $q = shift;
{ name => { like => $q } };
},
second => sub {},
},
description => 'Filter for profiles by name',
query_type => 'wildcard',
},
{
param => 'config_id',
description => 'Filter for profiles matching a config_id',
query => {
first => sub {
my $q = shift;
{ 'config_id' => { like => $q } };
},
second => sub {},
},
description => 'Filter for profiles by config_id',
query_type => 'wildcard',
},
];
}

@ -44,21 +44,21 @@ sub query_params {
},
{
param => 'identifier',
description => 'Search for PBX devices matching an identifier/MAC pattern (wildcards possible)',
query_type => 'string_like',
description => 'Search for PBX devices matching an identifier/MAC pattern',
query_type => 'wildcard',
},
{
param => 'station_name',
description => 'Search for PBX devices matching a station_name pattern (wildcards possible)',
query_type => 'string_like',
description => 'Search for PBX devices matching a station_name pattern',
query_type => 'wildcard',
},
{
param => 'pbx_extension',
description => 'Search for PBX devices matching a subscriber\'s extension pattern (wildcards possible)',
description => 'Search for PBX devices matching a subscriber\'s extension pattern',
query => {
first => sub {
my $q = shift;
{ 'provisioning_voip_subscriber.pbx_extension' => { like => "$q%" } };
my ($q,$is_pattern) = escape_search_string_pattern(shift);
{ 'provisioning_voip_subscriber.pbx_extension' => { like => $q } };
},
second => sub {
@ -68,13 +68,13 @@ sub query_params {
},
{
param => 'display_name',
description => 'Search for PBX devices matching a subscriber\'s display name pattern (wildcards possible)',
description => 'Search for PBX devices matching a subscriber\'s display name pattern',
query => {
first => sub {
my $q = shift;
my ($q,$is_pattern) = escape_search_string_pattern(shift);
{
'attribute.attribute' => 'display_name',
'voip_usr_preferences.value' => { like => "$q%" }
'voip_usr_preferences.value' => { like => $q }
};
},

@ -23,26 +23,14 @@ sub api_description {
sub query_params {
return [
{
param => 'name',
param => 'model',
description => 'Filter for peering group name',
query => {
first => sub {
my $q = shift;
{ name => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
{
param => 'description',
description => 'Filter for peering group description',
query => {
first => sub {
my $q = shift;
{ description => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
];
}

@ -34,14 +34,8 @@ sub query_params {
},
{
param => 'field',
description => 'Filter for peering rules field (wildcards possible)',
query => {
first => sub {
my $q = shift;
{ field => { like => $q } };
},
second => sub {},
},
description => 'Filter for peering rules field',
query_type => 'wildcard',
},
{
param => 'enabled',

@ -39,13 +39,7 @@ sub query_params {
{
param => 'description',
description => 'Filter for peering rules description',
query => {
first => sub {
my $q = shift;
{ description => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
{
param => 'enabled',

@ -35,35 +35,17 @@ sub query_params {
{
param => 'name',
description => 'Filter for peering server name',
query => {
first => sub {
my $q = shift;
{ name => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
{
param => 'host',
description => 'Filter for peering server host',
query => {
first => sub {
my $q = shift;
{ host => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
{
param => 'ip',
description => 'Filter for peering server ip',
query => {
first => sub {
my $q = shift;
{ host => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
{
param => 'enabled',

@ -55,13 +55,13 @@ sub query_params {
},
{
param => 'number',
description => 'Filter for Phonebook numbers with a specific number (wildcards possible)',
query_type => 'string_like',
description => 'Filter for Phonebook numbers with a specific number',
query_type => 'wildcard',
},
{
param => 'name',
description => 'Filter for Phonebook numbers with a specific name (wildcards possible)',
query_type => 'string_like',
description => 'Filter for Phonebook numbers with a specific name',
query_type => 'wildcard',
},
];
}

@ -36,20 +36,14 @@ sub query_params {
{
param => 'name',
description => 'Filter for profile packages with a specific name',
query => {
first => sub {
my $q = shift;
{ name => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
{
param => 'profile_name',
description => 'Filter for profile packages containing a billing profile with specific name',
description => 'Filter for profile packages containing a billing profile with specific name pattern',
query => {
first => sub {
my $q = shift;
my ($q,$is_pattern) = escape_search_string_pattern(shift);
{ 'billing_profile.name' => { like => $q } };
},
second => sub {
@ -60,10 +54,10 @@ sub query_params {
},
{
param => 'network_name',
description => 'Filter for profile packages containing a billing network with specific name',
description => 'Filter for profile packages containing a billing network with specific name pattern',
query => {
first => sub {
my $q = shift;
my ($q,$is_pattern) = escape_search_string_pattern(shift);
{ 'billing_network.name' => { like => $q } };
},
second => sub {

@ -24,14 +24,8 @@ sub query_params {
return [
{
param => 'name',
description => 'Filter for resellers matching the given name pattern',
query => {
first => sub {
my $q = shift;
{ name => { like => $q } };
},
second => sub {},
},
description => 'Filter for resellers by name',
query_type => 'wildcard',
},
{
param => 'status',

@ -29,13 +29,13 @@ sub query_params {
},
{
param => 'description',
description => 'Filter rulesets for a certain description (wildcards possible).',
query_type => 'string_like',
description => 'Filter rulesets for a certain description',
query_type => 'wildcard',
},
{
param => 'name',
description => 'Filter rulesets for a certain name (wildcards possible).',
query_type => 'string_like',
description => 'Filter rulesets for a certain name',
query_type => 'wildcard',
},
];
}

@ -23,8 +23,8 @@ sub query_params {
return [
{
param => 'description',
description => 'Filter rules for a certain description (wildcards possible).',
query_type => 'string_like',
description => 'Filter rules for a certain description',
query_type => 'wildcard',
},
{
param => 'set_id',

@ -24,7 +24,7 @@ sub query_params {
{
param => 'name',
description => 'Filter for sound groups with a specific name',
query_type => 'string_like',
query_type => 'wildcard',
},
];
}

@ -38,8 +38,8 @@ sub query_params {
},
{
param => 'name',
description => 'Filter for sound sets with a specific name (wildcard pattern allowed)',
query_type => 'string_like',
description => 'Filter for sound sets with a specific name',
query_type => 'wildcard',
},
];
}

@ -34,13 +34,7 @@ sub query_params {
{
param => 'name',
description => 'Filter for profile sets with a specific name',
query => {
first => sub {
my $q = shift;
{ 'me.name' => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
];
}

@ -34,13 +34,7 @@ sub query_params {
{
param => 'name',
description => 'Filter for profile with a specific name',
query => {
first => sub {
my $q = shift;
{ 'me.name' => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
];
}

@ -57,13 +57,7 @@ sub query_params {
{
param => 'username',
description => 'Search for specific SIP username',
query => {
first => sub {
my $q = shift;
return { 'me.username' => { like => $q } };
},
second => sub {},
},
query_type => 'wildcard',
},
{
param => 'webusername',
@ -80,10 +74,10 @@ sub query_params {
},
{
param => 'domain',
description => 'Filter for subscribers in specific domain',
description => 'Filter for subscribers in specific domain pattern',
query => {
first => sub {
my $q = shift;
my ($q,$is_pattern) = escape_search_string_pattern(shift);
return { 'domain.domain' => { like => $q } };
},
second => sub {
@ -107,10 +101,10 @@ sub query_params {
},
{
param => 'customer_external_id',
description => 'Filter for subscribers of a specific customer external_id.',
description => 'Filter for subscribers of a specific customer external_id pattern',
query => {
first => sub {
my $q = shift;
my ($q,$is_pattern) = escape_search_string_pattern(shift);
return { 'contract.external_id' => { like => $q } };
},
second => sub {
@ -120,10 +114,10 @@ sub query_params {
},
{
param => 'subscriber_external_id',
description => 'Filter for subscribers by subscriber\'s external_id.',
description => 'Filter for subscribers by subscriber\'s external_id pattern',
query => {
first => sub {
my $q = shift;
my ($q,$is_pattern) = escape_search_string_pattern(shift);
return { 'me.external_id' => { like => $q } };
},
second => sub {
@ -184,12 +178,12 @@ sub query_params {
},
{
param => 'alias',
description => 'Filter for subscribers who has specified alias.',
description => 'Filter for subscribers who has specified alias pattern',
query => {
first => sub {
my $q = shift;
my ($q,$is_pattern) = escape_search_string_pattern(shift);
{
'voip_dbaliases.username' => { like => '%'.$q.'%' },
'voip_dbaliases.username' => { like => $q },
};
},
second => sub {
@ -226,11 +220,11 @@ sub query_params {
},
{
param => 'primary_number',
description => 'Filter for subscribers of contracts with a specific primary number',
description => 'Filter for subscribers of contracts with a specific primary number pattern',
query => {
first => sub {
my $q = shift;
{ \['concat(primary_number.cc, primary_number.ac, primary_number.sn) like ?', "%$q%"] };
my ($q,$is_pattern) = escape_search_string_pattern(shift);
{ \['concat(primary_number.cc, primary_number.ac, primary_number.sn) like ?', $q ] };
},
second => sub {
@ -243,8 +237,8 @@ sub query_params {
description => 'Filter for subscribers of contracts with a specific PBX extension',
query => {
first => sub {
my $q = shift;
{ 'provisioning_voip_subscriber.pbx_extension' => { like => "%$q%" } };
my ($q,$is_pattern) = escape_search_string_pattern(shift);
{ 'provisioning_voip_subscriber.pbx_extension' => { like => $q } };
},
second => sub {
@ -257,10 +251,10 @@ sub query_params {
description => 'Filter for subscribers of contracts with a specific display name',
query => {
first => sub {
my $q = shift;
my ($q,$is_pattern) = escape_search_string_pattern(shift);
{
'attribute.attribute' => 'display_name',
'voip_usr_preferences.value' => { like => "%$q%" }
'voip_usr_preferences.value' => { like => $q }
};
},

@ -23,14 +23,8 @@ sub query_params {
return [
{
param => 'email',
description => 'Filter for contacts matching an email pattern',
query => {
first => sub {
my $q = shift;
{ email => { like => $q } };
},
second => sub {},
},
description => 'Filter for contacts by email address',
query_type => 'wildcard',
},
];
}

@ -37,8 +37,8 @@ sub query_params {
},
{
param => 'name',
description => 'Filter for items matching a Time Set name pattern',
query_type => 'string_like',
description => 'Filter for items by Time Set name',
query_type => 'wildcard',
},
];
}

@ -62,8 +62,9 @@ sub query_params {
query => {
first => sub {
my $q = shift;
($q, my $is_pattern) = escape_search_string_pattern('/var/spool/asterisk/voicemail/*/' . $q);
return {
'me.dir' => { like => '/var/spool/asterisk/voicemail/%/'.$q },
'me.dir' => { like => $q },
};
},
second => sub {},

@ -40,14 +40,15 @@ sub query_params {
second => sub { },
},
},
{
YYYY{
param => 'folder',
description => 'Filter for voicemails in a specific folder (one of INBOX, Old, Friends, Family, Cust1 to Cust4)',
query => {
first => sub {
my $q = shift;
($q, my $is_pattern) = escape_search_string_pattern('*/' . $q);
# join is already done in get_item_rs
{ 'me.dir' => { like => '%/'.$q } };
{ 'me.dir' => { like => $q } };
},
second => sub { },
},

@ -1167,6 +1167,14 @@ sub get_query_callbacks{
} elsif ('string_eq' eq $p[0]->{query_type}) {
$sub_where = sub {my ($q, $c) = @_; { $param => $q };};
} elsif ('wildcard' eq $p[0]->{query_type}) {
$sub_where = sub {my ($q, $c) = @_; { wildcard_search(
search_string => $q,
search => 1,
exact_search => 0,
int_search => 0,
col_name => $param,
) };};
} elsif ('wildcard_optional' eq $p[0]->{query_type}) {
$sub_where = sub {my ($q, $c) = @_; { wildcard_search(
search_string => $q,
search => 1,

@ -249,9 +249,15 @@ sub escape_search_string_pattern {
}
$token;
} split(/(\\\\)/,$searchString,-1));
if (not $is_pattern and not $no_pattern) {
$searchString_escaped .= '%';
$is_pattern = 1;
if (not $is_pattern and not $no_pattern and length($searchString_escaped) > 0) {
#if ($append) {
$searchString_escaped .= '%';
$is_pattern = 1;
#}
#if ($prepend) {
# $searchString_escaped = '%' . $searchString_escaped;
# $is_pattern = 1;
#}
}
return ($searchString_escaped,$is_pattern);

@ -109,7 +109,11 @@ See description how to obtain properties, if any.
<ul id="[% id %]-qparams">
[% FOREACH f IN col.query_params -%]
[% IF f.query_type = 'wildcard' -%]
<li><b>[% f.param %]</b>: [% f.description _ ' ' _ ' (prefix search, * wildcards supported, note that leading or intermediate wildcards can be slow)' %]</li>
[% ELSE -%]
<li><b>[% f.param %]</b>: [% f.description %]</li>
[% END -%]
[% END -%]
<li><b>order_by</b>: Order collection by a specific attribute. Possible values are: <i>[% col.sorting_cols.sort.join(', ') %]</i></li>
<li><b>order_by_direction</b>: Direction which the collection should be ordered by. Possible values are: <i>asc (default), desc</i></li>

Loading…
Cancel
Save