Exemple #1
0
        /// <summary>
        ///     Parse requested query into Abstract Syntax Tree
        /// </summary>
        /// <param name="request">User defined request</param>
        /// <returns>Abstract syntax tree</returns>
        protected override RootScriptNode InstantiateRootNodeFromRequest(ConvertionRequest <TMethodsAggregator> request)
        {
            string[] formats;

            if (request.Formats == null || request.Formats.Length == 0)
            {
                formats = _defaultFormats;
            }
            else
            {
                formats = request.Formats;
            }

            var sourceTime      = TimeZoneInfo.ConvertTime(DateTimeOffset.Now, request.Source);
            var destinationTime = TimeZoneInfo.ConvertTime(sourceTime, request.Target);

            var preprocessor = new Preprocessor.Preprocessor(destinationTime, formats);
            var query        = preprocessor.Execute(request.Query);
            var lexer        = new Lexer(query, true);

            var parser = new RdlParser(lexer, formats, request.CultureInfo,
                                       new MethodDeclarationResolver(Metdatas), MethodOccurences);

            return(parser.ComposeRootComponents());
        }
Exemple #2
0
        /// <summary>
        ///     Convert Abstract Syntax Tree to Virtual Machine object with associated virtual code for such machine
        /// </summary>
        /// <param name="ast">Abstract Syntax Tree.</param>
        /// <param name="request">Request used by user to perform convertion.</param>
        /// <returns>Object that allows evaluate next occurences</returns>
        private ConvertionResponse <IFireTimeEvaluator> Convert(RootScriptNode ast,
                                                                ConvertionRequest <TMethodsAggregator> request)
        {
            var coretnessChecker        = new RdlQueryValidator(Metdatas);
            var queryValidatorTraverser = new Traverser(coretnessChecker);

            ast.Accept(queryValidatorTraverser);

            if (!coretnessChecker.IsValid)
            {
                return(new ConvertionResponse <IFireTimeEvaluator>(null, coretnessChecker.Errors.ToArray()));
            }

            var contextChangeTracker = new Stack <bool>();
            var scopeGenerator       = new ContextGenerator(contextChangeTracker);
            var scopeTraverser       = new ContextGeneratorTraverser(scopeGenerator, contextChangeTracker);

            ast.Accept(scopeTraverser);

            var codeGenerator = request.Debuggable
                ? new DebuggerSymbolGenerator(Metdatas, request.MethodsAggregator, MethodOccurences)
                : new CodeGenerator(Metdatas, request.MethodsAggregator, MethodOccurences);

            var codeGenerationTraverseVisitor = new ExtendedTraverser(codeGenerator, scopeGenerator.Scope.GetRootOfAllScopes());

            ast.Accept(codeGenerationTraverseVisitor);
            IFireTimeEvaluator evaluator = codeGenerator.CreateVirtualMachine(request.CancellationToken);

            if (evaluator == null)
            {
                return(new ConvertionResponse <IFireTimeEvaluator>(null, coretnessChecker.Errors.ToArray()));
            }

            evaluator = new TimeZoneAdjuster(request.Source, evaluator);
            evaluator = new DaylightSavingTimeTracker(request.Source, evaluator);

            return(request.Source == request.Target
                ? new ConvertionResponse <IFireTimeEvaluator>(evaluator)
                : new ConvertionResponse <IFireTimeEvaluator>(new TimeZoneChangerDecorator(request.Source, request.Target, evaluator)));
        }
Exemple #3
0
 /// <summary>
 ///     Determine if request is valid (it doesn't validate if query is valid)
 /// </summary>
 /// <param name="request">User defined request</param>
 /// <returns>Return if request is valid</returns>
 protected override bool IsValid(ConvertionRequest <TMethodsAggregator> request)
 => !string.IsNullOrEmpty(request.Query);
Exemple #4
0
 /// <summary>
 ///     Convert user request into reponse that contains evaluator
 /// </summary>
 /// <param name="request">Query convertion request</param>
 /// <returns>Response with evaluator</returns>
 public ConvertionResponse <IFireTimeEvaluator> Convert(ConvertionRequest <TMethodsAggregator> request)
 => base.Convert(request, ast => Convert(ast, request));