Skip to content

Commit 4790414

Browse files
authored
Feat(prql): Handle DESC with sort (#3299)
* update sort * add todo * lint * update
1 parent 75e0c69 commit 4790414

File tree

2 files changed

+40
-21
lines changed

2 files changed

+40
-21
lines changed

sqlglot/dialects/prql.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,17 @@ def _parse_take(self, query: exp.Query) -> t.Optional[exp.Query]:
104104
num = self._parse_number() # TODO: TAKE for ranges a..b
105105
return query.limit(num) if num else None
106106

107+
def _parse_ordered(
108+
self, parse_method: t.Optional[t.Callable] = None
109+
) -> t.Optional[exp.Ordered]:
110+
asc = self._match(TokenType.PLUS)
111+
desc = self._match(TokenType.DASH) or (asc and False)
112+
term = term = super()._parse_ordered(parse_method=parse_method)
113+
if term and desc:
114+
term.set("desc", True)
115+
term.set("nulls_first", False)
116+
return term
117+
107118
def _parse_order_by(self, query: exp.Select) -> t.Optional[exp.Query]:
108119
l_brace = self._match(TokenType.L_BRACE)
109120
expressions = self._parse_csv(self._parse_ordered)

tests/dialects/test_prql.py

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,48 +5,56 @@ class TestPRQL(Validator):
55
dialect = "prql"
66

77
def test_prql(self):
8-
self.validate_identity("FROM x", "SELECT * FROM x")
9-
self.validate_identity("FROM x DERIVE a + 1", "SELECT *, a + 1 FROM x")
10-
self.validate_identity("FROM x DERIVE x = a + 1", "SELECT *, a + 1 AS x FROM x")
11-
self.validate_identity("FROM x DERIVE {a + 1}", "SELECT *, a + 1 FROM x")
12-
self.validate_identity("FROM x DERIVE {x = a + 1, b}", "SELECT *, a + 1 AS x, b FROM x")
8+
self.validate_identity("from x", "SELECT * FROM x")
9+
self.validate_identity("from x derive a + 1", "SELECT *, a + 1 FROM x")
10+
self.validate_identity("from x derive x = a + 1", "SELECT *, a + 1 AS x FROM x")
11+
self.validate_identity("from x derive {a + 1}", "SELECT *, a + 1 FROM x")
12+
self.validate_identity("from x derive {x = a + 1, b}", "SELECT *, a + 1 AS x, b FROM x")
1313
self.validate_identity(
14-
"FROM x DERIVE {x = a + 1, b} SELECT {y = x, 2}", "SELECT a + 1 AS y, 2 FROM x"
14+
"from x derive {x = a + 1, b} select {y = x, 2}", "SELECT a + 1 AS y, 2 FROM x"
1515
)
16-
self.validate_identity("FROM x TAKE 10", "SELECT * FROM x LIMIT 10")
17-
self.validate_identity("FROM x TAKE 10 TAKE 5", "SELECT * FROM x LIMIT 5")
18-
self.validate_identity("FROM x FILTER age > 25", "SELECT * FROM x WHERE age > 25")
16+
self.validate_identity("from x take 10", "SELECT * FROM x LIMIT 10")
17+
self.validate_identity("from x take 10 take 5", "SELECT * FROM x LIMIT 5")
18+
self.validate_identity("from x filter age > 25", "SELECT * FROM x WHERE age > 25")
1919
self.validate_identity(
20-
"FROM x DERIVE {x = a + 1, b} FILTER age > 25",
20+
"from x derive {x = a + 1, b} filter age > 25",
2121
"SELECT *, a + 1 AS x, b FROM x WHERE age > 25",
2222
)
23-
self.validate_identity("FROM x FILTER dept != 'IT'", "SELECT * FROM x WHERE dept <> 'IT'")
23+
self.validate_identity("from x filter dept != 'IT'", "SELECT * FROM x WHERE dept <> 'IT'")
2424
self.validate_identity(
25-
"FROM x FILTER p == 'product' SELECT { a, b }", "SELECT a, b FROM x WHERE p = 'product'"
25+
"from x filter p == 'product' select { a, b }", "SELECT a, b FROM x WHERE p = 'product'"
2626
)
2727
self.validate_identity(
28-
"FROM x FILTER age > 25 FILTER age < 27", "SELECT * FROM x WHERE age > 25 AND age < 27"
28+
"from x filter age > 25 filter age < 27", "SELECT * FROM x WHERE age > 25 AND age < 27"
2929
)
3030
self.validate_identity(
31-
"FROM x FILTER (age > 25 && age < 27)", "SELECT * FROM x WHERE (age > 25 AND age < 27)"
31+
"from x filter (age > 25 && age < 27)", "SELECT * FROM x WHERE (age > 25 AND age < 27)"
3232
)
3333
self.validate_identity(
34-
"FROM x FILTER (age > 25 || age < 27)", "SELECT * FROM x WHERE (age > 25 OR age < 27)"
34+
"from x filter (age > 25 || age < 27)", "SELECT * FROM x WHERE (age > 25 OR age < 27)"
3535
)
3636
self.validate_identity(
37-
"FROM x FILTER (age > 25 || age < 22) FILTER age > 26 FILTER age < 27",
37+
"from x filter (age > 25 || age < 22) filter age > 26 filter age < 27",
3838
"SELECT * FROM x WHERE ((age > 25 OR age < 22) AND age > 26) AND age < 27",
3939
)
4040
self.validate_identity(
41-
"FROM x SORT age",
41+
"from x sort age",
4242
"SELECT * FROM x ORDER BY age",
4343
)
4444
self.validate_identity(
45-
"FROM x SORT {age, name}",
45+
"from x sort {-age}",
46+
"SELECT * FROM x ORDER BY age DESC",
47+
)
48+
self.validate_identity(
49+
"from x sort {age, name}",
4650
"SELECT * FROM x ORDER BY age, name",
4751
)
48-
self.validate_identity("FROM x APPEND y", "SELECT * FROM x UNION ALL SELECT * FROM y")
49-
self.validate_identity("FROM x REMOVE y", "SELECT * FROM x EXCEPT ALL SELECT * FROM y")
5052
self.validate_identity(
51-
"FROM x INTERSECT y", "SELECT * FROM x INTERSECT ALL SELECT * FROM y"
53+
"from x sort {-age, +name}",
54+
"SELECT * FROM x ORDER BY age DESC, name",
55+
)
56+
self.validate_identity("from x append y", "SELECT * FROM x UNION ALL SELECT * FROM y")
57+
self.validate_identity("from x remove y", "SELECT * FROM x EXCEPT ALL SELECT * FROM y")
58+
self.validate_identity(
59+
"from x intersect y", "SELECT * FROM x INTERSECT ALL SELECT * FROM y"
5260
)

0 commit comments

Comments
 (0)