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}