001package gudusoft.gsqlparser.catalog.runtime; 002 003import gudusoft.gsqlparser.catalog.diagnostic.CatalogDiagnostic; 004 005import java.util.ArrayList; 006import java.util.Collections; 007import java.util.List; 008import java.util.Optional; 009 010/** 011 * Outcome of a {@link CatalogResolver#resolve} call. 012 * 013 * <p>Plan ยง7.2. {@link #miss(List)} carries diagnostics describing why; {@link #ok(CatalogBinding)} 014 * carries the resolved binding.</p> 015 */ 016public final class CatalogResolutionResult { 017 018 private final CatalogBinding binding; 019 private final List<CatalogDiagnostic> diagnostics; 020 021 private CatalogResolutionResult(CatalogBinding binding, List<CatalogDiagnostic> diagnostics) { 022 this.binding = binding; 023 this.diagnostics = diagnostics == null 024 ? Collections.<CatalogDiagnostic>emptyList() 025 : Collections.unmodifiableList(new ArrayList<CatalogDiagnostic>(diagnostics)); 026 } 027 028 public boolean resolved() { 029 return binding != null; 030 } 031 032 public Optional<CatalogBinding> binding() { 033 return Optional.ofNullable(binding); 034 } 035 036 public Optional<CatalogObjectKind> kind() { 037 return binding == null ? Optional.<CatalogObjectKind>empty() : Optional.of(binding.kind()); 038 } 039 040 public List<CatalogDiagnostic> diagnostics() { 041 return diagnostics; 042 } 043 044 public static CatalogResolutionResult miss(List<CatalogDiagnostic> diagnostics) { 045 return new CatalogResolutionResult(null, diagnostics); 046 } 047 048 public static CatalogResolutionResult ok(CatalogBinding binding) { 049 if (binding == null) { 050 throw new IllegalArgumentException("CatalogResolutionResult.ok: binding is required"); 051 } 052 return new CatalogResolutionResult(binding, null); 053 } 054 055 public static CatalogResolutionResult ok(CatalogBinding binding, List<CatalogDiagnostic> diagnostics) { 056 if (binding == null) { 057 throw new IllegalArgumentException("CatalogResolutionResult.ok: binding is required"); 058 } 059 return new CatalogResolutionResult(binding, diagnostics); 060 } 061}