示例#1
0
            static Expr AggImpl(CallExpr ce, Generator.Ctx ctx)
            {
                var valsExpr = ce.args[0];

                Expr keysExpr;

                if (ce.args.Count > 1)
                {
                    keysExpr = ce.args[1];
                }
                else
                {
                    keysExpr = new ReferenceExpr(sWithKey);
                }

                var refAkk = new ReferenceExpr(string.Format("{0}:{1}:{2}", sAkk, valsExpr, keysExpr));
                int iAkk   = ctx.IndexOf(refAkk.name);

                Expr resultExpr;

                if (iAkk >= 0)
                {
                    resultExpr = refAkk;
                }
                else
                {
                    resultExpr = new CallExpr(FuncDefs_Solver.SolverWeightedSumsAdd, refAkk,
                                              new CallExpr(FuncDefs_Solver.SolverWeightedSumsNew, new ReferenceExpr(sFactory), valsExpr, keysExpr));
                }

                return(resultExpr);
            }
示例#2
0
            static object AggImplSimple(CallExpr ce, Generator.Ctx ctx)
            {
                var what = ce.funcName;
                var expr = new BinaryExpr(ExprType.Fluent, AggImpl(ce, ctx), new CallExpr(FuncDefs_Solver.SolverWeightedSumsGet, new ConstExpr(what)));

                return(Generator.Generate(expr, ctx));
            }
示例#3
0
            public static object AGGR(CallExpr call, Generator.Ctx ctx)
            {
                CallExpr ce;
                {
                    var dict = new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase);
                    ce = Filter.ReplaceValueInfoRefsWithData(call, DataLoader.sData, dict);
                    ctx.CreateValue(DataLoader.sUsedParamsDict, dict);
                }

                var args = new List <Expr>();

                args.Add(CallExpr.let(new ReferenceExpr(sFactory),
                                      new CallExpr(FuncDefs_Solver.SolverWeightedSumsFactory, ce.args[0], new ReferenceExpr(sTimeA), new ReferenceExpr(sTimeB))));
                args.Add(CallExpr.let(new ReferenceExpr(sWithKey), ce.args[1]));

                for (int i = 2; i < ce.args.Count; i++)
                {
                    args.Add(ce.args[i]);
                }
                var exprAgg = CallExpr.Eval(args.ToArray());

                var expr = new CallExpr(FuncDefs_Solver.SolverTimedObjects,
                                        new CallExpr((Fx)FuncDefs_Solver.SolverWeightedSumsFactoryTimes, new ReferenceExpr(sFactory)), exprAgg);

                return(Generator.Generate(expr, ctx));
            }
示例#4
0
 static void Required(Generator.Ctx ctx, string section, string key)
 {
     if (!ctx.name2ndx.TryGetValue(key, out int i) || ctx.values[i] == Generator.Undefined)
     {
         throw new Exception($"Value named '{key}' required in section '{section}'");
     }
 }
示例#5
0
        /// <summary>
        /// Function call context
        /// </summary>
        public AsyncExprCtx(Generator.Ctx funcCtx, AsyncExprCtx callerCtx, IList args, int nArgs)
        {
            if (funcCtx.parent != null)
            {
                Trace.Assert(funcCtx.parent.name2ndx == callerCtx.name2ndx);
            }
            else
            {
                Trace.Assert(funcCtx.values.Count == nArgs);
            }
            this.name2ndx = funcCtx.name2ndx;
            var values = funcCtx.values;
            int n      = values.Count;

            ctxValues = new CtxValue[n];
            //int nArgs = args.Count;
            for (int i = 0; i < nArgs; i++)
            {
                ctxValues[i] = new CtxValue(args[i], callerCtx);
            }
            for (int i = nArgs; i < n; i++)
            {
                ctxValues[i] = new CtxValue(values[i]);
            }
            parent = callerCtx;
        }
