// VisitOnWhere()内でWhereプロパティをNullにすると // その後のWhere.Accept(visitor)でNULL例外が発生する public override void VisitBefore(SingleQueryClause query) { if (!query.IsSubQuery) { query.Where = null; } }
public override void VisitAfter(SingleQueryClause query) { //if(query.GetType() == typeof(SingleQuery)){ // var singleQuery = (SingleQuery)query; // var node = new SingleQuery(query.Quantifier // , singleQuery.HasTop // , singleQuery.Top // , singleQuery.HasWildcard // , results // , from // , where // , groupBy // , having // , orderBy // , limit // , singleQuery.Comments.Clone()); //} else { // var singleQueryClause = query; // var node = new SingleQueryClause(query.Quantifier // , singleQueryClause.HasTop // , singleQueryClause.Top // , singleQueryClause.HasWildcard // , results // , from // , where // , groupBy // , having // , singleQueryClause.Comments.Clone()); //} }
public override void VisitAfter(SingleQueryClause query) { if (!query.IsSubQuery && query.GetType() == typeof(SingleQuery)) { this.GetOrderBy(((SingleQuery)query).OrderBy); } }
public override void VisitAfter(SingleQueryClause query) { if (!query.IsSubQuery && query.GetType() == typeof(SingleQuery)) { ((SingleQuery)query).OrderBy.AddRange(_orderBy); } }
public override void VisitOnWhere(SingleQueryClause query, int offset) { if (!query.IsSubQuery) { _predicate = query.Where; } }
public override void VisitBefore(SingleQueryClause query) { if (!query.IsSubQuery && query.GetType() == typeof(SingleQuery)) { ((SingleQuery)query).OrderBy.Clear(); } }
private void InsertResult(SingleQueryClause query, int index, ResultColumn result) { // SELECT句が'*'かつFrom句が存在する場合、Table.*に置き換える if (query.HasWildcard) { if (!query.HasFrom) { throw new InvalidASTStructureError( "'*'が参照するFROM句が存在しないため、SELECT句を追加できません"); } query.HasWildcard = false; // From句で参照する抽出元の別名を取得する var tableWildcards = new List <TableWildcard>(); foreach (var table in this.GetAliasNamesFromSource(query.From)) { if (!string.IsNullOrEmpty(table.AliasName)) { tableWildcards.Add(new TableWildcard(table.AliasName)); } else { tableWildcards.Add(new TableWildcard(table.ServerName , table.DataBaseName , table.SchemaName , table.Name)); } } query.Results.Clear(); query.Results.AddRange(tableWildcards); } // 指定されたSelect句を追加する query.Results.Insert(index, result); }
//・以下の場合、*に置き換えることでSELECT文の結果が変わる可能性がある // メインクエリのDISINTCT句がある場合 // メインクエリの集約関数がある場合 // メインクエリのGROUPBY句を持つ場合 public override void VisitBefore(SingleQueryClause query) { if (!query.IsSubQuery) { ReplaceWithConstant(query); } }
public sealed override void VisitBefore(SingleQueryClause query) { if (!query.HasFrom) { // FROM句がない場合はSELECT句サブクエリのResultInfoListが // Stackに積まれる前に空のResultInfoListを積んでおく _stack.Push(new ResultInfoList()); } }
//public override void VisitBefore(SingleQuery query) { // this.VisitBefore((SingleQueryClause)query); //} //public override void VisitBefore(CompoundQuery compoundQuery) { // this.VisitBefore((CompoundQueryClause)compoundQuery); //} //public override void VisitBefore(BracketedQuery bracketedQuery) { // this.VisitBefore((BracketedQueryClause)bracketedQuery); //} public override void VisitBefore(SingleQueryClause query) { if (_added) { return; } this.InsertResult(query, _index, _result); _added = true; }
// 若干の速度改善のため、 // 追加したWhere句へのAccept()を軽減するため、VisitAfterでWhere句の操作を行う public override void VisitAfter(SingleQueryClause query) { // if(!query.IsSubQuery) { // サブクエリへの追加にも対応するためIsSubQueryは用いない if (_queryNestLevel == 1) { query.Where = this.AddPredicate(query.Where); } --_queryNestLevel; }
public override void VisitAfter(SingleQueryClause query) { if (this.IsNotInMainResultsSource()) { return; } if (query.HasFrom) { _scopeStack.Pop(); } }
public override void VisitAfter(SingleQueryClause query) { if (IsPlaceHolderPredicate(query.Where)) { query.Where = Place((PlaceHolderPredicate)query.Where); } if (IsPlaceHolderPredicate(query.Having)) { query.Having = Place((PlaceHolderPredicate)query.Having); } }
public override void VisitOnFrom(SingleQueryClause query, int offset) { if (this.IsNotInMainResultsSource()) { return; } if (this.FindTableAliasName(query.From, _oldTableAliasName)) { // 変更後のテーブル別名が既にあるテーブル別名と重複する場合は、末尾に"_"を付加する while (this.FindTableAliasName(query.From, _newTableAliasName)) { _newTableAliasName += "_"; } _scopeStack.Push(new Scope(FromOrResult.FromQuery, true)); } else { _scopeStack.Push(new Scope(FromOrResult.FromQuery, false)); } }
public void VisitAfter(SingleQueryClause query) { _visitor.VisitAfter(query); }
public sealed override void VisitAfter(SingleQueryClause query) { // ReadロックはReadするテーブル行をロックするのが目的なので、その行を抽出するための条件 // (EXISTS, IN, ..)で用いられるサブクエリ内のテーブル行はロックしない if (this.IsNotInMainResultsSource()) { return; } // // このQueryの列情報(ResultInfoList)を作成する // // 作成するこのQueryの列情報 var resultInfoList = new ResultInfoList(); // SELECT句サブクエリ var subQueries = new Stack <ResultInfoList>(); // FROM句の抽出元テーブル列 ResultInfoList sources; while (true) { ResultInfoList subQuery = _stack.Pop(); if (subQuery.IsSubQueryInResults) { subQueries.Push(subQuery); } else if (this.CurrentSubQueryIs(SubQueryType.Exists)) { // Existsサブクエリの場合はSELECT句情報を作成しない return; } else if (this.CurrentSubQueryIs(SubQueryType.OrderBy)) { // OrderByサブクエリの場合はSELECT句情報を作成しない return; } else { sources = subQuery; break; } } if (query.HasWildcard) { foreach (var source in sources) { resultInfoList.Add(new ResultInfo("", source.ColumnAliasName, null, source)); } _stack.Push(resultInfoList); return; } foreach (var resultColumn in query.Results) { if (resultColumn.IsTableWildcard) { var tableWildcard = (TableWildcard)resultColumn; foreach (var source in sources) { if (source.TableAliasName == tableWildcard.TableAliasName) { resultInfoList.Add(new ResultInfo("", source.ColumnAliasName, tableWildcard, source)); } } } else { var resultExpr = (ResultExpr)resultColumn; if (resultExpr.Value.GetType() == typeof(Column)) { // sourcesから参照元のResultInfoを見つける var column = (Column)resultExpr.Value; var columnAliasName = string.IsNullOrEmpty(resultExpr.AliasName) ? column.Name : resultExpr.AliasName; var foundInSources = false; foreach (var source in sources) { if (source.IsDirectSource(column, _ignoreCase)) { resultInfoList.Add(new ResultInfo("", columnAliasName, resultExpr, source)); foundInSources = true; break; } } // 参照元のResultInfoが見つからない場合(抽出元テーブルの列名が不明な場合等) // UNIONでResultInfoをマージするためSELECT句には必ずResultInfoを用意する if (!foundInSources) { resultInfoList.Add(new ResultInfo("", columnAliasName, resultExpr)); } } else if (resultExpr.Value.GetType() == typeof(SubQueryExp)) { var subQueryExp = (SubQueryExp)resultExpr.Value; var subQueryResultInfo = subQueries.Pop(); if (subQueryResultInfo.Count == 0) { resultInfoList.Add(new ResultInfo("", resultExpr.AliasName, resultExpr, null)); } else { resultInfoList.Add(new ResultInfo("", resultExpr.AliasName, resultExpr, subQueryResultInfo[0])); } } else { // UNIONでResultInfoをマージするためSELECT句には必ずResultInfoを用意する resultInfoList.Add(new ResultInfo("", resultExpr.AliasName, resultColumn)); } } // if } // for if (query.HasGroupBy) { // GROUP BY句がある場合は、そのGROUPBY句で指定されていないSELECT句は // 一致条件の被演算子に指定されてもテーブル列への一致条件とは見做さない for (var i = resultInfoList.Count - 1; i >= 0; --i) { if (!this.FindInGroupByItems(query.GroupBy, resultInfoList[i], i)) { resultInfoList[i] = new ResultInfo("" , resultInfoList[i].ColumnAliasName , resultInfoList[i].Node); } } } else { var aggregateFinder = new FindAggregateExprVisitor(); query.Results.Accept(aggregateFinder); if (aggregateFinder.ContainsAggregativeExpr) { // GROUP BY句がなく集約関数がある場合は、全てのSELECT句は // 一致条件の被演算子に指定されてもテーブル列への一致条件とは見做さない for (var i = resultInfoList.Count - 1; i >= 0; --i) { resultInfoList[i] = new ResultInfo("" , resultInfoList[i].ColumnAliasName , resultInfoList[i].Node); } } } // if _stack.Push(resultInfoList); }
public override void VisitBefore(SingleQueryClause query) { query.HasTop = true; query.Top = _maxRows; }
public override void VisitBefore(SingleQueryClause query) { ++_queryNestLevel; }
public void VisitBefore(SingleQueryClause query) { _visitor.VisitBefore(query); }
virtual public void VisitOnWhere(SingleQueryClause query, int offset) { }
virtual public void VisitBefore(SingleQueryClause query) { }
virtual public void VisitAfter(SingleQueryClause query) { }
public void VisitOnWhere(SingleQueryClause query, int offset) { _visitor.VisitOnWhere(query, offset); }
virtual public void VisitOnHaving(SingleQueryClause query, int offset) { }
public void VisitOnHaving(SingleQueryClause query, int offset) { _visitor.VisitOnHaving(query, offset); }