Skip to content

Commit eba1ffa

Browse files
authored
Merge pull request #156 from launchql/feat/adv-pretty-updates
Feat/adv pretty updates
2 parents a655952 + 71e8aa3 commit eba1ffa

File tree

6 files changed

+540
-17
lines changed

6 files changed

+540
-17
lines changed

__fixtures__/generated/generated.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@
1111
"pretty/misc-4.sql": "SELECT p.id, p.title,\n CASE\n WHEN EXISTS (\n SELECT 1 FROM reviews r\n WHERE r.product_id = p.id AND r.rating >= 4\n ) THEN 'Popular'\n ELSE 'Unrated'\n END AS status\nFROM products p\nWHERE p.archived = false",
1212
"pretty/misc-5.sql": "WITH logs AS (\n SELECT id, payload::json->>'event' AS event, (payload::json->>'ts')::timestamp AS ts\n FROM event_log\n WHERE ts > NOW() - INTERVAL '7 days'\n)\nSELECT event, COUNT(*) AS freq\nFROM (\n SELECT DISTINCT event, ts::date AS event_day\n FROM logs\n) d\nGROUP BY event\nORDER BY freq DESC",
1313
"pretty/misc-6.sql": "SELECT \n o.id AS order_id,\n u.name AS user_name,\n p.name AS product_name,\n s.status,\n sh.shipped_at,\n r.refund_amount\nFROM orders o\nJOIN users u \n ON o.user_id = u.id\nJOIN order_items oi \n ON oi.order_id = o.id\nJOIN products p \n ON (\n (p.id = oi.product_id AND p.available = true)\n OR \n (p.sku = oi.product_sku AND (p.discontinued = false OR p.replacement_id IS NOT NULL))\n )\nLEFT JOIN shipping sh \n ON (\n sh.order_id = o.id \n AND (\n (sh.carrier = 'UPS' AND sh.tracking_number IS NOT NULL)\n OR \n (sh.carrier = 'FedEx' AND sh.shipped_at > o.created_at + INTERVAL '1 day')\n )\n )\nLEFT JOIN statuses s \n ON s.id = o.status_id \n AND (\n s.name != 'cancelled'\n OR (s.name = 'cancelled' AND s.updated_at > NOW() - INTERVAL '7 days')\n )\nLEFT JOIN refunds r \n ON r.order_id = o.id \n AND (\n (r.status = 'approved' AND r.processed_at IS NOT NULL)\n OR \n (r.status = 'pending' AND r.requested_at < NOW() - INTERVAL '14 days')\n )\nWHERE o.created_at > NOW() - INTERVAL '90 days'\n AND u.active = true\n AND (\n s.status = 'shipped' \n OR (\n s.status = 'processing' \n AND EXISTS (\n SELECT 1 FROM order_notes n WHERE n.order_id = o.id AND n.note ILIKE '%expedite%'\n )\n )\n )\nORDER BY o.created_at DESC",
14+
"pretty/misc-7.sql": "select (CASE \nWHEN ( n = 2 ) THEN ARRAY[ 'month' ]\nWHEN ( n = 4 ) THEN ARRAY[ 'year' ]\nWHEN ( n = 6 ) THEN ARRAY[ 'year', 'month' ]\nWHEN ( n = 8 ) THEN ARRAY[ 'day' ]\nWHEN ( n = 1024 ) THEN ARRAY[ 'hour' ]\nWHEN ( n = 1032 ) THEN ARRAY[ 'day', 'hour' ]\nWHEN ( n = 2048 ) THEN ARRAY[ 'minute' ]\nWHEN ( n = 3072 ) THEN ARRAY[ 'hour', 'minute' ]\nWHEN ( n = 3080 ) THEN ARRAY[ 'day', 'minute' ]\nWHEN ( n = 4096 ) THEN ARRAY[ 'second' ]\nWHEN ( n = 6144 ) THEN ARRAY[ 'minute', 'second' ]\nWHEN ( n = 7168 ) THEN ARRAY[ 'hour', 'second' ]\nWHEN ( n = 7176 ) THEN ARRAY[ 'day', 'second' ]\nWHEN ( n = 32767 ) THEN ARRAY[]::text[]\nEND)",
15+
"pretty/misc-8.sql": "SELECT (\n CASE \n WHEN n = 2 OR n = 3 THEN ARRAY['month', COALESCE(extra_label, 'unknown')]\n WHEN n IN (4, 5) THEN \n CASE \n WHEN is_leap_year THEN ARRAY['year', 'leap']\n ELSE ARRAY['year']\n END\n WHEN n = 6 THEN ARRAY['year', 'month', 'quarter']\n WHEN n = 8 THEN ARRAY['day', 'week', compute_label(n)]\n WHEN n = 1024 THEN ARRAY['hour', format('%s-hour', extra_label)]\n WHEN n = 1032 AND flag = true THEN ARRAY['day', 'hour', 'flagged']\n WHEN n BETWEEN 2048 AND 2049 THEN ARRAY['minute', 'tick']\n WHEN n = 3072 THEN ARRAY['hour', 'minute', current_setting('timezone')]\n WHEN n = 3080 THEN ARRAY['day', 'minute', to_char(now(), 'HH24:MI')]\n WHEN n IN (4096, 4097, 4098) THEN ARRAY['second', 'millisecond']\n WHEN n = 6144 THEN ARRAY['minute', 'second', CASE WHEN use_micro = true THEN 'microsecond' ELSE 'none' END]\n WHEN n = 7168 OR (n > 7170 AND n < 7180) THEN ARRAY['hour', 'second', 'buffered']\n WHEN n = 7176 THEN ARRAY['day', 'second', extra_info::text]\n WHEN n = 32767 THEN ARRAY[]::text[]\n ELSE ARRAY['undefined', 'unknown', 'fallback']\n END\n)",
16+
"pretty/misc-9.sql": "SELECT \n user_id,\n (CASE \n WHEN EXISTS (SELECT 1 FROM logins WHERE logins.user_id = users.user_id AND success = false) \n THEN 'risky'\n ELSE 'safe'\n END) AS risk_status\nFROM users",
17+
"pretty/misc-10.sql": "SELECT * \nFROM orders\nWHERE \n status = (CASE \n WHEN shipped_at IS NOT NULL THEN 'shipped'\n WHEN canceled_at IS NOT NULL THEN 'canceled'\n ELSE 'processing'\n END)",
18+
"pretty/misc-11.sql": "SELECT *\nFROM users u,\nLATERAL (\n SELECT \n (CASE \n WHEN u.is_admin THEN 'admin_dashboard'\n ELSE 'user_dashboard'\n END) AS dashboard_view\n) AS derived",
19+
"pretty/misc-12.sql": "SELECT \n id,\n (SELECT \n CASE \n WHEN COUNT(*) > 5 THEN 'frequent'\n ELSE 'occasional'\n END\n FROM purchases p WHERE p.user_id = u.id) AS purchase_freq\nFROM users u",
20+
"pretty/misc-13.sql": "SELECT \n id,\n CASE \n WHEN rank() OVER (ORDER BY score DESC) = 1 THEN 'top'\n ELSE 'normal'\n END AS tier\nFROM players",
1421
"pretty/create_table-1.sql": "CREATE TABLE users (\n id SERIAL PRIMARY KEY,\n name TEXT NOT NULL,\n email TEXT UNIQUE\n)",
1522
"pretty/create_table-2.sql": "CREATE TABLE products (\n id SERIAL PRIMARY KEY,\n name VARCHAR(255) NOT NULL,\n price DECIMAL(10,2) CHECK (price > 0),\n category_id INTEGER,\n description TEXT,\n created_at TIMESTAMP DEFAULT now(),\n updated_at TIMESTAMP,\n UNIQUE (name, category_id),\n FOREIGN KEY (category_id) REFERENCES categories(id)\n)",
1623
"pretty/create_table-3.sql": "CREATE TABLE orders (\n id SERIAL PRIMARY KEY,\n subtotal DECIMAL(10,2) NOT NULL,\n tax_rate DECIMAL(5,4) DEFAULT 0.0825,\n tax_amount DECIMAL(10,2) GENERATED ALWAYS AS (subtotal * tax_rate) STORED,\n total DECIMAL(10,2) GENERATED ALWAYS AS (subtotal + tax_amount) STORED\n)",