示例#6
0
文件: OPs.cs 项目: WVitek/DotGlue
        public static void ValueOfAny(object funcOrValue, Generator.Ctx ctx, int nMaxParallelism, Action <object> onComplete, CancellationToken cancellation)
        {
            if (nMaxParallelism < 1)
            {
                nMaxParallelism = 1024;
            }
            var sema = W.Common.Utils.NewAsyncSemaphore(nMaxParallelism);
            var ae   = new AsyncExprRootCtx(ctx.name2ndx, ctx.values, sema);

            ae.cancellationToken = cancellation;
            ThreadPool.QueueUserWorkItem(state =>
            {
                var task = ConstValueOf(ae, funcOrValue);
                //task.Start();
                task.ContinueWith(t =>
                {
                    try
                    {
                        onComplete(t.Result);
                    }
                    catch (Exception ex)
                    {
                        onComplete(ex);
                        Console.WriteLine(string.Join("; ", ctx.name2ndx.Keys));
                    }
                });
            });
        }
示例#7
0
        public static object SqlFuncsToText(CallExpr ce, Generator.Ctx ctx)
        {
            var set = new HashSet <string>(StringComparer.OrdinalIgnoreCase);

            {
                var arg0 = ctx.GetConstant(ce.args[0]);
                if (arg0 is IList lst)
                {
                    foreach (var s in lst)
                    {
                        set.Add(Convert.ToString(s));
                    }
                }
                else
                {
                    set.Add(Convert.ToString(arg0));
                }
            }

            using (var sw = new StringWriter())
            {
                SqlFuncsToTextImpl(ctx, sw, vi => set.Contains(vi.location));
                return(sw.ToString());
            }
        }
示例#8
0
文件: OPs.cs 项目: WVitek/DotGlue
        public static object GetConstant(this Generator.Ctx ctx, string valueName)
        {
            int i   = ctx.IndexOf(valueName);
            var val = (i < 0) ? null : ctx[i];

            if (val == null)
            {
                return(null);
            }
            var expr = val as Expr;

            if (expr != null)
            {
                val = Generator.Generate(expr, ctx);
            }
            if (OPs.KindOf(val) == ValueKind.Const)
            {
                return(val);
            }
            else if (expr != null)
            {
                return(ctx.Error(string.Format("Constant expected as value of '{0}' // {1}", valueName, expr)));
            }
            else
            {
                return(ctx.Error(string.Format("Constant expected as value of '{0}'", valueName)));
            }
        }
示例#9
0
 /// <summary>
 /// Nested (child) context with validation
 /// </summary>
 public AsyncExprCtx(Generator.Ctx ctx, IList values, AsyncExprCtx parent)
     : this(ctx.name2ndx, values)
 {
     Trace.Assert(parent != null);
     this.parent = parent;
     Trace.Assert(parent.name2ndx.Count == 0 || (ctx.parent != null && parent.name2ndx == ctx.parent.name2ndx));
 }
示例#10
0
            public ProcessingContext(Generator.Ctx parent, IReadFiles metaStorage)
            {
                ctxFile = new Generator.Ctx(parent);
                ctxFile.CreateValue(sFileDir);
                ctxFile.CreateValue(sFileName);
                ctxFile.CreateValue(sSheetName);

                var metaFiles = metaStorage.EnumerateFiles("").Where(fn => fn.EndsWith(".src.ini"));

                metas = Metadata.Load(metaStorage, metaFiles, ctxFile).ToArray();

                dictExt2Kind = new Dictionary <string, string>();
                foreach (var m in metas)
                {
                    foreach (var Ext in m.FileNameExtension)
                    {
                        var ext = '.' + Ext.ToLowerInvariant();
                        if (!dictExt2Kind.TryGetValue(ext, out var kind))
                        {
                            dictExt2Kind[ext] = m.FileContentKind;
                        }
                        else if (kind != m.FileContentKind)
                        {
                            throw new Exception($"Can't associate extension '{ext}' with two kinds of content ('{kind}' and '{m.FileContentKind}')");
                        }
                    }
                }
            }
