예제 #1
0
        public override Expr SplitAgg()
        {
            var child = child_();

            // child of tsum/tcount will be replace to bypass aggfunc child during aggfunc intialization
            var tsum = new AggSum(new List <Expr> {
                child
            }); tsum.dummyBind();
            var sumchild = new AggSum(new List <Expr> {
                child.Clone()
            }); sumchild.dummyBind();
            var sumchildref = new AggrRef(sumchild, -1);

            tsum.children_[0] = sumchildref;

            var tcount = new AggSum(new List <Expr> {
                child
            }); tcount.dummyBind();
            var countchild = new AggCount(new List <Expr> {
                child.Clone()
            }); countchild.dummyBind();
            var countchildref = new AggrRef(countchild, -1);

            tcount.children_[0] = countchildref;

            var processed = new BinExpr(tsum, tcount, "/");

            processed.dummyBind();
            return(processed);
        }
예제 #2
0
파일: ExprFunc.cs 프로젝트: caterby/qpmodel
        static public FuncExpr BuildFuncExpr(string funcName, List <Expr> args)
        {
            FuncExpr r    = null;
            var      func = funcName.Trim().ToLower();

            switch (func)
            {
            case "sum": r = new AggSum(args[0]); break;

            case "min": r = new AggMin(args[0]); break;

            case "max": r = new AggMax(args[0]); break;

            case "avg": r = new AggAvg(args[0]); break;

            case "stddev_samp": r = new AggStddevSamp(args[0]); break;

            case "count":
                if (args.Count == 0)
                {
                    r = new AggCountStar(null);
                }
                else
                {
                    r = new AggCount(args[0]);
                }
                break;

            case "substr":
            case "substring": r = new SubstringFunc(args); break;

            case "upper": r = new UpperFunc(args); break;

            case "year": r = new YearFunc(args); break;

            case "repeat": r = new RepeatFunc(args); break;

            case "round": r = new RoundFunc(args); break;

            case "coalesce": r = new CoalesceFunc(args); break;

            case "hash": r = new HashFunc(args); break;

            default:
                if (ExternalFunctions.set_.ContainsKey(funcName))
                {
                    r = new ExternalFunc(func, args);
                }
                else
                {
                    r = new FuncExpr(funcName, args);
                }
                break;
            }

            // verify arguments count
            Utils.Checks(args.Count == r.argcnt_, $"{r.argcnt_} argument is expected");
            return(r);
        }
예제 #3
0
        public virtual Expr SplitAgg()
        {
            // this is for sum, count, and countstar
            var child     = child_();
            var processed = new AggSum(new List <Expr> {
                child.Clone()
            });

            processed.children_[0] = new AggrRef(this.Clone(), -1);
            processed.dummyBind();
            return(processed);
        }
예제 #4
0
        static public FuncExpr BuildFuncExpr(string funcName, List <Expr> args)
        {
            var func = funcName.Trim().ToLower();

            FuncExpr r;

            switch (func)
            {
            case "sum": r = new AggSum(args); break;

            case "min": r = new AggMin(args); break;

            case "max": r = new AggMax(args); break;

            case "avg": r = new AggAvg(args); break;

            case "stddev_samp": r = new AggStddevSamp(args); break;

            case "count":
                if (args.Count == 0)
                {
                    r = new AggCountStar(null);
                }
                else
                {
                    r = new AggCount(args);
                }
                break;

            case "substr":
            case "substring": r = new SubstringFunc(args); break;

            case "upper": r = new UpperFunc(args); break;

            case "year": r = new YearFunc(args); break;

            case "date": r = new DateFunc(args); break;

            case "repeat": r = new RepeatFunc(args); break;

            case "abs": r = new AbsFunc(args); break;

            case "round": r = new RoundFunc(args); break;

            case "coalesce": r = new CoalesceFunc(args); break;

            case "hash": r = new HashFunc(args); break;

            case "tumble": r = new TumbleWindow(args); break;

            case "tumble_start": r = new TumbleStart(args); break;

            case "tumble_end": r = new TumbleEnd(args); break;

            case "hop": r = new HopWindow(args); break;

            case "session": r = new SessionWindow(args); break;

            default:
                if (ExternalFunctions.set_.ContainsKey(funcName))
                {
                    r = new ExternalFunc(func, args);
                }
                else
                {
                    r = new FuncExpr(funcName, args);
                }
                break;
            }

            // verify arguments count
            if (args.Count != r.argcnt_)
            {
                throw new SemanticAnalyzeException($"{r.argcnt_} argument is expected");
            }
            return(r);
        }