Search in sources :

Example 1 with Edge

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();
}
Also used : StringWriter(java.io.StringWriter) ImmutableList(com.google.common.collect.ImmutableList) Node(com.apple.foundationdb.record.query.plan.temp.explain.PlannerGraph.Node) Cluster(com.apple.foundationdb.record.query.plan.temp.explain.GraphExporter.Cluster) PartialMatchEdge(com.apple.foundationdb.record.query.plan.temp.explain.PlannerGraph.PartialMatchEdge) Edge(com.apple.foundationdb.record.query.plan.temp.explain.PlannerGraph.Edge) PrintWriter(java.io.PrintWriter) StringWriter(java.io.StringWriter) Writer(java.io.Writer) Nonnull(javax.annotation.Nonnull)

Example 2 with Edge

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();
}
Also used : ExpressionRefTraversal(com.apple.foundationdb.record.query.plan.temp.ExpressionRefTraversal) PartialMatchEdge(com.apple.foundationdb.record.query.plan.temp.explain.PlannerGraph.PartialMatchEdge) Iterables(com.google.common.collect.Iterables) GroupExpressionRef(com.apple.foundationdb.record.query.plan.temp.GroupExpressionRef) RecordQueryPlan(com.apple.foundationdb.record.query.plan.plans.RecordQueryPlan) ComponentIdProvider(com.apple.foundationdb.record.query.plan.temp.explain.GraphExporter.ComponentIdProvider) Function(java.util.function.Function) PlannerProperty(com.apple.foundationdb.record.query.plan.temp.PlannerProperty) PartialMatch(com.apple.foundationdb.record.query.plan.temp.PartialMatch) ImmutableList(com.google.common.collect.ImmutableList) CharStreams(com.google.common.io.CharStreams) Map(java.util.Map) ImmutableNetwork(com.google.common.graph.ImmutableNetwork) MatchCandidate(com.apple.foundationdb.record.query.plan.temp.MatchCandidate) URI(java.net.URI) ExpressionRef(com.apple.foundationdb.record.query.plan.temp.ExpressionRef) Network(com.google.common.graph.Network) Edge(com.apple.foundationdb.record.query.plan.temp.explain.PlannerGraph.Edge) Nonnull(javax.annotation.Nonnull) Nullable(javax.annotation.Nullable) PrintWriter(java.io.PrintWriter) Desktop(java.awt.Desktop) Verify(com.google.common.base.Verify) ImmutableSet(com.google.common.collect.ImmutableSet) Cluster(com.apple.foundationdb.record.query.plan.temp.explain.GraphExporter.Cluster) ImmutableMap(com.google.common.collect.ImmutableMap) Node(com.apple.foundationdb.record.query.plan.temp.explain.PlannerGraph.Node) StringWriter(java.io.StringWriter) Collection(java.util.Collection) Debugger(com.apple.foundationdb.record.query.plan.temp.debug.Debugger) Throwables(com.google.common.base.Throwables) Set(java.util.Set) Maps(com.google.common.collect.Maps) InputStreamReader(java.io.InputStreamReader) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) File(java.io.File) StandardCharsets(java.nio.charset.StandardCharsets) RelationalExpression(com.apple.foundationdb.record.query.plan.temp.RelationalExpression) Objects(java.util.Objects) List(java.util.List) Writer(java.io.Writer) Optional(java.util.Optional) Preconditions(com.google.common.base.Preconditions) InputStream(java.io.InputStream) Node(com.apple.foundationdb.record.query.plan.temp.explain.PlannerGraph.Node) ImmutableMap(com.google.common.collect.ImmutableMap) StringWriter(java.io.StringWriter) PartialMatchEdge(com.apple.foundationdb.record.query.plan.temp.explain.PlannerGraph.PartialMatchEdge) Edge(com.apple.foundationdb.record.query.plan.temp.explain.PlannerGraph.Edge) PrintWriter(java.io.PrintWriter) StringWriter(java.io.StringWriter) Writer(java.io.Writer) Nonnull(javax.annotation.Nonnull)

Aggregations

Cluster (com.apple.foundationdb.record.query.plan.temp.explain.GraphExporter.Cluster)2 Edge (com.apple.foundationdb.record.query.plan.temp.explain.PlannerGraph.Edge)2 Node (com.apple.foundationdb.record.query.plan.temp.explain.PlannerGraph.Node)2 PartialMatchEdge (com.apple.foundationdb.record.query.plan.temp.explain.PlannerGraph.PartialMatchEdge)2 ImmutableList (com.google.common.collect.ImmutableList)2 PrintWriter (java.io.PrintWriter)2 StringWriter (java.io.StringWriter)2 Writer (java.io.Writer)2 Nonnull (javax.annotation.Nonnull)2 RecordQueryPlan (com.apple.foundationdb.record.query.plan.plans.RecordQueryPlan)1 ExpressionRef (com.apple.foundationdb.record.query.plan.temp.ExpressionRef)1 ExpressionRefTraversal (com.apple.foundationdb.record.query.plan.temp.ExpressionRefTraversal)1 GroupExpressionRef (com.apple.foundationdb.record.query.plan.temp.GroupExpressionRef)1 MatchCandidate (com.apple.foundationdb.record.query.plan.temp.MatchCandidate)1 PartialMatch (com.apple.foundationdb.record.query.plan.temp.PartialMatch)1 PlannerProperty (com.apple.foundationdb.record.query.plan.temp.PlannerProperty)1 RelationalExpression (com.apple.foundationdb.record.query.plan.temp.RelationalExpression)1 Debugger (com.apple.foundationdb.record.query.plan.temp.debug.Debugger)1 ComponentIdProvider (com.apple.foundationdb.record.query.plan.temp.explain.GraphExporter.ComponentIdProvider)1 Preconditions (com.google.common.base.Preconditions)1