示例#11
0
        public static object UseSqlAsFuncsFrom(CallExpr ce, Generator.Ctx ctx)
        {
            var arg0 = Generator.Generate(ce.args[0], ctx);

            if (OPs.KindOf(arg0) != ValueKind.Const)
            {
                ctx.Error("Constant value expected");
            }

            var arg1 = (ce.args.Count < 2) ? null : Generator.Generate(ce.args[1], ctx);

            var        sqlFileName = Convert.ToString(arg0);
            DbFuncType forKinds;

            if (arg1 == null)
            {
                forKinds = DbFuncType.TimeSlice | DbFuncType.TimeInterval;
            }
            else
            {
                var lst = arg1 as IList ?? new object[] { arg1 };
                forKinds = DbFuncType.None;
                foreach (var v in lst)
                {
                    forKinds |= (DbFuncType)Enum.Parse(typeof(DbFuncType), Convert.ToString(v));
                }
            }

            var dbConnName = (ce.args.Count < 3) ? DefaultDbConnName : OPs.TryAsName(ce.args[2], ctx);

            if (string.IsNullOrEmpty(dbConnName))
            {
                ctx.Error($"Connection name must be nonempty: {ce.args[2]}");
            }

            var fullFileName = Path.IsPathRooted(sqlFileName)
                ? sqlFileName
                : Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Convert.ToString(sqlFileName));

            var           cacheKey = $"FuncDefs:{fullFileName}:{forKinds.ToString()}";
            Func <object> ldfsFunc = () =>
            {
                var sqlCtx = new W.Expressions.Sql.Preprocessing.PreprocessingContext()
                {
                    sqlFileName                 = fullFileName,
                    cacheSubdomain              = "DB",
                    dbConnValueName             = dbConnName,
                    forKinds                    = forKinds,
                    ctx                         = ctx,
                    cachingExpiration           = TimeSpan.FromMinutes(5),
                    defaultLocationForValueInfo = (ce.args.Count < 4) ? null : OPs.TryAsString(ce.args[3], ctx)
                };
                return(sqlCtx.LoadingFuncs());
            };
            var lfds = (IEnumerable <FuncDef>)FuncDefs_Core._Cached(cacheKey, ldfsFunc, DateTimeOffset.MaxValue, TimeSpan.FromMinutes(5));

            return(lfds);
        }
示例#12
0
            public LoadingInfo(string dataExpr, object cookie, Generator.Ctx rootCtx)
            {
                this.dataExpr = dataExpr;
                this.cookie   = cookie;
                aggCtx        = new Generator.Ctx(rootCtx);
                var expr = Parser.ParseToExpr(dataExpr);

                aggCode = Generator.Generate(expr, aggCtx);
            }
示例#13
0
        public static object SqlFuncsToDDL(CallExpr ce, Generator.Ctx ctx)
        {
            var locationCode = Convert.ToString(ctx.GetConstant(ce.args[0]));

            using (var sw = new StringWriter())
                using (var drops = new StringWriter())
                {
                    SqlFuncsToDDL_Impl(ctx, sw, drops, locationCode);
                    return(new object[] { sw.ToString(), drops.ToString() });
                }
        }
示例#14
0
文件: OPs.cs 项目: WVitek/DotGlue
        public static Task <object> GlobalValueOfAny(object funcOrValue, Generator.Ctx ctx, int nMaxParallelism, CancellationToken cancellation)
        {
            if (nMaxParallelism < 1)
            {
                nMaxParallelism = 1024;
            }
            var sema = W.Common.Utils.NewAsyncSemaphore(nMaxParallelism);
            var ae   = new AsyncExprRootCtx(ctx.name2ndx, ctx.values, sema);

            ae.cancellationToken = cancellation;

            return(ConstValueOf(ae, funcOrValue));
        }
示例#15
0
文件: OPs.cs 项目: WVitek/DotGlue
        public static Task <object> GlobalValueOfAny(object funcOrValue, Generator.Ctx ctx, CancellationToken cancellation)
        {
            //if (nMaxParallelism < 1)
            //	nMaxParallelism = 128;
            //var sema = Cached<IAsyncSemaphore>("WExpr:GlobalMaxParallelismSemaphore",
            //	() => W.Common.Utils.NewAsyncSemaphore(nMaxParallelism),
            //	null, TimeSpan.FromMinutes(5), System.Web.Caching.Cache.NoAbsoluteExpiration);
            var sema = GlobalMaxParallelismSemaphore;
            var ae   = new AsyncExprRootCtx(ctx.name2ndx, ctx.values, sema);

            ae.cancellationToken = cancellation;
            return(ConstValueOf(ae, funcOrValue));
        }
示例#16
0
文件: OPs.cs 项目: WVitek/DotGlue
        public static object GetConstant(this Generator.Ctx ctx, Expr expr)
        {
            var val = Generator.Generate(expr, ctx);

            if (OPs.KindOf(val) == ValueKind.Const)
            {
                return(val);
            }
            else
            {
                return(ctx.Error("Constant expected as value of " + expr.ToString()));
            }
        }
