private PredicateSegment CreateInSegment(MySqlCommandParser.PredicateContext ctx)
        {
            ColumnSegment         column = (ColumnSegment)Visit(ctx.bitExpr(0));
            PredicateBracketValue predicateBracketValue = CreateBracketValue(ctx);

            return(new PredicateSegment(ctx.Start.StartIndex, ctx.Stop.StopIndex, column, new PredicateInRightValue(predicateBracketValue, GetExpressionSegments(ctx))));
        }
        private PredicateSegment CreateBetweenSegment(MySqlCommandParser.PredicateContext ctx)
        {
            ColumnSegment      column  = (ColumnSegment)Visit(ctx.bitExpr(0));
            IExpressionSegment between = (IExpressionSegment)Visit(ctx.bitExpr(1));
            IExpressionSegment and     = (IExpressionSegment)Visit(ctx.predicate());

            return(new PredicateSegment(ctx.Start.StartIndex, ctx.Stop.StopIndex, column, new PredicateBetweenRightValue(between, and)));
        }
        private PredicateBracketValue CreateBracketValue(MySqlCommandParser.PredicateContext ctx)
        {
            PredicateLeftBracketValue predicateLeftBracketValue = null != ctx.subquery()
                    ? new PredicateLeftBracketValue(ctx.subquery().LP_().Symbol.StartIndex, ctx.subquery().LP_().Symbol.StopIndex)
                    : new PredicateLeftBracketValue(ctx.LP_().Symbol.StartIndex, ctx.LP_().Symbol.StopIndex);
            PredicateRightBracketValue predicateRightBracketValue = null != ctx.subquery()
                    ? new PredicateRightBracketValue(ctx.subquery().RP_().Symbol.StartIndex, ctx.subquery().RP_().Symbol.StopIndex)
                    : new PredicateRightBracketValue(ctx.RP_().Symbol.StartIndex, ctx.RP_().Symbol.StopIndex);

            return(new PredicateBracketValue(predicateLeftBracketValue, predicateRightBracketValue));
        }
        private ICollection <IExpressionSegment> GetExpressionSegments(MySqlCommandParser.PredicateContext ctx)
        {
            ICollection <IExpressionSegment> result = new LinkedList <IExpressionSegment>();

            if (null != ctx.subquery())
            {
                MySqlCommandParser.SubqueryContext subquery = ctx.subquery();
                result.Add(new SubQueryExpressionSegment(new SubQuerySegment(subquery.Start.StartIndex, subquery.Stop.StopIndex, (SelectCommand)Visit(ctx.subquery()))));
                return(result);
            }
            foreach (var each in ctx.expr())
            {
                result.Add((IExpressionSegment)Visit(each));
            }
            return(result);
        }
 public override IASTNode VisitPredicate(MySqlCommandParser.PredicateContext ctx)
 {
     if (null != ctx.IN() && null == ctx.NOT())
     {
         return(CreateInSegment(ctx));
     }
     if (null != ctx.BETWEEN() && null == ctx.NOT())
     {
         return(CreateBetweenSegment(ctx));
     }
     if (1 == ctx.children.Count)
     {
         return(Visit(ctx.bitExpr(0)));
     }
     return(VisitRemainPredicate(ctx));
 }
 private IASTNode VisitRemainPredicate(MySqlCommandParser.PredicateContext ctx)
 {
     foreach (var each in ctx.bitExpr())
     {
         Visit(each);
     }
     foreach (var each in ctx.expr())
     {
         Visit(each);
     }
     foreach (var each in ctx.simpleExpr())
     {
         Visit(each);
     }
     if (null != ctx.predicate())
     {
         Visit(ctx.predicate());
     }
     return(new CommonExpressionSegment(ctx.Start.StartIndex, ctx.Stop.StopIndex, ctx.GetText()));
 }