use of com.apple.foundationdb.record.query.plan.temp.explain.PlannerGraph.Edge in project fdb-record-layer by FoundationDB.
the class PlannerGraphProperty method exportToDot.
/**
* Creates a serialized format of this graph as a dot-compatible definition.
* @param plannerGraph the planner graph we should export to dot
* @param queryPlannerNodes set of nodes which is a subset of nodes of {@code plannerGraph} which represents the
* actual query graph
* @param clusteringFunction function to partition the planner graph into clusters. Clusters are not isolated
* sub-graphs in this context. It is possible and often desirable for a use case to define edges between
* nodes of clusters. Clusters are used by the dot exporter to
* <ul>
* <li>assign common attributes to all nodes and edges, e.g. like a common gray background</li>
* <li>assign a name that is displayed displayed</li>
* <li>cause the layout algorithm to pack the nodes in a cluster if they were one big node</li>
* </ul>
* @return the graph as string in dot format.
*/
@Nonnull
public static String exportToDot(@Nonnull final AbstractPlannerGraph<Node, Edge> plannerGraph, @Nonnull final Set<Node> queryPlannerNodes, @Nonnull final Function<GraphExporter.ClusterProvider<Node, Edge>, Collection<Cluster<Node, Edge>>> clusteringFunction) {
final GraphExporter<Node, Edge> exporter = new DotExporter<>(new CountingIdProvider<>(), Node::getAttributes, Edge::getAttributes, ImmutableMap.of("fontname", Attribute.dot("courier"), "rankdir", Attribute.dot("BT"), "splines", Attribute.dot("false")), (network, nodes) -> {
final ImmutableList.Builder<Cluster<Node, Edge>> clusterBuilder = ImmutableList.builder();
clusterBuilder.addAll(clustersForGroups(plannerGraph.getNetwork(), queryPlannerNodes));
clusterBuilder.addAll(clusteringFunction.apply(PlannerGraphProperty::clustersForGroups));
return clusterBuilder.build();
});
// export as string
final Writer writer = new StringWriter();
exporter.exportGraph(plannerGraph.getNetwork(), writer);
return writer.toString();
}
use of com.apple.foundationdb.record.query.plan.temp.explain.PlannerGraph.Edge in project fdb-record-layer by FoundationDB.
the class PlannerGraphProperty method exportToGml.
/**
* Creates a serialized format of this graph as a gml-compatible definition.
* @param plannerGraph the planner graph to be exported
* @param additionalInfoMap a map used to generate names and descriptions for operators.
* @return the graph as string in gml format.
*/
@Nonnull
public static String exportToGml(@Nonnull final PlannerGraph plannerGraph, @Nonnull final Map<String, Attribute> additionalInfoMap) {
// Synthesize the set of NodeWithInfo nodes that are in the plan.
final ImmutableSet<String> usedInfoIds = plannerGraph.getNetwork().nodes().stream().filter(n -> n instanceof PlannerGraph.WithInfoId).map(n -> (PlannerGraph.WithInfoId) n).map(PlannerGraph.WithInfoId::getInfoId).collect(ImmutableSet.toImmutableSet());
final ImmutableMap.Builder<String, Attribute> infoMapBuilder = ImmutableMap.builder();
infoMapBuilder.putAll(Maps.filterEntries(NodeInfo.getInfoAttributeMap(NodeInfo.getNodeInfos()), e -> usedInfoIds.contains(Objects.requireNonNull(e).getKey())));
infoMapBuilder.putAll(Maps.filterEntries(additionalInfoMap, e -> usedInfoIds.contains(Objects.requireNonNull(e).getKey())));
final ImmutableMap<String, Attribute> infoMap = infoMapBuilder.build();
final GraphExporter<Node, Edge> exporter = createGmlExporter(infoMap);
// export as string
final Writer writer = new StringWriter();
exporter.exportGraph(plannerGraph.getNetwork(), writer);
return writer.toString();
}
Aggregations