Repository: atlas Updated Branches: refs/heads/master a2c26bfc2 -> 9d4678e41
ATLAS-2777: Enhance advanced search (DSL) to support classification search on _CLASSIFIED or _NOT_CLASSIFIED keyword Project: http://git-wip-us.apache.org/repos/asf/atlas/repo Commit: http://git-wip-us.apache.org/repos/asf/atlas/commit/9d4678e4 Tree: http://git-wip-us.apache.org/repos/asf/atlas/tree/9d4678e4 Diff: http://git-wip-us.apache.org/repos/asf/atlas/diff/9d4678e4 Branch: refs/heads/master Commit: 9d4678e41502c23abb3ad1d5e2cd0c9760679034 Parents: a2c26bf Author: Sarath Subramanian <[email protected]> Authored: Thu Jul 5 09:35:19 2018 -0700 Committer: Sarath Subramanian <[email protected]> Committed: Thu Jul 5 09:35:19 2018 -0700 ---------------------------------------------------------------------- .../org/apache/atlas/query/GremlinClause.java | 2 ++ .../atlas/query/GremlinQueryComposer.java | 24 ++++++++++++++++-- .../apache/atlas/query/RegistryBasedLookup.java | 26 ++++++++++++++++++-- 3 files changed, 48 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/atlas/blob/9d4678e4/repository/src/main/java/org/apache/atlas/query/GremlinClause.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/query/GremlinClause.java b/repository/src/main/java/org/apache/atlas/query/GremlinClause.java index 454b343..ca8419a 100644 --- a/repository/src/main/java/org/apache/atlas/query/GremlinClause.java +++ b/repository/src/main/java/org/apache/atlas/query/GremlinClause.java @@ -47,6 +47,8 @@ enum GremlinClause { TEXT_PREFIX("has('%s', org.janusgraph.core.attribute.Text.textPrefix(%s))"), TEXT_SUFFIX("has('%s', org.janusgraph.core.attribute.Text.textRegex(\".*\" + %s))"), TRAIT("outE('classifiedAs').has('__name', within('%s')).outV()"), + ANY_TRAIT("or(has('__traitNames'), has('__propagatedTraitNames'))"), + NO_TRAIT("and(hasNot('__traitNames'), hasNot('__propagatedTraitNames'))"), SELECT_NOOP_FN("def f(r){ r }; "), SELECT_FN("def f(r){ t=[[%s]]; %s r.each({t.add([%s])}); t.unique(); }; "), SELECT_ONLY_AGG_FN("def f(r){ t=[[%s]]; %s t.add([%s]); t;}; "), http://git-wip-us.apache.org/repos/asf/atlas/blob/9d4678e4/repository/src/main/java/org/apache/atlas/query/GremlinQueryComposer.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/query/GremlinQueryComposer.java b/repository/src/main/java/org/apache/atlas/query/GremlinQueryComposer.java index 9ad9a6e..17c837b 100644 --- a/repository/src/main/java/org/apache/atlas/query/GremlinQueryComposer.java +++ b/repository/src/main/java/org/apache/atlas/query/GremlinQueryComposer.java @@ -46,6 +46,9 @@ import java.util.TimeZone; import java.util.stream.Collectors; import java.util.stream.Stream; +import static org.apache.atlas.model.discovery.SearchParameters.ALL_CLASSIFICATIONS; +import static org.apache.atlas.model.discovery.SearchParameters.NO_CLASSIFICATIONS; + public class GremlinQueryComposer { private static final Logger LOG = LoggerFactory.getLogger(GremlinQueryComposer.class); private static final String ISO8601_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; @@ -112,7 +115,15 @@ public class GremlinQueryComposer { IdentifierHelper.Info ia = createInfo(typeInfo.get()); if (ia.isTrait()) { - addTrait(GremlinClause.TRAIT, ia); + String traitName = ia.get(); + + if (traitName.equalsIgnoreCase(ALL_CLASSIFICATIONS)) { + addTrait(GremlinClause.ANY_TRAIT, ia); + } else if (traitName.equalsIgnoreCase(NO_CLASSIFICATIONS)) { + addTrait(GremlinClause.NO_TRAIT, ia); + } else { + addTrait(GremlinClause.TRAIT, ia); + } } else { if (ia.hasSubtypes()) { add(GremlinClause.HAS_TYPE_WITHIN, ia.getSubTypes()); @@ -144,7 +155,14 @@ public class GremlinQueryComposer { } IdentifierHelper.Info traitInfo = createInfo(traitName); - addTrait(GremlinClause.TRAIT, traitInfo); + + if (StringUtils.equals(traitName, ALL_CLASSIFICATIONS)) { + addTrait(GremlinClause.ANY_TRAIT, traitInfo); + } else if (StringUtils.equals(traitName, NO_CLASSIFICATIONS)) { + addTrait(GremlinClause.NO_TRAIT, traitInfo); + } else { + addTrait(GremlinClause.TRAIT, traitInfo); + } } public void addWhere(String lhs, String operator, String rhs) { @@ -739,6 +757,8 @@ public class GremlinQueryComposer { public boolean isValid(Context ctx, GremlinClause clause, IdentifierHelper.Info ia) { switch (clause) { case TRAIT: + case ANY_TRAIT: + case NO_TRAIT: return check(ia.isTrait(), AtlasErrorCode.INVALID_DSL_UNKNOWN_CLASSIFICATION, ia.getRaw()); case HAS_TYPE: http://git-wip-us.apache.org/repos/asf/atlas/blob/9d4678e4/repository/src/main/java/org/apache/atlas/query/RegistryBasedLookup.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/query/RegistryBasedLookup.java b/repository/src/main/java/org/apache/atlas/query/RegistryBasedLookup.java index 808eab8..e0fb4d8 100644 --- a/repository/src/main/java/org/apache/atlas/query/RegistryBasedLookup.java +++ b/repository/src/main/java/org/apache/atlas/query/RegistryBasedLookup.java @@ -27,6 +27,11 @@ import org.apache.commons.lang.StringUtils; import java.util.*; +import static org.apache.atlas.discovery.SearchContext.MATCH_ALL_CLASSIFIED; +import static org.apache.atlas.discovery.SearchContext.MATCH_ALL_NOT_CLASSIFIED; +import static org.apache.atlas.model.discovery.SearchParameters.ALL_CLASSIFICATIONS; +import static org.apache.atlas.model.discovery.SearchParameters.NO_CLASSIFICATIONS; + class RegistryBasedLookup implements Lookup { private static final Set<String> SYSTEM_ATTRIBUTES = new HashSet<>( Arrays.asList(Constants.GUID_PROPERTY_KEY, @@ -56,7 +61,17 @@ class RegistryBasedLookup implements Lookup { @Override public AtlasType getType(String typeName) throws AtlasBaseException { - return typeRegistry.getType(typeName); + AtlasType ret; + + if (typeName.equalsIgnoreCase(ALL_CLASSIFICATIONS)) { + ret = MATCH_ALL_CLASSIFIED; + } else if (typeName.equalsIgnoreCase(NO_CLASSIFICATIONS)) { + ret = MATCH_ALL_NOT_CLASSIFIED; + } else { + ret = typeRegistry.getType(typeName); + } + + return ret; } @Override @@ -156,7 +171,14 @@ class RegistryBasedLookup implements Lookup { public boolean isTraitType(String typeName) { AtlasType t = null; try { - t = typeRegistry.getType(typeName); + if (typeName.equalsIgnoreCase(ALL_CLASSIFICATIONS)) { + t = MATCH_ALL_CLASSIFIED; + } else if (typeName.equalsIgnoreCase(NO_CLASSIFICATIONS)) { + t = MATCH_ALL_NOT_CLASSIFIED; + } else { + t = typeRegistry.getType(typeName); + } + } catch (AtlasBaseException e) { return false; }
