From df12f11efeb9f98f142929c7811cf04b54dfc327 Mon Sep 17 00:00:00 2001 From: Umesh Patil Date: Mon, 27 Jul 2026 19:20:11 +0530 Subject: [PATCH] ATLAS-5321 : Fix basic search by glossary termName after parent glossary update --- .../apache/atlas/discovery/SearchContext.java | 19 ++++++----- .../atlas/glossary/GlossaryService.java | 4 ++- .../atlas/repository/ogm/DataAccess.java | 34 +++++++++++++++++++ .../discovery/AtlasDiscoveryServiceTest.java | 22 ++++++++++++ 4 files changed, 69 insertions(+), 10 deletions(-) diff --git a/repository/src/main/java/org/apache/atlas/discovery/SearchContext.java b/repository/src/main/java/org/apache/atlas/discovery/SearchContext.java index c59a5c4408e..0bdd49ae35c 100644 --- a/repository/src/main/java/org/apache/atlas/discovery/SearchContext.java +++ b/repository/src/main/java/org/apache/atlas/discovery/SearchContext.java @@ -23,11 +23,9 @@ import org.apache.atlas.model.discovery.SearchParameters; import org.apache.atlas.model.instance.AtlasEntity; import org.apache.atlas.model.typedef.AtlasClassificationDef; -import org.apache.atlas.repository.Constants; import org.apache.atlas.repository.graph.GraphHelper; import org.apache.atlas.repository.graphdb.AtlasEdge; import org.apache.atlas.repository.graphdb.AtlasGraph; -import org.apache.atlas.repository.graphdb.AtlasGraphQuery; import org.apache.atlas.repository.graphdb.AtlasVertex; import org.apache.atlas.repository.store.graph.v2.AtlasGraphUtilsV2; import org.apache.atlas.repository.store.graph.v2.EntityGraphRetriever; @@ -48,7 +46,9 @@ import java.util.Base64; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -582,15 +582,16 @@ private AtlasVertex getGlossaryTermVertex(String termName) { AtlasVertex ret = null; if (StringUtils.isNotEmpty(termName)) { - AtlasEntityType termType = getTermEntityType(); - AtlasAttribute attrName = termType.getAttribute(TermSearchProcessor.ATLAS_GLOSSARY_TERM_ATTR_QNAME); - AtlasGraphQuery query = graph.query().has(Constants.ENTITY_TYPE_PROPERTY_KEY, termType.getTypeName()) - .has(attrName.getVertexPropertyName(), termName) - .has(Constants.STATE_PROPERTY_KEY, AtlasEntity.Status.ACTIVE.name()); + AtlasEntityType termType = getTermEntityType(); + Map uniqAttributes = new HashMap<>(); - Iterator results = query.vertices().iterator(); + uniqAttributes.put(TermSearchProcessor.ATLAS_GLOSSARY_TERM_ATTR_QNAME, termName); - ret = results.hasNext() ? results.next() : null; + ret = AtlasGraphUtilsV2.findByUniqueAttributes(graph, termType, uniqAttributes); + + if (ret != null && AtlasGraphUtilsV2.getState(ret) != AtlasEntity.Status.ACTIVE) { + ret = null; + } } return ret; diff --git a/repository/src/main/java/org/apache/atlas/glossary/GlossaryService.java b/repository/src/main/java/org/apache/atlas/glossary/GlossaryService.java index f28b9cb625a..bd43f73b371 100644 --- a/repository/src/main/java/org/apache/atlas/glossary/GlossaryService.java +++ b/repository/src/main/java/org/apache/atlas/glossary/GlossaryService.java @@ -311,8 +311,10 @@ public AtlasGlossary updateGlossary(AtlasGlossary atlasGlossary) throws AtlasBas if (!storeObject.equals(atlasGlossary)) { atlasGlossary.setGuid(storeObject.getGuid()); atlasGlossary.setQualifiedName(storeObject.getQualifiedName()); + atlasGlossary.setTerms(null); + atlasGlossary.setCategories(null); - storeObject = dataAccess.save(atlasGlossary); + storeObject = dataAccess.savePartial(atlasGlossary); setInfoForRelations(storeObject); } diff --git a/repository/src/main/java/org/apache/atlas/repository/ogm/DataAccess.java b/repository/src/main/java/org/apache/atlas/repository/ogm/DataAccess.java index a3be9c0e146..4d84ccf56ae 100644 --- a/repository/src/main/java/org/apache/atlas/repository/ogm/DataAccess.java +++ b/repository/src/main/java/org/apache/atlas/repository/ogm/DataAccess.java @@ -63,6 +63,12 @@ public T save(T obj) throws AtlasBaseException return this.load(obj); } + public T savePartial(T obj) throws AtlasBaseException { + savePartialNoLoad(obj); + + return this.load(obj); + } + public void saveNoLoad(T obj) throws AtlasBaseException { requireNonNull(obj, "Can't save a null object"); @@ -91,6 +97,34 @@ public void saveNoLoad(T obj) throws AtlasBaseE } } + public void savePartialNoLoad(T obj) throws AtlasBaseException { + requireNonNull(obj, "Can't save a null object"); + + AtlasPerfTracer perf = null; + + try { + if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) { + perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "DataAccess.savePartial()"); + } + + DataTransferObject dto = dtoRegistry.get((Class) obj.getClass()); + + AtlasEntityWithExtInfo entityWithExtInfo = dto.toEntityWithExtInfo(obj); + EntityMutationResponse entityMutationResponse = entityStore.createOrUpdate(new AtlasEntityStream(entityWithExtInfo), true); + + // Update GUID assignment for newly created entity + if (CollectionUtils.isNotEmpty(entityMutationResponse.getCreatedEntities())) { + String assignedGuid = entityMutationResponse.getGuidAssignments().get(obj.getGuid()); + + if (!obj.getGuid().equals(assignedGuid)) { + obj.setGuid(assignedGuid); + } + } + } finally { + AtlasPerfTracer.log(perf); + } + } + public Iterable save(Iterable obj) throws AtlasBaseException { requireNonNull(obj, "Can't save a null object"); diff --git a/repository/src/test/java/org/apache/atlas/discovery/AtlasDiscoveryServiceTest.java b/repository/src/test/java/org/apache/atlas/discovery/AtlasDiscoveryServiceTest.java index 9a324fa2298..7213a70799f 100644 --- a/repository/src/test/java/org/apache/atlas/discovery/AtlasDiscoveryServiceTest.java +++ b/repository/src/test/java/org/apache/atlas/discovery/AtlasDiscoveryServiceTest.java @@ -19,6 +19,7 @@ import org.apache.atlas.ApplicationProperties; import org.apache.atlas.AtlasClient; +import org.apache.atlas.AtlasErrorCode; import org.apache.atlas.BasicTestSetup; import org.apache.atlas.SortOrder; import org.apache.atlas.TestModules; @@ -29,6 +30,7 @@ import org.apache.atlas.model.discovery.QuickSearchParameters; import org.apache.atlas.model.discovery.RelationshipSearchParameters; import org.apache.atlas.model.discovery.SearchParameters; +import org.apache.atlas.model.glossary.AtlasGlossary; import org.apache.atlas.model.instance.AtlasClassification; import org.apache.atlas.model.instance.AtlasEntity; import org.apache.atlas.model.instance.AtlasEntityHeader; @@ -113,6 +115,26 @@ public void term() throws AtlasBaseException { assertSearchProcessorWithoutMarker(params, 10); } + @Test + public void termSearchAfterGlossaryUpdate() throws AtlasBaseException { + List glossaries = glossaryService.getGlossaries(100, 0, SortOrder.ASCENDING); + AtlasGlossary glossary = glossaries.stream() + .filter(g -> SALES_GLOSSARY.equals(g.getName())) + .findFirst() + .orElseThrow(() -> new AtlasBaseException(AtlasErrorCode.BAD_REQUEST, "Glossary not found: " + SALES_GLOSSARY)); + + SearchParameters params = new SearchParameters(); + + params.setTermName(SALES_TERM + "@" + SALES_GLOSSARY); + + assertSearchProcessorWithoutMarker(params, 10); + + glossary.setShortDescription("updated after glossary update"); + glossaryService.updateGlossary(glossary); + + assertSearchProcessorWithoutMarker(params, 10); + } + // TSP execute and CSP,ESP filter @Test public void termTag() throws AtlasBaseException {