__fixtures__/kitchen-sink/pretty/misc.sql

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,105 @@ WHERE o.created_at > NOW() - INTERVAL '90 days'
110110
)
111111
)
112112
ORDER BY o.created_at DESC;
113+
114+
-- 7. A case
115+
116+
select (CASE
117+
WHEN ( n = 2 ) THEN ARRAY[ 'month' ]
118+
WHEN ( n = 4 ) THEN ARRAY[ 'year' ]
119+
WHEN ( n = 6 ) THEN ARRAY[ 'year', 'month' ]
120+
WHEN ( n = 8 ) THEN ARRAY[ 'day' ]
121+
WHEN ( n = 1024 ) THEN ARRAY[ 'hour' ]
122+
WHEN ( n = 1032 ) THEN ARRAY[ 'day', 'hour' ]
123+
WHEN ( n = 2048 ) THEN ARRAY[ 'minute' ]
124+
WHEN ( n = 3072 ) THEN ARRAY[ 'hour', 'minute' ]
125+
WHEN ( n = 3080 ) THEN ARRAY[ 'day', 'minute' ]
126+
WHEN ( n = 4096 ) THEN ARRAY[ 'second' ]
127+
WHEN ( n = 6144 ) THEN ARRAY[ 'minute', 'second' ]
128+
WHEN ( n = 7168 ) THEN ARRAY[ 'hour', 'second' ]
129+
WHEN ( n = 7176 ) THEN ARRAY[ 'day', 'second' ]
130+
WHEN ( n = 32767 ) THEN ARRAY[]::text[]
131+
END);
132+
133+
-- 8. A case
134+
135+
SELECT (
136+
CASE
137+
WHEN n = 2 OR n = 3 THEN ARRAY['month', COALESCE(extra_label, 'unknown')]
138+
WHEN n IN (4, 5) THEN
139+
CASE
140+
WHEN is_leap_year THEN ARRAY['year', 'leap']
141+
ELSE ARRAY['year']
142+
END
143+
WHEN n = 6 THEN ARRAY['year', 'month', 'quarter']
144+
WHEN n = 8 THEN ARRAY['day', 'week', compute_label(n)]
145+
WHEN n = 1024 THEN ARRAY['hour', format('%s-hour', extra_label)]
146+
WHEN n = 1032 AND flag = true THEN ARRAY['day', 'hour', 'flagged']
147+
WHEN n BETWEEN 2048 AND 2049 THEN ARRAY['minute', 'tick']
148+
WHEN n = 3072 THEN ARRAY['hour', 'minute', current_setting('timezone')]
149+
WHEN n = 3080 THEN ARRAY['day', 'minute', to_char(now(), 'HH24:MI')]
150+
WHEN n IN (4096, 4097, 4098) THEN ARRAY['second', 'millisecond']
151+
WHEN n = 6144 THEN ARRAY['minute', 'second', CASE WHEN use_micro = true THEN 'microsecond' ELSE 'none' END]
152+
WHEN n = 7168 OR (n > 7170 AND n < 7180) THEN ARRAY['hour', 'second', 'buffered']
153+
WHEN n = 7176 THEN ARRAY['day', 'second', extra_info::text]
154+
WHEN n = 32767 THEN ARRAY[]::text[]
155+
ELSE ARRAY['undefined', 'unknown', 'fallback']
156+
END
157+
);
158+
159+
160+
-- 9. A case with select
161+
162+
SELECT
163+
user_id,
164+
(CASE
165+
WHEN EXISTS (SELECT 1 FROM logins WHERE logins.user_id = users.user_id AND success = false)
166+
THEN 'risky'
167+
ELSE 'safe'
168+
END) AS risk_status
169+
FROM users;
170+
171+
-- 10. A case in where clause
172+
173+
SELECT *
174+
FROM orders
175+
WHERE
176+
status = (CASE
177+
WHEN shipped_at IS NOT NULL THEN 'shipped'
178+
WHEN canceled_at IS NOT NULL THEN 'canceled'
179+
ELSE 'processing'
180+
END);
181+
182+
-- 11. A case in lateral join
183+
184+
SELECT *
185+
FROM users u,
186+
LATERAL (
187+
SELECT
188+
(CASE
189+
WHEN u.is_admin THEN 'admin_dashboard'
190+
ELSE 'user_dashboard'
191+
END) AS dashboard_view
192+
) AS derived;
193+
194+
-- 12. A CASE used inside a scalar subquery in SELECT
195+
196+
SELECT
197+
id,
198+
(SELECT
199+
CASE
200+
WHEN COUNT(*) > 5 THEN 'frequent'
201+
ELSE 'occasional'
202+
END
203+
FROM purchases p WHERE p.user_id = u.id) AS purchase_freq
204+
FROM users u;
205+
206+
-- 13. A case in window function
207+
208+
SELECT
209+
id,
210+
CASE
211+
WHEN rank() OVER (ORDER BY score DESC) = 1 THEN 'top'
212+
ELSE 'normal'
213+
END AS tier
214+
FROM players;

packages/deparser/__tests__/kitchen-sink/pretty-misc.test.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@ it('pretty-misc', async () => {
99
"pretty/misc-3.sql",
1010
"pretty/misc-4.sql",
1111
"pretty/misc-5.sql",
12-
"pretty/misc-6.sql"
12+
"pretty/misc-6.sql",
13+
"pretty/misc-7.sql",
14+
"pretty/misc-8.sql",
15+
"pretty/misc-9.sql",
16+
"pretty/misc-10.sql",
17+
"pretty/misc-11.sql",
18+
"pretty/misc-12.sql",
19+
"pretty/misc-13.sql"
1320
]);
1421
});

0 commit comments

Comments
 (0)