Skip to content

Commit

Permalink
Merge pull request #384 from karlomikus/develop
Browse files Browse the repository at this point in the history
Add extra filter #383
  • Loading branch information
karlomikus authored Dec 21, 2024
2 parents 7f5f5ec + 7da2769 commit b56a85a
Show file tree
Hide file tree
Showing 7 changed files with 124 additions and 100 deletions.
8 changes: 6 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
# v4.2.5
## Fixes
- Added missing filter `missing_bar_ingredients` attribute to `/cocktails` endpoint

# v4.2.4
## Changes
- Optimized ingredients list query
- Moved SQLite optimizations from bash to backend
- Moved SQLite optimizations from docker entry point to api

## Fixed
- Fixed missing rate limit for imports
- Fixed missing max images validation fro cloud instance
- Fixed missing max images validation for cloud instance
- Fixed markdown export encoding special characters
- Fixed missing complex ingredients on import

Expand Down
1 change: 1 addition & 0 deletions app/Http/Controllers/CocktailController.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ class CocktailController extends Controller
new OAT\Property(property: 'main_ingredient_id', type: 'string'),
new OAT\Property(property: 'total_ingredients', type: 'string'),
new OAT\Property(property: 'missing_ingredients', type: 'string'),
new OAT\Property(property: 'missing_bar_ingredients', type: 'string'),
new OAT\Property(property: 'specific_ingredients', type: 'string'),
new OAT\Property(property: 'ignore_ingredients', type: 'string'),
])),
Expand Down
7 changes: 7 additions & 0 deletions app/Http/Filters/CocktailQueryFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,13 @@ public function __construct(CocktailRepository $cocktailRepo)
$query->having('missing_ingredients', (int) $value);
}
}),
AllowedFilter::callback('missing_bar_ingredients', function ($query, $value) {
if ((int) $value >= 3) {
$query->having('missing_bar_ingredients', '>=', (int) $value);
} else {
$query->having('missing_bar_ingredients', (int) $value);
}
}),
AllowedFilter::callback('specific_ingredients', function ($query, $value) use ($barMembership) {
if (!is_array($value)) {
$value = [$value];
Expand Down
50 changes: 28 additions & 22 deletions app/Repository/CocktailRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,28 +50,34 @@ public function getCocktailsByIngredients(array $ingredientIds, ?int $limit = nu
$ingredientIds = array_unique($ingredientIds);
}

$query = $this->db->table('cocktails AS c')
->select('c.id')
->join('cocktail_ingredients AS ci', 'ci.cocktail_id', '=', 'c.id')
->join('ingredients AS i', 'i.id', '=', 'ci.ingredient_id')
->leftJoin('cocktail_ingredient_substitutes AS cis', 'cis.cocktail_ingredient_id', '=', 'ci.id')
->where('optional', false)
->where(function ($query) use ($ingredientIds, $useParentIngredientAsSubstitute) {
$query->whereIn('i.id', $ingredientIds)->orWhereIn('cis.ingredient_id', $ingredientIds);

// Experimental, not the best solution, hard to follow/explain/show
if ($useParentIngredientAsSubstitute) {
$query->orWhereIn('i.id', function ($parentSubquery) use ($ingredientIds) {
$parentSubquery
->select('parent_ingredient_id')
->from('ingredients')
->whereIn('id', $ingredientIds)
->whereNotNull('parent_ingredient_id');
});
}
})
->groupBy('c.id')
->havingRaw('COUNT(*) >= (SELECT COUNT(*) FROM cocktail_ingredients WHERE cocktail_id = c.id AND optional = false)');
$query = $this->db->table('cocktails')
->select('cocktails.id')
->selectRaw(
'
COUNT(DISTINCT CASE
WHEN ingredients.id IN (' . str_repeat('?,', count($ingredientIds) - 1) . '?) THEN ingredients.id
WHEN cocktail_ingredient_substitutes.ingredient_id IN (' . str_repeat('?,', count($ingredientIds) - 1) . '?) THEN cocktail_ingredient_substitutes.ingredient_id
WHEN ? = true AND ingredients.id IN (
SELECT parent_ingredient_id
FROM ingredients
WHERE id IN (' . str_repeat('?,', count($ingredientIds) - 1) . '?)
AND parent_ingredient_id IS NOT NULL
) THEN ingredients.id
ELSE NULL
END) as matching_ingredients',
[...$ingredientIds, ...$ingredientIds, $useParentIngredientAsSubstitute, ...$ingredientIds]
)
->join('cocktail_ingredients', 'cocktails.id', '=', 'cocktail_ingredients.cocktail_id')
->join('ingredients', 'ingredients.id', '=', 'cocktail_ingredients.ingredient_id')
->leftJoin('cocktail_ingredient_substitutes', 'cocktail_ingredient_substitutes.cocktail_ingredient_id', '=', 'cocktail_ingredients.id')
->where('cocktail_ingredients.optional', false)
->groupBy('cocktails.id')
->havingRaw('matching_ingredients >= (
SELECT COUNT(*)
FROM cocktail_ingredients ci2
WHERE ci2.cocktail_id = cocktails.id
AND ci2.optional = false
)');

if ($limit) {
$query->limit($limit);
Expand Down
Loading

0 comments on commit b56a85a

Please sign in to comment.