示例#1
0
        override sealed public void Visit(PlaceHolderPredicate predicate)
        {
            //
            // プレースホルダに当てはまるPredicate式にvisitorを適用する
            //

            if (!_placeHolders.ContainsKey(predicate.LabelName))
            {
                this.VisitOnPlaceHolder(predicate);
                return;
            }

            if (!(_placeHolders[predicate.LabelName] is Predicate))
            {
                throw new CannotBuildASTException("Type of placeholder value is mismatched.");
            }

            var placeValue = (Predicate)(_placeHolders[predicate.LabelName]);

            if (this.NeedsBracket(predicate.Parent, placeValue))
            {
                // 定義されたPredicate演算子の優先順位に基づき、
                // 必要であればプレースホルダ値を括弧で囲む
                (new BracketedPredicate(placeValue)).Accept(this);
            }
            else
            {
                placeValue.Accept(this);
            }
        }
 protected override Predicate Place(PlaceHolderPredicate ph)
 {
     // 0=1は全てのPlaceHolderPredicateに適用できる
     // FALSE値に置き換えることでSELECT文の高速化を期待できる
     return(new BinaryOpPredicate(new UNumericLiteral("0")
                                  , PredicateOperator.Equal
                                  , new UNumericLiteral("1")));
 }
示例#3
0
        private Predicate PlaceInCollate(PlaceHolderPredicate ph)
        {
            var predicate = this.Place(ph);

            if (predicate.GetType() == typeof(AndPredicate) ||
                predicate.GetType() == typeof(OrPredicate))
            {
                predicate = new BracketedPredicate(predicate);
            }
            return(predicate);
        }
示例#4
0
        private Predicate PlaceInAnd(PlaceHolderPredicate ph)
        {
            var predicate = this.Place(ph);

            if (predicate.GetType() == typeof(OrPredicate))
            {
                // OR演算式の場合は式全体を括弧で囲んでAND節をつなげる
                predicate = new BracketedPredicate(predicate);
            }
            return(predicate);
        }
 public void Visit(PlaceHolderPredicate predicate)
 {
     // プレースホルダに当てはまるPredicate式に_visitorを適用する
     if (_placeHolders.ContainsKey(predicate.LabelName))
     {
         _placeHolders[predicate.LabelName].Accept(_visitor);
     }
     else
     {
         _visitor.Visit(predicate);
     }
 }
示例#6
0
        protected virtual Predicate Place(PlaceHolderPredicate ph)
        {
            var placeHolderName = ph.LabelName;

            if (!_placeHolders.ContainsKey(placeHolderName))
            {
                return(ph);
            }
            var placeHolderValue = _placeHolders[placeHolderName];

            if (placeHolderValue is Expr)
            {
                throw new CannotBuildASTException("Type of placeholder value is mismatched.");
            }
            // 適用したプレースホルダを記録する
            if (!_placedHolders.ContainsKey(placeHolderName))
            {
                _placedHolders.Add(placeHolderName, placeHolderValue);
            }
            return((Predicate)placeHolderValue);
        }
示例#7
0
 virtual public void Visit(PlaceHolderPredicate predicate)
 {
 }
        public override void Visit(PlaceHolderPredicate predicate)
        {
            var node = new PlaceHolderPredicate(predicate.Label, predicate.Comments.Clone());

            _stack.Push(node);
        }
示例#9
0
 virtual protected void VisitOnPlaceHolder(PlaceHolderPredicate predicate)
 {
 }
 public override void Visit(PlaceHolderPredicate predicate)
 {
     this.GetPlaceHolderInfo(predicate.LabelName);
 }