public Join ( JoinType joinType, |
||
joinType | JoinType | The type of join to apply to the two tables. |
onExpression | The condition for the two tables to join. | |
return | void |
private void SetFromTableInClause(FromClause clause, IFromSourceNode source, JoinNode join) { AddSourceToClause(clause, source); if (join != null) { var joinType = JoinType.Inner; if (!String.IsNullOrEmpty(join.JoinType)) joinType = GetJoinType(join.JoinType); SqlExpression onExpression = null; if (join.OnExpression != null) onExpression = Build(join.OnExpression); clause.Join(joinType, onExpression); SetFromTableInClause(clause, join.Source, join.NextJoin); } }
public static FromClause Build(PlSqlParser.FromClauseContext context) { if (context == null) return null; var clause = new FromClause(); var list = context.tableRefList(); if (list.IsEmpty) throw new ParseCanceledException("No source set in FROM clause"); var tableRefs = list.tableRef().Select(FormTableRef); bool joinSeen = false; bool first = true; foreach (var tableRef in tableRefs) { if (joinSeen) throw new ParseCanceledException("Invalid join clause"); var source = tableRef.Source; if (source.SubQuery != null) { clause.AddSubQuery(source.Alias, source.SubQuery); } else if (source.TableName != null) { clause.AddTable(source.Alias, source.TableName); } foreach (var joinNode in tableRef.Join) { var joinSource = joinNode.Source; if (joinSource.SubQuery != null) { clause.AddSubQuery(joinSource.Alias, joinSource.SubQuery); } else if (joinSource.TableName != null) { clause.AddTable(joinSource.Alias, joinSource.TableName); } clause.Join(joinNode.JoinType, joinNode.OnExpression); joinSeen = true; } if (!first && !joinSeen) { clause.Join(JoinType.Inner, null); } first = false; } return clause; }