-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Move ontology/glossary relation migration from 1.14.0 back to 1.13.0 #27431
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
97a57f0
dbbb338
fff5bfd
c260755
051eccc
e2e7f57
9fd80a6
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -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'; | ||||||||||
| 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; | ||||||||||
|
||||||||||
| WHERE json IS NULL OR json::jsonb->'conceptMappings' IS NULL; | |
| WHERE json IS NULL | |
| OR json::jsonb->'conceptMappings' IS NULL | |
| OR jsonb_typeof(json::jsonb->'conceptMappings') = 'null'; |
This file was deleted.
This file was deleted.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In MySQL,
WHERE JSON_EXTRACT(json, '$.relatedTerms') IS NOT NULLwill not match rows whererelatedTermsexists but is JSONnull, so the key won’t be removed (unlike the Postgres migration, which removes the key whenever it exists). To reliably strip the field whenever present, use a key-existence predicate (e.g.,JSON_CONTAINS_PATH(json, 'one', '$.relatedTerms')) rather than checking the extracted value for NULL.