Commit 9d4678e4 by Sarath Subramanian

ATLAS-2777: Enhance advanced search (DSL) to support classification search on…

ATLAS-2777: Enhance advanced search (DSL) to support classification search on _CLASSIFIED or _NOT_CLASSIFIED keyword
parent a2c26bfc
...@@ -47,6 +47,8 @@ enum GremlinClause { ...@@ -47,6 +47,8 @@ enum GremlinClause {
TEXT_PREFIX("has('%s', org.janusgraph.core.attribute.Text.textPrefix(%s))"), TEXT_PREFIX("has('%s', org.janusgraph.core.attribute.Text.textPrefix(%s))"),
TEXT_SUFFIX("has('%s', org.janusgraph.core.attribute.Text.textRegex(\".*\" + %s))"), TEXT_SUFFIX("has('%s', org.janusgraph.core.attribute.Text.textRegex(\".*\" + %s))"),
TRAIT("outE('classifiedAs').has('__name', within('%s')).outV()"), 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_NOOP_FN("def f(r){ r }; "),
SELECT_FN("def f(r){ t=[[%s]]; %s r.each({t.add([%s])}); t.unique(); }; "), 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;}; "), SELECT_ONLY_AGG_FN("def f(r){ t=[[%s]]; %s t.add([%s]); t;}; "),
......
...@@ -46,6 +46,9 @@ import java.util.TimeZone; ...@@ -46,6 +46,9 @@ import java.util.TimeZone;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; 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 { public class GremlinQueryComposer {
private static final Logger LOG = LoggerFactory.getLogger(GremlinQueryComposer.class); private static final Logger LOG = LoggerFactory.getLogger(GremlinQueryComposer.class);
private static final String ISO8601_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; private static final String ISO8601_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
...@@ -112,7 +115,15 @@ public class GremlinQueryComposer { ...@@ -112,7 +115,15 @@ public class GremlinQueryComposer {
IdentifierHelper.Info ia = createInfo(typeInfo.get()); IdentifierHelper.Info ia = createInfo(typeInfo.get());
if (ia.isTrait()) { 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 { } else {
if (ia.hasSubtypes()) { if (ia.hasSubtypes()) {
add(GremlinClause.HAS_TYPE_WITHIN, ia.getSubTypes()); add(GremlinClause.HAS_TYPE_WITHIN, ia.getSubTypes());
...@@ -144,7 +155,14 @@ public class GremlinQueryComposer { ...@@ -144,7 +155,14 @@ public class GremlinQueryComposer {
} }
IdentifierHelper.Info traitInfo = createInfo(traitName); 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) { public void addWhere(String lhs, String operator, String rhs) {
...@@ -739,6 +757,8 @@ public class GremlinQueryComposer { ...@@ -739,6 +757,8 @@ public class GremlinQueryComposer {
public boolean isValid(Context ctx, GremlinClause clause, IdentifierHelper.Info ia) { public boolean isValid(Context ctx, GremlinClause clause, IdentifierHelper.Info ia) {
switch (clause) { switch (clause) {
case TRAIT: case TRAIT:
case ANY_TRAIT:
case NO_TRAIT:
return check(ia.isTrait(), AtlasErrorCode.INVALID_DSL_UNKNOWN_CLASSIFICATION, ia.getRaw()); return check(ia.isTrait(), AtlasErrorCode.INVALID_DSL_UNKNOWN_CLASSIFICATION, ia.getRaw());
case HAS_TYPE: case HAS_TYPE:
......
...@@ -27,6 +27,11 @@ import org.apache.commons.lang.StringUtils; ...@@ -27,6 +27,11 @@ import org.apache.commons.lang.StringUtils;
import java.util.*; 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 { class RegistryBasedLookup implements Lookup {
private static final Set<String> SYSTEM_ATTRIBUTES = new HashSet<>( private static final Set<String> SYSTEM_ATTRIBUTES = new HashSet<>(
Arrays.asList(Constants.GUID_PROPERTY_KEY, Arrays.asList(Constants.GUID_PROPERTY_KEY,
...@@ -56,7 +61,17 @@ class RegistryBasedLookup implements Lookup { ...@@ -56,7 +61,17 @@ class RegistryBasedLookup implements Lookup {
@Override @Override
public AtlasType getType(String typeName) throws AtlasBaseException { 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 @Override
...@@ -156,7 +171,14 @@ class RegistryBasedLookup implements Lookup { ...@@ -156,7 +171,14 @@ class RegistryBasedLookup implements Lookup {
public boolean isTraitType(String typeName) { public boolean isTraitType(String typeName) {
AtlasType t = null; AtlasType t = null;
try { 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) { } catch (AtlasBaseException e) {
return false; return false;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment