// 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());
     //}
 }
Ejemplo n.º 3
0
 public override void VisitAfter(SingleQueryClause query)
 {
     if (!query.IsSubQuery && query.GetType() == typeof(SingleQuery))
     {
         this.GetOrderBy(((SingleQuery)query).OrderBy);
     }
 }
Ejemplo n.º 4
0
 public override void VisitAfter(SingleQueryClause query)
 {
     if (!query.IsSubQuery && query.GetType() == typeof(SingleQuery))
     {
         ((SingleQuery)query).OrderBy.AddRange(_orderBy);
     }
 }
Ejemplo n.º 5
0
 public override void VisitOnWhere(SingleQueryClause query, int offset)
 {
     if (!query.IsSubQuery)
     {
         _predicate = query.Where;
     }
 }
Ejemplo n.º 6
0
 public override void VisitBefore(SingleQueryClause query)
 {
     if (!query.IsSubQuery && query.GetType() == typeof(SingleQuery))
     {
         ((SingleQuery)query).OrderBy.Clear();
     }
 }
Ejemplo n.º 7
0
 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);
 }
Ejemplo n.º 8
0
        //・以下の場合、*に置き換えることでSELECT文の結果が変わる可能性がある
        //  メインクエリのDISINTCT句がある場合
        //  メインクエリの集約関数がある場合
        //  メインクエリのGROUPBY句を持つ場合

        public override void VisitBefore(SingleQueryClause query)
        {
            if (!query.IsSubQuery)
            {
                ReplaceWithConstant(query);
            }
        }
Ejemplo n.º 9
0
 public sealed override void VisitBefore(SingleQueryClause query)
 {
     if (!query.HasFrom)
     {
         // FROM句がない場合はSELECT句サブクエリのResultInfoListが
         // Stackに積まれる前に空のResultInfoListを積んでおく
         _stack.Push(new ResultInfoList());
     }
 }
Ejemplo n.º 10
0
        //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;
        }
Ejemplo n.º 11
0
 // 若干の速度改善のため、
 // 追加したWhere句へのAccept()を軽減するため、VisitAfterでWhere句の操作を行う
 public override void VisitAfter(SingleQueryClause query)
 {
     // if(!query.IsSubQuery) {
     // サブクエリへの追加にも対応するためIsSubQueryは用いない
     if (_queryNestLevel == 1)
     {
         query.Where = this.AddPredicate(query.Where);
     }
     --_queryNestLevel;
 }
Ejemplo n.º 12
0
 public override void VisitAfter(SingleQueryClause query)
 {
     if (this.IsNotInMainResultsSource())
     {
         return;
     }
     if (query.HasFrom)
     {
         _scopeStack.Pop();
     }
 }
Ejemplo n.º 13
0
 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);
     }
 }
Ejemplo n.º 14
0
 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));
     }
 }
Ejemplo n.º 15
0
 public void VisitAfter(SingleQueryClause query)
 {
     _visitor.VisitAfter(query);
 }
Ejemplo n.º 16
0
        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);
        }
Ejemplo n.º 17
0
 public override void VisitBefore(SingleQueryClause query)
 {
     query.HasTop = true;
     query.Top    = _maxRows;
 }
Ejemplo n.º 18
0
 public override void VisitBefore(SingleQueryClause query)
 {
     ++_queryNestLevel;
 }
Ejemplo n.º 19
0
 public void VisitBefore(SingleQueryClause query)
 {
     _visitor.VisitBefore(query);
 }
Ejemplo n.º 20
0
 virtual public void VisitOnWhere(SingleQueryClause query, int offset)
 {
 }
Ejemplo n.º 21
0
 virtual public void VisitBefore(SingleQueryClause query)
 {
 }
Ejemplo n.º 22
0
 virtual public void VisitAfter(SingleQueryClause query)
 {
 }
Ejemplo n.º 23
0
 public void VisitOnWhere(SingleQueryClause query, int offset)
 {
     _visitor.VisitOnWhere(query, offset);
 }
Ejemplo n.º 24
0
 virtual public void VisitOnHaving(SingleQueryClause query, int offset)
 {
 }
Ejemplo n.º 25
0
 public void VisitOnHaving(SingleQueryClause query, int offset)
 {
     _visitor.VisitOnHaving(query, offset);
 }