示例#17
0
        static void SqlFuncsToTextImpl(Generator.Ctx ctx, TextWriter wr, Func <ValueInfo, bool> filter)
        {
            foreach (var f in ctx.GetFunc(null, 0))
            {
                if (f.xtraAttrs == null || !f.xtraAttrs.TryGetValue(nameof(QueryTemplate), out var objQT))
                {
                    // no QueryTemplate = is not SQL-originated function
                    continue;
                }
                if (!f.resultsInfo.Any(filter))
                {
                    // no any output parameter from specified location/origin/source
                    continue;
                }

                Attr.TblAttrsFriendlyText(f.xtraAttrs, wr);
                var colAttrs  = (IList <Dictionary <Attr.Col, object> >)f.xtraAttrs[nameof(Attr.Tbl._columns_attrs)];
                var queryTmpl = (QueryTemplate)objQT;
                var sql       = queryTmpl.SrcSqlExpr;
                foreach (SqlSectionExpr sec in sql.args)
                {
                    var  args        = sec.args;
                    var  attrs       = (sec.kind == SqlSectionExpr.Kind.Select) ? colAttrs : null;
                    bool fromNewLine = args.Count > 1 || attrs != null;
                    wr.Write(sec.sectionName);
                    if (fromNewLine)
                    {
                        wr.WriteLine();
                    }
                    for (int i = 0; i < args.Count; i++)
                    {
                        if (i > 0)
                        {
                            wr.WriteLine(',');
                        }
                        if (attrs != null)
                        {
                            Attr.FriendlyText(attrs[i], wr);
                        }
                        wr.Write(fromNewLine ? '\t' : ' ');
                        wr.Write(args[i]);
                    }
                    wr.WriteLine();
                }
                //wr.WriteLine(sql);
                wr.WriteLine(';');
                wr.WriteLine();
                wr.WriteLine();
            }
        }
示例#18
0
        public static object LookupHelperFuncs(CallExpr ce, Generator.Ctx ctx)
        {
            var dbConn     = ce.args[0];
            var dbConnName = OPs.TryAsName(dbConn, ctx);

            if (dbConnName == null)
            {
                throw new Generator.Exception($"Can't get DB connection name: {dbConn}");
            }

            var pairs = ctx.GetConstant(ce.args[1]) as IList;

            if (pairs == null)
            {
                throw new Generator.Exception($"Can't interpet as array of constants: {ce.args[1]}");
            }
            if (pairs.Count % 2 != 0)
            {
                throw new Generator.Exception($"Items count must be even (cause it must be array of pairs): {ce.args[1]}");
            }

            var location = Convert.ToString(ctx.GetConstant(ce.args[2]));

            var defs = new List <FuncDef>(pairs.Count / 2);

            for (int i = 0; i < pairs.Count; i += 2)
            {
                var dbTableName = pairs[i].ToString();
                var substance   = pairs[i + 1].ToString();

                // Dictionary loader func
                defs.Add(FuncDefs_Core.macroFuncImpl(ctx,
                                                     // name
                                                     new ConstExpr($"{dbConnName}:{dbTableName}_LoadDict"),
                                                     // inputs
                                                     new ArrayExpr(),
                                                     // outputs
                                                     new ArrayExpr(new ConstExpr($"{substance}_DICT_{location}")),
                                                     // body
                                                     new CallExpr(LoadCodeLookupDictRows, dbConn, new ConstExpr(dbTableName)),
                                                     //
                                                     null, false
                                                     ));
            }



            return(defs);
        }
示例#19
0
            public static object AGGR(CallExpr call, Generator.Ctx ctx)
            {
                var dictUsedValues = new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase);
                //var timeSpanExpr = ce.args[0];

                var ce = Filter.ReplaceValueInfoRefsWithData(call, DataLoader.sData, dictUsedValues);

                ctx.CreateValue(DataLoader.sUsedParamsDict, dictUsedValues);
                var expr = new CallExpr(FuncDefs_Solver.SolverTimedObjects,
                                        new CallExpr((Fx)FuncDefs_Solver.SolverTimesOfIDicts, new ReferenceExpr(DataLoader.sData)),
                                        ce.args[ce.args.Count - 1]
                                        );

                return(Generator.Generate(expr, ctx));
            }
