public NodeMultiZipper<T> withNewZipper(NodeZipper<T> newZipper) { List<NodeZipper<T>> newZippers = getZippers(); newZippers.add(newZipper); return new NodeMultiZipper<>(commonRoot, newZippers, this.nodeAdapter); }
private CompletableFuture<NodeMultiZipper<ExecutionResultNode>> nextStep(ExecutionContext executionContext, NodeMultiZipper<ExecutionResultNode> multizipper) { NodeMultiZipper<ExecutionResultNode> nextUnresolvedNodes = ResultNodesUtil.getUnresolvedNodes(multizipper.toRootNode()); if (nextUnresolvedNodes.getZippers().size() == 0) { return completedFuture(nextUnresolvedNodes); } List<NodeMultiZipper<ExecutionResultNode>> groups = groupNodesIntoBatches(nextUnresolvedNodes); return resolveNodes(executionContext, groups).thenCompose(next -> nextStep(executionContext, next)); }
private CompletableFuture<NodeMultiZipper<ExecutionResultNode>> resolveNodes(ExecutionContext executionContext, List<NodeMultiZipper<ExecutionResultNode>> unresolvedNodes) { assertNotEmpty(unresolvedNodes, "unresolvedNodes can't be empty"); ExecutionResultNode commonRoot = unresolvedNodes.get(0).getCommonRoot(); CompletableFuture<List<List<NodeZipper<ExecutionResultNode>>>> listListCF = Async.flatMap(unresolvedNodes, executionResultMultiZipper -> fetchAndAnalyze(executionContext, executionResultMultiZipper.getZippers())); return flatList(listListCF).thenApply(zippers -> new NodeMultiZipper<ExecutionResultNode>(commonRoot, zippers, RESULT_NODE_ADAPTER)); }
private CompletableFuture<NamedResultNode> resolveAllChildNodes(ExecutionContext context, NamedResultNode namedResultNode) { NodeMultiZipper<ExecutionResultNode> unresolvedNodes = ResultNodesUtil.getUnresolvedNodes(namedResultNode.getNode()); List<CompletableFuture<NodeZipper<ExecutionResultNode>>> resolvedNodes = map(unresolvedNodes.getZippers(), unresolvedNode -> resolveNode(context, unresolvedNode)); return resolvedNodesToResultNode(namedResultNode, unresolvedNodes, resolvedNodes); }
private List<NodeMultiZipper<ExecutionResultNode>> groupNodesIntoBatches(NodeMultiZipper<ExecutionResultNode> unresolvedZipper) { Map<MergedField, List<NodeZipper<ExecutionResultNode>>> zipperBySubSelection = FpKit.groupingBy(unresolvedZipper.getZippers(), (executionResultZipper -> executionResultZipper.getCurNode().getMergedField())); return mapEntries(zipperBySubSelection, (key, value) -> new NodeMultiZipper<ExecutionResultNode>(unresolvedZipper.getCommonRoot(), value, RESULT_NODE_ADAPTER)); }
public NodeMultiZipper<T> withNewZipper(NodeZipper<T> newZipper) { List<NodeZipper<T>> newZippers = getZippers(); newZippers.add(newZipper); return new NodeMultiZipper<>(commonRoot, newZippers, this.nodeAdapter); }
private CompletableFuture<NodeMultiZipper<ExecutionResultNode>> nextStep(ExecutionContext executionContext, NodeMultiZipper<ExecutionResultNode> multizipper) { NodeMultiZipper<ExecutionResultNode> nextUnresolvedNodes = ResultNodesUtil.getUnresolvedNodes(multizipper.toRootNode()); if (nextUnresolvedNodes.getZippers().size() == 0) { return completedFuture(nextUnresolvedNodes); } List<NodeMultiZipper<ExecutionResultNode>> groups = groupNodesIntoBatches(nextUnresolvedNodes); return resolveNodes(executionContext, groups).thenCompose(next -> nextStep(executionContext, next)); }
private CompletableFuture<NodeMultiZipper<ExecutionResultNode>> resolveNodes(ExecutionContext executionContext, List<NodeMultiZipper<ExecutionResultNode>> unresolvedNodes) { assertNotEmpty(unresolvedNodes, "unresolvedNodes can't be empty"); ExecutionResultNode commonRoot = unresolvedNodes.get(0).getCommonRoot(); CompletableFuture<List<List<NodeZipper<ExecutionResultNode>>>> listListCF = Async.flatMap(unresolvedNodes, executionResultMultiZipper -> fetchAndAnalyze(executionContext, executionResultMultiZipper.getZippers())); return flatList(listListCF).thenApply(zippers -> new NodeMultiZipper<ExecutionResultNode>(commonRoot, zippers, RESULT_NODE_ADAPTER)); }
private CompletableFuture<NamedResultNode> resolveAllChildNodes(ExecutionContext context, NamedResultNode namedResultNode) { NodeMultiZipper<ExecutionResultNode> unresolvedNodes = ResultNodesUtil.getUnresolvedNodes(namedResultNode.getNode()); List<CompletableFuture<NodeZipper<ExecutionResultNode>>> resolvedNodes = map(unresolvedNodes.getZippers(), unresolvedNode -> resolveNode(context, unresolvedNode)); return resolvedNodesToResultNode(namedResultNode, unresolvedNodes, resolvedNodes); }
private List<NodeMultiZipper<ExecutionResultNode>> groupNodesIntoBatches(NodeMultiZipper<ExecutionResultNode> unresolvedZipper) { Map<MergedField, List<NodeZipper<ExecutionResultNode>>> zipperBySubSelection = FpKit.groupingBy(unresolvedZipper.getZippers(), (executionResultZipper -> executionResultZipper.getCurNode().getMergedField())); return mapEntries(zipperBySubSelection, (key, value) -> new NodeMultiZipper<ExecutionResultNode>(unresolvedZipper.getCommonRoot(), value, RESULT_NODE_ADAPTER)); }