diff --git a/src/extensions/data-catalog/data-model-tab.tsx b/src/extensions/data-catalog/data-model-tab.tsx index 1948eca9..3e1d85eb 100644 --- a/src/extensions/data-catalog/data-model-tab.tsx +++ b/src/extensions/data-catalog/data-model-tab.tsx @@ -1,6 +1,7 @@ import SchemaNameSelect from "@/components/gui/schema-editor/schema-name-select"; import { Toolbar, ToolbarFiller } from "@/components/gui/toolbar"; import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { Dialog, DialogContent, @@ -157,6 +158,7 @@ interface DataCatalogTableColumnProps { column: DatabaseTableColumn; driver: DataCatalogDriver; search?: string; + hasDefinitionOnly?: boolean; } function DataCatalogTableColumn({ @@ -164,6 +166,7 @@ function DataCatalogTableColumn({ table, driver, search, + hasDefinitionOnly, }: DataCatalogTableColumnProps) { const modelColumn = driver.getColumn( table.schemaName, @@ -176,6 +179,10 @@ function DataCatalogTableColumn({ const [open, setOpen] = useState(false); + if (hasDefinitionOnly && !definition) { + return null; + } + return (
@@ -217,28 +224,67 @@ interface DataCatalogTableAccordionProps { table: DatabaseTableSchema; driver: DataCatalogDriver; search?: string; + columnName?: string; + hasDefinitionOnly?: boolean; } function DataCatalogTableAccordion({ table, driver, search, + hasDefinitionOnly, }: DataCatalogTableAccordionProps) { + const modelTable = driver.getTable(table.schemaName, table.tableName!); + + const [definition, setDefinition] = useState(modelTable?.definition || ""); + + const onUpdateTable = useCallback(() => { + if ( + definition && + definition.trim() && + definition !== modelTable?.definition + ) { + driver.updateTable(table?.schemaName, table.tableName!, { + definition, + }); + } + }, [driver, table, definition, modelTable]); + // Check if any of the column match? const matchColumns = useMemo(() => { - return !search || search.toLowerCase() === table.tableName!.toLowerCase() - ? table.columns - : table.columns.filter((column) => - column.name.toLowerCase().includes(search.toLowerCase()) - ); + if (!search || search.toLowerCase() === table.tableName!.toLowerCase()) { + return table.columns; + } + return table.columns.filter((column) => + column.name.toLowerCase().includes(search.toLowerCase()) + ); }, [search, table]); const matchedTableName = useMemo(() => { - return search - ? table.tableName!.toLowerCase().includes(search?.toLowerCase()) - : true; + if (search) { + return table.tableName!.toLowerCase().includes(search?.toLowerCase()); + } + return true; }, [search, table]); + // this will work only toggle check box + if (hasDefinitionOnly) { + const columnsDefinition = table.columns + .map((col) => { + const modelColumn = driver.getColumn( + table.schemaName, + table.tableName!, + col.name + ); + return !!modelColumn?.definition; + }) + .filter(Boolean); + + if (columnsDefinition.length === 0) { + return null; + } + } + if (!matchedTableName && matchColumns.length === 0 && search) { return null; } @@ -247,7 +293,16 @@ function DataCatalogTableAccordion({
{table.tableName}
-
No description
+ { + e.preventDefault(); + setDefinition(e.currentTarget.value); + }} + className="h-[30px] w-[150px] p-0 text-[13px] focus-visible:outline-none" + />
{matchColumns.map((column) => { return ( @@ -257,6 +312,7 @@ function DataCatalogTableAccordion({ column={column} driver={driver} search={search} + hasDefinitionOnly={hasDefinitionOnly} /> ); })} @@ -267,6 +323,7 @@ function DataCatalogTableAccordion({ export default function DataCatalogModelTab() { const { currentSchemaName, schema } = useSchema(); const [search, setSearch] = useState(""); + const [hasDefinitionOnly, setHasDefinitionOnly] = useState(false); const [selectedSchema, setSelectedSchema] = useState(currentSchemaName); const { extensions } = useConfig(); @@ -299,6 +356,13 @@ export default function DataCatalogModelTab() { value={selectedSchema} onChange={setSelectedSchema} /> +
+ setHasDefinitionOnly(!hasDefinitionOnly)} + /> + +
))}
diff --git a/src/extensions/data-catalog/driver-inmemory.ts b/src/extensions/data-catalog/driver-inmemory.ts index f2aefef8..23d156e6 100644 --- a/src/extensions/data-catalog/driver-inmemory.ts +++ b/src/extensions/data-catalog/driver-inmemory.ts @@ -1,4 +1,10 @@ -import DataCatalogDriver, { DataCatalogModelColumn, DataCatalogModelColumnInput, DataCatalogModelTable, DataCatalogModelTableInput, DataCatalogSchemas } from "./driver"; +import DataCatalogDriver, { + DataCatalogModelColumn, + DataCatalogModelColumnInput, + DataCatalogModelTable, + DataCatalogModelTableInput, + DataCatalogSchemas, +} from "./driver"; interface DataCatalogInmemoryDriverOptions { delay?: number; @@ -6,16 +12,19 @@ interface DataCatalogInmemoryDriverOptions { export default class DataCatalogInmemoryDriver implements DataCatalogDriver { protected schemas: DataCatalogSchemas; - protected options: DataCatalogInmemoryDriverOptions + protected options: DataCatalogInmemoryDriverOptions; - constructor(schemas: DataCatalogSchemas, options: DataCatalogInmemoryDriverOptions) { + constructor( + schemas: DataCatalogSchemas, + options: DataCatalogInmemoryDriverOptions + ) { this.schemas = schemas; this.options = options; } async load(): Promise { if (this.options.delay) { - await new Promise(resolve => setTimeout(resolve, this.options.delay)); + await new Promise((resolve) => setTimeout(resolve, this.options.delay)); } return this.schemas; @@ -28,7 +37,7 @@ export default class DataCatalogInmemoryDriver implements DataCatalogDriver { data: DataCatalogModelColumnInput ): Promise { if (this.options.delay) { - await new Promise(resolve => setTimeout(resolve, this.options.delay)); + await new Promise((resolve) => setTimeout(resolve, this.options.delay)); } const normalizedSchemaName = schemaName.toLowerCase(); @@ -46,7 +55,7 @@ export default class DataCatalogInmemoryDriver implements DataCatalogDriver { schemaName: normalizedSchemaName, tableName: normalizedTableName, columns: {}, - definition: '', + definition: "", }; } @@ -54,7 +63,7 @@ export default class DataCatalogInmemoryDriver implements DataCatalogDriver { if (!table.columns[normalizedColumnName]) { table.columns[normalizedColumnName] = { name: normalizedColumnName, - definition: '', + definition: "", samples: [], hideFromEzql: false, }; @@ -71,7 +80,7 @@ export default class DataCatalogInmemoryDriver implements DataCatalogDriver { data: DataCatalogModelTableInput ): Promise { if (this.options.delay) { - await new Promise(resolve => setTimeout(resolve, this.options.delay)); + await new Promise((resolve) => setTimeout(resolve, this.options.delay)); } const normalizedSchemaName = schemaName.toLowerCase(); @@ -88,7 +97,7 @@ export default class DataCatalogInmemoryDriver implements DataCatalogDriver { schemaName: normalizedSchemaName, tableName: normalizedTableName, columns: {}, - definition: '', + definition: "", }; } @@ -103,9 +112,18 @@ export default class DataCatalogInmemoryDriver implements DataCatalogDriver { tableName: string, columnName: string ): DataCatalogModelColumn | undefined { + const normalizedColumnName = columnName.toLowerCase(); + + const table = this.getTable(schemaName, tableName); + return table?.columns[normalizedColumnName]; + } + + getTable( + schemaName: string, + tableName: string + ): DataCatalogModelTable | undefined { const normalizedSchemaName = schemaName.toLowerCase(); const normalizedTableName = tableName.toLowerCase(); - const normalizedColumnName = columnName.toLowerCase(); if (!this.schemas[normalizedSchemaName]) { return; @@ -118,6 +136,6 @@ export default class DataCatalogInmemoryDriver implements DataCatalogDriver { } const table = schemas[normalizedTableName]; - return table.columns[normalizedColumnName]; + return table; } -} \ No newline at end of file +} diff --git a/src/extensions/data-catalog/driver.tsx b/src/extensions/data-catalog/driver.tsx index fd69d637..e0c1631e 100644 --- a/src/extensions/data-catalog/driver.tsx +++ b/src/extensions/data-catalog/driver.tsx @@ -48,4 +48,9 @@ export default abstract class DataCatalogDriver { tableName: string, columnName: string ): DataCatalogModelColumn | undefined; + + abstract getTable( + schemaName: string, + tableName: string + ): DataCatalogModelTable | undefined; }