From 83b5f2a5951b745cda10578235de20fb794118cd Mon Sep 17 00:00:00 2001 From: "snyk-io[bot]" <141718529+snyk-io[bot]@users.noreply.github.com> Date: Sat, 24 Jan 2026 06:18:21 +0000 Subject: [PATCH 01/11] fix: pom.xml to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JAVA-CHQOSLOGBACK-15062482 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 9c5992b..c193297 100644 --- a/pom.xml +++ b/pom.xml @@ -27,13 +27,13 @@ ch.qos.logback logback-core - 1.5.18 + 1.5.25 ch.qos.logback logback-classic - 1.5.18 + 1.5.25 org.slf4j From 0ff4eb927b4ecf59b991557ee24d0ee20e1147c2 Mon Sep 17 00:00:00 2001 From: Arjun Danda Sureshbabu Date: Wed, 4 Feb 2026 12:02:26 -0800 Subject: [PATCH 02/11] Adding support for Search, Agent and Semantic View support --- .../MAIN_SCHEMA/AGENTS/SALES_ASSISTANT.sql | 40 +++++ .../CORTEX_SEARCH_SERVICES/PRODUCT_SEARCH.sql | 12 ++ .../SEMANTIC_VIEWS/SALES_ANALYTICS.sql | 33 ++++ .../dlsync/models/ScriptObjectType.java | 3 + .../dependency/DependencyExtractorTest.java | 167 ++++++++++++++++++ .../snowflake/dlsync/doa/ScriptRepoTest.java | 91 ++++++++++ .../dlsync/parser/SqlTokenizerTest.java | 112 ++++++++++++ 7 files changed, 458 insertions(+) create mode 100644 example_scripts/main/example_db/MAIN_SCHEMA/AGENTS/SALES_ASSISTANT.sql create mode 100644 example_scripts/main/example_db/MAIN_SCHEMA/CORTEX_SEARCH_SERVICES/PRODUCT_SEARCH.sql create mode 100644 example_scripts/main/example_db/MAIN_SCHEMA/SEMANTIC_VIEWS/SALES_ANALYTICS.sql diff --git a/example_scripts/main/example_db/MAIN_SCHEMA/AGENTS/SALES_ASSISTANT.sql b/example_scripts/main/example_db/MAIN_SCHEMA/AGENTS/SALES_ASSISTANT.sql new file mode 100644 index 0000000..0153c9c --- /dev/null +++ b/example_scripts/main/example_db/MAIN_SCHEMA/AGENTS/SALES_ASSISTANT.sql @@ -0,0 +1,40 @@ +CREATE OR REPLACE AGENT ${EXAMPLE_DB}.${MAIN_SCHEMA}.SALES_ASSISTANT + COMMENT = 'Sales assistant agent for product and order queries' + PROFILE = '{"display_name": "Sales Assistant", "avatar": "sales-icon.png", "color": "blue"}' + FROM SPECIFICATION + $$ + models: + orchestration: claude-4-sonnet + + orchestration: + budget: + seconds: 30 + tokens: 16000 + + instructions: + response: "You will respond in a friendly but professional manner about sales and products" + orchestration: "For product questions use Search; for sales analytics use Analyst" + system: "You are a helpful sales assistant that helps with product and order inquiries" + sample_questions: + - question: "What products do we have in stock?" + answer: "I'll search our product catalog to find available items." + - question: "What were our top selling products last month?" + answer: "I'll analyze our sales data to find the best performers." + + tools: + - tool_spec: + type: "cortex_analyst_text_to_sql" + name: "SalesAnalyst" + description: "Analyzes sales data and generates reports" + - tool_spec: + type: "cortex_search" + name: "ProductSearch" + description: "Searches product catalog and documentation" + + tool_resources: + SalesAnalyst: + semantic_view: "${EXAMPLE_DB}.${MAIN_SCHEMA}.SALES_ANALYTICS" + ProductSearch: + name: "${EXAMPLE_DB}.${MAIN_SCHEMA}.PRODUCT_SEARCH" + max_results: "10" + $$; diff --git a/example_scripts/main/example_db/MAIN_SCHEMA/CORTEX_SEARCH_SERVICES/PRODUCT_SEARCH.sql b/example_scripts/main/example_db/MAIN_SCHEMA/CORTEX_SEARCH_SERVICES/PRODUCT_SEARCH.sql new file mode 100644 index 0000000..a24f018 --- /dev/null +++ b/example_scripts/main/example_db/MAIN_SCHEMA/CORTEX_SEARCH_SERVICES/PRODUCT_SEARCH.sql @@ -0,0 +1,12 @@ +CREATE OR REPLACE CORTEX SEARCH SERVICE ${EXAMPLE_DB}.${MAIN_SCHEMA}.PRODUCT_SEARCH + ON product_description + ATTRIBUTES product_name, category + WAREHOUSE = ${MY_WAREHOUSE} + TARGET_LAG = '1 hour' +AS ( + SELECT + product_name, + product_description, + category + FROM ${EXAMPLE_DB}.${MAIN_SCHEMA}.PRODUCTS +); diff --git a/example_scripts/main/example_db/MAIN_SCHEMA/SEMANTIC_VIEWS/SALES_ANALYTICS.sql b/example_scripts/main/example_db/MAIN_SCHEMA/SEMANTIC_VIEWS/SALES_ANALYTICS.sql new file mode 100644 index 0000000..02807ba --- /dev/null +++ b/example_scripts/main/example_db/MAIN_SCHEMA/SEMANTIC_VIEWS/SALES_ANALYTICS.sql @@ -0,0 +1,33 @@ +CREATE OR REPLACE SEMANTIC VIEW ${EXAMPLE_DB}.${MAIN_SCHEMA}.SALES_ANALYTICS + TABLES ( + products AS ${EXAMPLE_DB}.${MAIN_SCHEMA}.PRODUCTS + PRIMARY KEY (PRODUCT_ID) + COMMENT = 'Product catalog table', + orders AS ${EXAMPLE_DB}.${MAIN_SCHEMA}.ORDERS + PRIMARY KEY (ORDER_ID) + COMMENT = 'Customer orders table' + ) + RELATIONSHIPS ( + orders (PRODUCT_ID) REFERENCES products + ) + DIMENSIONS ( + products.product_name AS products.NAME + WITH SYNONYMS = ('product', 'item') + COMMENT = 'Name of the product', + products.category AS products.CATEGORY + WITH SYNONYMS = ('type', 'group') + COMMENT = 'Product category', + orders.order_date AS orders.ORDER_DATE + WITH SYNONYMS = ('date', 'purchase date') + COMMENT = 'Date when order was placed' + ) + METRICS ( + orders.total_revenue AS SUM(orders.PRICE * orders.QUANTITY) + WITH SYNONYMS = ('revenue', 'sales') + COMMENT = 'Total revenue from orders', + orders.order_count AS COUNT(orders.ORDER_ID) + WITH SYNONYMS = ('number of orders', 'count') + COMMENT = 'Total number of orders' + ) + COMMENT = 'Semantic view for sales analytics' + AI_SQL_GENERATION 'When asked about sales, use total_revenue metric. When asked about orders, use order_count metric.'; diff --git a/src/main/java/com/snowflake/dlsync/models/ScriptObjectType.java b/src/main/java/com/snowflake/dlsync/models/ScriptObjectType.java index 1673c8b..375c04d 100644 --- a/src/main/java/com/snowflake/dlsync/models/ScriptObjectType.java +++ b/src/main/java/com/snowflake/dlsync/models/ScriptObjectType.java @@ -8,6 +8,9 @@ public enum ScriptObjectType { STREAMLITS("STREAMLIT", ObjectLevel.SCHEMA, false), PIPES("PIPE", ObjectLevel.SCHEMA, false), MASKING_POLICIES("MASKING POLICY", ObjectLevel.SCHEMA, false), + CORTEX_SEARCH_SERVICES("CORTEX SEARCH SERVICE", ObjectLevel.SCHEMA, false), + SEMANTIC_VIEWS("SEMANTIC VIEW", ObjectLevel.SCHEMA, false), + AGENTS("AGENT", ObjectLevel.SCHEMA, false), NETWORK_RULES("NETWORK RULE", ObjectLevel.SCHEMA, false), RESOURCE_MONITORS("RESOURCE MONITOR", ObjectLevel.ACCOUNT, false), NETWORK_POLICIES("NETWORK POLICY", ObjectLevel.ACCOUNT, false), diff --git a/src/test/java/com/snowflake/dlsync/dependency/DependencyExtractorTest.java b/src/test/java/com/snowflake/dlsync/dependency/DependencyExtractorTest.java index b986dce..32314c2 100644 --- a/src/test/java/com/snowflake/dlsync/dependency/DependencyExtractorTest.java +++ b/src/test/java/com/snowflake/dlsync/dependency/DependencyExtractorTest.java @@ -388,5 +388,172 @@ void extractScriptDependenciesIdentifierInQuotes() { } + SchemaScript mockCortexSearchDependency(String name, String schema) { + String content = "CREATE OR REPLACE CORTEX SEARCH SERVICE " + name + "\n" + + " ON search_column\n" + + " ATTRIBUTES attr1, attr2\n" + + " WAREHOUSE = MY_WH\n" + + " TARGET_LAG = '1 hour'\n" + + "AS (SELECT * FROM SOURCE_TABLE);"; + return ScriptFactory.getSchemaScript("TEST_DB", schema, ScriptObjectType.CORTEX_SEARCH_SERVICES, name, content); + } + + @Test + void extractScriptDependenciesCortexSearchService() { + String content = "CREATE OR REPLACE CORTEX SEARCH SERVICE TEST_SCHEMA.PRODUCT_SEARCH\n" + + " ON product_description\n" + + " ATTRIBUTES product_name, category\n" + + " WAREHOUSE = MY_WH\n" + + " TARGET_LAG = '1 hour'\n" + + "AS (\n" + + " SELECT product_name, product_description, category\n" + + " FROM TEST_SCHEMA.PRODUCTS\n" + + ");"; + SchemaScript script = ScriptFactory.getSchemaScript("TEST_DB", "TEST_SCHEMA", ScriptObjectType.CORTEX_SEARCH_SERVICES, "PRODUCT_SEARCH", content); + MigrationScript dependency1 = mockTableDependency("PRODUCTS", "TEST_SCHEMA"); + List