* data tables settings ui * install runed * zod 4 fixes * use new toJSONSchema * Migrate ducklake catalogs to more generic custom instance databases * fix compilation * Safety conversion for old duckdb ffi * data tables settings * ts client basis * inline run works * datatables work * Revert "datatables work" This reverts commit6e1588d59e. * datatables work (without leaking pg credentials) * println * separate sqlUtils.ts * nit * Separate custom instance db Select and Wizard components * nit * nit wording * add tags to custom instance dbs * error when trying to use ducklake as datatable or opposite * show status in dropdown * data table instance setup works * sqk function for ducklake * factorize logic * fix temp reactivity * Data table assetexplore * Migrate S3 permissions to modal * Revert "Migrate S3 permissions to modal" This reverts commit0631d03cb0. * nit query -> fetch * Custom instance setup new look * run_language_executor separate fn * run_inline param * nit wording * Better typed client * Data tables display as assets in frontend * asset db icon * nit * cleaner errors * nit * Fix sed calls in mac * run_inline_script_preview in python client * basic python datatable client * datatable and datalake parser in python * ducklake client python * nit fix * Fix migration producing NULL instead of {} when no custom databases * merge conflict fail * python ducklake client arg fix * parse or infer sql types in ts client * ts asset parser, detect datatable & ducklake R/W * fix sql repl for other read ops than select * export type SqlTemplateFunction * rename list_custom_instance_pg_databases * typecheck datatable and ducklake name in Typescript * Fix typecheck datatable and ducklake in TS * declare module overriding instead of extending * infer_sql_type in python client * SqlQuery object in python * fix merge conflicts * update const_format * CI fix * factor out to var_identifiers * sqlx prepare * unnecessary security (admin is required) * clearer comment * ee repo ref * nit snake case * claude step 1: detect var declarations * move detect_sql_access_type to common mod * claude step 2: detect when saved vars are queried * Revert "claude step 2: detect when saved vars are queried" This reverts commit1e1f930568. * Revert "claude step 1: detect var declarations" This reverts commitf866f4819d. * remove ducklake/datatable and default * detect data table assigns in var_identifiers * Python parser successfully infers R/W/RW from ducklake / datatable * still register ducklake/datatable if not used as unknown R/W * Go to settings button in Assets Dropdown on not found * nit * sqlx prepare fail * manual fix, somehow sqlx prepare won't do it * fix frontend ci * ee repo ref * ducklake_user doesnt exist in unit tests * nit fix * ui nit * nit * nit missing clone * fork ducklakes and datatables * fix surface hover bug * stupid mistake * better deeply reactive mutable derived * Ducklake picker * Editor bar data tables * DuckDB supports datatables * datatable in duckdb asset parser * duckdb asset parser var_identifiers * Revert "duckdb asset parser var_identifiers" This reverts commit88068b1a77. * sqlx prepare * Box pin in test_workflow_as_code to fix stack overflow * stash * sql asset parser parses most s3 literals * nit * Detect attach + handle returning RW * detect assets used with dot notation * detect implicit access with USE dl; syntax * Add assets as unknown if var was never used * Support default ducklake/datatable main in parser * ignore asset parsing errors in frontend (avoid flow layout shift) * super weird duplication (merge conflict ?) * nits * fix duckdb parser detecting too much as asset when RW ctx is unknown * fix transparent assets btn * missing arg * nit styling * asset parser specific table parsing * fix resource specific table parsing * More concise asset display in flows + better icons * fix assets page filtering out resources with added table * Fix frontend to support specific table assets * Open DB Manager to specific table * Specific table parser in Python and TS + unit tests * Fix UPDATE setting access to None * fix flow edge rendering on top of output picker * python parser fix var override bug * add ts test * fix compilation * sqlx prepare * update parsers version * fix missing schema key onDelete * Grant permission to create schemas in custom instance databases * Update pg query to return empty schemas * Create schema * Select nits * support schemas in sql parser * ts parser handle schema with sql parser result * detect .schema() syntax * detect schema syntax in python * support .schema() in ts and py SDK * open db manager to specific schema * support reassignment in ts parser * nit better unitest * : syntax in ts * datatable:schema syntax in python * fix client py * nit select dropdown darkmode * object | null fetchOne * ts client nits * parse_sql_client_name fn * getImportWmillTsStatement refactor in EditorBar * text to json() in python client * update parser versions * pkg lock * Sql query details in TS asset parser * code transformation with type parameter in Editor * Custom Language Worker, code substition works ! * Error marker mapping works * hover info is correct * completions work correctly * other overrides * type inference kinda works * Position mapping tests * refactor prepare_queries * Refactor PgDatabase to share common code * Pgdatabase in prepare_queries * TokioPgConnection refactor * refactor prepare_queries * type parameter to sql function * Fix deadlock * nit fix * Fix worker async call freezing because of svelte Proxy * Force worker to recompute when we set queries * nit refactor * nits console logs * wait that ts worker initialize * monaco change file version * update diagnostics * Refactor for errors * Show SQL errors in Monaco * improve sdk * cleaning refactor + MapResource + usePreparedAssetSqlQueries * Fixes * Fix error position mapping * cache in typescript worker * fix insert no values * don't inject type if already present * Support schema in prepare queries * update parsers * ChangeOnDeepInequality * inferAsset ScriptEditor usage refactor * sql query typecheck work in flow editor * Assets and SQL Query check in Raw App Inline Editor * pkg lock * Fix DatatableSqlTemplateFunction nit * prepare query schema nit * duplicate diagnostics * nit getScriptVersion mock * Reprepare queries when switching workspaces * nit fix * nit fix * fetch_one_scalar and execute in python client * limit pg_connections * -- prepare flag in postgres * skip serializing * fix destructuring undefined * Prepare queries in workers instead of backend * nit * Execute search_path instructions normally * nit fix * Fix SET search_path issue in prepare * only support preparing single-statement queries for now * update parsers * safety * better remove_comments * Fix getQueryStmtCountHeuristic * getQueryStmtCountHeuristic tests * comment out failing tests * Fix getQueryStmtCountHeuristic impl * only datatable
113 lines
3.7 KiB
Rust
113 lines
3.7 KiB
Rust
use serde::Serialize;
|
|
|
|
#[derive(Serialize, PartialEq, Clone, Copy, Debug)]
|
|
#[serde(rename_all(serialize = "lowercase"))]
|
|
pub enum AssetUsageAccessType {
|
|
R,
|
|
W,
|
|
RW,
|
|
}
|
|
|
|
use AssetUsageAccessType::*;
|
|
|
|
#[derive(Serialize, PartialEq, Clone, Copy, Debug)]
|
|
#[serde(rename_all(serialize = "lowercase"))]
|
|
pub enum AssetKind {
|
|
S3Object,
|
|
Resource,
|
|
Ducklake,
|
|
DataTable,
|
|
}
|
|
|
|
#[derive(Serialize, Debug, PartialEq)]
|
|
pub struct ParseAssetsResult {
|
|
pub kind: AssetKind,
|
|
pub path: String,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub access_type: Option<AssetUsageAccessType>, // None in case of ambiguity
|
|
}
|
|
|
|
#[derive(Serialize, Debug, PartialEq)]
|
|
pub struct SqlQueryDetails {
|
|
pub query_string: String, // SQL query with $1 placeholders for interpolations
|
|
pub span: (u32, u32), // (start, end) byte positions in source code
|
|
pub source_kind: AssetKind, // DataTable or Ducklake
|
|
pub source_name: String, // e.g., "main", "dt"
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub source_schema: Option<String>, // e.g., Some("public"), None
|
|
}
|
|
|
|
#[derive(Serialize, Debug, Default)]
|
|
pub struct ParseAssetsOutput {
|
|
pub assets: Vec<ParseAssetsResult>,
|
|
pub sql_queries: Vec<SqlQueryDetails>,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize)]
|
|
pub struct DelegateToGitRepoDetails {
|
|
pub resource: String,
|
|
pub playbook: Option<String>,
|
|
pub commit: Option<String>,
|
|
}
|
|
|
|
pub fn merge_assets(assets: Vec<ParseAssetsResult>) -> Vec<ParseAssetsResult> {
|
|
let mut arr: Vec<ParseAssetsResult> = vec![];
|
|
for asset in assets {
|
|
// Remove duplicates
|
|
if let Some(existing) = arr
|
|
.iter_mut()
|
|
.find(|x| x.path == asset.path && x.kind == asset.kind)
|
|
{
|
|
// merge access types
|
|
existing.access_type = match (asset.access_type, existing.access_type) {
|
|
(None, _) | (_, None) => None,
|
|
(Some(R), Some(W)) | (Some(W), Some(R)) => Some(RW),
|
|
(Some(RW), _) | (_, Some(RW)) => Some(RW),
|
|
(Some(R), Some(R)) => Some(R),
|
|
(Some(W), Some(W)) => Some(W),
|
|
};
|
|
} else {
|
|
arr.push(asset);
|
|
}
|
|
}
|
|
arr.sort_by(|a, b| a.path.cmp(&b.path));
|
|
arr
|
|
}
|
|
|
|
// Will return false if the user assigned an asset to a variable like:
|
|
// let sql = wmill.datatable('main')
|
|
// But never used it. In that case we don't know which table is being used,
|
|
// but we still want to add the main datatable as an asset with unknown access type.
|
|
//
|
|
// This function takes care of the fact that assets can be suffixed (e.g. "main/users")
|
|
pub fn asset_was_used(assets: &Vec<ParseAssetsResult>, (kind, path): (AssetKind, &String)) -> bool {
|
|
assets.iter().any(|a| {
|
|
let a_path = a.path.as_str();
|
|
let has_same_path_base = a_path
|
|
.strip_prefix(path)
|
|
.map(|p| p.starts_with('/'))
|
|
.unwrap_or(false);
|
|
(has_same_path_base || a_path == path) && a.kind == kind
|
|
})
|
|
}
|
|
|
|
pub fn parse_asset_syntax(s: &str, enable_default_syntax: bool) -> Option<(AssetKind, &str)> {
|
|
if enable_default_syntax && s == "datatable" {
|
|
Some((AssetKind::DataTable, "main"))
|
|
} else if enable_default_syntax && s == "ducklake" {
|
|
Some((AssetKind::Ducklake, "main"))
|
|
} else if s.starts_with("s3://") {
|
|
Some((AssetKind::S3Object, &s[5..]))
|
|
} else if s.starts_with("res://") {
|
|
Some((AssetKind::Resource, &s[6..]))
|
|
} else if s.starts_with("$res:") {
|
|
Some((AssetKind::Resource, &s[5..]))
|
|
} else if s.starts_with("ducklake://") {
|
|
Some((AssetKind::Ducklake, &s[11..]))
|
|
} else if s.starts_with("datatable://") {
|
|
Some((AssetKind::DataTable, &s[12..]))
|
|
} else {
|
|
None
|
|
}
|
|
}
|