/// <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()); }
/// <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))); }
/// <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);
/// <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));