示例#20
0
文件: OPs.cs 项目: WVitek/DotGlue
        public static object ValueOfAny(object funcOrValue, int nMaxParallelism, Generator.Ctx ctx, CancellationToken cancellation)
        {
            if (nMaxParallelism < 1)
            {
                nMaxParallelism = 128;
            }
            var ae = new AsyncExprRootCtx(ctx.name2ndx, ctx.values, W.Common.Utils.NewAsyncSemaphore(nMaxParallelism));

            ae.cancellationToken = cancellation;
            var task = ConstValueOf(ae, funcOrValue);

            //task.Start();
            task.Wait();
            return(task.Exception ?? task.Result);
        }
示例#21
0
文件: OPs.cs 项目: WVitek/DotGlue
        public static string TryAsString(Expr expr, Generator.Ctx ctx)
        {
            var ce = expr as ConstExpr;

            if (ce != null)
            {
                return(Convert.ToString(ce.value));
            }
            var val = Generator.Generate(expr, ctx);

            if (OPs.KindOf(val) == ValueKind.Const && val != null)
            {
                return(Convert.ToString(val));
            }
            return(null);
        }
示例#22
0
 public static IEnumerable <Metadata> Load(IReadFiles storage, IEnumerable <string> files, Generator.Ctx parent)
 {
     foreach (var fname in files)
     {
         using (var stream = storage.OpenReadFile(fname))
             using (var reader = new StreamReader(stream))
             {
                 var ctx = new Generator.Ctx(parent);
                 ctx.CreateValue(sMetadataFile, fname);
                 foreach (var m in Metadata.Create(reader, ctx))
                 {
                     yield return(m);
                 }
             }
     }
 }
示例#23
0
        public static object COLUMN(CallExpr ce, Generator.Ctx ctx)
        {
            var cellName = OPs.TryAsName(ce.args[0], ctx);

            if (cellName == null)
            {
                throw new Generator.Exception($"COLUMN(cellName): can't get cell name from expession // {ce.args[0]}");
            }
            int i = 0;

            if (CellRange.ParseCellName(cellName, ref i, cellName.Length, out int row, out int col))
            {
                return(col);
            }
            throw new Generator.Exception($"COLUMN(cellName): can't parse given cell name // {cellName}");
        }
示例#24
0
        public static object FindDependencies(CallExpr ce, Generator.Ctx ctx)
        {
            var arg0 = Generator.Generate(ce.args[0], ctx);

            if (OPs.KindOf(arg0) != ValueKind.Const || arg0 == null)
            {
                throw new SolverException("FindDependencies: list of source params must be constant and not null");
            }
            var arg1 = (ce.args.Count > 1) ? Generator.Generate(ce.args[1], ctx) : null;

            if (OPs.KindOf(arg1) != ValueKind.Const)
            {
                throw new SolverException("FindDependencies: optional list of dependent params must be constant");
            }
            var arg2 = (ce.args.Count > 2) ? Generator.Generate(ce.args[2], ctx) : null;

            if (OPs.KindOf(arg2) != ValueKind.Const)
            {
                throw new SolverException("FindDependencies: optional list of unusable params must be constant");
            }
            var srcPrms   = ((IList)arg0).Cast <object>().Select(o => o.ToString()).ToArray();
            var depPrms   = (arg1 == null) ? null : ((IList)arg1).Cast <object>().Select(o => o.ToString()).ToArray();
            var unusables = (arg2 == null)
                ? new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase)
                : ((IList)arg2).Cast <object>().Select(o => o.ToString()).ToDictionary(s => s, StringComparer.OrdinalIgnoreCase);
            var aliasOf      = GetAliases(ctx);
            var funcs        = Dependecies.GetFuncInfos(ctx.GetFunc(null, 0), aliasOf, fi => !fi.inputs.Any(inp => unusables.ContainsKey(inp)));
            var dependencies = Dependecies.Find(funcs, aliasOf, int.MaxValue, srcPrms, depPrms);
            var resDict      = new Dictionary <string, bool>(StringComparer.OrdinalIgnoreCase);
            var resParams    = (depPrms == null)
                ? dependencies.Keys.Except(srcPrms, StringComparer.OrdinalIgnoreCase)
                : depPrms.Where(s => dependencies.ContainsKey(s));
            var res = new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase);

            foreach (var prmName in resParams)
            {
                var deps = dependencies[prmName];
                var srcs = srcPrms.Where(s => deps.ContainsKey(s)).ToArray();
                if (srcs.Length > 0)
                {
                    res.Add(prmName, srcs);
                }
            }
            return(res);
        }
