私の目標は、graphql Javaドキュメントオブジェクトをトラバースし、最大深さを返すことです。どのように私は再帰的にJavaのgraphqlドキュメントをトラバースし、到達する最も深いレベルを見つける
例:深さ0
{
name
}
例:深さ1
{
viewer{
viewerId
}
}
例:深さ2
{
viewer{
albums{
albumId
}
}
}
例:あなたは、両方のアルバム/曲を見ることができるように深さ2同じ親のビューアの下にある
{
viewer{
albums{
albumId
}
songs{
songId
}
}
}
例:深さ3
{
viewer{
albums{
tracks{
trackId
}
}
}
}
が、私はそれを横断するベースコードを書かれているが、私のコードは、それは深さ= 3の代わりに、2返し深さ= 2の第二版では動作しません。なぜなら、それは同じ親の下で2回カウントしているからです。本質的には、フィールドに子がある場合は常にdepth = depth + 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);
私はこだわっていますし、再帰の深い知識を持つ誰かが私を助けることができるかどう非常に感謝します。
完璧な回答!魅力のように動作します。Robert、再帰関数を呼び出すときに、どのようにコードを変更して現在の深度を渡すことができますか?他のチケットのスコアの複雑さをどのように計算するかを知るために、フィールドの時に現在の深さを知りたい。 – user1172490