dbplyr icon indicating copy to clipboard operation
dbplyr copied to clipboard

Inline `filter()` in `semi/anti_join()`

Open mgirlich opened this issue 2 years ago • 0 comments

library(dplyr, warn.conflicts = FALSE)
library(dbplyr, warn.conflicts = FALSE)

lf <- lazy_frame(x = 1, y = 2, z = 3)
lf2 <- lazy_frame(x = 1, a = 2, b = 3)

semi_join(
  lf,
  lf2 %>% 
    filter(a == 1),
  by = "x"
)

Currently produces

SELECT *
FROM `df` AS `LHS`
WHERE EXISTS (
  SELECT 1 FROM (
    SELECT *
    FROM `df`
    WHERE (`a` = 1.0)
  ) `RHS`
  WHERE (`LHS`.`x` = `RHS`.`x`)
)

But could be

SELECT *
FROM `df` AS `LHS`
WHERE EXISTS (
  SELECT 1 FROM
  FROM `df` AS `RHS`
  WHERE (`RHS`.`a` = 1.0) AND (`LHS`.`x` = `RHS`.`x`)
)

mgirlich avatar May 20 '22 13:05 mgirlich