TT#98650 speedup redis locaction search by id

instantiation a redis location resultset can cause
a scan if no filter args are provided.

(cherry picked from commit b4281d4ee8)
Change-Id: If08d634a0e9aa7ad5bdab5ced8859123c45fbe7b
mr7.5.11
Rene Krenn 5 years ago
parent 7466b472d7
commit 353296d05d

@ -14,27 +14,38 @@ use NGCP::Panel::Utils::Kamailio;
use NGCP::Panel::Utils::Subscriber;
sub _item_rs {
my ($self, $c) = @_;
my ($self, $c, $filter) = @_;
my $item_rs;
if ($c->config->{redis}->{usrloc}) {
# TODO: will this survive with like 1M records?
my $filter = {};
if ($c->req->param('subscriber_id')) {
my $sub = $c->model('DB')->resultset('voip_subscribers')->find($c->req->param('subscriber_id'));
if ($sub) {
$filter->{username} = $sub->username;
unless (defined $filter) {
$filter = {};
if ($c->req->param('subscriber_id')) {
my $sub = $c->model('DB')->resultset('voip_subscribers')->find($c->req->param('subscriber_id'));
if ($sub) {
$filter->{username} = $sub->username;
}
if($c->config->{features}->{multidomain}) {
$filter->{domain} = $sub->domain->domain;
} else {
$filter->{domain} = undef;
}
} else {
if ($c->config->{features}->{multidomain}) {
$filter->{domain} = { like => '.+' };
} else {
$filter->{domain} = undef;
}
}
if($c->config->{features}->{multidomain}) {
$filter->{domain} = $sub->domain->domain;
if ($c->user->roles eq "admin" || $c->user->roles eq "ccareadmin") {
} elsif ($c->user->roles eq "reseller" || $c->user->roles eq "ccare") {
$filter->{reseller_id} = $c->user->reseller_id;
}
}
if ($c->user->roles eq "admin") {
} elsif ($c->user->roles eq "reseller") {
$filter->{reseller_id} = $c->user->reseller_id;
}
$item_rs = NGCP::Panel::Utils::Subscriber::get_subscriber_location_rs($c, $filter);
} else {
my @joins = ();
@ -123,7 +134,7 @@ sub resource_from_item {
sub item_by_id {
my ($self, $c, $id) = @_;
my $item_rs = $self->item_rs($c);
my $item_rs = $self->item_rs($c,{ id => $id, });
return $item_rs->find($id);
}

@ -48,7 +48,7 @@ sub get_subscriber_location_rs {
}
$redis->select($c->config->{redis}->{usrloc_db});
my $rs = NGCP::Panel::Utils::RedisLocationResultSet->new(_redis => $redis, _c => $c);
$rs = $rs->search($filter) if $filter;
$rs = $rs->search($filter) if ($filter and scalar keys %$filter);
return $rs;
} catch($e) {
$c->log->error("Failed to fetch location information from redis: $e");

Loading…
Cancel
Save