From 532f3e5e4eefec53872ee3d04cedcca2525ede5c Mon Sep 17 00:00:00 2001 From: Ram Narayan Balaji <81347100+yan-3005@users.noreply.github.com> Date: Wed, 24 Sep 2025 18:38:03 +0530 Subject: [PATCH] Undo entity status migration, show entityStatus by default (#23511) * Revert Entity Status Migrations as we already have the default value * Batch Migrations and by default show entityStatus field in the response * Setting default value of enum in the status.json and fixing test cases for new default enum UNPROCESSED * Update generated TypeScript types * DataContract by default has Unprocessed status, Overriden method in the GlossaryTermRepository --------- Co-authored-by: github-actions[bot] --- .../service/jdbi3/DataContractRepository.java | 6 - .../service/jdbi3/EntityRepository.java | 9 +- .../service/jdbi3/GlossaryTermRepository.java | 37 +- .../migration/mysql/v1100/Migration.java | 5 +- .../migration/postgres/v1100/Migration.java | 5 +- .../migration/utils/v1100/MigrationUtil.java | 340 +++++++++--------- .../data/DataContractResourceTest.java | 2 +- .../domains/DataProductResourceTest.java | 8 +- .../dqtests/TestCaseResourceTest.java | 22 +- .../tags/ClassificationResourceTest.java | 8 +- .../resources/tags/TagResourceTest.java | 8 +- .../resources/json/schema/type/status.json | 6 +- .../generated/api/data/createDataContract.ts | 1 + .../governance/createWorkflowDefinition.ts | 1 + .../entity/classification/classification.ts | 1 + .../generated/entity/classification/tag.ts | 1 + .../generated/entity/data/apiCollection.ts | 1 + .../src/generated/entity/data/apiEndpoint.ts | 1 + .../ui/src/generated/entity/data/chart.ts | 1 + .../ui/src/generated/entity/data/container.ts | 1 + .../ui/src/generated/entity/data/dashboard.ts | 1 + .../entity/data/dashboardDataModel.ts | 1 + .../src/generated/entity/data/dataContract.ts | 1 + .../ui/src/generated/entity/data/database.ts | 1 + .../generated/entity/data/databaseSchema.ts | 1 + .../ui/src/generated/entity/data/directory.ts | 1 + .../ui/src/generated/entity/data/file.ts | 1 + .../ui/src/generated/entity/data/glossary.ts | 1 + .../src/generated/entity/data/glossaryTerm.ts | 1 + .../ui/src/generated/entity/data/metric.ts | 1 + .../ui/src/generated/entity/data/mlmodel.ts | 1 + .../ui/src/generated/entity/data/pipeline.ts | 1 + .../ui/src/generated/entity/data/query.ts | 1 + .../ui/src/generated/entity/data/report.ts | 1 + .../src/generated/entity/data/searchIndex.ts | 1 + .../generated/entity/data/storedProcedure.ts | 1 + .../ui/src/generated/entity/data/table.ts | 1 + .../ui/src/generated/entity/data/topic.ts | 1 + .../ui/src/generated/entity/data/worksheet.ts | 1 + .../generated/entity/domains/dataProduct.ts | 1 + .../setGlossaryTermStatusTask.ts | 1 + .../ui/src/generated/tests/testCase.ts | 1 + .../resources/ui/src/generated/type/status.ts | 1 + 43 files changed, 266 insertions(+), 221 deletions(-) diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DataContractRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DataContractRepository.java index f169d96df3b..e0cd6402611 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DataContractRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DataContractRepository.java @@ -159,12 +159,6 @@ public class DataContractRepository extends EntityRepository { createOrUpdateDataContractTestSuite(dataContract, update); } - @Override - protected void setDefaultStatus(DataContract entity, boolean update) { - // If the contract status is marked as null, let it be null, If it is not marked as null, leave - // it as is, so no implementation here - } - // Ensure we have a pipeline after creation if needed @Override protected void postCreate(DataContract dataContract) { diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityRepository.java index d74526691e4..0522ccbf281 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityRepository.java @@ -585,8 +585,8 @@ public abstract class EntityRepository { if (entity.getEntityStatus() != null) { return; } - // Set default status to APPROVED - entity.setEntityStatus(EntityStatus.APPROVED); + // Set default status to UNPROCESSED + entity.setEntityStatus(EntityStatus.UNPROCESSED); } /** @@ -1186,11 +1186,6 @@ public abstract class EntityRepository { entity.setReviewers( fields.contains(FIELD_REVIEWERS) ? getReviewers(entity) : entity.getReviewers()); entity.setVotes(fields.contains(FIELD_VOTES) ? getVotes(entity) : entity.getVotes()); - if (fields.contains(FIELD_ENTITY_STATUS)) { - if (entity.getEntityStatus() == null) { - entity.setEntityStatus(EntityStatus.APPROVED); - } - } setFields(entity, fields); return entity; diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/GlossaryTermRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/GlossaryTermRepository.java index a4a060d2d1c..d912df9c8c3 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/GlossaryTermRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/GlossaryTermRepository.java @@ -233,17 +233,42 @@ public class GlossaryTermRepository extends EntityRepository { // Validate related terms EntityUtil.populateEntityReferences(entity.getRelatedTerms()); - if (!update || entity.getEntityStatus() == null) { - // If parentTerm or glossary has reviewers set, the glossary term can only be created in - // `Draft` mode - entity.setEntityStatus( - !nullOrEmpty(parentReviewers) ? EntityStatus.DRAFT : EntityStatus.APPROVED); - } if (!update) { checkDuplicateTerms(entity); } } + @Override + protected void setDefaultStatus(GlossaryTerm entity, boolean update) { + // If the entityStatus is set as Unprocessed then it is the default value from the POJO + if (!update + || entity.getEntityStatus() == null + || entity.getEntityStatus() == EntityStatus.UNPROCESSED) { + // Get reviewers from parent term or glossary to determine appropriate default status + List parentReviewers = null; + + // Get parent reviewers if parent term exists + if (entity.getParent() != null) { + GlossaryTerm parentTerm = + Entity.getEntity( + entity.getParent().withType(GLOSSARY_TERM), "reviewers", Include.NON_DELETED); + parentReviewers = parentTerm.getReviewers(); + } + + // Get glossary reviewers if no parent reviewers + if (parentReviewers == null && entity.getGlossary() != null) { + Glossary glossary = + Entity.getEntity(entity.getGlossary(), "reviewers", Include.NON_DELETED); + parentReviewers = glossary.getReviewers(); + } + + // If parentTerm or glossary has reviewers set, the glossary term can only be created in + // `Draft` mode, otherwise use `Approved` + entity.setEntityStatus( + !nullOrEmpty(parentReviewers) ? EntityStatus.DRAFT : EntityStatus.APPROVED); + } + } + @Override public void storeEntity(GlossaryTerm entity, boolean update) { // Relationships and fields such as parentTerm are derived and not stored as part of json diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/migration/mysql/v1100/Migration.java b/openmetadata-service/src/main/java/org/openmetadata/service/migration/mysql/v1100/Migration.java index 0d43444393c..852d0bf2d22 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/migration/mysql/v1100/Migration.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/migration/mysql/v1100/Migration.java @@ -1,6 +1,7 @@ package org.openmetadata.service.migration.mysql.v1100; import lombok.SneakyThrows; +import org.openmetadata.service.jdbi3.locator.ConnectionType; import org.openmetadata.service.migration.api.MigrationProcessImpl; import org.openmetadata.service.migration.utils.MigrationFile; import org.openmetadata.service.migration.utils.v1100.MigrationUtil; @@ -14,7 +15,7 @@ public class Migration extends MigrationProcessImpl { @Override @SneakyThrows public void runDataMigration() { - MigrationUtil migrationUtil = new MigrationUtil(collectionDAO); - migrationUtil.migrateEntityStatusForExistingEntities(handle); + MigrationUtil migrationUtil = new MigrationUtil(handle, ConnectionType.MYSQL); + migrationUtil.migrateEntityStatusForExistingEntities(); } } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/migration/postgres/v1100/Migration.java b/openmetadata-service/src/main/java/org/openmetadata/service/migration/postgres/v1100/Migration.java index 20bb06da5a7..8686a462ea3 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/migration/postgres/v1100/Migration.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/migration/postgres/v1100/Migration.java @@ -1,6 +1,7 @@ package org.openmetadata.service.migration.postgres.v1100; import lombok.SneakyThrows; +import org.openmetadata.service.jdbi3.locator.ConnectionType; import org.openmetadata.service.migration.api.MigrationProcessImpl; import org.openmetadata.service.migration.utils.MigrationFile; import org.openmetadata.service.migration.utils.v1100.MigrationUtil; @@ -14,7 +15,7 @@ public class Migration extends MigrationProcessImpl { @Override @SneakyThrows public void runDataMigration() { - MigrationUtil migrationUtil = new MigrationUtil(collectionDAO); - migrationUtil.migrateEntityStatusForExistingEntities(handle); + MigrationUtil migrationUtil = new MigrationUtil(handle, ConnectionType.POSTGRES); + migrationUtil.migrateEntityStatusForExistingEntities(); } } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v1100/MigrationUtil.java b/openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v1100/MigrationUtil.java index d433c17ac72..4f2a150e098 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v1100/MigrationUtil.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/migration/utils/v1100/MigrationUtil.java @@ -1,121 +1,121 @@ package org.openmetadata.service.migration.utils.v1100; -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.SQLException; import lombok.extern.slf4j.Slf4j; import org.jdbi.v3.core.Handle; -import org.openmetadata.service.jdbi3.CollectionDAO; +import org.openmetadata.service.jdbi3.locator.ConnectionType; @Slf4j public class MigrationUtil { private static final int BATCH_SIZE = 500; - private final CollectionDAO collectionDAO; - private boolean isPostgres = false; + private final Handle handle; + private final ConnectionType connectionType; - public MigrationUtil(CollectionDAO collectionDAO) { - this.collectionDAO = collectionDAO; + public MigrationUtil(Handle handle, ConnectionType connectionType) { + this.handle = handle; + this.connectionType = connectionType; } - public void migrateEntityStatusForExistingEntities(Handle handle) { - try { - Connection connection = handle.getConnection(); - DatabaseMetaData metaData = connection.getMetaData(); - String dbType = metaData.getDatabaseProductName().toLowerCase(); - isPostgres = dbType.contains("postgres") || dbType.contains("postgresql"); - - LOG.info( - "Starting entityStatus migration for v1.10.0 on {} database", - isPostgres ? "PostgreSQL" : "MySQL"); - } catch (SQLException e) { - LOG.error("Failed to determine database type, assuming MySQL: {}", e.getMessage()); - isPostgres = false; - } - - // All entity tables that need entityStatus field - String[] entityTables = { - "table_entity", - "dashboard_entity", - "pipeline_entity", - "topic_entity", - "ml_model_entity", - "storage_container_entity", - "search_index_entity", - "stored_procedure_entity", - "dashboard_data_model_entity", - "database_entity", - "database_schema_entity", - "metric_entity", - "chart_entity", - "report_entity", - "data_product_entity", - "tag", - "classification", - "glossary_term_entity", - "data_contract_entity", - "test_case" - }; - + public void migrateEntityStatusForExistingEntities() { int totalEntitiesMigrated = 0; - - for (String tableName : entityTables) { - int migrated = 0; - - if (tableName.equals("glossary_term_entity")) { - migrated = migrateGlossaryTermStatus(handle); - } else if (tableName.equals("data_contract_entity")) { - migrated = migrateDataContractStatus(handle); - } else { - migrated = migrateEntityStatusForTable(handle, tableName); - } - - totalEntitiesMigrated += migrated; - } + // Only migrate glossary terms and data contracts that have existing status fields + totalEntitiesMigrated += migrateGlossaryTermStatus(); + totalEntitiesMigrated += migrateDataContractStatus(); LOG.info("===== MIGRATION SUMMARY ====="); - LOG.info("Total entities migrated with entityStatus field: {}", totalEntitiesMigrated); + LOG.info("Total entities migrated with status field changes: {}", totalEntitiesMigrated); LOG.info("===== MIGRATION COMPLETE ====="); } - private int migrateEntityStatusForTable(Handle handle, String tableName) { - LOG.info("Processing table: {}", tableName); + private int migrateGlossaryTermStatus() { + LOG.info("Processing glossary_term_entity: migrating 'status' to 'entityStatus'"); int totalMigrated = 0; - int batchNumber = 0; try { // First, get the total count of entities that need migration - String countSql = buildCountQuery(tableName); + String countSql = buildGlossaryTermCountQuery(); int totalToMigrate = handle.createQuery(countSql).mapTo(Integer.class).one(); if (totalToMigrate == 0) { - LOG.info( - "✓ Completed {}: No records needed migration (already have entityStatus)", tableName); + LOG.info("✓ Completed glossary_term_entity: No records needed migration"); return 0; } - LOG.info(" Found {} records to migrate in {}", totalToMigrate, tableName); + LOG.info(" Found {} glossary terms to migrate", totalToMigrate); - if (isPostgres) { - // PostgreSQL: Use CTE with LIMIT for batch processing - totalMigrated = migratePostgresBatch(handle, tableName, totalToMigrate); + if (connectionType == ConnectionType.POSTGRES) { + totalMigrated = migrateGlossaryTermPostgresBatch(totalToMigrate); } else { - // MySQL: Need to use ORDER BY with LIMIT for deterministic batches - totalMigrated = migrateMySQLBatch(handle, tableName, totalToMigrate); + totalMigrated = migrateGlossaryTermMySQLBatch(totalToMigrate); } if (totalMigrated > 0) { - LOG.info("✓ Completed {}: {} total records migrated", tableName, totalMigrated); + LOG.info("✓ Completed glossary_term_entity: {} total records migrated", totalMigrated); } } catch (Exception e) { - LOG.error("✗ FAILED migrating entityStatus for table {}: {}", tableName, e.getMessage(), e); + LOG.error("✗ FAILED migrating glossary_term_entity status: {}", e.getMessage(), e); } return totalMigrated; } - private int migratePostgresBatch(Handle handle, String tableName, int totalToMigrate) - throws InterruptedException { + private int migrateDataContractStatus() { + LOG.info( + "Processing data_contract_entity: migrating 'status' to 'entityStatus' and 'Active' to 'Approved'"); + int totalMigrated = 0; + + try { + // First, get the total count of entities that need migration + String countSql = buildDataContractCountQuery(); + int totalToMigrate = handle.createQuery(countSql).mapTo(Integer.class).one(); + + if (totalToMigrate == 0) { + LOG.info("✓ Completed data_contract_entity: No records needed migration"); + return 0; + } + + LOG.info(" Found {} data contracts to migrate", totalToMigrate); + + if (connectionType == ConnectionType.POSTGRES) { + totalMigrated = migrateDataContractPostgresBatch(totalToMigrate); + } else { + totalMigrated = migrateDataContractMySQLBatch(totalToMigrate); + } + + if (totalMigrated > 0) { + LOG.info("✓ Completed data_contract_entity: {} total records migrated", totalMigrated); + } + + } catch (Exception e) { + LOG.error("✗ FAILED migrating data_contract_entity status: {}", e.getMessage(), e); + } + + return totalMigrated; + } + + private String buildGlossaryTermCountQuery() { + if (connectionType == ConnectionType.POSTGRES) { + return "SELECT COUNT(*) FROM glossary_term_entity " + + "WHERE json ?? 'status' AND NOT json ?? 'entityStatus'"; + } else { + return "SELECT COUNT(*) FROM glossary_term_entity " + + "WHERE JSON_CONTAINS_PATH(json, 'one', '$.status') = 1 " + + "AND JSON_CONTAINS_PATH(json, 'one', '$.entityStatus') = 0"; + } + } + + private String buildDataContractCountQuery() { + if (connectionType == ConnectionType.POSTGRES) { + return "SELECT COUNT(*) FROM data_contract_entity " + + "WHERE json ?? 'status' AND NOT json ?? 'entityStatus'"; + } else { + return "SELECT COUNT(*) FROM data_contract_entity " + + "WHERE JSON_CONTAINS_PATH(json, 'one', '$.status') = 1 " + + "AND JSON_CONTAINS_PATH(json, 'one', '$.entityStatus') = 0"; + } + } + + private int migrateGlossaryTermPostgresBatch(int totalToMigrate) throws InterruptedException { int totalMigrated = 0; int batchNumber = 0; @@ -126,17 +126,18 @@ public class MigrationUtil { String.format( "WITH batch AS ( " + " SELECT id " - + " FROM %1$s " - + " WHERE NOT ((json)::jsonb ?? 'entityStatus') " + + " FROM glossary_term_entity " + + " WHERE json ?? 'status' AND NOT json ?? 'entityStatus' " + " ORDER BY id " - + " LIMIT %2$d " + + " LIMIT %d " + ") " - + "UPDATE %1$s t " - + "SET json = jsonb_set((t.json)::jsonb, '{entityStatus}', '\"Approved\"'::jsonb)::json " + + "UPDATE glossary_term_entity t " + + "SET json = jsonb_set(t.json - 'status', '{entityStatus}', " + + "COALESCE(t.json->'status', '\"Approved\"'::jsonb)) " + "FROM batch " + "WHERE t.id = batch.id " - + " AND NOT ((t.json)::jsonb ?? 'entityStatus')", - tableName, BATCH_SIZE); + + " AND t.json ?? 'status' AND NOT t.json ?? 'entityStatus'", + BATCH_SIZE); long startTime = System.currentTimeMillis(); int batchCount = handle.createUpdate(updateSql).execute(); @@ -145,11 +146,10 @@ public class MigrationUtil { if (batchCount > 0) { totalMigrated += batchCount; LOG.info( - " Batch {}: Migrated {} records in {}ms (Total for {}: {}/{})", + " Batch {}: Migrated {} glossary terms in {}ms (Total: {}/{})", batchNumber, batchCount, executionTime, - tableName, totalMigrated, totalToMigrate); Thread.sleep(100); @@ -161,8 +161,7 @@ public class MigrationUtil { return totalMigrated; } - private int migrateMySQLBatch(Handle handle, String tableName, int totalToMigrate) - throws InterruptedException { + private int migrateGlossaryTermMySQLBatch(int totalToMigrate) throws InterruptedException { int totalMigrated = 0; int batchNumber = 0; @@ -171,17 +170,20 @@ public class MigrationUtil { String updateSql = String.format( - "UPDATE %1$s t " + "UPDATE glossary_term_entity t " + "JOIN ( " + " SELECT id " - + " FROM %1$s " - + " WHERE JSON_EXTRACT(json, '$.entityStatus') IS NULL " + + " FROM glossary_term_entity " + + " WHERE JSON_CONTAINS_PATH(json, 'one', '$.status') = 1 " + + " AND JSON_CONTAINS_PATH(json, 'one', '$.entityStatus') = 0 " + " ORDER BY id " - + " LIMIT %2$d " + + " LIMIT %d " + ") s ON t.id = s.id " - + "SET t.json = JSON_SET(t.json, '$.entityStatus', 'Approved') " - + "WHERE JSON_EXTRACT(t.json, '$.entityStatus') IS NULL", - tableName, BATCH_SIZE); + + "SET t.json = JSON_SET(JSON_REMOVE(t.json, '$.status'), '$.entityStatus', " + + "COALESCE(JSON_UNQUOTE(JSON_EXTRACT(t.json, '$.status')), 'Approved')) " + + "WHERE JSON_CONTAINS_PATH(t.json, 'one', '$.status') = 1 " + + " AND JSON_CONTAINS_PATH(t.json, 'one', '$.entityStatus') = 0", + BATCH_SIZE); long startTime = System.currentTimeMillis(); int batchCount = handle.createUpdate(updateSql).execute(); @@ -190,11 +192,10 @@ public class MigrationUtil { if (batchCount > 0) { totalMigrated += batchCount; LOG.info( - " Batch {}: Migrated {} records in {}ms (Total for {}: {}/{})", + " Batch {}: Migrated {} glossary terms in {}ms (Total: {}/{})", batchNumber, batchCount, executionTime, - tableName, totalMigrated, totalToMigrate); Thread.sleep(100); @@ -206,108 +207,101 @@ public class MigrationUtil { return totalMigrated; } - private int migrateGlossaryTermStatus(Handle handle) { - LOG.info("Processing glossary_term_entity: migrating 'status' to 'entityStatus'"); + private int migrateDataContractPostgresBatch(int totalToMigrate) throws InterruptedException { int totalMigrated = 0; + int batchNumber = 0; - try { - String sql; - if (isPostgres) { - sql = - "UPDATE glossary_term_entity " - + "SET json = jsonb_set(json - 'status', '{entityStatus}', " - + "COALESCE(json->'status', '\"Approved\"'::jsonb)) " - + "WHERE json ?? 'status' " - + "AND NOT json ?? 'entityStatus'"; - } else { - sql = - "UPDATE glossary_term_entity " - + "SET json = JSON_SET(JSON_REMOVE(json, '$.status'), '$.entityStatus', " - + "COALESCE(JSON_UNQUOTE(JSON_EXTRACT(json, '$.status')), 'Approved')) " - + "WHERE JSON_CONTAINS_PATH(json, 'one', '$.status') = 1 " - + "AND JSON_CONTAINS_PATH(json, 'one', '$.entityStatus') = 0"; - } + while (totalMigrated < totalToMigrate) { + batchNumber++; + + String updateSql = + String.format( + "WITH batch AS ( " + + " SELECT id " + + " FROM data_contract_entity " + + " WHERE json ?? 'status' AND NOT json ?? 'entityStatus' " + + " ORDER BY id " + + " LIMIT %d " + + ") " + + "UPDATE data_contract_entity t " + + "SET json = jsonb_set(t.json - 'status', '{entityStatus}', " + + "CASE " + + " WHEN t.json->>'status' = 'Active' THEN '\"Approved\"'::jsonb " + + " ELSE COALESCE(t.json->'status', '\"Approved\"'::jsonb) " + + "END) " + + "FROM batch " + + "WHERE t.id = batch.id " + + " AND t.json ?? 'status' AND NOT t.json ?? 'entityStatus'", + BATCH_SIZE); long startTime = System.currentTimeMillis(); - totalMigrated = handle.createUpdate(sql).execute(); + int batchCount = handle.createUpdate(updateSql).execute(); long executionTime = System.currentTimeMillis() - startTime; - if (totalMigrated > 0) { + if (batchCount > 0) { + totalMigrated += batchCount; LOG.info( - "✓ Completed glossary_term_entity: {} records migrated from 'status' to 'entityStatus' in {}ms", + " Batch {}: Migrated {} data contracts in {}ms (Total: {}/{})", + batchNumber, + batchCount, + executionTime, totalMigrated, - executionTime); + totalToMigrate); + Thread.sleep(100); } else { - LOG.info("✓ Completed glossary_term_entity: No records needed migration"); + break; } - - } catch (Exception e) { - LOG.error("✗ FAILED migrating glossary_term_entity status: {}", e.getMessage(), e); } return totalMigrated; } - private int migrateDataContractStatus(Handle handle) { - LOG.info( - "Processing data_contract_entity: migrating 'status' to 'entityStatus' and 'Active' to 'Approved'"); + private int migrateDataContractMySQLBatch(int totalToMigrate) throws InterruptedException { int totalMigrated = 0; + int batchNumber = 0; - try { - String sql; - if (isPostgres) { - // PostgreSQL: Rename status to entityStatus and convert Active to Approved - sql = - "UPDATE data_contract_entity " - + "SET json = jsonb_set(json - 'status', '{entityStatus}', " - + "CASE " - + " WHEN json->>'status' = 'Active' THEN '\"Approved\"'::jsonb " - + " ELSE COALESCE(json->'status', '\"Approved\"'::jsonb) " - + "END) " - + "WHERE json ?? 'status' " - + "AND NOT json ?? 'entityStatus'"; - } else { - // MySQL: Rename status to entityStatus and convert Active to Approved - sql = - "UPDATE data_contract_entity " - + "SET json = JSON_SET(JSON_REMOVE(json, '$.status'), '$.entityStatus', " - + "CASE " - + " WHEN JSON_UNQUOTE(JSON_EXTRACT(json, '$.status')) = 'Active' THEN 'Approved' " - + " ELSE COALESCE(JSON_UNQUOTE(JSON_EXTRACT(json, '$.status')), 'Approved') " - + "END) " - + "WHERE JSON_CONTAINS_PATH(json, 'one', '$.status') = 1 " - + "AND JSON_CONTAINS_PATH(json, 'one', '$.entityStatus') = 0"; - } + while (totalMigrated < totalToMigrate) { + batchNumber++; + + String updateSql = + String.format( + "UPDATE data_contract_entity t " + + "JOIN ( " + + " SELECT id " + + " FROM data_contract_entity " + + " WHERE JSON_CONTAINS_PATH(json, 'one', '$.status') = 1 " + + " AND JSON_CONTAINS_PATH(json, 'one', '$.entityStatus') = 0 " + + " ORDER BY id " + + " LIMIT %d " + + ") s ON t.id = s.id " + + "SET t.json = JSON_SET(JSON_REMOVE(t.json, '$.status'), '$.entityStatus', " + + "CASE " + + " WHEN JSON_UNQUOTE(JSON_EXTRACT(t.json, '$.status')) = 'Active' THEN 'Approved' " + + " ELSE COALESCE(JSON_UNQUOTE(JSON_EXTRACT(t.json, '$.status')), 'Approved') " + + "END) " + + "WHERE JSON_CONTAINS_PATH(t.json, 'one', '$.status') = 1 " + + " AND JSON_CONTAINS_PATH(t.json, 'one', '$.entityStatus') = 0", + BATCH_SIZE); long startTime = System.currentTimeMillis(); - totalMigrated = handle.createUpdate(sql).execute(); + int batchCount = handle.createUpdate(updateSql).execute(); long executionTime = System.currentTimeMillis() - startTime; - if (totalMigrated > 0) { + if (batchCount > 0) { + totalMigrated += batchCount; LOG.info( - "✓ Completed data_contract_entity: {} records migrated from 'status' to 'entityStatus' in {}ms", + " Batch {}: Migrated {} data contracts in {}ms (Total: {}/{})", + batchNumber, + batchCount, + executionTime, totalMigrated, - executionTime); + totalToMigrate); + Thread.sleep(100); } else { - LOG.info("✓ Completed data_contract_entity: No records needed migration"); + break; } - - } catch (Exception e) { - LOG.error("✗ FAILED migrating data_contract_entity status: {}", e.getMessage(), e); } return totalMigrated; } - - private String buildCountQuery(String tableName) { - if (isPostgres) { - return String.format( - "SELECT COUNT(*) FROM %s " + "WHERE NOT (json ?? 'entityStatus')", tableName); - - } else { - return String.format( - "SELECT COUNT(*) FROM %s " + "WHERE JSON_EXTRACT(json, '$.entityStatus') IS NULL", - tableName); - } - } } diff --git a/openmetadata-service/src/test/java/org/openmetadata/service/resources/data/DataContractResourceTest.java b/openmetadata-service/src/test/java/org/openmetadata/service/resources/data/DataContractResourceTest.java index a820028011a..73a893d0bba 100644 --- a/openmetadata-service/src/test/java/org/openmetadata/service/resources/data/DataContractResourceTest.java +++ b/openmetadata-service/src/test/java/org/openmetadata/service/resources/data/DataContractResourceTest.java @@ -1627,7 +1627,7 @@ public class DataContractResourceTest extends EntityResourceTest { CreateTag createTag = createRequest(getEntityName(test)); Tag tag = createEntity(createTag, ADMIN_AUTH_HEADERS); - // Verify the tag is created with APPROVED status + // Verify the tag is created with UNPROCESSED status assertEquals( - EntityStatus.APPROVED, tag.getEntityStatus(), "Tag should be created with APPROVED status"); + EntityStatus.UNPROCESSED, + tag.getEntityStatus(), + "Tag should be created with UNPROCESSED status"); // Update the entityStatus using PATCH operation String originalJson = JsonUtils.pojoToJson(tag); tag.setEntityStatus(EntityStatus.IN_REVIEW); ChangeDescription change = getChangeDescription(tag, MINOR_UPDATE); - fieldUpdated(change, "entityStatus", EntityStatus.APPROVED, EntityStatus.IN_REVIEW); + fieldUpdated(change, "entityStatus", EntityStatus.UNPROCESSED, EntityStatus.IN_REVIEW); Tag updatedTag = patchEntityAndCheck(tag, originalJson, ADMIN_AUTH_HEADERS, MINOR_UPDATE, change); diff --git a/openmetadata-spec/src/main/resources/json/schema/type/status.json b/openmetadata-spec/src/main/resources/json/schema/type/status.json index d13b6a21942..923c5427560 100644 --- a/openmetadata-spec/src/main/resources/json/schema/type/status.json +++ b/openmetadata-spec/src/main/resources/json/schema/type/status.json @@ -10,6 +10,8 @@ "In Review", "Approved", "Deprecated", - "Rejected" - ] + "Rejected", + "Unprocessed" + ], + "default": "Unprocessed" } \ No newline at end of file diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/api/data/createDataContract.ts b/openmetadata-ui/src/main/resources/ui/src/generated/api/data/createDataContract.ts index 499a45efd9f..73b3626fe0a 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/api/data/createDataContract.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/api/data/createDataContract.ts @@ -149,6 +149,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/api/governance/createWorkflowDefinition.ts b/openmetadata-ui/src/main/resources/ui/src/generated/api/governance/createWorkflowDefinition.ts index c6737e8bfcd..8cb3b640989 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/api/governance/createWorkflowDefinition.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/api/governance/createWorkflowDefinition.ts @@ -150,6 +150,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } export interface InputNamespaceMap { diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/classification/classification.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/classification/classification.ts index 0e393935c8c..bd4c27758cf 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/classification/classification.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/classification/classification.ts @@ -237,6 +237,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/classification/tag.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/classification/tag.ts index 2a5d023bc1d..8dc67244ff6 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/classification/tag.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/classification/tag.ts @@ -260,6 +260,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/apiCollection.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/apiCollection.ts index 8edfe016318..7db5de2f383 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/apiCollection.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/apiCollection.ts @@ -362,6 +362,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/apiEndpoint.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/apiEndpoint.ts index a2af15ca273..0af1ec619a4 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/apiEndpoint.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/apiEndpoint.ts @@ -379,6 +379,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/chart.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/chart.ts index 8db37e3de85..55698fb34fe 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/chart.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/chart.ts @@ -391,6 +391,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/container.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/container.ts index e5710ac7ba8..e3b0dccbb56 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/container.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/container.ts @@ -814,6 +814,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/dashboard.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/dashboard.ts index b56a7c178b7..08c78f2feb0 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/dashboard.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/dashboard.ts @@ -387,6 +387,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/dashboardDataModel.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/dashboardDataModel.ts index cf0bdf9e94c..c4350f0b6cb 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/dashboardDataModel.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/dashboardDataModel.ts @@ -784,6 +784,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/dataContract.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/dataContract.ts index c9a3ab9c000..afdf120deb3 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/dataContract.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/dataContract.ts @@ -303,6 +303,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/database.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/database.ts index c205adaceed..f9172e3c8e7 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/database.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/database.ts @@ -505,6 +505,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/databaseSchema.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/databaseSchema.ts index ae484bd4644..451cabcadc4 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/databaseSchema.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/databaseSchema.ts @@ -501,6 +501,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/directory.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/directory.ts index d9f46b4eb8a..90f9a539e38 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/directory.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/directory.ts @@ -407,6 +407,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/file.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/file.ts index eecee353873..6941993ea3b 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/file.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/file.ts @@ -420,6 +420,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/glossary.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/glossary.ts index bdae37ac0ad..6b72ac0628e 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/glossary.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/glossary.ts @@ -250,6 +250,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/glossaryTerm.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/glossaryTerm.ts index 6a6f174615b..71944650592 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/glossaryTerm.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/glossaryTerm.ts @@ -287,6 +287,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/metric.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/metric.ts index 12d44a250b8..998e88d7671 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/metric.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/metric.ts @@ -361,6 +361,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/mlmodel.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/mlmodel.ts index 558e477aec9..7fec6640acf 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/mlmodel.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/mlmodel.ts @@ -397,6 +397,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/pipeline.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/pipeline.ts index ef80785e255..e3a124d41d3 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/pipeline.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/pipeline.ts @@ -396,6 +396,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/query.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/query.ts index a324ab62f3c..4540ccad772 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/query.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/query.ts @@ -272,6 +272,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/report.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/report.ts index dd75121997d..f90a088436c 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/report.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/report.ts @@ -228,6 +228,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/searchIndex.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/searchIndex.ts index 8dc3bcd7fdc..f24ab99d093 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/searchIndex.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/searchIndex.ts @@ -373,6 +373,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/storedProcedure.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/storedProcedure.ts index 35707a8a3fd..29e343fc88b 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/storedProcedure.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/storedProcedure.ts @@ -388,6 +388,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/table.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/table.ts index 0cb19ec7b64..4643fbaebc2 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/table.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/table.ts @@ -904,6 +904,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/topic.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/topic.ts index 0d97a57ab0f..ed7089444bc 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/topic.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/topic.ts @@ -408,6 +408,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/worksheet.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/worksheet.ts index 60424209b26..9bb3c8b9740 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/worksheet.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/data/worksheet.ts @@ -791,6 +791,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/entity/domains/dataProduct.ts b/openmetadata-ui/src/main/resources/ui/src/generated/entity/domains/dataProduct.ts index bace956fff0..e9cdfefcf26 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/entity/domains/dataProduct.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/entity/domains/dataProduct.ts @@ -259,6 +259,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/governance/workflows/elements/nodes/automatedTask/setGlossaryTermStatusTask.ts b/openmetadata-ui/src/main/resources/ui/src/generated/governance/workflows/elements/nodes/automatedTask/setGlossaryTermStatusTask.ts index c51b9863e41..d74d629a3f7 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/governance/workflows/elements/nodes/automatedTask/setGlossaryTermStatusTask.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/governance/workflows/elements/nodes/automatedTask/setGlossaryTermStatusTask.ts @@ -53,6 +53,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } export interface InputNamespaceMap { diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/tests/testCase.ts b/openmetadata-ui/src/main/resources/ui/src/generated/tests/testCase.ts index b9ed818dfe2..6023cb54afe 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/tests/testCase.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/tests/testCase.ts @@ -294,6 +294,7 @@ export enum EntityStatus { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", } /** diff --git a/openmetadata-ui/src/main/resources/ui/src/generated/type/status.ts b/openmetadata-ui/src/main/resources/ui/src/generated/type/status.ts index b2c097bdcad..3a6660e2cb2 100644 --- a/openmetadata-ui/src/main/resources/ui/src/generated/type/status.ts +++ b/openmetadata-ui/src/main/resources/ui/src/generated/type/status.ts @@ -20,4 +20,5 @@ export enum Status { Draft = "Draft", InReview = "In Review", Rejected = "Rejected", + Unprocessed = "Unprocessed", }