PlanAssertions.java

package li.selman.persistencetest.plan;

import java.sql.Connection;
import li.selman.persistencetest.core.CapturedQuery;

/**
 * Entry point for execution-plan assertions.
 *
 * <pre>{@code
 * CapturedQuery lastSelect = assertThatQueries().lastSelect().capturedQuery(); // from query-assertions
 * assertThatPlanOf(connection, lastSelect).usesIndex();
 * }</pre>
 *
 * <p>Deliberately a separate entry point from {@code query-assertions}' {@code lastSelect()} rather than a
 * method chained directly onto it: obtaining a plan needs a live {@link Connection} that
 * {@code query-assertions} has no reason to know about, and Java has no mechanism to retroactively add
 * methods to another module's fluent-assertion type anyway.
 */
public final class PlanAssertions {

    private PlanAssertions() {}

    /** Uses {@link PostgresExecutionPlanAnalyzer}. */
    public static ExecutionPlanAssert assertThatPlanOf(Connection connection, CapturedQuery query) {
        return assertThatPlanOf(connection, query, new PostgresExecutionPlanAnalyzer());
    }

    /** Like {@link #assertThatPlanOf(Connection, CapturedQuery)}, with a caller-supplied analyzer. */
    public static ExecutionPlanAssert assertThatPlanOf(
            Connection connection, CapturedQuery query, ExecutionPlanAnalyzer analyzer) {
        return new ExecutionPlanAssert(analyzer.explain(connection, query));
    }
}