Skip to content

Commit 1b78605

Browse files
feat(sql) change SQL API
1 parent 3b67da8 commit 1b78605

7 files changed

Lines changed: 28 additions & 32 deletions

File tree

docs/docs/content/documentation/IPC.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ You can send SQL queries to remote tables using the `SQLQuery` class:
100100
>>> from rayforce import TCPClient
101101
>>> from rayforce.plugins.sql import SQLQuery
102102

103-
>>> query = SQLQuery("employees", "SELECT dept, AVG(salary) FROM self GROUP BY dept")
103+
>>> query = SQLQuery(Table("employees"), "SELECT dept, AVG(salary) FROM self GROUP BY dept")
104104
>>> result = client.execute(query)
105105
```
106106

docs/docs/content/documentation/plugins/sql.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -272,17 +272,17 @@ from rayforce.plugins.sql import SQLQuery
272272
client = TCPClient(host="localhost", port=5000)
273273

274274
# Execute SQL query on remote table
275-
query = SQLQuery("employees", "SELECT dept, AVG(salary) FROM self GROUP BY dept")
275+
query = SQLQuery(Table("employees"), "SELECT dept, AVG(salary) FROM self GROUP BY dept")
276276
result = client.execute(query)
277277

278278
# All SQL operations are supported
279-
update_query = SQLQuery("employees", "UPDATE self SET salary = salary * 1.1 WHERE rating > 4")
279+
update_query = SQLQuery(Table("employees"), "UPDATE self SET salary = salary * 1.1 WHERE rating > 4")
280280
client.execute(update_query)
281281

282-
insert_query = SQLQuery("employees", "INSERT INTO self (id, name) VALUES (100, 'New Hire')")
282+
insert_query = SQLQuery(Table("employees"), "INSERT INTO self (id, name) VALUES (100, 'New Hire')")
283283
client.execute(insert_query)
284284

285-
upsert_query = SQLQuery("employees", """
285+
upsert_query = SQLQuery(Table("employees"), """
286286
INSERT INTO self (id, name, salary)
287287
VALUES (100, 'Updated', 75000)
288288
ON CONFLICT (id) DO UPDATE

rayforce/plugins/sql.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -482,21 +482,18 @@ def _infer_name(self, expr: ParsedExpr) -> str:
482482
return "expr"
483483

484484

485-
def sql_query(query: str, table: Table) -> Table:
485+
def sql_query(table: Table, query: str) -> Table:
486486
return SQLCompiler().compile(SQLParser().parse(query), table)
487487

488488

489489
class SQLQuery:
490-
def __init__(self, table: str, query: str) -> None:
491-
self.table_name = table
492-
self.query_str = query
493-
self._parsed = SQLParser().parse(query)
490+
def __init__(self, table: Table, query: str) -> None:
491+
self.table = table
492+
self.parsed = SQLParser().parse(query)
494493

495494
@property
496495
def ipc(self):
497-
from rayforce.types.table import Table
498-
499-
return SQLIPCCompiler().compile(self._parsed, Table(self.table_name)).ipc
496+
return SQLIPCCompiler().compile(self.parsed, self.table).ipc
500497

501498

502499
class SQLIPCCompiler(SQLCompiler):

rayforce/types/table.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ def pivot(
574574
def sql(self, query: str) -> Table:
575575
from rayforce.plugins.sql import sql_query
576576

577-
return sql_query(query, t.cast("Table", self))
577+
return sql_query(t.cast("Table", self), query)
578578

579579

580580
class Table(

tests/network/tcp/test_query_objects.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ def test_sql_select_query_tcp(client):
148148
)
149149
table.save("employees")
150150

151-
query = SQLQuery("employees", "SELECT name, age FROM self WHERE age > 25")
151+
query = SQLQuery(Table("employees"), "SELECT name, age FROM self WHERE age > 25")
152152
result = _capture_and_eval(client, query)
153153

154154
assert isinstance(result, Table)
@@ -164,7 +164,7 @@ def test_sql_update_query_tcp(client):
164164
)
165165
table.save("employees")
166166

167-
query = SQLQuery("employees", "UPDATE self SET salary = 75000.0 WHERE id = 1")
167+
query = SQLQuery(Table("employees"), "UPDATE self SET salary = 75000.0 WHERE id = 1")
168168
result = _capture_and_eval(client, query)
169169

170170
assert isinstance(result, Symbol)
@@ -182,7 +182,7 @@ def test_sql_insert_query_tcp(client):
182182
)
183183
table.save("employees")
184184

185-
query = SQLQuery("employees", "INSERT INTO self (id, name) VALUES (2, 'bob')")
185+
query = SQLQuery(Table("employees"), "INSERT INTO self (id, name) VALUES (2, 'bob')")
186186
result = _capture_and_eval(client, query)
187187

188188
assert isinstance(result, Symbol)
@@ -202,7 +202,7 @@ def test_sql_upsert_query_tcp(client):
202202
table.save("employees")
203203

204204
query = SQLQuery(
205-
"employees",
205+
Table("employees"),
206206
"INSERT INTO self (id, name) VALUES (1, 'alice_updated') ON CONFLICT (id) DO UPDATE",
207207
)
208208
result = _capture_and_eval(client, query)
@@ -223,7 +223,7 @@ def test_sql_complex_select_tcp(client):
223223
table.save("employees")
224224

225225
query = SQLQuery(
226-
"employees",
226+
Table("employees"),
227227
"SELECT dept, AVG(salary) AS avg_salary FROM self GROUP BY dept",
228228
)
229229
result = _capture_and_eval(client, query)

tests/network/websocket/test_query_objects.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ async def test_sql_select_query_ws(ws_server):
353353
)
354354
table.save("employees")
355355

356-
query = SQLQuery("employees", "SELECT name, age FROM self WHERE age > 25")
356+
query = SQLQuery(Table("employees"), "SELECT name, age FROM self WHERE age > 25")
357357
result = await connection.execute(query)
358358

359359
assert isinstance(result, Table)
@@ -379,7 +379,7 @@ async def test_sql_update_query_ws(ws_server):
379379
)
380380
table.save("employees")
381381

382-
query = SQLQuery("employees", "UPDATE self SET salary = 75000.0 WHERE id = 1")
382+
query = SQLQuery(Table("employees"), "UPDATE self SET salary = 75000.0 WHERE id = 1")
383383
result = await connection.execute(query)
384384

385385
assert isinstance(result, Table)
@@ -402,7 +402,7 @@ async def test_sql_insert_query_ws(ws_server):
402402
)
403403
table.save("employees")
404404

405-
query = SQLQuery("employees", "INSERT INTO self (id, name) VALUES (2, 'bob')")
405+
query = SQLQuery(Table("employees"), "INSERT INTO self (id, name) VALUES (2, 'bob')")
406406
result = await connection.execute(query)
407407

408408
assert isinstance(result, Table)
@@ -429,7 +429,7 @@ async def test_sql_upsert_query_ws(ws_server):
429429

430430
# Update existing row
431431
query = SQLQuery(
432-
"employees",
432+
Table("employees"),
433433
"INSERT INTO self (id, name) VALUES (1, 'alice_updated') ON CONFLICT (id) DO UPDATE",
434434
)
435435
result = await connection.execute(query)
@@ -456,7 +456,7 @@ async def test_sql_complex_select_ws(ws_server):
456456
table.save("employees")
457457

458458
query = SQLQuery(
459-
"employees",
459+
Table("employees"),
460460
"SELECT dept, AVG(salary) AS avg_salary FROM self GROUP BY dept",
461461
)
462462
result = await connection.execute(query)

tests/plugins/test_sql.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -429,40 +429,39 @@ def test_in_combined_with_and(sqlglot, sample_table):
429429
def test_sql_query_ipc_select(sqlglot):
430430
from rayforce.plugins.sql import SQLQuery
431431

432-
query = SQLQuery("employees", "SELECT name, age FROM self WHERE age > 30")
432+
query = SQLQuery(Table("employees"), "SELECT name, age FROM self WHERE age > 30")
433433
assert query.ipc is not None
434434

435435

436436
def test_sql_query_ipc_update(sqlglot):
437437
from rayforce.plugins.sql import SQLQuery
438438

439-
query = SQLQuery("employees", "UPDATE self SET salary = 100000.0 WHERE level = 'senior'")
439+
query = SQLQuery(Table("employees"), "UPDATE self SET salary = 100000.0 WHERE level = 'senior'")
440440
assert query.ipc is not None
441441

442442

443443
def test_sql_query_ipc_insert(sqlglot):
444444
from rayforce.plugins.sql import SQLQuery
445445

446-
query = SQLQuery("employees", "INSERT INTO self (id, name) VALUES (1, 'Alice')")
446+
query = SQLQuery(Table("employees"), "INSERT INTO self (id, name) VALUES (1, 'Alice')")
447447
assert query.ipc is not None
448448

449449

450450
def test_sql_query_ipc_upsert(sqlglot):
451451
from rayforce.plugins.sql import SQLQuery
452452

453453
query = SQLQuery(
454-
"employees", "INSERT INTO self (id, name) VALUES (1, 'Alice') ON CONFLICT (id) DO UPDATE"
454+
Table("employees"),
455+
"INSERT INTO self (id, name) VALUES (1, 'Alice') ON CONFLICT (id) DO UPDATE",
455456
)
456457
assert query.ipc is not None
457458

458459

459460
def test_sql_query_stores_parsed(sqlglot):
460461
from rayforce.plugins.sql import ParsedSelect, SQLQuery
461462

462-
query = SQLQuery("employees", "SELECT * FROM self")
463-
assert isinstance(query._parsed, ParsedSelect)
464-
assert query.table_name == "employees"
465-
assert query.query_str == "SELECT * FROM self"
463+
query = SQLQuery(Table("employees"), "SELECT * FROM self")
464+
assert isinstance(query.parsed, ParsedSelect)
466465

467466

468467
def test_missing_sqlglot_raises(monkeypatch):

0 commit comments

Comments
 (0)