textbringer-tree-sitter 1.2.0 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CLAUDE.md +8 -0
- data/lib/textbringer/tree_sitter/node_maps/ruby.rb +4 -79
- data/lib/textbringer/tree_sitter/node_maps/sql.rb +14 -21
- data/lib/textbringer/tree_sitter/version.rb +1 -1
- data/lib/textbringer/tree_sitter_adapter.rb +7 -5
- data/samples/Sample.java +289 -0
- data/samples/sample.c +176 -0
- data/samples/sample.cob +174 -0
- data/samples/sample.cr +321 -0
- data/samples/sample.cs +273 -0
- data/samples/sample.ex +307 -0
- data/samples/sample.groovy +258 -0
- data/samples/sample.haml +154 -0
- data/samples/sample.html +168 -0
- data/samples/sample.js +266 -0
- data/samples/sample.json +68 -0
- data/samples/sample.pas +276 -0
- data/samples/sample.php +303 -0
- data/samples/sample.py +290 -0
- data/samples/sample.rb +160 -0
- data/samples/sample.rs +391 -0
- data/samples/sample.sh +142 -0
- data/samples/sample.sql +352 -0
- data/samples/sample.swift +482 -0
- data/samples/sample.tf +150 -0
- data/samples/sample.yaml +182 -0
- metadata +22 -1
data/samples/sample.sql
ADDED
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
-- Line comment
|
|
2
|
+
/* Block comment */
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* Multi-line
|
|
6
|
+
* block comment
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
-- ============================================
|
|
10
|
+
-- DDL: CREATE / ALTER / DROP
|
|
11
|
+
-- ============================================
|
|
12
|
+
|
|
13
|
+
-- --- Create schema ---
|
|
14
|
+
CREATE SCHEMA IF NOT EXISTS sample_schema;
|
|
15
|
+
|
|
16
|
+
-- --- Create tables ---
|
|
17
|
+
CREATE TABLE users (
|
|
18
|
+
id SERIAL PRIMARY KEY,
|
|
19
|
+
username VARCHAR(50) NOT NULL UNIQUE,
|
|
20
|
+
email VARCHAR(255) NOT NULL,
|
|
21
|
+
password TEXT NOT NULL,
|
|
22
|
+
age INTEGER CHECK (age >= 0),
|
|
23
|
+
salary DECIMAL(10, 2) DEFAULT 0.00,
|
|
24
|
+
is_active BOOLEAN DEFAULT TRUE,
|
|
25
|
+
role VARCHAR(20) DEFAULT 'user',
|
|
26
|
+
metadata JSONB,
|
|
27
|
+
avatar BYTEA,
|
|
28
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
29
|
+
updated_at TIMESTAMPTZ,
|
|
30
|
+
birth_date DATE,
|
|
31
|
+
login_time TIME,
|
|
32
|
+
uuid_col UUID DEFAULT gen_random_uuid()
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
CREATE TABLE posts (
|
|
36
|
+
id BIGSERIAL PRIMARY KEY,
|
|
37
|
+
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
38
|
+
title VARCHAR(200) NOT NULL,
|
|
39
|
+
body TEXT,
|
|
40
|
+
published BOOLEAN DEFAULT FALSE,
|
|
41
|
+
view_count INTEGER DEFAULT 0,
|
|
42
|
+
tags TEXT[],
|
|
43
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
44
|
+
CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id)
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
CREATE TABLE comments (
|
|
48
|
+
id SERIAL PRIMARY KEY,
|
|
49
|
+
post_id INTEGER NOT NULL REFERENCES posts(id) ON DELETE CASCADE,
|
|
50
|
+
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE SET NULL,
|
|
51
|
+
body TEXT NOT NULL,
|
|
52
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
-- --- Indexes ---
|
|
56
|
+
CREATE INDEX idx_users_email ON users(email);
|
|
57
|
+
CREATE UNIQUE INDEX idx_users_username ON users(username);
|
|
58
|
+
CREATE INDEX idx_posts_user ON posts(user_id);
|
|
59
|
+
CREATE INDEX idx_posts_tags ON posts USING GIN(tags);
|
|
60
|
+
|
|
61
|
+
-- --- Views ---
|
|
62
|
+
CREATE VIEW active_users AS
|
|
63
|
+
SELECT id, username, email, created_at
|
|
64
|
+
FROM users
|
|
65
|
+
WHERE is_active = TRUE;
|
|
66
|
+
|
|
67
|
+
CREATE VIEW post_summary AS
|
|
68
|
+
SELECT
|
|
69
|
+
p.id,
|
|
70
|
+
p.title,
|
|
71
|
+
u.username AS author,
|
|
72
|
+
p.view_count,
|
|
73
|
+
COUNT(c.id) AS comment_count
|
|
74
|
+
FROM posts p
|
|
75
|
+
LEFT JOIN users u ON p.user_id = u.id
|
|
76
|
+
LEFT JOIN comments c ON c.post_id = p.id
|
|
77
|
+
GROUP BY p.id, p.title, u.username, p.view_count;
|
|
78
|
+
|
|
79
|
+
-- --- Alter table ---
|
|
80
|
+
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
|
|
81
|
+
ALTER TABLE users ALTER COLUMN email SET NOT NULL;
|
|
82
|
+
ALTER TABLE users DROP COLUMN IF EXISTS phone;
|
|
83
|
+
|
|
84
|
+
-- --- Drop ---
|
|
85
|
+
DROP INDEX IF EXISTS idx_temp;
|
|
86
|
+
DROP VIEW IF EXISTS temp_view;
|
|
87
|
+
-- DROP TABLE IF EXISTS temp_table CASCADE;
|
|
88
|
+
|
|
89
|
+
-- ============================================
|
|
90
|
+
-- DML: INSERT / UPDATE / DELETE
|
|
91
|
+
-- ============================================
|
|
92
|
+
|
|
93
|
+
-- --- Insert ---
|
|
94
|
+
INSERT INTO users (username, email, password, age, salary, is_active)
|
|
95
|
+
VALUES
|
|
96
|
+
('alice', 'alice@example.com', 'hashed_pw1', 30, 75000.00, TRUE),
|
|
97
|
+
('bob', 'bob@example.com', 'hashed_pw2', 25, 60000.00, TRUE),
|
|
98
|
+
('charlie', 'charlie@example.com', 'hashed_pw3', 35, 90000.00, FALSE);
|
|
99
|
+
|
|
100
|
+
INSERT INTO posts (user_id, title, body, published, tags)
|
|
101
|
+
VALUES
|
|
102
|
+
(1, 'First Post', 'Hello, World!', TRUE, ARRAY['intro', 'hello']),
|
|
103
|
+
(1, 'Second Post', 'More content here.', FALSE, ARRAY['draft']),
|
|
104
|
+
(2, 'Bobs Post', 'Bob writes too.', TRUE, ARRAY['blog']);
|
|
105
|
+
|
|
106
|
+
INSERT INTO comments (post_id, user_id, body)
|
|
107
|
+
VALUES
|
|
108
|
+
(1, 2, 'Great post!'),
|
|
109
|
+
(1, 1, 'Thanks!'),
|
|
110
|
+
(3, 1, 'Nice one, Bob.');
|
|
111
|
+
|
|
112
|
+
-- --- Update ---
|
|
113
|
+
UPDATE users
|
|
114
|
+
SET salary = salary * 1.10,
|
|
115
|
+
updated_at = CURRENT_TIMESTAMP
|
|
116
|
+
WHERE is_active = TRUE
|
|
117
|
+
AND age >= 25;
|
|
118
|
+
|
|
119
|
+
-- --- Delete ---
|
|
120
|
+
DELETE FROM comments
|
|
121
|
+
WHERE created_at < CURRENT_TIMESTAMP - INTERVAL '1 year';
|
|
122
|
+
|
|
123
|
+
-- ============================================
|
|
124
|
+
-- DQL: SELECT (various forms)
|
|
125
|
+
-- ============================================
|
|
126
|
+
|
|
127
|
+
-- --- Basic select ---
|
|
128
|
+
SELECT * FROM users;
|
|
129
|
+
SELECT DISTINCT role FROM users;
|
|
130
|
+
SELECT id, username, email FROM users WHERE is_active = TRUE;
|
|
131
|
+
|
|
132
|
+
-- --- Operators ---
|
|
133
|
+
SELECT * FROM users WHERE age BETWEEN 20 AND 40;
|
|
134
|
+
SELECT * FROM users WHERE username LIKE 'a%';
|
|
135
|
+
SELECT * FROM users WHERE username ILIKE '%LIC%';
|
|
136
|
+
SELECT * FROM users WHERE role IN ('admin', 'user');
|
|
137
|
+
SELECT * FROM users WHERE metadata IS NOT NULL;
|
|
138
|
+
SELECT * FROM users WHERE age >= 18 AND salary > 50000 OR role = 'admin';
|
|
139
|
+
SELECT * FROM users WHERE NOT is_active;
|
|
140
|
+
|
|
141
|
+
-- --- Aggregate functions ---
|
|
142
|
+
SELECT
|
|
143
|
+
COUNT(*) AS total_users,
|
|
144
|
+
AVG(age) AS avg_age,
|
|
145
|
+
MIN(salary) AS min_salary,
|
|
146
|
+
MAX(salary) AS max_salary,
|
|
147
|
+
SUM(salary) AS total_salary
|
|
148
|
+
FROM users
|
|
149
|
+
WHERE is_active = TRUE;
|
|
150
|
+
|
|
151
|
+
-- --- GROUP BY / HAVING ---
|
|
152
|
+
SELECT
|
|
153
|
+
role,
|
|
154
|
+
COUNT(*) AS user_count,
|
|
155
|
+
AVG(salary) AS avg_salary
|
|
156
|
+
FROM users
|
|
157
|
+
GROUP BY role
|
|
158
|
+
HAVING COUNT(*) > 1
|
|
159
|
+
ORDER BY avg_salary DESC;
|
|
160
|
+
|
|
161
|
+
-- --- ORDER BY / LIMIT / OFFSET ---
|
|
162
|
+
SELECT * FROM users
|
|
163
|
+
ORDER BY created_at DESC NULLS LAST
|
|
164
|
+
LIMIT 10
|
|
165
|
+
OFFSET 20;
|
|
166
|
+
|
|
167
|
+
-- --- FETCH (SQL standard) ---
|
|
168
|
+
SELECT * FROM users
|
|
169
|
+
ORDER BY id
|
|
170
|
+
FETCH FIRST 5 ROWS ONLY;
|
|
171
|
+
|
|
172
|
+
-- --- JOINs ---
|
|
173
|
+
SELECT u.username, p.title, p.created_at
|
|
174
|
+
FROM users u
|
|
175
|
+
INNER JOIN posts p ON u.id = p.user_id
|
|
176
|
+
WHERE p.published = TRUE;
|
|
177
|
+
|
|
178
|
+
SELECT u.username, p.title
|
|
179
|
+
FROM users u
|
|
180
|
+
LEFT JOIN posts p ON u.id = p.user_id;
|
|
181
|
+
|
|
182
|
+
SELECT u.username, p.title
|
|
183
|
+
FROM users u
|
|
184
|
+
RIGHT JOIN posts p ON u.id = p.user_id;
|
|
185
|
+
|
|
186
|
+
SELECT u.username, p.title
|
|
187
|
+
FROM users u
|
|
188
|
+
FULL OUTER JOIN posts p ON u.id = p.user_id;
|
|
189
|
+
|
|
190
|
+
SELECT u1.username, u2.username
|
|
191
|
+
FROM users u1
|
|
192
|
+
CROSS JOIN users u2
|
|
193
|
+
WHERE u1.id < u2.id;
|
|
194
|
+
|
|
195
|
+
-- --- Subqueries ---
|
|
196
|
+
SELECT * FROM users
|
|
197
|
+
WHERE id IN (
|
|
198
|
+
SELECT DISTINCT user_id FROM posts WHERE published = TRUE
|
|
199
|
+
);
|
|
200
|
+
|
|
201
|
+
SELECT u.*, (
|
|
202
|
+
SELECT COUNT(*) FROM posts p WHERE p.user_id = u.id
|
|
203
|
+
) AS post_count
|
|
204
|
+
FROM users u;
|
|
205
|
+
|
|
206
|
+
-- --- CTE (Common Table Expressions) ---
|
|
207
|
+
WITH active_posters AS (
|
|
208
|
+
SELECT user_id, COUNT(*) AS post_count
|
|
209
|
+
FROM posts
|
|
210
|
+
WHERE published = TRUE
|
|
211
|
+
GROUP BY user_id
|
|
212
|
+
),
|
|
213
|
+
ranked AS (
|
|
214
|
+
SELECT
|
|
215
|
+
u.username,
|
|
216
|
+
ap.post_count,
|
|
217
|
+
RANK() OVER (ORDER BY ap.post_count DESC) AS rank
|
|
218
|
+
FROM users u
|
|
219
|
+
JOIN active_posters ap ON u.id = ap.user_id
|
|
220
|
+
)
|
|
221
|
+
SELECT * FROM ranked WHERE rank <= 3;
|
|
222
|
+
|
|
223
|
+
-- --- Recursive CTE ---
|
|
224
|
+
WITH RECURSIVE fibonacci(n, a, b) AS (
|
|
225
|
+
VALUES (1, 0, 1)
|
|
226
|
+
UNION ALL
|
|
227
|
+
SELECT n + 1, b, a + b
|
|
228
|
+
FROM fibonacci
|
|
229
|
+
WHERE n < 10
|
|
230
|
+
)
|
|
231
|
+
SELECT n, a AS fib FROM fibonacci;
|
|
232
|
+
|
|
233
|
+
-- --- Set operations ---
|
|
234
|
+
SELECT username FROM users WHERE role = 'admin'
|
|
235
|
+
UNION
|
|
236
|
+
SELECT username FROM users WHERE age > 30;
|
|
237
|
+
|
|
238
|
+
SELECT id FROM users
|
|
239
|
+
INTERSECT
|
|
240
|
+
SELECT user_id FROM posts;
|
|
241
|
+
|
|
242
|
+
SELECT id FROM users
|
|
243
|
+
EXCEPT
|
|
244
|
+
SELECT user_id FROM comments;
|
|
245
|
+
|
|
246
|
+
-- --- CASE expression ---
|
|
247
|
+
SELECT
|
|
248
|
+
username,
|
|
249
|
+
CASE
|
|
250
|
+
WHEN age < 18 THEN 'minor'
|
|
251
|
+
WHEN age BETWEEN 18 AND 65 THEN 'adult'
|
|
252
|
+
ELSE 'senior'
|
|
253
|
+
END AS age_group,
|
|
254
|
+
CASE role
|
|
255
|
+
WHEN 'admin' THEN 'Administrator'
|
|
256
|
+
WHEN 'user' THEN 'Regular User'
|
|
257
|
+
ELSE 'Unknown'
|
|
258
|
+
END AS role_label
|
|
259
|
+
FROM users;
|
|
260
|
+
|
|
261
|
+
-- --- Window functions ---
|
|
262
|
+
SELECT
|
|
263
|
+
username,
|
|
264
|
+
salary,
|
|
265
|
+
AVG(salary) OVER () AS avg_salary,
|
|
266
|
+
salary - AVG(salary) OVER () AS diff_from_avg,
|
|
267
|
+
ROW_NUMBER() OVER (ORDER BY salary DESC) AS salary_rank,
|
|
268
|
+
LAG(salary) OVER (ORDER BY salary) AS prev_salary,
|
|
269
|
+
LEAD(salary) OVER (ORDER BY salary) AS next_salary
|
|
270
|
+
FROM users;
|
|
271
|
+
|
|
272
|
+
-- --- String functions ---
|
|
273
|
+
SELECT
|
|
274
|
+
UPPER(username) AS upper_name,
|
|
275
|
+
LOWER(email) AS lower_email,
|
|
276
|
+
LENGTH(username) AS name_length,
|
|
277
|
+
CONCAT(username, ' <', email, '>') AS display
|
|
278
|
+
FROM users;
|
|
279
|
+
|
|
280
|
+
-- ============================================
|
|
281
|
+
-- Functions / Procedures
|
|
282
|
+
-- ============================================
|
|
283
|
+
|
|
284
|
+
-- --- Function ---
|
|
285
|
+
CREATE OR REPLACE FUNCTION calculate_bonus(
|
|
286
|
+
base_salary DECIMAL,
|
|
287
|
+
performance_rating INTEGER
|
|
288
|
+
)
|
|
289
|
+
RETURNS DECIMAL
|
|
290
|
+
LANGUAGE SQL
|
|
291
|
+
IMMUTABLE
|
|
292
|
+
AS $$
|
|
293
|
+
SELECT base_salary * (performance_rating / 10.0);
|
|
294
|
+
$$;
|
|
295
|
+
|
|
296
|
+
-- --- Procedure ---
|
|
297
|
+
CREATE OR REPLACE PROCEDURE deactivate_user(
|
|
298
|
+
target_user_id INTEGER
|
|
299
|
+
)
|
|
300
|
+
LANGUAGE SQL
|
|
301
|
+
AS $$
|
|
302
|
+
UPDATE users SET is_active = FALSE WHERE id = target_user_id;
|
|
303
|
+
$$;
|
|
304
|
+
|
|
305
|
+
-- --- Trigger ---
|
|
306
|
+
CREATE OR REPLACE FUNCTION update_timestamp()
|
|
307
|
+
RETURNS TRIGGER
|
|
308
|
+
LANGUAGE SQL
|
|
309
|
+
AS $$
|
|
310
|
+
SELECT NEW.updated_at = CURRENT_TIMESTAMP;
|
|
311
|
+
$$;
|
|
312
|
+
|
|
313
|
+
CREATE TRIGGER users_update_timestamp
|
|
314
|
+
BEFORE UPDATE ON users
|
|
315
|
+
FOR EACH ROW
|
|
316
|
+
EXECUTE FUNCTION update_timestamp();
|
|
317
|
+
|
|
318
|
+
-- ============================================
|
|
319
|
+
-- Transactions
|
|
320
|
+
-- ============================================
|
|
321
|
+
|
|
322
|
+
BEGIN;
|
|
323
|
+
UPDATE users SET salary = salary + 5000 WHERE username = 'alice';
|
|
324
|
+
INSERT INTO posts (user_id, title, body) VALUES (1, 'Raise!', 'Got a raise!');
|
|
325
|
+
COMMIT;
|
|
326
|
+
|
|
327
|
+
-- ROLLBACK example
|
|
328
|
+
BEGIN;
|
|
329
|
+
DELETE FROM users WHERE username = 'charlie';
|
|
330
|
+
ROLLBACK;
|
|
331
|
+
|
|
332
|
+
-- ============================================
|
|
333
|
+
-- Privileges
|
|
334
|
+
-- ============================================
|
|
335
|
+
|
|
336
|
+
GRANT SELECT, INSERT ON users TO readonly_role;
|
|
337
|
+
REVOKE DELETE ON users FROM readonly_role;
|
|
338
|
+
|
|
339
|
+
-- ============================================
|
|
340
|
+
-- Function calls
|
|
341
|
+
-- ============================================
|
|
342
|
+
SELECT
|
|
343
|
+
NOW(),
|
|
344
|
+
CURRENT_DATE,
|
|
345
|
+
COALESCE(NULL, 'fallback'),
|
|
346
|
+
NULLIF(1, 1),
|
|
347
|
+
GREATEST(1, 2, 3),
|
|
348
|
+
LEAST(1, 2, 3),
|
|
349
|
+
ABS(-42),
|
|
350
|
+
ROUND(3.14159, 2),
|
|
351
|
+
CEIL(3.14),
|
|
352
|
+
FLOOR(3.99);
|