001package gudusoft.gsqlparser.ir.semantic.validation.oracle; 002 003import java.util.Collections; 004import java.util.LinkedHashSet; 005import java.util.Set; 006 007/** Validated source-level join intent for one predicate/conjunct. */ 008public final class PredicateJoinIntent { 009 010 public enum Validity { 011 VALID, 012 INVALID, 013 UNKNOWN 014 } 015 016 private final Validity validity; 017 private final boolean markerPresent; 018 private final Integer preservedRelationInstanceId; 019 private final Integer nullGeneratedRelationInstanceId; 020 private final Set<Integer> referencedRelationInstanceIds; 021 022 private PredicateJoinIntent( 023 Validity validity, 024 boolean markerPresent, 025 Integer preservedRelationInstanceId, 026 Integer nullGeneratedRelationInstanceId, 027 Set<Integer> referencedRelationInstanceIds) { 028 this.validity = validity; 029 this.markerPresent = markerPresent; 030 this.preservedRelationInstanceId = preservedRelationInstanceId; 031 this.nullGeneratedRelationInstanceId = nullGeneratedRelationInstanceId; 032 this.referencedRelationInstanceIds = Collections.unmodifiableSet( 033 new LinkedHashSet<Integer>(referencedRelationInstanceIds)); 034 } 035 036 static PredicateJoinIntent valid( 037 int preservedRelationInstanceId, 038 int nullGeneratedRelationInstanceId, 039 Set<Integer> referencedRelationInstanceIds) { 040 return new PredicateJoinIntent(Validity.VALID, true, 041 Integer.valueOf(preservedRelationInstanceId), 042 Integer.valueOf(nullGeneratedRelationInstanceId), 043 referencedRelationInstanceIds); 044 } 045 046 /** 047 * A marked filter on an already null-generated relation, for example 048 * {@code b.status(+) = 'ACTIVE'}. Its preserved relation is resolved from 049 * another pair predicate in the same query block. 050 */ 051 static PredicateJoinIntent validNullGeneratedFilter( 052 int nullGeneratedRelationInstanceId, 053 Set<Integer> referencedRelationInstanceIds) { 054 return new PredicateJoinIntent(Validity.VALID, true, 055 null, Integer.valueOf(nullGeneratedRelationInstanceId), 056 referencedRelationInstanceIds); 057 } 058 059 static PredicateJoinIntent invalid(Set<Integer> referencedRelationInstanceIds) { 060 return new PredicateJoinIntent(Validity.INVALID, true, 061 null, null, referencedRelationInstanceIds); 062 } 063 064 static PredicateJoinIntent unknown(Set<Integer> referencedRelationInstanceIds) { 065 return new PredicateJoinIntent(Validity.UNKNOWN, true, 066 null, null, referencedRelationInstanceIds); 067 } 068 069 public Validity getValidity() { 070 return validity; 071 } 072 073 public boolean hasMarker() { 074 return markerPresent; 075 } 076 077 public Integer getPreservedRelationInstanceId() { 078 return preservedRelationInstanceId; 079 } 080 081 public Integer getNullGeneratedRelationInstanceId() { 082 return nullGeneratedRelationInstanceId; 083 } 084 085 public Set<Integer> getReferencedRelationInstanceIds() { 086 return referencedRelationInstanceIds; 087 } 088 089 public boolean isNullGeneratedFilter() { 090 return validity == Validity.VALID 091 && nullGeneratedRelationInstanceId != null 092 && preservedRelationInstanceId == null; 093 } 094}