Improve automatic exclusion of edited and deleted recipes
This commit is contained in:
parent
6962f6ef40
commit
095f45db3b
@ -314,32 +314,22 @@ sub set_status {
|
|||||||
sub get_recipe_list {
|
sub get_recipe_list {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $mode = shift;
|
my $mode = shift;
|
||||||
my $exlstates = shift;
|
my $exlstates = shift // [ $self -> {"settings"} -> {"config"} -> {"Recipe:status:edited"} // "Edited",
|
||||||
|
$self -> {"settings"} -> {"config"} -> {"Recipe:status:deleted"} // "Deleted",
|
||||||
|
];
|
||||||
|
|
||||||
$self -> clear_error();
|
$self -> clear_error();
|
||||||
|
|
||||||
if(!defined($exlstates)) {
|
|
||||||
$exlstates = [ $self -> {"settings"} -> {"config"} -> {"Recipe:status:edited"} // "Edited",
|
|
||||||
$self -> {"settings"} -> {"config"} -> {"Recipe:status:deleted"} // "Deleted",
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
my @params = ();
|
my @params = ();
|
||||||
my @wherefrag = ();
|
my @wherefrag = ();
|
||||||
|
|
||||||
# Get the status IDs for excluded states
|
# Get the status IDs for excluded states
|
||||||
my @states = ();
|
my $states = $slef -> _convert_states($exlstates);
|
||||||
foreach my $state (@{$exlstates}) {
|
|
||||||
my $statusid = $self -> {"entities"} -> {"states"} -> get_id($state)
|
|
||||||
or return $self -> self_error($self -> {"entities"} -> {"states"} -> errstr());
|
|
||||||
|
|
||||||
push(@states, $statusid);
|
|
||||||
}
|
|
||||||
|
|
||||||
# And add them to the query
|
# And add them to the query
|
||||||
if(scalar(@states)) {
|
if(scalar(@{$states})) {
|
||||||
push(@wherefrag, "`r`.`status_id` NOT IN (?".(",?" x (scalar(@states) - 1)).") ");
|
push(@wherefrag, "`r`.`status_id` NOT IN (?".(",?" x (scalar(@{$states}) - 1)).") ");
|
||||||
push(@params, @states);
|
push(@params, @{$states});
|
||||||
}
|
}
|
||||||
|
|
||||||
# If a mode has been specified, set up query framents for it
|
# If a mode has been specified, set up query framents for it
|
||||||
@ -517,6 +507,10 @@ sub find {
|
|||||||
or return $self -> self_error("Tag lookup error: ".$self -> {"entities"} -> {"tags"} -> errstr());
|
or return $self -> self_error("Tag lookup error: ".$self -> {"entities"} -> {"tags"} -> errstr());
|
||||||
$args -> {"tagids"} = $self -> _hashlist_to_list($tags, "id");
|
$args -> {"tagids"} = $self -> _hashlist_to_list($tags, "id");
|
||||||
|
|
||||||
|
# Find should always exclude deleted and edited recipes
|
||||||
|
my $exclstates = $self -> _convert_state($self -> {"settings"} -> {"config"} -> {"Recipe:status:edited"} // "Edited",
|
||||||
|
$self -> {"settings"} -> {"config"} -> {"Recipe:status:deleted"} // "Deleted");
|
||||||
|
|
||||||
# Fix up default matching modes
|
# Fix up default matching modes
|
||||||
$args -> {"ingredmatch"} = "all" unless($args -> {"ingredmatch"} && $args -> {"ingredmatch"} eq "any");
|
$args -> {"ingredmatch"} = "all" unless($args -> {"ingredmatch"} && $args -> {"ingredmatch"} eq "any");
|
||||||
$args -> {"tagmatch"} = "all" unless($args -> {"tagmatch"} && $args -> {"tagmatch"} eq "any");
|
$args -> {"tagmatch"} = "all" unless($args -> {"tagmatch"} && $args -> {"tagmatch"} eq "any");
|
||||||
@ -590,12 +584,21 @@ sub find {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Build and run the search query
|
# Build and run the search query
|
||||||
|
# Note that this does something somewhat contraindicated in the docs:
|
||||||
|
# it uses both JOIN ON AND conditions and WHERE conditions, specifically
|
||||||
|
# it filters out a number of states so that they will never appear
|
||||||
|
# in the result set. In theory this should work safely.
|
||||||
my $query = "SELECT DISTINCT `r`.*, `s`.`name` AS `status`, `t`.`name` AS `type`, `c`.`username`, `c`.`email`, `c`.`realname`
|
my $query = "SELECT DISTINCT `r`.*, `s`.`name` AS `status`, `t`.`name` AS `type`, `c`.`username`, `c`.`email`, `c`.`realname`
|
||||||
FROM `".$self -> {"settings"} -> {"database"} -> {"recipes"}."` AS `r`
|
FROM `".$self -> {"settings"} -> {"database"} -> {"recipes"}."` AS `r`
|
||||||
INNER JOIN `".$self -> {"settings"} -> {"database"} -> {"states"}."` AS `s` ON `s`.`id` = `r`.`status_id`
|
INNER JOIN `".$self -> {"settings"} -> {"database"} -> {"states"}."` AS `s`
|
||||||
INNER JOIN `".$self -> {"settings"} -> {"database"} -> {"types"}."` AS `t` ON `t`.`id` = `r`.`type_id`
|
ON `s`.`id` = `r`.`status_id`
|
||||||
INNER JOIN `".$self -> {"settings"} -> {"database"} -> {"users"}."` AS `c` ON `c`.`user_id` = `r`.`creator_id`
|
AND `s`.`id` NOT IN (".join(",", @{$exclstates}).")
|
||||||
INNER JOIN `".$self -> {"settings"} -> {"database"} -> {"users"}."` AS `e` ON `e`.`user_id` = `r`.`updater_id`
|
INNER JOIN `".$self -> {"settings"} -> {"database"} -> {"types"}."` AS `t`
|
||||||
|
ON `t`.`id` = `r`.`type_id`
|
||||||
|
INNER JOIN `".$self -> {"settings"} -> {"database"} -> {"users"}."` AS `c`
|
||||||
|
ON `c`.`user_id` = `r`.`creator_id`
|
||||||
|
INNER JOIN `".$self -> {"settings"} -> {"database"} -> {"users"}."` AS `e`
|
||||||
|
ON `e`.`user_id` = `r`.`updater_id`
|
||||||
$joins
|
$joins
|
||||||
WHERE $wherecond
|
WHERE $wherecond
|
||||||
ORDER BY $order
|
ORDER BY $order
|
||||||
@ -948,6 +951,28 @@ sub _hashlist_to_list {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
## @methos private $ _convert_states($states)
|
||||||
|
# Given a list, or reference to a list, of state names, generate a
|
||||||
|
# matching list of state IDs.
|
||||||
|
#
|
||||||
|
# @param states A list or reference to a list of state names
|
||||||
|
# @return A reference to a list of state IDs matching the provided names
|
||||||
|
sub _convert_states {
|
||||||
|
my $self = shift;
|
||||||
|
my $states = array_or_arrayref(@_);
|
||||||
|
|
||||||
|
my @ids = ();
|
||||||
|
foreach my $state (@{$states}) {
|
||||||
|
my $statusid = $self -> {"entities"} -> {"states"} -> get_id($state)
|
||||||
|
or return $self -> self_error($self -> {"entities"} -> {"states"} -> errstr());
|
||||||
|
|
||||||
|
push(@ids, $statusid);
|
||||||
|
}
|
||||||
|
|
||||||
|
return \@ids;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
## @method private $ _join_fragment($idlist, $table, $params)
|
## @method private $ _join_fragment($idlist, $table, $params)
|
||||||
# Generate an inner join fragment to append to the table list of a search
|
# Generate an inner join fragment to append to the table list of a search
|
||||||
# query. This is used to restrict the results to recipes that use certain
|
# query. This is used to restrict the results to recipes that use certain
|
||||||
|
Loading…
x
Reference in New Issue
Block a user