Skip to content

Commit fd5deda

Browse files
committed
feat(metadata): provide db version
1 parent f9e4e02 commit fd5deda

17 files changed

+104
-2
lines changed

ibis-server/app/model/metadata/bigquery.py

+3
Original file line numberDiff line numberDiff line change
@@ -136,3 +136,6 @@ def get_constraints(self) -> list[Constraint]:
136136
)
137137
)
138138
return constraints
139+
140+
def get_version(self) -> str:
141+
return "Follow BigQuery release version"

ibis-server/app/model/metadata/canner.py

+10
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@ def get_table_list(self) -> list[Table]:
3333
def get_constraints(self) -> list[Constraint]:
3434
return []
3535

36+
def get_version(self) -> str:
37+
query = gql("""
38+
query SystemInfo {
39+
systemInfo {
40+
version
41+
}
42+
}
43+
""")
44+
return self.client.execute(query)["systemInfo"]["version"]
45+
3646
def _get_workspace_sql_name(self) -> str:
3747
if hasattr(self.connection_info, "connection_url"):
3848
return urlparse(

ibis-server/app/model/metadata/clickhouse.py

+3
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ def get_table_list(self) -> list[Table]:
7070
def get_constraints(self) -> list[Constraint]:
7171
return []
7272

73+
def get_version(self) -> str:
74+
return self.connection.sql("SELECT version()").to_pandas().iloc[0, 0]
75+
7376
def _format_compact_table_name(self, schema: str, table: str):
7477
return f"{schema}.{table}"
7578

ibis-server/app/model/metadata/metadata.py

+4
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,7 @@ def get_table_list(self) -> list[Table]:
1515
@abstractmethod
1616
def get_constraints(self) -> list[Constraint]:
1717
pass
18+
19+
@abstractmethod
20+
def get_version(self) -> str:
21+
pass

ibis-server/app/model/metadata/mssql.py

+3
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,9 @@ def get_constraints(self) -> list[Constraint]:
161161
)
162162
return constraints
163163

164+
def get_version(self) -> str:
165+
return self.connection.sql("SELECT @@VERSION").to_pandas().iloc[0, 0]
166+
164167
def _format_compact_table_name(self, schema: str, table: str):
165168
return f"{schema}.{table}"
166169

ibis-server/app/model/metadata/mysql.py

+3
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,9 @@ def get_constraints(self) -> list[Constraint]:
117117
)
118118
return constraints
119119

120+
def get_version(self) -> str:
121+
return self.connection.sql("SELECT version()").to_pandas().iloc[0, 0]
122+
120123
def _format_compact_table_name(self, schema: str, table: str):
121124
return f"{schema}.{table}"
122125

ibis-server/app/model/metadata/postgres.py

+3
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,9 @@ def get_constraints(self) -> list[Constraint]:
123123
)
124124
return constraints
125125

126+
def get_version(self) -> str:
127+
return self.connection.sql("SELECT version()").to_pandas().iloc[0, 0]
128+
126129
def _format_postgres_compact_table_name(self, schema: str, table: str):
127130
return f"{schema}.{table}"
128131

ibis-server/app/model/metadata/trino.py

+3
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ def get_table_list(self) -> list[Table]:
7979
def get_constraints(self) -> list[Constraint]:
8080
return []
8181

82+
def get_version(self) -> str:
83+
return self.connection.sql("SELECT version()").to_pandas().iloc[0, 0]
84+
8285
def _format_trino_compact_table_name(
8386
self, catalog: str, schema: str, table: str
8487
) -> str:

ibis-server/app/routers/v2/connector.py

+5
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ def get_constraints(data_source: DataSource, dto: MetadataDTO) -> list[Constrain
5959
).get_constraints()
6060

6161

62+
@router.post("/{data_source}/metadata/version")
63+
def get_db_version(data_source: DataSource, dto: MetadataDTO) -> str:
64+
return MetadataFactory.get_metadata(data_source, dto.connection_info).get_version()
65+
66+
6267
@router.post("/dry-plan")
6368
def dry_plan(dto: DryPlanDTO) -> str:
6469
return Rewriter(dto.manifest_str).rewrite(dto.sql)

ibis-server/tests/routers/v2/connector/test_bigquery.py

+8
Original file line numberDiff line numberDiff line change
@@ -319,3 +319,11 @@ def test_metadata_list_constraints():
319319
json={"connectionInfo": connection_info},
320320
)
321321
assert response.status_code == 200
322+
323+
def test_metadata_db_version():
324+
response = client.post(
325+
url=f"{base_url}/metadata/version",
326+
json={"connectionInfo": connection_info},
327+
)
328+
assert response.status_code == 200
329+
assert response.text == '"Follow BigQuery release version"'

ibis-server/tests/routers/v2/connector/test_canner.py

+8
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,14 @@ def test_metadata_list_constraints():
346346
assert response.status_code == 200
347347
assert response.json() == []
348348

349+
def test_metadata_db_version():
350+
response = client.post(
351+
url=f"{base_url}/metadata/version",
352+
json={"connectionInfo": connection_info},
353+
)
354+
assert response.status_code == 200
355+
assert response.text is not None
356+
349357
def _to_connection_url():
350358
info = connection_info
351359
return f"postgres://{info['user']}:{info['pat']}@{info['host']}:{info['port']}/{info['workspace']}"

