diff --git a/bootstrap/sql/migrations/native/1.13.0/mysql/postDataMigrationSQLScript.sql b/bootstrap/sql/migrations/native/1.13.0/mysql/postDataMigrationSQLScript.sql index 094654a328a0..7b7ceca2a1aa 100644 --- a/bootstrap/sql/migrations/native/1.13.0/mysql/postDataMigrationSQLScript.sql +++ b/bootstrap/sql/migrations/native/1.13.0/mysql/postDataMigrationSQLScript.sql @@ -54,3 +54,34 @@ WHERE JSON_UNQUOTE(JSON_EXTRACT(json, '$.serviceType')) = 'Iceberg'; UPDATE stored_procedure_entity SET json = JSON_SET(json, '$.serviceType', 'CustomDatabase') WHERE JSON_UNQUOTE(JSON_EXTRACT(json, '$.serviceType')) = 'Iceberg'; + +-- Migrate existing glossary term RELATED_TO relationships to include relationType +-- For backward compatibility, existing relations without a relationType are set to "relatedTo" + +UPDATE entity_relationship +SET json = JSON_SET(COALESCE(json, '{}'), '$.relationType', 'relatedTo') +WHERE fromEntity = 'glossaryTerm' + AND toEntity = 'glossaryTerm' + AND relation = 15 + AND (json IS NULL OR JSON_EXTRACT(json, '$.relationType') IS NULL); + +-- Insert default glossary term relation settings if they don't exist +-- This preserves any existing user customizations +INSERT INTO openmetadata_settings (configType, json) +SELECT 'glossaryTermRelationSettings', '{"relationTypes":[{"name":"relatedTo","displayName":"Related To","description":"General association between terms that are conceptually connected.","rdfPredicate":"https://open-metadata.org/ontology/relatedTo","isSymmetric":true,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"associative","isSystemDefined":true,"color":"#1570ef"},{"name":"synonym","displayName":"Synonym","description":"Terms that have the same meaning and can be used interchangeably.","rdfPredicate":"http://www.w3.org/2004/02/skos/core#exactMatch","isSymmetric":true,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"equivalence","isSystemDefined":true,"color":"#b42318"},{"name":"antonym","displayName":"Antonym","description":"Terms that have opposite meanings.","rdfPredicate":"https://open-metadata.org/ontology/antonym","isSymmetric":true,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"associative","isSystemDefined":true,"color":"#b54708"},{"name":"broader","displayName":"Broader","description":"A more general term (hypernym).","inverseRelation":"narrower","rdfPredicate":"http://www.w3.org/2004/02/skos/core#broader","isSymmetric":false,"isTransitive":true,"isCrossGlossaryAllowed":true,"category":"hierarchical","isSystemDefined":true,"color":"#067647"},{"name":"narrower","displayName":"Narrower","description":"A more specific term (hyponym).","inverseRelation":"broader","rdfPredicate":"http://www.w3.org/2004/02/skos/core#narrower","isSymmetric":false,"isTransitive":true,"isCrossGlossaryAllowed":true,"category":"hierarchical","isSystemDefined":true,"color":"#4e5ba6"},{"name":"partOf","displayName":"Part Of","description":"This term is a part or component of another term.","inverseRelation":"hasPart","rdfPredicate":"https://open-metadata.org/ontology/partOf","isSymmetric":false,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"hierarchical","isSystemDefined":true,"color":"#026aa2"},{"name":"hasPart","displayName":"Has Part","description":"This term has the other term as a part or component.","inverseRelation":"partOf","rdfPredicate":"https://open-metadata.org/ontology/hasPart","isSymmetric":false,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"hierarchical","isSystemDefined":true,"color":"#155eef"},{"name":"calculatedFrom","displayName":"Calculated From","description":"This term/metric is calculated or derived from another term.","inverseRelation":"usedToCalculate","rdfPredicate":"https://open-metadata.org/ontology/calculatedFrom","isSymmetric":false,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"associative","isSystemDefined":true,"color":"#6938ef"},{"name":"usedToCalculate","displayName":"Used To Calculate","description":"This term is used in the calculation of another term.","inverseRelation":"calculatedFrom","rdfPredicate":"https://open-metadata.org/ontology/usedToCalculate","isSymmetric":false,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"associative","isSystemDefined":true,"color":"#ba24d5"},{"name":"seeAlso","displayName":"See Also","description":"Related term that may provide additional context.","rdfPredicate":"http://www.w3.org/2000/01/rdf-schema#seeAlso","isSymmetric":true,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"associative","isSystemDefined":true,"color":"#c11574"}]}' +WHERE NOT EXISTS ( + SELECT 1 FROM openmetadata_settings WHERE configType = 'glossaryTermRelationSettings' +); + +-- Strip stale relatedTerms from glossary term entity JSON. +-- relatedTerms is now loaded from entity_relationship table, not from entity JSON. +-- Old data stored relatedTerms as EntityReference objects which fail to deserialize as TermRelation. +UPDATE glossary_term_entity +SET json = JSON_REMOVE(json, '$.relatedTerms') +WHERE JSON_EXTRACT(json, '$.relatedTerms') IS NOT NULL; + +-- Backfill conceptMappings for existing glossary terms +UPDATE glossary_term_entity +SET json = JSON_SET(COALESCE(json, '{}'), '$.conceptMappings', JSON_ARRAY()) +WHERE JSON_EXTRACT(json, '$.conceptMappings') IS NULL; + diff --git a/bootstrap/sql/migrations/native/1.13.0/postgres/postDataMigrationSQLScript.sql b/bootstrap/sql/migrations/native/1.13.0/postgres/postDataMigrationSQLScript.sql index e1db031bf67d..33bbd1dd5dfe 100644 --- a/bootstrap/sql/migrations/native/1.13.0/postgres/postDataMigrationSQLScript.sql +++ b/bootstrap/sql/migrations/native/1.13.0/postgres/postDataMigrationSQLScript.sql @@ -55,4 +55,35 @@ WHERE json->>'serviceType' = 'Iceberg'; UPDATE stored_procedure_entity SET json = jsonb_set(json::jsonb, '{serviceType}', '"CustomDatabase"')::json -WHERE json->>'serviceType' = 'Iceberg'; \ No newline at end of file +WHERE json->>'serviceType' = 'Iceberg'; + +-- Migrate existing glossary term RELATED_TO relationships to include relationType +-- For backward compatibility, existing relations without a relationType are set to "relatedTo" + +UPDATE entity_relationship +SET json = jsonb_set(COALESCE(json::jsonb, '{}'::jsonb), '{relationType}', '"relatedTo"') +WHERE fromentity = 'glossaryTerm' + AND toentity = 'glossaryTerm' + AND relation = 15 + AND (json IS NULL OR json::jsonb->>'relationType' IS NULL); + +-- Insert default glossary term relation settings if they don't exist +-- This preserves any existing user customizations +INSERT INTO openmetadata_settings (configtype, json) +SELECT 'glossaryTermRelationSettings', '{"relationTypes":[{"name":"relatedTo","displayName":"Related To","description":"General association between terms that are conceptually connected.","rdfPredicate":"https://open-metadata.org/ontology/relatedTo","isSymmetric":true,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"associative","isSystemDefined":true,"color":"#1570ef"},{"name":"synonym","displayName":"Synonym","description":"Terms that have the same meaning and can be used interchangeably.","rdfPredicate":"http://www.w3.org/2004/02/skos/core#exactMatch","isSymmetric":true,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"equivalence","isSystemDefined":true,"color":"#b42318"},{"name":"antonym","displayName":"Antonym","description":"Terms that have opposite meanings.","rdfPredicate":"https://open-metadata.org/ontology/antonym","isSymmetric":true,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"associative","isSystemDefined":true,"color":"#b54708"},{"name":"broader","displayName":"Broader","description":"A more general term (hypernym).","inverseRelation":"narrower","rdfPredicate":"http://www.w3.org/2004/02/skos/core#broader","isSymmetric":false,"isTransitive":true,"isCrossGlossaryAllowed":true,"category":"hierarchical","isSystemDefined":true,"color":"#067647"},{"name":"narrower","displayName":"Narrower","description":"A more specific term (hyponym).","inverseRelation":"broader","rdfPredicate":"http://www.w3.org/2004/02/skos/core#narrower","isSymmetric":false,"isTransitive":true,"isCrossGlossaryAllowed":true,"category":"hierarchical","isSystemDefined":true,"color":"#4e5ba6"},{"name":"partOf","displayName":"Part Of","description":"This term is a part or component of another term.","inverseRelation":"hasPart","rdfPredicate":"https://open-metadata.org/ontology/partOf","isSymmetric":false,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"hierarchical","isSystemDefined":true,"color":"#026aa2"},{"name":"hasPart","displayName":"Has Part","description":"This term has the other term as a part or component.","inverseRelation":"partOf","rdfPredicate":"https://open-metadata.org/ontology/hasPart","isSymmetric":false,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"hierarchical","isSystemDefined":true,"color":"#155eef"},{"name":"calculatedFrom","displayName":"Calculated From","description":"This term/metric is calculated or derived from another term.","inverseRelation":"usedToCalculate","rdfPredicate":"https://open-metadata.org/ontology/calculatedFrom","isSymmetric":false,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"associative","isSystemDefined":true,"color":"#6938ef"},{"name":"usedToCalculate","displayName":"Used To Calculate","description":"This term is used in the calculation of another term.","inverseRelation":"calculatedFrom","rdfPredicate":"https://open-metadata.org/ontology/usedToCalculate","isSymmetric":false,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"associative","isSystemDefined":true,"color":"#ba24d5"},{"name":"seeAlso","displayName":"See Also","description":"Related term that may provide additional context.","rdfPredicate":"http://www.w3.org/2000/01/rdf-schema#seeAlso","isSymmetric":true,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"associative","isSystemDefined":true,"color":"#c11574"}]}'::jsonb +WHERE NOT EXISTS ( + SELECT 1 FROM openmetadata_settings WHERE configtype = 'glossaryTermRelationSettings' +); + +-- Strip stale relatedTerms from glossary term entity JSON. +-- relatedTerms is now loaded from entity_relationship table, not from entity JSON. +-- Old data stored relatedTerms as EntityReference objects which fail to deserialize as TermRelation. +UPDATE glossary_term_entity +SET json = (json::jsonb - 'relatedTerms')::json +WHERE jsonb_exists(json::jsonb, 'relatedTerms'); + +-- Backfill conceptMappings for existing glossary terms +UPDATE glossary_term_entity +SET json = jsonb_set(COALESCE(json::jsonb, '{}'::jsonb), '{conceptMappings}', '[]'::jsonb) +WHERE json IS NULL OR json::jsonb->'conceptMappings' IS NULL; + diff --git a/bootstrap/sql/migrations/native/1.14.0/mysql/postDataMigrationSQLScript.sql b/bootstrap/sql/migrations/native/1.14.0/mysql/postDataMigrationSQLScript.sql deleted file mode 100644 index 0a95477d29b9..000000000000 --- a/bootstrap/sql/migrations/native/1.14.0/mysql/postDataMigrationSQLScript.sql +++ /dev/null @@ -1,29 +0,0 @@ --- Migrate existing glossary term RELATED_TO relationships to include relationType --- For backward compatibility, existing relations without a relationType are set to "relatedTo" - -UPDATE entity_relationship -SET json = JSON_SET(COALESCE(json, '{}'), '$.relationType', 'relatedTo') -WHERE fromEntity = 'glossaryTerm' - AND toEntity = 'glossaryTerm' - AND relation = 15 - AND (json IS NULL OR JSON_EXTRACT(json, '$.relationType') IS NULL); - --- Insert default glossary term relation settings if they don't exist --- This preserves any existing user customizations -INSERT INTO openmetadata_settings (configType, json) -SELECT 'glossaryTermRelationSettings', '{"relationTypes":[{"name":"relatedTo","displayName":"Related To","description":"General association between terms that are conceptually connected.","rdfPredicate":"https://open-metadata.org/ontology/relatedTo","isSymmetric":true,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"associative","isSystemDefined":true,"color":"#1570ef"},{"name":"synonym","displayName":"Synonym","description":"Terms that have the same meaning and can be used interchangeably.","rdfPredicate":"http://www.w3.org/2004/02/skos/core#exactMatch","isSymmetric":true,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"equivalence","isSystemDefined":true,"color":"#b42318"},{"name":"antonym","displayName":"Antonym","description":"Terms that have opposite meanings.","rdfPredicate":"https://open-metadata.org/ontology/antonym","isSymmetric":true,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"associative","isSystemDefined":true,"color":"#b54708"},{"name":"broader","displayName":"Broader","description":"A more general term (hypernym).","inverseRelation":"narrower","rdfPredicate":"http://www.w3.org/2004/02/skos/core#broader","isSymmetric":false,"isTransitive":true,"isCrossGlossaryAllowed":true,"category":"hierarchical","isSystemDefined":true,"color":"#067647"},{"name":"narrower","displayName":"Narrower","description":"A more specific term (hyponym).","inverseRelation":"broader","rdfPredicate":"http://www.w3.org/2004/02/skos/core#narrower","isSymmetric":false,"isTransitive":true,"isCrossGlossaryAllowed":true,"category":"hierarchical","isSystemDefined":true,"color":"#4e5ba6"},{"name":"partOf","displayName":"Part Of","description":"This term is a part or component of another term.","inverseRelation":"hasPart","rdfPredicate":"https://open-metadata.org/ontology/partOf","isSymmetric":false,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"hierarchical","isSystemDefined":true,"color":"#026aa2"},{"name":"hasPart","displayName":"Has Part","description":"This term has the other term as a part or component.","inverseRelation":"partOf","rdfPredicate":"https://open-metadata.org/ontology/hasPart","isSymmetric":false,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"hierarchical","isSystemDefined":true,"color":"#155eef"},{"name":"calculatedFrom","displayName":"Calculated From","description":"This term/metric is calculated or derived from another term.","inverseRelation":"usedToCalculate","rdfPredicate":"https://open-metadata.org/ontology/calculatedFrom","isSymmetric":false,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"associative","isSystemDefined":true,"color":"#6938ef"},{"name":"usedToCalculate","displayName":"Used To Calculate","description":"This term is used in the calculation of another term.","inverseRelation":"calculatedFrom","rdfPredicate":"https://open-metadata.org/ontology/usedToCalculate","isSymmetric":false,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"associative","isSystemDefined":true,"color":"#ba24d5"},{"name":"seeAlso","displayName":"See Also","description":"Related term that may provide additional context.","rdfPredicate":"http://www.w3.org/2000/01/rdf-schema#seeAlso","isSymmetric":true,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"associative","isSystemDefined":true,"color":"#c11574"}]}' -WHERE NOT EXISTS ( - SELECT 1 FROM openmetadata_settings WHERE configType = 'glossaryTermRelationSettings' -); - --- Strip stale relatedTerms from glossary term entity JSON. --- relatedTerms is now loaded from entity_relationship table, not from entity JSON. --- Old data stored relatedTerms as EntityReference objects which fail to deserialize as TermRelation. -UPDATE glossary_term_entity -SET json = JSON_REMOVE(json, '$.relatedTerms') -WHERE JSON_EXTRACT(json, '$.relatedTerms') IS NOT NULL; - --- Backfill conceptMappings for existing glossary terms -UPDATE glossary_term_entity -SET json = JSON_SET(COALESCE(json, '{}'), '$.conceptMappings', JSON_ARRAY()) -WHERE JSON_EXTRACT(json, '$.conceptMappings') IS NULL; diff --git a/bootstrap/sql/migrations/native/1.14.0/postgres/postDataMigrationSQLScript.sql b/bootstrap/sql/migrations/native/1.14.0/postgres/postDataMigrationSQLScript.sql deleted file mode 100644 index 217566fe0565..000000000000 --- a/bootstrap/sql/migrations/native/1.14.0/postgres/postDataMigrationSQLScript.sql +++ /dev/null @@ -1,29 +0,0 @@ --- Migrate existing glossary term RELATED_TO relationships to include relationType --- For backward compatibility, existing relations without a relationType are set to "relatedTo" - -UPDATE entity_relationship -SET json = jsonb_set(COALESCE(json::jsonb, '{}'::jsonb), '{relationType}', '"relatedTo"') -WHERE fromentity = 'glossaryTerm' - AND toentity = 'glossaryTerm' - AND relation = 15 - AND (json IS NULL OR json::jsonb->>'relationType' IS NULL); - --- Insert default glossary term relation settings if they don't exist --- This preserves any existing user customizations -INSERT INTO openmetadata_settings (configtype, json) -SELECT 'glossaryTermRelationSettings', '{"relationTypes":[{"name":"relatedTo","displayName":"Related To","description":"General association between terms that are conceptually connected.","rdfPredicate":"https://open-metadata.org/ontology/relatedTo","isSymmetric":true,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"associative","isSystemDefined":true,"color":"#1570ef"},{"name":"synonym","displayName":"Synonym","description":"Terms that have the same meaning and can be used interchangeably.","rdfPredicate":"http://www.w3.org/2004/02/skos/core#exactMatch","isSymmetric":true,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"equivalence","isSystemDefined":true,"color":"#b42318"},{"name":"antonym","displayName":"Antonym","description":"Terms that have opposite meanings.","rdfPredicate":"https://open-metadata.org/ontology/antonym","isSymmetric":true,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"associative","isSystemDefined":true,"color":"#b54708"},{"name":"broader","displayName":"Broader","description":"A more general term (hypernym).","inverseRelation":"narrower","rdfPredicate":"http://www.w3.org/2004/02/skos/core#broader","isSymmetric":false,"isTransitive":true,"isCrossGlossaryAllowed":true,"category":"hierarchical","isSystemDefined":true,"color":"#067647"},{"name":"narrower","displayName":"Narrower","description":"A more specific term (hyponym).","inverseRelation":"broader","rdfPredicate":"http://www.w3.org/2004/02/skos/core#narrower","isSymmetric":false,"isTransitive":true,"isCrossGlossaryAllowed":true,"category":"hierarchical","isSystemDefined":true,"color":"#4e5ba6"},{"name":"partOf","displayName":"Part Of","description":"This term is a part or component of another term.","inverseRelation":"hasPart","rdfPredicate":"https://open-metadata.org/ontology/partOf","isSymmetric":false,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"hierarchical","isSystemDefined":true,"color":"#026aa2"},{"name":"hasPart","displayName":"Has Part","description":"This term has the other term as a part or component.","inverseRelation":"partOf","rdfPredicate":"https://open-metadata.org/ontology/hasPart","isSymmetric":false,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"hierarchical","isSystemDefined":true,"color":"#155eef"},{"name":"calculatedFrom","displayName":"Calculated From","description":"This term/metric is calculated or derived from another term.","inverseRelation":"usedToCalculate","rdfPredicate":"https://open-metadata.org/ontology/calculatedFrom","isSymmetric":false,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"associative","isSystemDefined":true,"color":"#6938ef"},{"name":"usedToCalculate","displayName":"Used To Calculate","description":"This term is used in the calculation of another term.","inverseRelation":"calculatedFrom","rdfPredicate":"https://open-metadata.org/ontology/usedToCalculate","isSymmetric":false,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"associative","isSystemDefined":true,"color":"#ba24d5"},{"name":"seeAlso","displayName":"See Also","description":"Related term that may provide additional context.","rdfPredicate":"http://www.w3.org/2000/01/rdf-schema#seeAlso","isSymmetric":true,"isTransitive":false,"isCrossGlossaryAllowed":true,"category":"associative","isSystemDefined":true,"color":"#c11574"}]}'::jsonb -WHERE NOT EXISTS ( - SELECT 1 FROM openmetadata_settings WHERE configtype = 'glossaryTermRelationSettings' -); - --- Strip stale relatedTerms from glossary term entity JSON. --- relatedTerms is now loaded from entity_relationship table, not from entity JSON. --- Old data stored relatedTerms as EntityReference objects which fail to deserialize as TermRelation. -UPDATE glossary_term_entity -SET json = (json::jsonb - 'relatedTerms')::json -WHERE jsonb_exists(json::jsonb, 'relatedTerms'); - --- Backfill conceptMappings for existing glossary terms -UPDATE glossary_term_entity -SET json = jsonb_set(COALESCE(json::jsonb, '{}'::jsonb), '{conceptMappings}', '[]'::jsonb) -WHERE json IS NULL OR json::jsonb->'conceptMappings' IS NULL;