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}