tablesByName, Statement statement) throws SQLException {
+ try (ResultSet columnsResultSet = statement.executeQuery(COLUMNS_QUERY)) {
+ while (columnsResultSet.next()) {
+ String tableName = columnsResultSet.getString("table_name");
+ String schema = columnsResultSet.getString("table_schema");
+
+ Table table = tablesByName.computeIfAbsent(tableName, __ -> new Table(
+ TableType.TABLE, schema, tableName,
+ new ArrayList<>(),
+ new ArrayList<>(),
+ new ArrayList<>()
+ ));
+
+ table.addColumn(new Column(
+ columnsResultSet.getString("column_name"),
+ columnsResultSet.getString("column_type"),
+ null,
+ false
+ ));
+ }
+ }
+ }
+}
diff --git a/server/api-service/lowcoder-plugins/databricksPlugin/src/main/resources/databricks-icon.svg b/server/api-service/lowcoder-plugins/databricksPlugin/src/main/resources/databricks-icon.svg
new file mode 100644
index 0000000000..78ef0bffb4
--- /dev/null
+++ b/server/api-service/lowcoder-plugins/databricksPlugin/src/main/resources/databricks-icon.svg
@@ -0,0 +1,10 @@
+
\ No newline at end of file
diff --git a/server/api-service/lowcoder-plugins/databricksPlugin/src/main/resources/databricks-plugin.json b/server/api-service/lowcoder-plugins/databricksPlugin/src/main/resources/databricks-plugin.json
new file mode 100644
index 0000000000..5c17b79ce5
--- /dev/null
+++ b/server/api-service/lowcoder-plugins/databricksPlugin/src/main/resources/databricks-plugin.json
@@ -0,0 +1,67 @@
+{
+ "type": "databricks",
+ "name": "Databricks",
+ "icon": "databricks-icon.svg",
+ "category": "Database",
+ "properties": [
+ {
+ "name": "host",
+ "label": "Server Hostname",
+ "type": "text",
+ "required": true,
+ "placeholder": "adb-xxxxxxxxxxxxxxxx.xx.azuredatabricks.net"
+ },
+ {
+ "name": "port",
+ "label": "Port",
+ "type": "number",
+ "required": true,
+ "defaultValue": 443
+ },
+ {
+ "name": "httpPath",
+ "label": "HTTP Path",
+ "type": "text",
+ "required": true,
+ "placeholder": "/sql/1.0/warehouses/xxxxxxxxxxxxxxxx"
+ },
+ {
+ "name": "catalog",
+ "label": "Catalog",
+ "type": "text",
+ "required": true,
+ "placeholder": "hive_metastore"
+ },
+ {
+ "name": "schema",
+ "label": "Schema",
+ "type": "text",
+ "placeholder": "default"
+ },
+ {
+ "name": "authentication",
+ "label": "Authentication",
+ "type": "select",
+ "required": true,
+ "options": [
+ { "label": "Personal Access Token", "value": "pat" }
+ ],
+ "defaultValue": "pat"
+ },
+ {
+ "name": "token",
+ "label": "Personal Access Token",
+ "type": "password",
+ "required": true,
+ "placeholder": "dapi_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
+ }
+ ],
+ "features": {
+ "query": true,
+ "insert": true,
+ "update": true,
+ "delete": true,
+ "listTables": true,
+ "getTable": true
+ }
+}
diff --git a/server/api-service/lowcoder-plugins/databricksPlugin/src/test/java/org/lowcoder/plugin/databricks/DatabricksQueryExecutorTest.java b/server/api-service/lowcoder-plugins/databricksPlugin/src/test/java/org/lowcoder/plugin/databricks/DatabricksQueryExecutorTest.java
new file mode 100644
index 0000000000..d2a84383d6
--- /dev/null
+++ b/server/api-service/lowcoder-plugins/databricksPlugin/src/test/java/org/lowcoder/plugin/databricks/DatabricksQueryExecutorTest.java
@@ -0,0 +1,43 @@
+package org.lowcoder.plugin.databricks;
+
+import org.junit.jupiter.api.Test;
+import org.lowcoder.sdk.models.DatasourceStructure;
+import org.lowcoder.sdk.plugin.common.sql.SqlBasedDatasourceConnectionConfig;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+class DatabricksQueryExecutorTest {
+
+ @Test
+ void testGetDatabaseMetadata() throws Exception {
+ DatabricksQueryExecutor executor = new DatabricksQueryExecutor();
+ Connection conn = mock(Connection.class);
+ Statement stmt = mock(Statement.class);
+ ResultSet rs = mock(ResultSet.class);
+
+ when(conn.createStatement()).thenReturn(stmt);
+ when(stmt.executeQuery(anyString())).thenReturn(rs);
+ when(rs.next()).thenReturn(true, false);
+ when(rs.getString("table_name")).thenReturn("my_table");
+ when(rs.getString("table_schema")).thenReturn("default");
+ when(rs.getString("column_name")).thenReturn("id");
+ when(rs.getString("data_type")).thenReturn("int");
+
+ SqlBasedDatasourceConnectionConfig config = mock(SqlBasedDatasourceConnectionConfig.class);
+ when(config.getExtParams()).thenReturn(Map.of("catalog", "hive_metastore", "schema", "default"));
+
+ DatasourceStructure structure = executor.getDatabaseMetadata(conn, config);
+
+ assertNotNull(structure);
+ assertEquals(1, structure.getTables().size());
+ assertEquals("my_table", structure.getTables().get(0).getName());
+ assertEquals(1, structure.getTables().get(0).getColumns().size());
+ assertEquals("id", structure.getTables().get(0).getColumns().get(0).getName());
+ }
+}
diff --git a/server/api-service/lowcoder-plugins/pom.xml b/server/api-service/lowcoder-plugins/pom.xml
index 647d1ba88f..960ef07fd7 100644
--- a/server/api-service/lowcoder-plugins/pom.xml
+++ b/server/api-service/lowcoder-plugins/pom.xml
@@ -162,6 +162,11 @@
snowflakePlugin
${revision}
+
+ org.lowcoder
+ databricksPlugin
+ ${revision}
+
@@ -223,5 +228,6 @@
graphqlPlugin
sqlBasedPlugin
snowflakePlugin
+ databricksPlugin
pFad - Phonifier reborn
Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy