Esempio n. 1
0
        public void TakeNonPersistentExprs(ITransformationSchema schema)
        {
            this.nonPersistentExprs.Clear();
            foreach (AssignmentObject assignmentObject in schema.AssignmentObjects)
            {
                IExpression expr = assignmentObject.Expression;
                if (!assignmentObject.IsPersistentAssignment)
                {
                    string renderResult = this._opRendererResolver(expr.OperatorSymbol).Render(expr);

                    if (expr.IsScalar)
                    {
                        this.nonPersistentExprs.Add(assignmentObject.Expression, $"DECLARE @{assignmentObject.Name} {this.GetType(expr)} = {renderResult};");
                    }
                    else
                    {
                        StringBuilder result = new StringBuilder();
                        if (expr.OperatorSymbol == "fill_time_series")
                        {
                            result.AppendLine((this._opRendererResolver(expr.OperatorSymbol) as FillTimeSeriesOperatorRenderer).RenderWith(expr));
                        }
                        result.AppendLine($"SELECT * INTO #{assignmentObject.Name} FROM (\n{renderResult}) AS t");

                        if (expr.OperatorSymbol == "exists_in" && expr.OperatorDefinition.Keyword == "false")
                        {
                            result.Append($" WHERE {expr.Structure.Measures[0].ComponentName} = 0");
                        }

                        this.nonPersistentExprs.Add(assignmentObject.Expression, result.ToString());
                    }
                }
            }
        }
        /// <summary>
        /// Performs removing a dead code for a transformation schema.
        /// </summary>
        /// <param name="schema">The transformation schema to modify.</param>
        public void Modify(ITransformationSchema schema)
        {
            this.schema = schema;
            List <string> usedObjects = new List <string>(); // object list used in the schema

            for (byte stage = 1; stage <= 3; stage++)
            {
                if (stage == 2) // stage of removing unused non persistent objects (refs) from the schema
                {
                    this.schema.AssignmentObjects.RemoveAll(ao => !ao.IsPersistentAssignment && !ao.Name.In(usedObjects.ToArray()));
                }
                else
                {
                    foreach (AssignmentObject assignmentObject in this.schema.AssignmentObjects)
                    {
                        if (stage == 1 && assignmentObject.IsPersistentAssignment)              // stage of searching used objects by the current object - if the persistent assignment object
                        {
                            usedObjects.Add(assignmentObject.Name);                             // persistent assignment object addition
                            usedObjects.AddRange(this.SearchRefs(assignmentObject.Expression)); // addition of used object by the current persistent assignment object
                        }
                        else if (stage == 3)                                                    // stage of removing unused non persistent objects (refs) from assignment objects users
                        {
                            if (assignmentObject.IsPersistentAssignment)
                            {
                                (assignmentObject.Users as List <AssignmentObject>).Clear();                                         // persistent assignment object doesn't need specified users - it's not a reference
                            }
                            else
                            {
                                (assignmentObject.Users as List <AssignmentObject>).RemoveAll(user => !user.Name.In(usedObjects.ToArray())); // removement of unused non persistent objects (refs)
                            }
                        }
                    }
                }
            }
        }
 /// <summary>
 /// Performs replacing dataset operators to "join" operators.
 /// </summary>
 /// <param name="schema">The schema to modify.</param>
 public void Modify(ITransformationSchema schema)
 {
     foreach (AssignmentObject assignmentObject in schema.AssignmentObjects)
     {
         assignmentObject.Expression = this.TransformDatasets(assignmentObject.Expression);
     }
 }
        public void Constructor_JoinExpr_JoinExpr()
        {
            IExpression           expr    = TestExprFactory.GetExpression("join", ExpressionFactoryNameTarget.OperatorSymbol);
            IExpression           refExpr = ModelResolvers.ExprResolver();
            ITransformationSchema schema  = ModelResolvers.SchemaResolver();

            refExpr.AddOperand("ds", expr);
            expr.ContainingSchema    = schema;
            expr.ReferenceExpression = refExpr;

            IJoinExpression joinExpr2 = ModelResolvers.JoinExprResolver(expr);

            joinExpr2.BasicStructure = ModelResolvers.DsResolver();

            JoinExpression joinExpr = new JoinExpression(joinExpr2);

            Assert.Equal(expr.ParentExpression, joinExpr.ParentExpression);
            Assert.Equal(expr.ContainingSchema, joinExpr.ContainingSchema);
            Assert.Equal(expr.ExpressionText, joinExpr.ExpressionText);
            Assert.Equal(expr.LineNumber, joinExpr.LineNumber);
            Assert.Equal(expr.OperandsCollection, joinExpr.OperandsCollection);
            Assert.Equal(expr.OperatorDefinition, joinExpr.OperatorDefinition);
            Assert.Equal(expr.ParamSignature, joinExpr.ParamSignature);
            Assert.Equal(expr.ReferenceExpression, joinExpr.ReferenceExpression);
            Assert.Equal(expr.ResultName, joinExpr.ResultName);
            Assert.Equal(expr.Structure, joinExpr.Structure);
            Assert.Equal(joinExpr2.BasicStructure, joinExpr.BasicStructure);
        }
 /// <summary>
 /// Performs putting "using" branches to "inner" and "left" "join" operator expressions that do not contain them.
 /// </summary>
 /// <param name="schema">The schema to modify.</param>
 public void Modify(ITransformationSchema schema)
 {
     foreach (AssignmentObject assignmentObject in schema.AssignmentObjects)
     {
         this.ModifyJoins(assignmentObject.Expression);
     }
 }
Esempio n. 6
0
 public void MapNames(ITransformationSchema schema)
 {
     foreach (AssignmentObject assignmentObject in schema.AssignmentObjects)
     {
         this.MapName(assignmentObject.Expression, true);
     }
 }
 public void SetContainingSchema(ITransformationSchema schema)
 {
     this.ContainingSchema = schema;
     foreach (IExpression operand in this.OperandsCollection)
     {
         operand.SetContainingSchema(schema);
     }
 }
 public string Render(ITransformationSchema schema)
 {
     if (this._conf.ExprType == ExpressionsType.Standard)
     {
         return(this.Render(this.RenderTransformationSchema(schema.GetExpressions())));
     }
     return(this.Render(this.RenderTransformationSchema(schema.Rulesets)));
 }
        /// <summary>
        /// Initialises a new instance of the <see cref="AssignmentObject"/> class.
        /// </summary>
        /// <param name="schema">The transformation schema the assignment object is assigned to.</param>
        /// <param name="expression">The expression to assign to assignment object.</param>
        /// <param name="isPersistentAssignment">The value indicating whether the assignment is persistent.</param>
        /// <param name="refsNames">The collection of assignment objects names that this instance's expression contains.</param>
        public AssignmentObject(ITransformationSchema schema, IExpression expression, bool isPersistentAssignment, ICollection <string> refsNames)
        {
            this.ContainingSchema       = schema;
            this.Name                   = expression.ResultName;
            this.Expression             = expression;
            this.IsPersistentAssignment = isPersistentAssignment;
            this.Users                  = new List <AssignmentObject>();

            foreach (string userName in refsNames)
            {
                this.ContainingSchema.AssignmentObjects[userName].Users.Add(this);
            }
        }
        public string Render(ITransformationSchema schema)
        {
            StringBuilder scriptSB      = new StringBuilder();
            StringBuilder assignmentsSB = new StringBuilder();

            try
            {
                this._mapper.MapNames(schema);
                this._refs.TakeNonPersistentExprs(schema);

                foreach (AssignmentObject assignmentObject in schema.AssignmentObjects)
                {
                    if (this._refs.ContainsExpression(assignmentObject.Expression))
                    {
                        assignmentsSB.AppendLine(this._refs.RenderNonPersistentExpr(assignmentObject.Expression)); // non-persistent assignment expressions rendering
                    }
                    else
                    {
                        assignmentsSB.AppendLine(this.RenderPersistentExpr(assignmentObject.Expression)); // persistent assignment expressions rendering
                    }
                }

                if (this._conf.UseComments)
                {
                    scriptSB.AppendLine($"-- Script generated: {DateTime.Now}");
                }
                scriptSB.AppendLine("BEGIN TRANSACTION\n");
                for (int i = 1; i <= this._tmpTables.Count; i++)
                {
                    scriptSB.AppendLine($"IF OBJECT_ID (N'tempdb..{this._tmpTables.Name}{i}', N'U') IS NOT NULL");
                    scriptSB.AppendLine($"DROP TABLE {this._tmpTables.Name}{i}\n");
                }

                scriptSB.AppendLine(this._refs.RenderDroppingOfTables());
                scriptSB.Append(assignmentsSB.ToString());
                scriptSB.AppendLine("COMMIT TRANSACTION");
                scriptSB.AppendLine("GO");
            }
            catch (VtlTargetError ex)
            {
                this._logger?.LogError(ex, ex.Message);
            }
            catch (Exception ex)
            {
                this._logger?.LogCritical(ex, ex.Message);
            }

            return(scriptSB.ToString());
        }
        /// <summary>
        /// Translates a given transformation schema to target's language code whose target name is given.
        /// </summary>
        /// <param name="schema">The transformation schema.</param>
        /// <param name="targetName">The name of a target.</param>
        /// <param name="schemaProcessed">Specifies if the schema has been processed by middle-end operations (ex. type inference).</param>
        /// <returns></returns>
        public string Translate(ITransformationSchema schema, string targetName, bool schemaProcessed = false)
        {
            ITargetRenderer targetRenderer = this._provider.GetTargetRenderer(targetName);

            if (!schemaProcessed)
            {
                this._provider.GetMiddleEnd().Process(schema);
            }
            if (targetRenderer == null)
            {
                throw new NullReferenceException($"Target renderer named \"{targetName}\" has been not found.");
            }

            return(this._provider.GetTargetRenderer(targetName).Render(schema));
        }
Esempio n. 12
0
        public void SetContainingSchema_Schema_SetsSchema()
        {
            ITransformationSchema schema = ModelResolvers.SchemaResolver();
            Expression            expr   = new Expression();

            expr.AddOperand("ds_1", ModelResolvers.ExprResolver());

            Assert.Null(expr.ContainingSchema);
            Assert.Null(expr.Operands["ds_1"].ContainingSchema);

            expr.SetContainingSchema(schema);

            Assert.Equal(expr.ContainingSchema, schema);
            Assert.Equal(expr.Operands["ds_1"].ContainingSchema, schema);
        }
Esempio n. 13
0
        public TranslationResponse Tanslate(TranslationParameters parameters)
        {
            this._dataModelAggregator.EnvironmentMapper.Mapping = parameters.DataMappers;
            this._dataModelAggregator.DefaultNamespace          = parameters.DefaultNamespace;
            this._dataModelAggregator.DataModelsCollection.Clear();

            foreach (var dataSource in parameters.DataSources)
            {
                switch (dataSource.Type.ToLower())
                {
                case "json":
                    this._dataModelAggregator.AddJsonModel(dataSource.Localization);
                    break;

                case "sdmx":
                    this._dataModelAggregator.AddSdmxModel(dataSource.Localization, dataSource.Namespace);
                    break;

                case "tsql":
                    this._dataModelAggregator.AddSqlServerModel(dataSource.Localization);
                    break;

                default:
                    return(new TranslationResponse(new ArgumentException("Unexpected model type.")));
                }
            }

            ITransformationSchema schema = this._treeGenerator.BuildTransformationSchema(parameters.Experession);

            this._schemaModifiersApplier.Process(schema);

            bool areErrors = this._errorCollectorProvider.ErrorCollectors.Sum(counter => counter.Errors.Count) > 0;

            if (areErrors)
            {
                return(new TranslationResponse(this._errorCollectorProvider.ErrorCollectors.SelectMany(ec => ec.Errors).ToList()));
            }

            ITargetRenderer target = this._targetRenderers.FirstOrDefault(tr => tr.Name == parameters.Target);

            if (target == null)
            {
                return(new TranslationResponse(new ArgumentException("Unexpected target type.")));
            }

            return(new TranslationResponse(target.Render(schema)));
        }
Esempio n. 14
0
        static void Main(string[] args)
        {
            Translator translator = new Translator((configure) =>
            {
                configure.AddPlantUmlTarget((config) =>
                {
                    config.AddDataStructureObject();
                    config.UseArrowFirstToLast();
                    config.ShowNumberLine();
                });

                configure.AddTsqlTarget((config) =>
                {
                    config.AddComments();
                });

                configure.AddLogging((config) =>
                {
                    config.AddConsole();
                    config.AddDebug();
                });
            });

            translator.EnvironmentMapper.Mapping = new Dictionary <string, string>()
            {
                { "Json", string.Empty },
                { "Regular", string.Empty },
                { "Namespace", "[DbSchema].[DbTable]." },
            };

            translator.DataModels.AddJsonModel($"{Directory.GetCurrentDirectory()}\\DataModel.json");
            translator.DataModels.AddDictionaryModel(RegularModel.ModelConfiguration, "Regular");
            translator.DataModels.DefaultNamespace = "Json";

            ITransformationSchema schema = translator.CreateSchema(Example.Source);

            if (translator.Errors.Count == 0)
            {
                string plantUmlResult          = translator.Translate(schema, "PlantUML");
                PlantUmlUrlConverter converter = new PlantUmlUrlConverter(plantUmlResult);
                Process.Start("cmd.exe", $"/C start {converter.SVGUrl}");

                string tsqlResult = translator.Translate(schema, "TSQL");
                Debug.WriteLine(tsqlResult);
            }
        }
        public string Translate(TranslateOptions parameters)
        {
            dataModelAggregator.DefaultNamespace = parameters.DefaultNamespace;
            dataModelAggregator.DataModelsCollection.Clear();
            dataModelAggregator.AddJsonModel(parameters.Model);

            if (parameters.NamespaceMapping != null && parameters.NamespaceMapping != string.Empty)
            {
                // example mapping: "Json;Regular;Namespace=[DbSchema].[DbTable]."
                foreach (string map in parameters.NamespaceMapping.Split(';'))
                {
                    var sp = map.Split('=');
                    switch (sp.Length)
                    {
                    case 1:
                        this.mapper.Mapping.Add(sp[0], string.Empty);
                        break;

                    case 2:
                        this.mapper.Mapping.Add(sp[0], sp[1]);
                        break;

                    default:
                        throw new ArgumentException("Invalid format of namespace mapping argument");
                    }
                }
            }
            else
            {
                this.mapper.Mapping.Add(parameters.DefaultNamespace, string.Empty);
            }

            ITransformationSchema schema = treeGenerator.BuildTransformationSchema(parameters.Input.OpenText().ReadToEnd());

            schemaModifiersApplier.Process(schema);

            ITargetRenderer target = targetRenderers.FirstOrDefault(tr => tr.Name.ToLower() == parameters.Target.ToLower());

            if (target == null)
            {
                throw new ArgumentException("Unexpected target type.");
            }

            return(target.Render(schema));
        }
Esempio n. 16
0
 /// <summary>
 /// Performs processing of the schema.
 /// </summary>
 /// <param name="schema">The schema object to be processed.</param>
 public void Process(ITransformationSchema schema)
 {
     foreach (ISchemaModifier mod in this._modifiers)
     {
         try
         {
             mod.Modify(schema);
         }
         catch (VtlOperatorError ex)
         {
             this._logger?.LogError(ex, ex.Message);
         }
         catch (Exception ex)
         {
             this._logger?.LogCritical(ex, ex.Message);
         }
     }
 }
        protected string TranslateVtl(string source, out List <Exception> errors)
        {
            ITransformationSchema schema = this.frontEnd.BuildTransformationSchema(source);

            this.middleEnd.Process(schema);

            ITargetRenderer tsqlRenderer = this.provider.GetTargetRenderer("TSQL");

            string sql = tsqlRenderer.Render(schema);

            errors = new List <Exception>();
            foreach (ErrorCollector errCollector in this.errCollectorProvider.ErrorCollectors)
            {
                errors.AddRange(errCollector.Errors);
            }

            return(sql);
        }
        /// <summary>
        /// Performs a type inference for the schema.
        /// </summary>
        /// <param name="schema">The schema to modify.</param>
        public void Modify(ITransformationSchema schema)
        {
            foreach (IRuleset ruleset in schema.Rulesets)
            {
                foreach (IExpression expr in ruleset.RulesCollection)
                {
                    this.Infer(expr);
                }

                ruleset.InferStructure();
            }

            foreach (AssignmentObject assignmentObject in schema.AssignmentObjects)
            {
                this.Infer(assignmentObject.Expression);
                if (assignmentObject.IsPersistentAssignment)
                {
                    this.ValidatePersistentAssignment(assignmentObject.Expression);
                }
            }
        }
        /// <summary>
        /// Translates a given VTL 2.0 source code to target's language code whose target name is given.
        /// </summary>
        /// <param name="vtlSource">The VTL 2.0 source code.</param>
        /// <param name="targetName">The name of a target.</param>
        /// <returns></returns>
        public string Translate(string vtlSource, string targetName)
        {
            ITransformationSchema schema = this.CreateSchema(vtlSource);

            return(this.Translate(schema, targetName));
        }
