001package gudusoft.gsqlparser.catalog.input;
002
003import gudusoft.gsqlparser.catalog.diagnostic.CatalogDiagnostic;
004import gudusoft.gsqlparser.catalog.diagnostic.CatalogDiagnosticSeverity;
005import gudusoft.gsqlparser.catalog.runtime.CatalogRuntime;
006import gudusoft.gsqlparser.sqlenv.TSQLEnv;
007
008import java.util.ArrayList;
009import java.util.Collections;
010import java.util.List;
011import java.util.Optional;
012
013/**
014 * Carries the outcome of a load operation. Either {@link #sqlEnv()} or {@link #runtime()}
015 * is populated depending on the entry point invoked; both can be empty when the load
016 * failed.
017 *
018 * <p>Plan ยง7.1. {@link #ok()} returns {@code true} when no
019 * {@link CatalogDiagnosticSeverity#ERROR} diagnostics were emitted; WARN/INFO
020 * diagnostics do not fail the load.</p>
021 */
022public final class CatalogLoadResult {
023
024    private final TSQLEnv sqlEnv;
025    private final CatalogRuntime runtime;
026    private final List<CatalogDiagnostic> diagnostics;
027    private final boolean ok;
028
029    private CatalogLoadResult(TSQLEnv sqlEnv, CatalogRuntime runtime,
030                              List<CatalogDiagnostic> diagnostics) {
031        this.sqlEnv = sqlEnv;
032        this.runtime = runtime;
033        this.diagnostics = diagnostics == null
034            ? Collections.<CatalogDiagnostic>emptyList()
035            : Collections.unmodifiableList(new ArrayList<CatalogDiagnostic>(diagnostics));
036        boolean anyError = false;
037        for (CatalogDiagnostic d : this.diagnostics) {
038            if (d.severity() == CatalogDiagnosticSeverity.ERROR) {
039                anyError = true;
040                break;
041            }
042        }
043        this.ok = !anyError;
044    }
045
046    public boolean ok() {
047        return ok;
048    }
049
050    public Optional<TSQLEnv> sqlEnv() {
051        return Optional.ofNullable(sqlEnv);
052    }
053
054    public Optional<CatalogRuntime> runtime() {
055        return Optional.ofNullable(runtime);
056    }
057
058    public List<CatalogDiagnostic> diagnostics() {
059        return diagnostics;
060    }
061
062    public static CatalogLoadResult ok(TSQLEnv env, List<CatalogDiagnostic> diagnostics) {
063        if (env == null) {
064            throw new IllegalArgumentException("CatalogLoadResult.ok(env, ...): env is required");
065        }
066        return new CatalogLoadResult(env, null, diagnostics);
067    }
068
069    public static CatalogLoadResult ok(CatalogRuntime runtime, List<CatalogDiagnostic> diagnostics) {
070        if (runtime == null) {
071            throw new IllegalArgumentException(
072                "CatalogLoadResult.ok(runtime, ...): runtime is required");
073        }
074        return new CatalogLoadResult(null, runtime, diagnostics);
075    }
076
077    public static CatalogLoadResult failed(List<CatalogDiagnostic> diagnostics) {
078        return new CatalogLoadResult(null, null, diagnostics);
079    }
080
081    @Override
082    public String toString() {
083        return "CatalogLoadResult{ok=" + ok
084            + ", sqlEnv=" + (sqlEnv != null)
085            + ", runtime=" + (runtime != null)
086            + ", diagnostics=" + diagnostics.size() + '}';
087    }
088}