| 241 | | my_likes AS ( |
| 242 | | SELECT fl.listing_id |
| 243 | | FROM favorite_listings fl |
| 244 | | WHERE fl.client_id = :user_id |
| 245 | | ), |
| 246 | | |
| 247 | | my_recent_likes AS ( |
| 248 | | SELECT fl.listing_id |
| 249 | | FROM favorite_listings fl |
| 250 | | JOIN listings l ON l.listing_id = fl.listing_id |
| 251 | | WHERE fl.client_id = :user_id |
| 252 | | ORDER BY l.created_at DESC |
| 253 | | LIMIT :10 |
| 254 | | ), |
| 255 | | |
| 256 | | similar_users AS ( |
| 257 | | SELECT |
| 258 | | fl2.client_id AS other_user_id, |
| 259 | | COUNT(*) AS overlap_likes |
| 260 | | FROM favorite_listings fl2 |
| 261 | | JOIN my_likes ml ON ml.listing_id = fl2.listing_id |
| 262 | | WHERE fl2.client_id <> :user_id |
| 263 | | GROUP BY fl2.client_id |
| 264 | | HAVING COUNT(*) > 0 |
| 265 | | ), |
| 266 | | |
| 267 | | cf_candidates AS ( |
| 268 | | SELECT |
| 269 | | fl.listing_id, |
| 270 | | SUM(su.overlap_likes) AS cf_score, |
| 271 | | COUNT(DISTINCT su.other_user_id) AS liked_by_similar_users |
| 272 | | FROM similar_users su |
| 273 | | JOIN favorite_listings fl |
| 274 | | ON fl.client_id = su.other_user_id |
| 275 | | LEFT JOIN my_likes ml |
| 276 | | ON ml.listing_id = fl.listing_id |
| 277 | | WHERE ml.listing_id IS NULL |
| 278 | | GROUP BY fl.listing_id |
| 279 | | ), |
| 280 | | |
| 281 | | content_candidates AS ( |
| 282 | | SELECT |
| 283 | | l2.listing_id, |
| 284 | | COUNT(*) AS content_score |
| 285 | | FROM my_recent_likes r |
| 286 | | JOIN listings l1 ON l1.listing_id = r.listing_id |
| 287 | | JOIN listings l2 ON |
| 288 | | l2.listing_id <> l1.listing_id |
| 289 | | AND ( |
| 290 | | (l2.species = l1.species) |
| 291 | | OR (l2.breed = l1.breed) |
| 292 | | OR (l2.location = l1.location) |
| 293 | | ) |
| 294 | | LEFT JOIN my_likes ml ON ml.listing_id = l2.listing_id |
| 295 | | WHERE ml.listing_id IS NULL |
| 296 | | GROUP BY l2.listing_id |
| 297 | | ), |
| 298 | | |
| 299 | | |
| 300 | | merged AS ( |
| 301 | | SELECT |
| 302 | | COALESCE(cf.listing_id, cc.listing_id) AS listing_id, |
| 303 | | COALESCE(cf.cf_score, 0) AS cf_score, |
| 304 | | COALESCE(cf.liked_by_similar_users, 0) AS liked_by_similar_users, |
| 305 | | COALESCE(cc.content_score, 0) AS content_score |
| 306 | | FROM cf_candidates cf |
| 307 | | FULL OUTER JOIN content_candidates cc |
| 308 | | ON cc.listing_id = cf.listing_id |
| 309 | | ) |
| | 241 | my_likes AS ( |
| | 242 | SELECT fl.listing_id |
| | 243 | FROM favorite_listings fl |
| | 244 | WHERE fl.client_id = :user_id |
| | 245 | ), |
| | 246 | |
| | 247 | my_recent_likes AS ( |
| | 248 | SELECT fl.listing_id |
| | 249 | FROM favorite_listings fl |
| | 250 | JOIN listings l ON l.listing_id = fl.listing_id |
| | 251 | WHERE fl.client_id = :user_id |
| | 252 | ORDER BY l.created_at DESC |
| | 253 | LIMIT 10 |
| | 254 | ), |
| | 255 | |
| | 256 | similar_users AS ( |
| | 257 | SELECT |
| | 258 | fl2.client_id AS other_user_id, |
| | 259 | COUNT(*) AS overlap_likes |
| | 260 | FROM favorite_listings fl2 |
| | 261 | JOIN my_likes ml ON ml.listing_id = fl2.listing_id |
| | 262 | WHERE fl2.client_id <> :user_id |
| | 263 | GROUP BY fl2.client_id |
| | 264 | HAVING COUNT(*) > 0 |
| | 265 | ), |
| | 266 | |
| | 267 | cf_candidates AS ( |
| | 268 | SELECT |
| | 269 | fl.listing_id, |
| | 270 | SUM(su.overlap_likes) AS cf_score, |
| | 271 | COUNT(DISTINCT su.other_user_id) AS liked_by_similar_users |
| | 272 | FROM similar_users su |
| | 273 | JOIN favorite_listings fl |
| | 274 | ON fl.client_id = su.other_user_id |
| | 275 | LEFT JOIN my_likes ml |
| | 276 | ON ml.listing_id = fl.listing_id |
| | 277 | WHERE ml.listing_id IS NULL |
| | 278 | GROUP BY fl.listing_id |
| | 279 | ), |
| | 280 | |
| | 281 | content_candidates AS ( |
| | 282 | SELECT |
| | 283 | l2.listing_id, |
| | 284 | COUNT(*) AS content_score |
| | 285 | FROM my_recent_likes r |
| | 286 | JOIN listings l1 ON l1.listing_id = r.listing_id |
| | 287 | JOIN animals a1 ON a1.animal_id = l1.animal_id |
| | 288 | |
| | 289 | JOIN listings l2 ON l2.listing_id <> l1.listing_id |
| | 290 | JOIN animals a2 ON a2.animal_id = l2.animal_id |
| | 291 | |
| | 292 | LEFT JOIN my_likes ml ON ml.listing_id = l2.listing_id |
| | 293 | WHERE ml.listing_id IS NULL |
| | 294 | AND ( |
| | 295 | a2.species = a1.species |
| | 296 | OR a2.breed = a1.breed |
| | 297 | OR a2.located_name = a1.located_name |
| | 298 | ) |
| | 299 | GROUP BY l2.listing_id |
| | 300 | ), |
| | 301 | |
| | 302 | |
| | 303 | |
| | 304 | merged AS ( |
| | 305 | SELECT |
| | 306 | COALESCE(cf.listing_id, cc.listing_id) AS listing_id, |
| | 307 | COALESCE(cf.cf_score, 0) AS cf_score, |
| | 308 | COALESCE(cf.liked_by_similar_users, 0) AS liked_by_similar_users, |
| | 309 | COALESCE(cc.content_score, 0) AS content_score |
| | 310 | FROM cf_candidates cf |
| | 311 | FULL OUTER JOIN content_candidates cc |
| | 312 | ON cc.listing_id = cf.listing_id |
| | 313 | ) |