示例#25
0
        public static object WRptGenerateReportExpr(CallExpr ce, Generator.Ctx callerCtx)//(object tmplFileName, Expr outputFilesExpr)
        {
            var ctx = new Generator.Ctx(callerCtx);

            ctx.CreateValue(FuncDefs_Core.stateTryGetConst, string.Empty);
            var templateFileName = Convert.ToString(Generator.Generate(ce.args[0], ctx));
            var outputFilesExpr  = ce.args[1];
            var sheetExprs       = new List <Expr>();
            int iSheet           = 0;
            int blockNum         = 0;

            var xr = new Xlsx.Reader(templateFileName);

            var lstStrTbl = new OPs.ListOfConst(xr.stringTable);

            ctx.CreateValue(XlsxR.Sheet.sStrTbl, lstStrTbl);

            foreach (var s in xr.EnumSheetInfos())
            {
                var cells     = new XlsxR.Sheet(s.sheetCells.ToArray(), xr.styles);
                var sheetExpr = cells.GetSheetExpr(s.sheetFile, ctx, outputFilesExpr, ref blockNum);
                sheetExprs.Add(new CallExpr(FuncDefs_Core._block,
                                            sheetExpr,
                                            XlsxR.PROGRESS("sheet", new ConstExpr(xr.sheetNames[iSheet]))
                                            ));
                iSheet++;
            }
            ;

            var loopRef = new ReferenceExpr("sheet");

            var res = CallExpr.Eval(
                CallExpr.let(new ConstExpr(XlsxR.Sheet.sTmplFiles), new ConstExpr(xr.xmlFiles)),
                CallExpr.let(new ConstExpr(XlsxR.Sheet.sStrTbl), new ConstExpr(lstStrTbl)),
                XlsxR.PROGRESS("sheets", new ConstExpr(new OPs.ListOfConst(xr.sheetNames))),
                new CallExpr(FuncDefs_Core._ForEach, loopRef, new ArrayExpr(sheetExprs), loopRef),
                new CallExpr((Fxy)WRptCopyFiles, new ConstExpr(xr.xmlFiles), outputFilesExpr),
                new CallExpr((Fx)WRptWriterDone, outputFilesExpr)
                );

            return(res);
        }
示例#26
0
        public static object letLookupFunc(CallExpr ce, Generator.Ctx ctx)
        {
            var    arg0 = ce.args[0];
            object name;
            var    ref0 = arg0 as ReferenceExpr;

            if (ref0 != null)
            {
                name = ref0.name;
            }
            else
            {
                name = Generator.Generate(arg0, ctx);
                if (OPs.KindOf(name) != ValueKind.Const)
                {
                    throw new SolverException("letLookupFunc(name, ...) : name must be constant");
                }
            }
            var keysDescriptorObjs = Generator.Generate(ce.args[1], ctx);
            var keysDescriptors    = keysDescriptorObjs as IList;

            if (OPs.KindOf(keysDescriptorObjs) != ValueKind.Const || keysDescriptors == null)
            {
                throw new SolverException("letLookupFunc(...,keysDescrs ...) : keysDescrs must be list of constants");
            }
            var valsDescriptorObjs = Generator.Generate(ce.args[2], ctx);
            var valsDescriptors    = valsDescriptorObjs as IList;

            if (OPs.KindOf(valsDescriptorObjs) != ValueKind.Const || valsDescriptors == null)
            {
                throw new SolverException("letLookupFunc(...,...,valuesDescrs ...) : valuesDescrs must be list of constants");
            }
            var body = ce.args[3];
            var func = (Macro)((expr, gctx) =>
                               Generator.Generate(body, gctx)
                               );
            var keys = keysDescriptors.Cast <object>().Select(Convert.ToString);
            var vals = valsDescriptors.Cast <object>().Select(Convert.ToString);
            var fd   = GetLookupFuncDef(Convert.ToString(name), keys, vals, func);

            return(Generator.Generate(CallExpr.let(ce.args[0], new ConstExpr(fd)), ctx));
        }
