我的目标是遍历一个 graphql Java 文档对象并返回最大深度。
示例:深度 0
{
name
}
示例:深度 1
{
viewer{
viewerId
}
}
示例:深度 2
{
viewer{
albums{
albumId
}
}
}
示例:深度 2。如您所见,两张专辑/歌曲都在同一个父“查看者”下
{
viewer{
albums{
albumId
}
songs{
songId
}
}
}
示例:深度 3
{
viewer{
albums{
tracks{
trackId
}
}
}
}
我已经编写了基本代码来遍历它,但是我的代码不适用于深度 = 2 的第二个版本。它返回深度 = 3 而不是 2。原因是因为它在同一个父级下计数了两次。本质上的逻辑是这样的:当一个字段有孩子时,深度 = 深度 + 1。
import graphql.language.Document;
import graphql.language.Node;
import graphql.language.OperationDefinition;
public int checkDepthLimit(String query) {
Document document;
try {
document = documentParser.parseDocument(query);
} catch (Exception e) {}
Optional<Node> queryNode = document.getChildren().stream()
.filter(n -> (n.getClass() == OperationDefinition.class))
.findFirst();
return checkDepthLimit(queryNode.get());
}
private int checkDepthLimit(Node queryNode) {
int depth = 0;
String nodeType = queryNode.getClass().getSimpleName().toUpperCase();
if (nodeType.equals("FIELD")) {
if (!queryNode.getChildren().isEmpty()) {
depth += 1;
}
}
List<Node> nodeChildren = queryNode.getChildren();
for (int i = 0; i < nodeChildren.size(); i++) {
depth += checkDepthLimit(nodeChildren.get(i));
}
return depth;
}
String query = "{
viewer{
viewerId
}"
QueryComplexity c = new QueryComplexity();
int depth = c.checkDepthLimit(query);
我被困住了,如果有更深入的递归知识的人能够帮助我,我将不胜感激。