Esempio n. 20
0
        public static void Main(string[] args)
        {
            string             source           = Example.Source;
            string             connectionString = @"Server=...;Trusted_Connection=True;";
            IServiceCollection services         = new ServiceCollection();

            services.AddVtlProcessing((configure) =>
            {
                configure.DataModels.DefaultNamespace = "Json";
                configure.DataModels.AddSqlServerModel(connectionString);
                configure.DataModels.AddJsonModel($"{Directory.GetCurrentDirectory()}\\DataModel.json"); // namespace name is in a json file
                configure.DataModels.AddDictionaryModel((config) =>
                {
                    config
                    .AddDataSet(
                        "R1",
                        (ComponentType.Identifier, BasicDataType.Integer, "Id1"),
                        (ComponentType.Identifier, BasicDataType.Integer, "Id2"),
                        (ComponentType.Measure, BasicDataType.Integer, "Me1"),
                        (ComponentType.Measure, BasicDataType.Integer, "Me2"),
                        (ComponentType.NonViralAttribute, BasicDataType.String, "At1"),
                        (ComponentType.ViralAttribute, BasicDataType.Integer, "At2")
                        )
                    .AddDataSet(
                        "R2",
                        (ComponentType.Identifier, BasicDataType.Integer, "Id1"),
                        (ComponentType.Measure, BasicDataType.String, "Me1"),
                        (ComponentType.Measure, BasicDataType.Integer, "Me2")
                        )
                    .AddDataSet(
                        "R_num",
                        (ComponentType.Identifier, BasicDataType.Integer, "Id1"),
                        (ComponentType.Measure, BasicDataType.Number, "Me2")
                        );
                }
                                                        , "def_ns");

                configure.EnvironmentMapper.Mapping = new Dictionary <string, string>()
                {
                    { "Json", string.Empty },
                    { "Regular", string.Empty },
                    { "Pivot", "[VtlProcessingTests].[Pivoting]." },
                };
            });

            services.AddPlantUmlTarget((configure) =>
            {
                configure.AddDataStructureObject();
                configure.UseArrowFirstToLast();
                configure.ShowNumberLine();
                configure.UseRuleExpressionsModel();
            });

            services.AddTsqlTarget((configure) =>
            {
                configure.AddComments();
            });

            services.AddLogging((configure) =>
            {
                configure.AddConsole();
                configure.AddDebug();
                configure.AddProvider(new ErrorCollectorProvider());
            });

            ServiceProvider        provider    = services.BuildServiceProvider();
            ErrorCollectorProvider errColector = provider.GetService <ILoggerProvider>() as ErrorCollectorProvider;

            ITransformationSchema schema = provider.GetFrontEnd().BuildTransformationSchema(source); // front-end

            provider.GetMiddleEnd().Process(schema);                                                 // middle-end

            bool areErrors = errColector.ErrorCollectors.Sum(counter => counter.Errors.Count) > 0;

            // back-end:
            ITargetRenderer      plantUmlRenderer = provider.GetTargetRenderer("PlantUML");
            string               plantUmlResult   = plantUmlRenderer.Render(schema);
            PlantUmlUrlConverter converter        = new PlantUmlUrlConverter(plantUmlResult);

            if (!areErrors)
            {
                ITargetRenderer tsqlRenderer = provider.GetTargetRenderer("TSQL");

                Process.Start("cmd.exe", $"/C start {converter.SVGUrl}");

                FilesManager.ResultToFile(plantUmlResult, "result.plantuml");
                FilesManager.ResultToFile(tsqlRenderer.Render(schema), "result.sql");
            }
            else
            {
                Debug.WriteLine($"\n\n{converter.SVGUrl}\n\n");
            }
        }
        private void InitSchema(ref ITransformationSchema schema)
        {
            IDataStructure structureX = ModelResolvers.DsResolver();

            structureX.DatasetName = "X";

            IDataStructure structureY = ModelResolvers.DsResolver();

            structureY.DatasetName = "Y";

            IDataStructure constStructure = ModelResolvers.DsResolver();

            constStructure.DatasetName = "const";

            IExpression expr1_1 = TestExprFactory.GetExpression("get", ExpressionFactoryNameTarget.OperatorSymbol);

            expr1_1.ParamSignature = "ds";
            expr1_1.ExpressionText = "X";
            expr1_1.Structure      = structureX;
            IExpression expr1_2 = TestExprFactory.GetExpression("get", ExpressionFactoryNameTarget.OperatorSymbol);

            expr1_2.ParamSignature = "ds";
            expr1_2.ExpressionText = "Y";
            expr1_2.Structure      = structureY;

            IExpression expr2_1 = expr1_1;                                                                          // X
            IExpression expr2_2 = TestExprFactory.GetExpression("ref", ExpressionFactoryNameTarget.OperatorSymbol); // A

            expr2_2.ParamSignature = "ds";
            expr2_2.ExpressionText = "A";
            expr2_2.Structure      = structureY;                                                                      // struktura Y

            IExpression expr3_1 = expr2_2;                                                                            // A
            IExpression expr3_2 = TestExprFactory.GetExpression("const", ExpressionFactoryNameTarget.OperatorSymbol); // 2

            expr3_2.ParamSignature = "ds";
            expr3_2.ExpressionText = "2";
            expr3_2.Structure      = constStructure;                                                                // struktura const

            IExpression expr4_1 = expr1_2;                                                                          // Y
            IExpression expr4_2 = TestExprFactory.GetExpression("ref", ExpressionFactoryNameTarget.OperatorSymbol); // B

            expr4_2.ParamSignature = "ds";
            expr4_2.ExpressionText = "B";
            expr4_2.Structure      = structureX;                                                                // struktura X

            IExpression expr1 = TestExprFactory.GetExpression("+", ExpressionFactoryNameTarget.OperatorSymbol); // A := X + Y

            expr1.ResultName         = "A";
            expr1.ExpressionText     = "X + Y";
            expr1.ParamSignature     = "<root>";
            expr1.OperandsCollection = new List <IExpression>()
            {
                expr1_1, expr1_2
            };
            expr1.Structure = structureY;                                                                       // struktura Y

            IExpression expr2 = TestExprFactory.GetExpression("-", ExpressionFactoryNameTarget.OperatorSymbol); // B := X - 2

            expr2.ResultName         = "B";
            expr2.ExpressionText     = "X - A";
            expr2.ParamSignature     = "<root>";
            expr2.OperandsCollection = new List <IExpression>()
            {
                expr2_1, expr2_2
            };
            expr2.Structure = structureX;                                                                       // struktura X

            IExpression expr3 = TestExprFactory.GetExpression("*", ExpressionFactoryNameTarget.OperatorSymbol); // C <- A * 2

            expr3.ResultName         = "C";
            expr3.ExpressionText     = "A - 2";
            expr3.ParamSignature     = "<root>";
            expr3.OperandsCollection = new List <IExpression>()
            {
                expr3_1, expr3_2
            };
            expr3.Structure = structureY;                                                                       // strktura Y

            IExpression expr4 = TestExprFactory.GetExpression("+", ExpressionFactoryNameTarget.OperatorSymbol); // D := Y + B

            expr4.ResultName         = "D";
            expr4.ExpressionText     = "Y + B";
            expr4.ParamSignature     = "<root>";
            expr4.OperandsCollection = new List <IExpression>()
            {
                expr4_1, expr4_2
            };
            expr4.Structure = structureY; // struktura Y

            schema = ModelResolvers.SchemaResolver();
            schema.AssignmentObjects.Add(new AssignmentObject(schema, expr1, false, new string[0]));        // A := X + Y
            schema.AssignmentObjects.Add(new AssignmentObject(schema, expr2, false, new string[] { "A" })); // B := X - 2
            schema.AssignmentObjects.Add(new AssignmentObject(schema, expr3, true, new string[] { "A" }));  // C <- A * 2
            schema.AssignmentObjects.Add(new AssignmentObject(schema, expr4, false, new string[] { "B" })); // D := Y + B
        }