diff --git a/src/tags.rs b/src/tags.rs index 2c8ab3c..1c2d4c0 100644 --- a/src/tags.rs +++ b/src/tags.rs @@ -356,12 +356,17 @@ impl TagDao for SqliteTagDao { ) -> anyhow::Result> { use diesel::dsl::*; + let exclude_subquery = tagged_photo::table + .filter(tagged_photo::tag_id.eq_any(exclude_tag_ids.clone())) + .select(tagged_photo::photo_name) + .into_boxed(); + tagged_photo::table .filter(tagged_photo::tag_id.eq_any(tag_ids.clone())) - .filter(tagged_photo::tag_id.ne_all(exclude_tag_ids)) + .filter(tagged_photo::photo_name.ne_all(exclude_subquery)) .group_by(tagged_photo::photo_name) .select((tagged_photo::photo_name, count(tagged_photo::tag_id))) - .having(count_distinct(tagged_photo::tag_id).eq(tag_ids.len() as i64)) + .having(count_distinct(tagged_photo::tag_id).ge(tag_ids.len() as i64)) .select(tagged_photo::photo_name) .get_results::(&mut self.connection) .with_context(|| format!("Unable to get Tagged photos with ids: {:?}", tag_ids)) @@ -384,7 +389,6 @@ impl TagDao for SqliteTagDao { .filter(tagged_photo::photo_name.ne_all(exclude_subquery)) .group_by(tagged_photo::photo_name) .select((tagged_photo::photo_name, count(tagged_photo::tag_id))) - // .having(count_distinct(tagged_photo::tag_id).eq(tag_ids.len() as i64)) .select(tagged_photo::photo_name) .get_results::(&mut self.connection) .with_context(|| format!("Unable to get Tagged photos with ids: {:?}", tag_ids))