Skip to content

Commit

Permalink
feat: allow admins to specify a timeout for MongoDB queries (#8561)
Browse files Browse the repository at this point in the history
  • Loading branch information
stephanegigandet authored Jun 27, 2023
1 parent cefb9d5 commit 161e3e9
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 34 deletions.
27 changes: 6 additions & 21 deletions lib/ProductOpener/Data.pm
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ sub execute_query ($sub) {
)->run();
}

=head2 get_products_collection( $options_ref )
=head2 get_products_collection( $parameters_ref )
C<get_products_collection()> establishes a connection to MongoDB and uses timeout as an argument. This then selects a collection
from within the database.
Expand Down Expand Up @@ -155,35 +155,20 @@ Returns a mongoDB collection object.
=cut

sub get_products_collection ($options_ref = {}) {
my $database = $options_ref->{database} // $mongodb;
sub get_products_collection ($parameters_ref = {}) {
my $database = $parameters_ref->{database} // $mongodb;
my $collection = 'products';
if ($options_ref->{obsolete}) {
if ($parameters_ref->{obsolete}) {
$collection .= '_obsolete';
}
# We don't have a products_obsolete_tags collection at this point
# if it changes, the following elsif should be changed to a if
elsif ($options_ref->{tags}) {
elsif ($parameters_ref->{tags}) {
$collection .= '_tags';
}
return get_collection($database, $collection, $options_ref->{timeout});
return get_collection($database, $collection, $parameters_ref->{timeout});
}

=head2 get_products_tags_collection()
C<get_products_collection()> This selects the product tag collection from within the database.
=head3 Arguments
This method takes in arguments of integer type (user defined timeout in milliseconds).
It is optional for this subroutine to have an argument.
=head3 Return values
Returns a mongoDB collection.
=cut

sub get_emb_codes_collection ($timeout = undef) {
return get_collection($mongodb, 'emb_codes', $timeout);
}
Expand Down
72 changes: 59 additions & 13 deletions lib/ProductOpener/Display.pm
Original file line number Diff line number Diff line change
Expand Up @@ -793,6 +793,8 @@ sub init_request ($request_ref = {}) {
if (is_admin_user($User_id)) {
$admin = 1;
}
$request_ref->{admin} = $admin;
# TODO: remove the $admin global variable, and use $request_ref->{admin} instead.

# Producers platform: not logged in users, or users with no permission to add products

Expand Down Expand Up @@ -1442,7 +1444,7 @@ sub query_list_of_tags ($request_ref, $query_ref) {
if $log->is_debug();
$results = execute_query(
sub {
return get_products_collection({obsolete => request_param($request_ref, "obsolete")})
return get_products_collection(get_products_collection_request_parameters($request_ref))
->aggregate($aggregate_parameters, {allowDiskUse => 1});
}
);
Expand All @@ -1456,7 +1458,8 @@ sub query_list_of_tags ($request_ref, $query_ref) {
if $log->is_debug();
$results = execute_query(
sub {
return get_products_collection({obsolete => request_param($request_ref, "obsolete"), tags => 1})
return get_products_collection(
get_products_collection_request_parameters($request_ref, {tags => 1}))
->aggregate($aggregate_parameters, {allowDiskUse => 1});
}
);
Expand Down Expand Up @@ -1524,7 +1527,7 @@ sub query_list_of_tags ($request_ref, $query_ref) {
if $log->is_debug();
$count_results = execute_query(
sub {
return get_products_collection({obsolete => request_param($request_ref, "obsolete")})
return get_products_collection(get_products_collection_request_parameters($request_ref))
->aggregate($aggregate_count_parameters, {allowDiskUse => 1});
}
);
Expand All @@ -1538,7 +1541,7 @@ sub query_list_of_tags ($request_ref, $query_ref) {
$count_results = execute_query(
sub {
return get_products_collection(
{obsolete => request_param($request_ref, "obsolete"), tags => 1})
get_products_collection_request_parameters($request_ref, {tags => 1}))
->aggregate($aggregate_count_parameters, {allowDiskUse => 1});
}
);
Expand Down Expand Up @@ -4406,6 +4409,47 @@ sub count_products ($request_ref, $query_ref, $obsolete = 0) {
return $count;
}

=head2 get_products_collection_request_parameters ($request_ref, $additional_parameters_ref = {} )
This function looks at the request object to set parameters to pass to the get_products_collection() function.
=head3 Arguments
=head4 $request_ref request object
=head4 $additional_parameters_ref
An optional reference to a hash of parameters that should be added to the parameters extracted from the request object.
This is useful in particular to request the query to be executed on the smaller products_tags category, by passing
{ tags = 1 }
=head3 Return value
A reference to a parameters object that can be passed to get_products_collection()
=cut

sub get_products_collection_request_parameters ($request_ref, $additional_parameters_ref = {}) {

my $parameters_ref = {};

# If the request is for obsolete products, we will select a specific products collection
# for obsolete products
$parameters_ref->{obsolete} = request_param($request_ref, "obsolete");

# Admin users can request a specific query_timeout for MongoDB queries
if ($request_ref->{admin}) {
$parameters_ref->{timeout} = request_param($request_ref, "timeout");
}

# Add / overwrite request parameters with additional parameters passed as arguments
foreach my $parameter (keys %$additional_parameters_ref) {
$parameters_ref->{$parameter} = $additional_parameters_ref->{$parameter};
}

return $parameters_ref;
}

=head2 add_params_to_query ( $request_ref, $query_ref )
This function is used to parse search query parameters that are passed
Expand Down Expand Up @@ -4917,7 +4961,8 @@ sub search_and_display_products ($request_ref, $query_ref, $sort_by, $limit, $pa
$log->debug("Counting MongoDB documents for query", {query => $query_ref}) if $log->is_debug();
$count = execute_query(
sub {
return get_products_collection({obsolete => request_param($request_ref, "obsolete"), tags => 1})
return get_products_collection(
get_products_collection_request_parameters($request_ref, {tags => 1}))
->count_documents($query_ref);
}
);
Expand All @@ -4928,7 +4973,8 @@ sub search_and_display_products ($request_ref, $query_ref, $sort_by, $limit, $pa
$log->debug("Executing MongoDB query", {query => $aggregate_parameters}) if $log->is_debug();
$cursor = execute_query(
sub {
return get_products_collection({obsolete => request_param($request_ref, "obsolete"), tags => 1})
return get_products_collection(
get_products_collection_request_parameters($request_ref, {tags => 1}))
->aggregate($aggregate_parameters, {allowDiskUse => 1});
}
);
Expand Down Expand Up @@ -4980,7 +5026,7 @@ sub search_and_display_products ($request_ref, $query_ref, $sort_by, $limit, $pa
{key => $key_count})
if $log->is_debug();
return get_products_collection(
{obsolete => request_param($request_ref, "obsolete"), tags => 1})
get_products_collection_request_parameters($request_ref, {tags => 1}))
->count_documents($query_ref);
}
);
Expand All @@ -4993,7 +5039,7 @@ sub search_and_display_products ($request_ref, $query_ref, $sort_by, $limit, $pa
$log->debug("count_documents on complete products collection", {key => $key_count})
if $log->is_debug();
return get_products_collection(
{obsolete => request_param($request_ref, "obsolete")})
get_products_collection_request_parameters($request_ref))
->count_documents($query_ref);
}
);
Expand All @@ -5020,7 +5066,7 @@ sub search_and_display_products ($request_ref, $query_ref, $sort_by, $limit, $pa
sub {
$log->debug("empty query_ref, use estimated_document_count fot better performance", {})
if $log->is_debug();
return get_products_collection({obsolete => request_param($request_ref, "obsolete")})
return get_products_collection(get_products_collection_request_parameters($request_ref))
->estimated_document_count();
}
);
Expand All @@ -5032,7 +5078,7 @@ sub search_and_display_products ($request_ref, $query_ref, $sort_by, $limit, $pa
if $log->is_debug();
$cursor = execute_query(
sub {
return get_products_collection({obsolete => request_param($request_ref, "obsolete")})
return get_products_collection(get_products_collection_request_parameters($request_ref))
->query($query_ref)->fields($fields_ref)->sort($sort_ref)->limit($limit)->skip($skip);
}
);
Expand Down Expand Up @@ -6394,7 +6440,7 @@ sub search_and_graph_products ($request_ref, $query_ref, $graph_ref) {
eval {
$cursor = execute_query(
sub {
return get_products_collection({obsolete => request_param($request_ref, "obsolete")})
return get_products_collection(get_products_collection_request_parameters($request_ref))
->query($query_ref)->fields($fields_ref);
}
);
Expand Down Expand Up @@ -6527,7 +6573,7 @@ sub search_and_map_products ($request_ref, $query_ref, $graph_ref) {
eval {
$cursor = execute_query(
sub {
return get_products_collection({obsolete => request_param($request_ref, "obsolete")})
return get_products_collection(get_products_collection_request_parameters($request_ref))
->query($query_ref)->fields(
{
code => 1,
Expand Down Expand Up @@ -11003,7 +11049,7 @@ sub search_and_analyze_recipes ($request_ref, $query_ref) {
eval {
$cursor = execute_query(
sub {
return get_products_collection({obsolete => request_param($request_ref, "obsolete")})
return get_products_collection(get_products_collection_request_parameters($request_ref))
->query($query_ref)->fields($fields_ref);
}
);
Expand Down

0 comments on commit 161e3e9

Please sign in to comment.