public final class JoinEndpoint extends Object
JoinEntity. A join never references a bare
alias directly; it references a JoinEndpoint so that the left
side of a left-deep chain (t1 JOIN t2 JOIN t3) can be modelled
as the accumulated JoinEndpointKind.JOIN_RESULT of the prior
joins rather than a single relation.
JoinEndpointKind.RELATION endpoint carries the
FROM-clause alias and the relation's
qualifiedName (e.g. t1).JoinEndpointKind.JOIN_RESULT endpoint carries the
producingJoinOrder (the JoinEntity.getOrder() of
the join that produced this result) and the immutable list of
contributingAliases flowing through it.Immutable. Introduced by join-analysis slice 162 (S1).
| Modifier and Type | Field and Description |
|---|---|
static int |
NO_INSTANCE_ID
Sentinel for "no stable relation instance id" (slice 179).
|
static int |
NO_STATEMENT_INDEX
Sentinel for "no subquery statement index" (R8).
|
| Modifier and Type | Method and Description |
|---|---|
boolean |
equals(Object o) |
String |
getAlias()
Non-null only for
JoinEndpointKind.RELATION. |
List<String> |
getContributingAliases()
Never null; empty for
JoinEndpointKind.RELATION. |
int |
getInstanceId()
Stable relation instance id (slice 179, R4) for a RELATION endpoint —
matches
RelationSource.getInstanceId(). |
JoinEndpointKind |
getKind() |
int |
getProducingJoinOrder()
Meaningful only for
JoinEndpointKind.JOIN_RESULT; else -1. |
String |
getQualifiedName()
May be null even for
JoinEndpointKind.RELATION. |
int |
getStatementIndex()
Index of the lifted subquery's
StatementGraph for a
JoinEndpointKind.SUBQUERY endpoint (R8); NO_STATEMENT_INDEX
for other endpoint kinds. |
int |
hashCode() |
static JoinEndpoint |
joinResult(int producingJoinOrder,
List<String> contributingAliases)
The accumulated result of prior joins in a left-deep chain.
|
static JoinEndpoint |
relation(String alias,
String qualifiedName)
A single FROM-clause relation with no stable instance id.
|
static JoinEndpoint |
relation(String alias,
String qualifiedName,
int instanceId)
A single FROM-clause relation carrying its stable
instanceId (slice 179, R4) — the same per-block FROM-order
ordinal as the matching RelationSource.getInstanceId(), so an
endpoint links to its exact relation instance without alias-keying. |
static JoinEndpoint |
subquery(int statementIndex,
String label)
The right side of a predicate-derived semi-join (R8): a lifted
EXISTS / IN subquery. |
String |
toString() |
public static final int NO_INSTANCE_ID
public static final int NO_STATEMENT_INDEX
public static JoinEndpoint relation(String alias, String qualifiedName)
alias
must be non-empty; qualifiedName may be null when the
relation has no resolvable name (e.g. an unaliased derived table).public static JoinEndpoint relation(String alias, String qualifiedName, int instanceId)
instanceId (slice 179, R4) — the same per-block FROM-order
ordinal as the matching RelationSource.getInstanceId(), so an
endpoint links to its exact relation instance without alias-keying.public static JoinEndpoint subquery(int statementIndex, String label)
EXISTS / IN subquery. statementIndex is the
index of the subquery's own StatementGraph
block in the program; label is an optional human-facing name
(the synthetic <predicate_subquery_N> name or the subquery's
alias), may be null.public static JoinEndpoint joinResult(int producingJoinOrder, List<String> contributingAliases)
producingJoinOrder - the JoinEntity.getOrder() of the
join producing this resultcontributingAliases - aliases flowing through this result (may
be empty, never null)public JoinEndpointKind getKind()
public String getAlias()
JoinEndpointKind.RELATION.public String getQualifiedName()
JoinEndpointKind.RELATION.public int getInstanceId()
RelationSource.getInstanceId(). NO_INSTANCE_ID
for JOIN_RESULT endpoints or when not assigned.public int getProducingJoinOrder()
JoinEndpointKind.JOIN_RESULT; else -1.public List<String> getContributingAliases()
JoinEndpointKind.RELATION.public int getStatementIndex()
StatementGraph for a
JoinEndpointKind.SUBQUERY endpoint (R8); NO_STATEMENT_INDEX
for other endpoint kinds. For a SUBQUERY endpoint getAlias()
returns the optional label (synthetic name or alias, may be null).