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 {
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;}; "),
......
......@@ -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:
......
......@@ -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;
}
......
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