示例#27
0
        public static object Filtering(CallExpr ce, Generator.Ctx ctx)
        {
            // имя входного параметра
            var inputParam = (string)Generator.Generate(ce.args[0], ctx);
            var sourceData = ce.args[1].ToString();

            // условия фильтрации, связанные по AND
            IList <Expr> filterConditions;
            {
                var cond = ce.args[2] as CallExpr;
                if (cond == null || cond.funcName != "AND")
                {
                    cond = (CallExpr)Parser.ParseToExpr(Convert.ToString(Generator.Generate(ce.args[2], ctx)));
                    System.Diagnostics.Trace.Assert(cond.funcName == "AND", "Filtering: AND");
                }
                filterConditions = cond.args;
            }
            var outputParams = ((IList)Generator.Generate(ce.args[3], ctx)).Cast <string>().ToArray();

            return(Filter.Filtering(ctx, inputParam, sourceData, filterConditions, outputParams));
        }
示例#28
0
        static object solverAliasImpl(CallExpr ce, Generator.Ctx ctx)
        {
            var alias = OPs.TryAsName(ce.args[0], ctx);

            if (alias == null)
            {
                throw new SolverException(string.Format(ce.funcName + "(alias ...): alias must be constant or name instead of [{0}]", ce.args[0]));
            }
            var target = (ce.args.Count > 1) ? OPs.TryAsName(ce.args[1], ctx) : string.Empty;

            if (target == null)
            {
                throw new SolverException(string.Format(ce.funcName + "(..., target ...): target must be constant or name instead of [{0}]", ce.args[0]));
            }
            int priority = (ce.args.Count > 2) ? Convert.ToInt32(ctx.GetConstant(ce.args[2])) : 255;
            int i        = ctx.GetOrCreateIndexOf(optionSolverAliases);
            var aliases  = ctx[i] as SolverAliases;

            if (aliases == null)
            {
                aliases = new SolverAliases();
                ctx[i]  = aliases;
            }
            switch (ce.funcName)
            {
            case nameof(solverAlias):
                return(aliases.Set(alias, target, priority));

            case nameof(solverAliasPush):
                return(aliases.Push(alias, target));

            case nameof(solverAliasPop):
                return(aliases.Pop(alias));

            default:
                throw new NotImplementedException(ce.funcName);
            }
        }
示例#29
0
            public Task LoadData(AsyncExprCtx rootAec, Expr loadingExpr, CancellationToken ct)
            {
                int i = aggCtx.IndexOf(sFactory);

                if (i >= 0)
                {
                    var f = (WeightedSums.Factory)aggCtx[i];
                    foreach (var n2i in aggCtx.name2ndx)
                    {
                        if (n2i.Key.StartsWith(sAkk))
                        {
                            aggCtx[n2i.Value] = f.NewSums();
                        }
                    }
                }
                var loadingCtx = new Generator.Ctx(aggCtx.parent);

                loadingCtx.CreateValue(sUsedParamsDict, aggCtx[aggCtx.IndexOf(sUsedParamsDict)]);
                loadingCtx.CreateValue(sLoadingInfo, this);
                var loadingCode = Generator.Generate(loadingExpr, loadingCtx);
                var ae          = new AsyncExprCtx(loadingCtx, loadingCtx.values, rootAec);

                return(OPs.ConstValueOf(ae, loadingCode));
            }
示例#30
0
        public static object WRptExploreDependencies(CallExpr ce, Generator.Ctx callerCtx)//(object tmplFileName, string[] forCells)
        {
            var ctx = new Generator.Ctx(callerCtx);

            ctx.CreateValue(FuncDefs_Core.stateTryGetConst, string.Empty);
            var templateFileName = Convert.ToString(Generator.Generate(ce.args[0], ctx));
            var sheets           = new Dictionary <string, XlsxR.Sheet>();

            var xr = new Xlsx.Reader(templateFileName);

            foreach (var s in xr.EnumSheetInfos())
            {
                sheets.Add(s.sheetName, new XlsxR.Sheet(s.sheetCells.ToArray(), xr.styles));
            }

            var forCells = Utils.AsIList(Generator.Generate(ce.args[1], ctx))
                           .Cast <object>()
                           .Select(o => Convert.ToString(o))
                           .ToArray();

            var code = DepsHelper.DumpDeps(ctx, sheets, xr.stringTable, forCells);

            return(code);
        }