datahub-agent-context 1.3.1.10rc1__py3-none-any.whl → 1.4.0rc2__py3-none-any.whl
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.
- datahub_agent_context/__init__.py +11 -3
- datahub_agent_context/_version.py +1 -1
- datahub_agent_context/cli.py +152 -0
- datahub_agent_context/context.py +47 -34
- datahub_agent_context/langchain_tools/builder.py +6 -4
- datahub_agent_context/mcp_tools/base.py +6 -3
- datahub_agent_context/mcp_tools/save_document.py +634 -0
- datahub_agent_context/snowflake/__init__.py +0 -0
- datahub_agent_context/snowflake/generate_udfs.py +306 -0
- datahub_agent_context/snowflake/generators/__init__.py +21 -0
- datahub_agent_context/snowflake/generators/configuration.py +104 -0
- datahub_agent_context/snowflake/generators/cortex_agent.py +725 -0
- datahub_agent_context/snowflake/generators/network_rules.py +53 -0
- datahub_agent_context/snowflake/generators/stored_procedure.py +87 -0
- datahub_agent_context/snowflake/snowflake.py +662 -0
- datahub_agent_context/snowflake/udfs/__init__.py +1 -0
- datahub_agent_context/snowflake/udfs/add_glossary_terms.py +61 -0
- datahub_agent_context/snowflake/udfs/add_owners.py +59 -0
- datahub_agent_context/snowflake/udfs/add_structured_properties.py +57 -0
- datahub_agent_context/snowflake/udfs/add_tags.py +61 -0
- datahub_agent_context/snowflake/udfs/base.py +45 -0
- datahub_agent_context/snowflake/udfs/get_dataset_queries.py +68 -0
- datahub_agent_context/snowflake/udfs/get_entities.py +47 -0
- datahub_agent_context/snowflake/udfs/get_lineage.py +61 -0
- datahub_agent_context/snowflake/udfs/get_lineage_paths_between.py +69 -0
- datahub_agent_context/snowflake/udfs/get_me.py +51 -0
- datahub_agent_context/snowflake/udfs/grep_documents.py +70 -0
- datahub_agent_context/snowflake/udfs/list_schema_fields.py +80 -0
- datahub_agent_context/snowflake/udfs/remove_domains.py +45 -0
- datahub_agent_context/snowflake/udfs/remove_glossary_terms.py +57 -0
- datahub_agent_context/snowflake/udfs/remove_owners.py +56 -0
- datahub_agent_context/snowflake/udfs/remove_structured_properties.py +56 -0
- datahub_agent_context/snowflake/udfs/remove_tags.py +57 -0
- datahub_agent_context/snowflake/udfs/search_datahub.py +71 -0
- datahub_agent_context/snowflake/udfs/search_documents.py +58 -0
- datahub_agent_context/snowflake/udfs/set_domains.py +55 -0
- datahub_agent_context/snowflake/udfs/update_description.py +60 -0
- {datahub_agent_context-1.3.1.10rc1.dist-info → datahub_agent_context-1.4.0rc2.dist-info}/METADATA +21 -14
- datahub_agent_context-1.4.0rc2.dist-info/RECORD +66 -0
- datahub_agent_context-1.3.1.10rc1.dist-info/RECORD +0 -34
- {datahub_agent_context-1.3.1.10rc1.dist-info → datahub_agent_context-1.4.0rc2.dist-info}/WHEEL +0 -0
- {datahub_agent_context-1.3.1.10rc1.dist-info → datahub_agent_context-1.4.0rc2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""Generate Snowflake network rules SQL."""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def generate_network_rules_sql(datahub_domain: str) -> str:
|
|
5
|
+
"""Generate network rules SQL that uses configuration variables.
|
|
6
|
+
|
|
7
|
+
Args:
|
|
8
|
+
datahub_domain: The domain extracted from the DataHub URL (e.g., 'fieldeng.acryl.io')
|
|
9
|
+
"""
|
|
10
|
+
return f"""-- ============================================================================
|
|
11
|
+
-- Step 1: Network Rules and External Access Integration for DataHub API
|
|
12
|
+
-- ============================================================================
|
|
13
|
+
-- This script creates the network rule and external access integration
|
|
14
|
+
-- required for UDFs to make outbound calls to DataHub
|
|
15
|
+
--
|
|
16
|
+
-- Prerequisites:
|
|
17
|
+
-- - Run 00_configuration.sql first to set variables
|
|
18
|
+
-- - You must have ACCOUNTADMIN role or equivalent privileges
|
|
19
|
+
-- ============================================================================
|
|
20
|
+
|
|
21
|
+
-- Use the configured database and schema
|
|
22
|
+
USE DATABASE IDENTIFIER($SF_DATABASE);
|
|
23
|
+
USE SCHEMA IDENTIFIER($SF_SCHEMA);
|
|
24
|
+
USE WAREHOUSE IDENTIFIER($SF_WAREHOUSE);
|
|
25
|
+
|
|
26
|
+
-- Step 1: Create network rule for DataHub API
|
|
27
|
+
-- For EGRESS mode with external access, use HOST_PORT type with domain name
|
|
28
|
+
-- Note: Snowflake resolves the domain to IPs automatically
|
|
29
|
+
CREATE OR REPLACE NETWORK RULE datahub_api_rule
|
|
30
|
+
MODE = EGRESS
|
|
31
|
+
TYPE = HOST_PORT
|
|
32
|
+
VALUE_LIST = ('{datahub_domain}')
|
|
33
|
+
COMMENT = 'Network rule for {datahub_domain} DataHub API access';
|
|
34
|
+
|
|
35
|
+
-- Step 2: Create external access integration
|
|
36
|
+
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION datahub_access
|
|
37
|
+
ALLOWED_NETWORK_RULES = (datahub_api_rule)
|
|
38
|
+
ALLOWED_AUTHENTICATION_SECRETS = (datahub_url, datahub_token)
|
|
39
|
+
ENABLED = TRUE
|
|
40
|
+
COMMENT = 'External access integration for DataHub API calls';
|
|
41
|
+
|
|
42
|
+
-- Step 3: Grant usage on integration to the specified role
|
|
43
|
+
GRANT USAGE ON INTEGRATION datahub_access TO ROLE IDENTIFIER($SF_ROLE);
|
|
44
|
+
|
|
45
|
+
-- Verify the setup
|
|
46
|
+
SHOW NETWORK RULES LIKE 'datahub_api_rule';
|
|
47
|
+
SHOW INTEGRATIONS LIKE 'datahub_access';
|
|
48
|
+
|
|
49
|
+
SELECT
|
|
50
|
+
'Network rule and external access integration created successfully!' AS status,
|
|
51
|
+
'{datahub_domain}' AS datahub_domain,
|
|
52
|
+
$SF_DATABASE || '.' || $SF_SCHEMA AS location;
|
|
53
|
+
"""
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"""Generate Snowflake stored procedure SQL."""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def generate_stored_procedure_sql() -> str:
|
|
5
|
+
"""Generate stored procedure SQL that uses configuration variables."""
|
|
6
|
+
return """-- ============================================================================
|
|
7
|
+
-- Step 3: Create JavaScript Stored Procedure for SQL Execution
|
|
8
|
+
-- ============================================================================
|
|
9
|
+
-- This creates a stored procedure that can execute SELECT queries dynamically
|
|
10
|
+
-- and return results as JSON
|
|
11
|
+
--
|
|
12
|
+
-- Prerequisites:
|
|
13
|
+
-- - Run 00_configuration.sql first to set variables
|
|
14
|
+
-- ============================================================================
|
|
15
|
+
|
|
16
|
+
USE DATABASE IDENTIFIER($SF_DATABASE);
|
|
17
|
+
USE SCHEMA IDENTIFIER($SF_SCHEMA);
|
|
18
|
+
USE WAREHOUSE IDENTIFIER($SF_WAREHOUSE);
|
|
19
|
+
|
|
20
|
+
-- Create the JavaScript stored procedure (using CREATE OR REPLACE, so no need to drop first)
|
|
21
|
+
CREATE OR REPLACE PROCEDURE EXECUTE_DYNAMIC_SQL(SQL_TEXT STRING)
|
|
22
|
+
RETURNS VARIANT
|
|
23
|
+
LANGUAGE JAVASCRIPT
|
|
24
|
+
EXECUTE AS CALLER
|
|
25
|
+
AS
|
|
26
|
+
$$
|
|
27
|
+
// Validate that it's a SELECT query only
|
|
28
|
+
var queryUpper = SQL_TEXT.trim().toUpperCase();
|
|
29
|
+
if (!queryUpper.startsWith('SELECT')) {
|
|
30
|
+
return {
|
|
31
|
+
"success": false,
|
|
32
|
+
"error": "Only SELECT queries are allowed. Query must start with SELECT.",
|
|
33
|
+
"status": 400
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
try {
|
|
38
|
+
var stmt = snowflake.createStatement({ sqlText: SQL_TEXT });
|
|
39
|
+
var rs = stmt.execute();
|
|
40
|
+
|
|
41
|
+
var results = [];
|
|
42
|
+
var columns = [];
|
|
43
|
+
|
|
44
|
+
// Get column names from the first row metadata
|
|
45
|
+
var columnCount = rs.getColumnCount();
|
|
46
|
+
for (var i = 1; i <= columnCount; i++) {
|
|
47
|
+
columns.push(rs.getColumnName(i));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Process all rows
|
|
51
|
+
while (rs.next()) {
|
|
52
|
+
var row = {};
|
|
53
|
+
for (var i = 1; i <= columnCount; i++) {
|
|
54
|
+
var colName = rs.getColumnName(i);
|
|
55
|
+
var colValue = rs.getColumnValue(i);
|
|
56
|
+
// Handle null values and convert to JSON-serializable format
|
|
57
|
+
row[colName] = colValue;
|
|
58
|
+
}
|
|
59
|
+
results.push(row);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
"success": true,
|
|
64
|
+
"columns": columns,
|
|
65
|
+
"rows": results,
|
|
66
|
+
"row_count": results.length
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
} catch (err) {
|
|
70
|
+
return {
|
|
71
|
+
"success": false,
|
|
72
|
+
"error": err.message,
|
|
73
|
+
"status": 500
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
$$;
|
|
77
|
+
|
|
78
|
+
-- Grant usage on the procedure
|
|
79
|
+
GRANT USAGE ON PROCEDURE EXECUTE_DYNAMIC_SQL(STRING) TO ROLE IDENTIFIER($SF_ROLE);
|
|
80
|
+
|
|
81
|
+
-- Verify it was created
|
|
82
|
+
DESCRIBE PROCEDURE EXECUTE_DYNAMIC_SQL(STRING);
|
|
83
|
+
|
|
84
|
+
SELECT
|
|
85
|
+
'Stored procedure EXECUTE_DYNAMIC_SQL created successfully!' AS status,
|
|
86
|
+
$SF_DATABASE || '.' || $SF_SCHEMA || '.EXECUTE_DYNAMIC_SQL' AS procedure_name;
|
|
87
|
+
"""
|