ibis-server/tests/routers/v2/connector/test_clickhouse.py

+9
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,15 @@ def test_metadata_list_constraints(clickhouse: ClickHouseContainer):
529529
result = response.json()
530530
assert len(result) == 0
531531

532+
def test_metadata_db_version(clickhouse: ClickHouseContainer):
533+
connection_info = _to_connection_info(clickhouse)
534+
response = client.post(
535+
url=f"{base_url}/metadata/version",
536+
json={"connectionInfo": connection_info},
537+
)
538+
assert response.status_code == 200
539+
assert response.text is not None
540+
532541
def _to_connection_info(db: ClickHouseContainer):
533542
return {
534543
"host": db.get_container_host_ip(),

ibis-server/tests/routers/v2/connector/test_mssql.py

+9
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,15 @@ def test_metadata_list_constraints(mssql: SqlServerContainer):
366366
)
367367
assert response.status_code == 200
368368

369+
def test_metadata_db_version(mssql: SqlServerContainer):
370+
connection_info = _to_connection_info(mssql)
371+
response = client.post(
372+
url=f"{base_url}/metadata/version",
373+
json={"connectionInfo": connection_info},
374+
)
375+
assert response.status_code == 200
376+
assert "Microsoft SQL Server 2019" in response.text
377+
369378
def _to_connection_info(mssql: SqlServerContainer):
370379
return {
371380
"host": mssql.get_container_host_ip(),

ibis-server/tests/routers/v2/connector/test_mysql.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ def manifest_str():
8585

8686
@pytest.fixture(scope="module")
8787
def mysql(request) -> MySqlContainer:
88-
mysql = MySqlContainer("mysql:8.0").start()
88+
mysql = MySqlContainer("mysql:8.0.40").start()
8989
connection_url = mysql.get_connection_url()
9090
engine = sqlalchemy.create_engine(connection_url)
9191
pd.read_parquet(file_path("resource/tpch/data/orders.parquet")).to_sql(
@@ -381,6 +381,15 @@ def test_metadata_list_constraints(mysql: MySqlContainer):
381381
assert result["constraintedTable"] is not None
382382
assert result["constraintedColumn"] is not None
383383

384+
def test_metadata_db_version(mysql: MySqlContainer):
385+
connection_info = _to_connection_info(mysql)
386+
response = client.post(
387+
url=f"{base_url}/metadata/version",
388+
json={"connectionInfo": connection_info},
389+
)
390+
assert response.status_code == 200
391+
assert response.text == '"8.0.40"'
392+
384393
def _to_connection_info(mysql: MySqlContainer):
385394
return {
386395
"host": mysql.get_container_host_ip(),

ibis-server/tests/routers/v2/connector/test_postgres.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ def manifest_str():
7878

7979
@pytest.fixture(scope="module")
8080
def postgres(request) -> PostgresContainer:
81-
pg = PostgresContainer("postgres:16-alpine").start()
81+
pg = PostgresContainer("postgres:16.4-alpine").start()
8282
engine = sqlalchemy.create_engine(pg.get_connection_url())
8383
pd.read_parquet(file_path("resource/tpch/data/orders.parquet")).to_sql(
8484
"orders", engine, index=False
@@ -401,6 +401,15 @@ def test_metadata_list_constraints(postgres: PostgresContainer):
401401
)
402402
assert response.status_code == 200
403403

404+
def test_metadata_db_version(postgres: PostgresContainer):
405+
connection_info = _to_connection_info(postgres)
406+
response = client.post(
407+
url=f"{base_url}/metadata/version",
408+
json={"connectionInfo": connection_info},
409+
)
410+
assert response.status_code == 200
411+
assert "PostgreSQL 16.4" in response.text
412+
404413
def test_dry_plan(manifest_str):
405414
response = client.post(
406415
url=f"{base_url}/dry-plan",

ibis-server/tests/routers/v2/connector/test_snowflake.py

+4
Original file line numberDiff line numberDiff line change
@@ -268,3 +268,7 @@ def test_metadata_list_tables():
268268
@pytest.mark.skip(reason="Not implemented")
269269
def test_metadata_list_constraints():
270270
pass
271+
272+
@pytest.mark.skip(reason="Not implemented")
273+
def test_metadata_get_version():
274+
pass

ibis-server/tests/routers/v2/connector/test_trino.py

+9
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,15 @@ def test_metadata_list_constraints(trino: TrinoContainer):
402402
result = response.json()
403403
assert len(result) == 0
404404

405+
def test_metadata_db_version(trino: TrinoContainer):
406+
connection_info = _to_connection_info(trino)
407+
response = client.post(
408+
url=f"{base_url}/metadata/version",
409+
json={"connectionInfo": connection_info},
410+
)
411+
assert response.status_code == 200
412+
assert response.text is not None
413+
405414
def _to_connection_info(trino: TrinoContainer):
406415
return {
407416
"host": trino.get_container_host_ip(),

0 commit comments

Comments
 (0)