in repository/src/main/java/org/apache/atlas/query/executors/GremlinClauseToTraversalTranslator.java [99:257]
private AtlasGraphTraversal traverse(AtlasGraphTraversal traversal, Stack<List<AtlasGraphTraversal>> trLists, GremlinQueryComposer.GremlinClauseValue clauseValue) {
GremlinClause clause = clauseValue.getClause();
String[] values = clauseValue.getValues();
switch (clause) {
case G:
break;
case V:
traversal = graph.V();
break;
case AS:
traversal.as(values[0]);
break;
case AND: {
if (trLists != null && !trLists.peek().isEmpty()) {
List<AtlasGraphTraversal> subTraversals = trLists.pop();
traversal.and(subTraversals.toArray(new Traversal[0]));
} else {
throw new RuntimeException("subTraversals not expected to be NULL: " + clause);
}
}
break;
case OR: {
if (trLists != null && !trLists.peek().isEmpty()) {
List<AtlasGraphTraversal> subTraversals = trLists.pop();
traversal.or(subTraversals.toArray(new Traversal[0]));
} else {
throw new RuntimeException("subTraversals not expected to be NULL: " + clause);
}
}
break;
case HAS_PROPERTY:
traversal.has(values[0]);
break;
case HAS_NOT_PROPERTY:
traversal.hasNot(values[0]);
break;
case HAS_OPERATOR:
P<?> predicate = getPredicate(values[1], values[2], clauseValue.getRawValue());
traversal.has(values[0], predicate);
break;
case HAS_NOT_OPERATOR:
traversal.or(traversal.startAnonymousTraversal().has(values[0], P.neq(values[1])), traversal.startAnonymousTraversal().hasNot(values[0]));
break;
case HAS_TYPE:
traversal.has(Constants.TYPE_NAME_PROPERTY_KEY, values[0]);
break;
case HAS_WITHIN:
traversal.has(values[0], values[1]);
break;
case IN:
traversal.in(removeRedundantQuotes(values[0]));
break;
case OUT:
traversal.out(removeRedundantQuotes(values[0]));
break;
case ANY_TRAIT:
traversal.or(traversal.startAnonymousTraversal().has(EDGE_NAME_TRAIT_NAMES), traversal.startAnonymousTraversal().has(EDGE_NAME_PROPAGATED_TRAIT_NAMES));
break;
case TRAIT:
traversal.outE(EDGE_NAME_CLASSIFIED_AS).has(ATTR_PROPERTY_NAME, P.within(values[0])).outV();
break;
case NO_TRAIT:
traversal.and(traversal.startAnonymousTraversal().hasNot(EDGE_NAME_TRAIT_NAMES), traversal.startAnonymousTraversal().hasNot(EDGE_NAME_PROPAGATED_TRAIT_NAMES));
break;
case DEDUP:
traversal.dedup();
break;
case LIMIT:
traversal.limit(Scope.global, Long.parseLong(values[0]));
break;
case TO_LIST:
traversal.getAtlasVertexList();
break;
case NESTED_START:
traversal = traversal.startAnonymousTraversal();
trLists.peek().add(traversal);
break;
case HAS_TYPE_WITHIN:
String[] subTypes = StringUtils.split(removeRedundantQuotes(values[0]), ',');
traversal.has("__typeName", P.within(subTypes));
break;
case GROUP_BY:
traversal.has(values[0]).group().by(values[0]);
break;
case ORDER_BY:
traversal.has(values[0]).order().by(values[0]);
break;
case ORDER_BY_DESC:
traversal.has(values[0]).order().by(values[0], Order.desc);
break;
case STRING_CONTAINS:
traversal.textRegEx(values[0], removeRedundantQuotes(values[1]));
break;
case TEXT_CONTAINS:
traversal.textContainsRegEx(values[0], removeRedundantQuotes(values[1]));
break;
case RANGE:
traversal.dedup();
long low = Long.parseLong(values[1]);
long high = low + Long.parseLong(values[2]);
traversal.range(Scope.global, low, high);
break;
case SELECT_FN:
case SELECT_NOOP_FN:
case SELECT_ONLY_AGG_GRP_FN:
case INLINE_TRANSFORM_CALL:
case SELECT_MULTI_ATTR_GRP_FN:
break;
case TERM:
String term = String.format("AtlasGlossaryTerm.%s", values[0]);
traversal.where(traversal.startAnonymousTraversal()
.in(org.apache.atlas.repository.Constants.TERM_ASSIGNMENT_LABEL)
.has(term, P.eq(values[1])));
break;
default:
LOG.warn("Clause not translated: {}. Can potentially lead to incorrect results.", clause);
break;
}
return traversal;
}