Exemple #1
0
        public void Try1()
        {
            const string xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData'>
          <rows>
            <add id='1' xml=""&lt;things&gt;&lt;add name='deez'/&gt;&lt;add name='nutz'/&gt;&lt;/things&gt;"" />
            <add id='2' xml=""&lt;things&gt;&lt;add name='got'/&gt;&lt;add name='eeee'/&gt;&lt;/things&gt;"" />
          </rows>
          <fields>
                <add name='id' type='int' />
                <add name='xml' length='max'>
                    <transforms>
                        <add method='fromxml' root='things' xml-mode='all'>
                            <fields>
                                <add name='name' node-type='attribute' />
                            </fields>
                        </add>
                    </transforms>
                </add>
            </fields>
        </add>
      </entities>
    </add>";

            var logger  = new ConsoleLogger(LogLevel.Debug);
            var fromXml = new TransformHolder((c) => new Transformalize.Transforms.Xml.FromXmlTransform(c), new Transformalize.Transforms.Xml.FromXmlTransform().GetSignatures());

            using (var cfgScope = new ConfigurationContainer(fromXml).CreateScope(xml, logger)) {
                var process = cfgScope.Resolve <Process>();

                using (var scope = new Container(fromXml).CreateScope(process, logger)) {
                    var output = scope.Resolve <IProcessController>().Read().ToArray();

                    Assert.AreEqual(4, output.Length);

                    var name = process.Entities.First().CalculatedFields.First();

                    var first = output[0];
                    Assert.AreEqual("deez", first[name]);

                    var second = output[1];
                    Assert.AreEqual("nutz", second[name]);
                }
            }
        }
Exemple #2
0
        public void TestOne()
        {
            const string main = @"
<cfg name='main'>
    <connections>
        <add name='input' provider='sqlserver' database='test' />
        <add name='output' provider='sqlserver' database='tflTest' />
    </connections>
    <entities>
        <add name='e1'>
            <fields>
                <add name='pk1' primary-key='true' />
                <add name='f1' />
                <add name='fk1' />
            </fields>
        </add>
        <add name='e2'>
            <fields>
                <add name='pk2' primary-key='true' />
                <add name='f2' />
            </fields>
        </add>
    </entities>
    <relationships>
        <add left-entity='e1' left-field='fk1' right-entity='e2' right-field='pk2' />
    </relationships>
    <calculated-fields>
        <add name='cf1' t='format({f1} {f2})' />
    </calculated-fields>
</cfg>
";

            var logger = new TraceLogger(LogLevel.Debug);

            using (var scope = new ConfigurationContainer().CreateScope(main, logger, new Dictionary <string, string>(), "@[]")) {
                var process = scope.Resolve <Process>();
                Assert.AreEqual(0, process.Errors().Length);
                Assert.AreEqual(true, process.CalculatedFields.First().Transforms.First().Method == "format");
                var cfp = process.ToCalculatedFieldsProcess();
                cfp.Load();
                Assert.AreEqual(0, cfp.Errors().Length);
                Assert.IsTrue(cfp.Entities.First().TryGetField("f1", out var f1), "f1 is not in the calculated entity");
                Assert.IsTrue(cfp.Entities.First().TryGetField("f2", out var f2), "f2 is not in the calculated entity");
                Console.WriteLine(cfp.Serialize());
            }
        }
        public void TestStandardParameter()
        {
            const string xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData'>
          <rows>
            <add Input1='2' Input2='4' Input3='6' />
          </rows>
          <fields>
            <add name='Input1' />
            <add name='Input2' />
            <add name='Input3' />
          </fields>
          <calculated-fields>
            <add name='Value'>
               <transforms>
                  <add method='format' format='{0} and {1}'>
                     <parameters>
                        <add field='Input1' />
                        <add field='Input3' />
                     </parameters>
                  </add>
               </transforms>
            </add>
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var logger = new ConsoleLogger(LogLevel.Debug);

            using (var scope = new ConfigurationContainer().CreateScope(xml, logger)) {
                var process      = scope.Resolve <Process>();
                var targetFields = new List <Field> {
                    process.Entities[0].CalculatedFields.First(f => f.Name == "Value")
                };
                var required = process.Entities[0].FindRequiredFields(targetFields, process.Maps);
                Assert.AreEqual(2, required.Count());
                Assert.IsTrue(required.Any(f => f.Name == "Input1"));
                Assert.IsFalse(required.Any(f => f.Name == "Input2"));
                Assert.IsTrue(required.Any(f => f.Name == "Input3"));
            }
        }
Exemple #4
0
        public void TrySubstring()
        {
            const string xml = @"
    <add name='TestDistinct'>
      <entities>
        <add name='Dates'>
          <rows>
            <add name='dalenewman' />
          </rows>
          <fields>
            <add name='name' />
          </fields>
          <calculated-fields>
            <add name='t1' t='copy(name).substring(4)' />
            <add name='t2' t='copy(name).substring(4,3)' />
            <add name='t3' t='copy(name).substring(4,6)' />
            <add name='t4' t='copy(name).substring(4,7)' />
            <add name='t5' t='copy(name).substring(10)' />
            <add name='t6' t='copy(name).substring(11,1)' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var logger = new ConsoleLogger(LogLevel.Debug);

            using (var cfgScope = new ConfigurationContainer().CreateScope(xml, logger)) {
                var process = cfgScope.Resolve <Process>();

                using (var scope = new Container().CreateScope(process, logger)) {
                    scope.Resolve <IProcessController>().Execute();

                    var row = process.Entities.First().Rows[0];

                    Assert.AreEqual("newman", row["t1"], "should skip dale and return newman (the remaining part of the string)");
                    Assert.AreEqual("new", row["t2"], "should skip dale and return new (3 chars)");
                    Assert.AreEqual("newman", row["t3"], "should skip dale and return newman (6 characters)");
                    Assert.AreEqual("newman", row["t4"], "should skip dale and return newman (7 characters, but only 6 available)");
                    Assert.AreEqual("", row["t5"], "should skip dalenewman and return blank");
                    Assert.AreEqual("", row["t6"], "should skip more than dalenewman and return blank");
                }
            }
        }
        public void Run()
        {
            var logger = new ConsoleLogger();

            const string xml = @"
<add name='TestProcess' read-only='false'>
    <entities>
        <add name='TestData'>
            <rows>
                <add number1='1' number2='1.0' />
                <add number1='2' number2='2.0' />
            </rows>
            <fields>
                <add name='number1' type='int' primary-key='true' v='jint(number1 > 1)' help='javascript validation failed' />
                <add name='number2' type='double' v='jint(if(number2 > 1.0){ true; } else { number2Message = ""special message""; false; })' />
            </fields>
        </add>
    </entities>

</add>";

            using (var outer = new ConfigurationContainer(new JintValidateModule()).CreateScope(xml, logger)) {
                var process = outer.Resolve <Process>();
                using (var inner = new Container(new JintValidateModule()).CreateScope(process, logger)) {
                    var controller = inner.Resolve <IProcessController>();
                    controller.Execute();
                    var rows = process.Entities.First().Rows;

                    Assert.AreEqual(false, rows[0]["number1Valid"]);
                    Assert.AreEqual("javascript validation failed|", rows[0]["number1Message"]);

                    Assert.AreEqual(true, rows[1]["number1Valid"]);
                    Assert.AreEqual("", rows[1]["number1Message"]);

                    Assert.AreEqual(false, rows[0]["number2Valid"]);
                    Assert.AreEqual("special message|", rows[0]["number2Message"]);

                    Assert.AreEqual(true, rows[1]["number2Valid"]);
                    Assert.AreEqual("", rows[1]["number2Message"]);
                }
            }
        }
Exemple #6
0
        public void TrySomeDateMath()
        {
            const string xml = @"
    <add name='TestDateMath'>
      <entities>
        <add name='Dates'>
          <rows>
            <add Date='2017-01-01 9 AM' />
            <add Date='2016-06-07 12:31:22' />
          </rows>
          <fields>
            <add name='Date' type='datetime' />
          </fields>
          <calculated-fields>
            <add name='RoundToMonth' type='datetime' t='copy(Date).dateMath(/M)' />
            <add name='AddOneHourOneMinute' type='datetime' t='copy(Date).DateMath(+1h+1m)' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var logger   = new ConsoleLogger(LogLevel.Debug);
            var dateMath = new TransformHolder((c) => new DateMathTransform(c), new DateMathTransform().GetSignatures());

            using (var cfgScope = new ConfigurationContainer(dateMath).CreateScope(xml, logger)) {
                var process = cfgScope.Resolve <Process>();

                using (var scope = new Container(dateMath).CreateScope(process, logger)) {
                    scope.Resolve <IProcessController>().Execute();

                    var row1 = process.Entities.First().Rows[0];
                    var row2 = process.Entities.First().Rows[1];

                    Assert.AreEqual(new DateTime(2017, 1, 1, 0, 0, 0), row1["RoundToMonth"]);
                    Assert.AreEqual(new DateTime(2017, 1, 1, 10, 1, 0), row1["AddOneHourOneMinute"]);

                    Assert.AreEqual(new DateTime(2016, 6, 1, 0, 0, 0), row2["RoundToMonth"]);
                    Assert.AreEqual(new DateTime(2016, 6, 7, 13, 32, 22), row2["AddOneHourOneMinute"]);
                }
            }
        }
Exemple #7
0
        public void FormatTransformer()
        {
            const string xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData'>
          <rows>
            <add Field1='1' Field2='2' Field3='3' />
          </rows>
          <fields>
            <add name='Field1' />
            <add name='Field2' />
            <add name='Field3' type='double' />
          </fields>
          <calculated-fields>
            <add name='Format' t='copy(Field1,Field2,Field3).format({0}-{1}+{2} ).trim()' />
            <add name='BetterFormat' t='format({Field1}-{Field2}+{Field3} ).trim()' />
            <add name='FormatRepeats' t='copy(Field1,Field2,Field3).format({0}-{1}+{2}_{1})' />
            <add name='BetterFormatRepeats' t='format({Field1}-{Field2}+{Field3}_{Field2})' />
            <add name='WithFormat' t='format({Field1:#.0} and {Field3:000.0000})' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var logger = new ConsoleLogger(LogLevel.Debug);

            using (var cfgScope = new ConfigurationContainer().CreateScope(xml, logger)) {
                var process = cfgScope.Resolve <Process>();

                using (var scope = new Container().CreateScope(process, logger)) {
                    var output = scope.Resolve <IProcessController>().Read().ToArray();

                    Assert.AreEqual("1-2+3", output[0][process.GetField("Format")]);
                    Assert.AreEqual("1-2+3", output[0][process.GetField("BetterFormat")]);
                    Assert.AreEqual("1-2+3_2", output[0][process.GetField("FormatRepeats")]);
                    Assert.AreEqual("1-2+3_2", output[0][process.GetField("BetterFormatRepeats")]);
                    Assert.AreEqual("1 and 003.0000", output[0][process.GetField("WithFormat")]);
                }
            }
        }
        public void AppendWorks()
        {
            const string xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData' pipeline='linq'>
          <rows>
            <add Field1='one' Field2='2' Field3='three' />
          </rows>
          <fields>
            <add name='Field1' />
            <add name='Field2' type='double' />
            <add name='Field3' />
          </fields>
          <calculated-fields>
            <add name='t1' t='copy(Field1).append( is 1)' />
            <add name='t2' t='copy(Field2).append( is two)' />
            <add name='t3' t='copy(Field3).append(Field2)' />
            <add name='t4' t='copy(Field3).append(t3)' />
            <add name='t5' t='copy(Field1).append()' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var logger = new ConsoleLogger(LogLevel.Debug);

            using (var cfgScope = new ConfigurationContainer().CreateScope(xml, logger)) {
                var process = cfgScope.Resolve <Process>();

                using (var scope = new Container().CreateScope(process, logger)) {
                    var output = scope.Resolve <IProcessController>().Read().ToArray();

                    var cf = process.Entities.First().CalculatedFields.ToArray();
                    Assert.AreEqual("one is 1", output[0][cf[0]]);
                    Assert.AreEqual("2 is two", output[0][cf[1]]);
                    Assert.AreEqual("three2", output[0][cf[2]]);
                    Assert.AreEqual("threethree2", output[0][cf[3]]);
                }
            }
        }
        public void Match()
        {
            const string xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData' pipeline='linq'>
          <rows>
            <add Field1='Local/3114@tolocalext-fc5d,1' />
            <add Field1='SIP/Generic-Vitel_Outbound-0002b45a' />
          </rows>
          <fields>
            <add name='Field1' />
            <add name='Field2' />
          </fields>
          <calculated-fields>
            <add name='MatchField1' t='copy(Field1).match(3[0-9]{3}(?=@))' default='None' />
            <add name='MatchAnyField' t='copy(Field1,Field2).match(3[0-9]{3}(?=@))' default='None' />
            <add name='MatchCount' type='int' t='copy(Field1).matchCount(Vitel)' />
            <add name='Matching' t='copy(Field1).matching([0-9a-zA-Z])' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var logger = new ConsoleLogger();

            using (var outer = new ConfigurationContainer().CreateScope(xml, logger)) {
                var process = outer.Resolve <Process>();
                using (var inner = new Container().CreateScope(process, logger)) {
                    var output = inner.Resolve <IProcessController>().Read().ToArray();
                    var cf     = process.Entities.First().CalculatedFields.ToArray();
                    Assert.AreEqual("3114", output[0][cf[0]]);
                    Assert.AreEqual("3114", output[0][cf[1]]);
                    Assert.AreEqual("None", output[1][cf[0]]);
                    Assert.AreEqual("None", output[1][cf[1]]);

                    Assert.AreEqual(1, output[1][cf[2]]);
                    Assert.AreEqual("Local3114tolocalextfc5d1", output[0][cf[3]]);
                }
            }
        }
        public void Run()
        {
            var logger = new ConsoleLogger(LogLevel.Debug);

            var xml = @"
<add name='Test' read-only='true'>
    <scripts>
        <add name='s1' file='scripts\script.js' />
    </scripts>
    <entities>
        <add name='Data'>
            <rows>
                <add number1='1' number2='1.0' />
                <add number1='2' number2='2.0' />
                <add number1='3' number2='3.0' />
            </rows>
            <fields>
                <add name='number1' type='int' primary-key='true' />
                <add name='number2' type='double' />
            </fields>
            <calculated-fields>
                <add name='scripted' type='double' t='jint(s1)' />
            </calculated-fields>
        </add>
    </entities>

</add>";

            using (var outer = new ConfigurationContainer(new JintTransformModule()).CreateScope(xml, logger)) {
                var process = outer.Resolve <Process>();
                using (var inner = new Container(new JintTransformModule()).CreateScope(process, new ConsoleLogger(LogLevel.Debug))) {
                    var controller = inner.Resolve <IProcessController>();
                    controller.Execute();
                    var rows = process.Entities.First().Rows;

                    Assert.AreEqual(-1.0, rows[0]["scripted"]);
                    Assert.AreEqual(4.0, rows[1]["scripted"]);
                    Assert.AreEqual(9.0, rows[2]["scripted"]);
                }
            }
        }
Exemple #11
0
        public void AnyWorks()
        {
            const string xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData' pipeline='linq'>
          <rows>
            <add Field1='1' Field2='2' Field3='3' />
          </rows>
          <fields>
            <add name='Field1' />
            <add name='Field2' />
            <add name='Field3' />
          </fields>
          <calculated-fields>
            <add name='Has1' type='bool' t='copy(*).any(1)' />
            <add name='Has2' type='bool' t='copy(Field1,Field2,Field3).any(2)' />
            <add name='Has3' type='bool' t='copy(*).any(3)' />
            <add name='Has4' type='bool' t='copy(Field1,Field2,Field3).any(4)' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var logger = new ConsoleLogger(LogLevel.Debug);

            using (var cfgScope = new ConfigurationContainer().CreateScope(xml, logger)) {
                var process = cfgScope.Resolve <Process>();

                using (var scope = new Container().CreateScope(process, logger)) {
                    var output = scope.Resolve <IProcessController>().Read().ToArray();

                    var cf = process.Entities.First().CalculatedFields.ToArray();
                    Assert.AreEqual(true, output[0][cf[0]]);
                    Assert.AreEqual(true, output[0][cf[1]]);
                    Assert.AreEqual(true, output[0][cf[2]]);
                    Assert.AreEqual(false, output[0][cf[3]]);
                }
            }
        }
Exemple #12
0
        public void TryIt()
        {
            const string xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData'>
          
          <rows>
            <add Field1='11' Field2='12' Field3='13' />
            <add Field1='xx' Field2='' Field3='100.8' />
          </rows>

          <fields>
            <add name='Field1' v='contains(1)' message-field='Message' />
            <add name='Field2' v='required().is(int)' message-field='Message' />
            <add name='Field3' v='matches(^[0-9/.]{5}$)' message-field='Message' help='Field3 must be a 5 digit number (including decimal pt.)' />
          </fields>
          <calculated-fields>
            <add name='Message' length='1000' default='' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var logger = new ConsoleLogger(LogLevel.Debug);

            using (var outer = new ConfigurationContainer().CreateScope(xml, logger)) {
                var process = outer.Resolve <Process>();
                using (var inner = new Container().CreateScope(process, logger)) {
                    var controller = inner.Resolve <IProcessController>();
                    var output     = controller.Read().ToArray();
                    var message    = process.Entities.First().CalculatedFields.First(cf => cf.Name == "Message");
                    var valid      = process.Entities.First().CalculatedFields.First(cf => cf.Name == "TestDataValid");
                    Assert.IsFalse((bool)output[0][valid]);
                    Assert.AreEqual("Field3 must be a 5 digit number (including decimal pt.)", output[0][message].ToString().Replace("|", " ").TrimEnd());
                    Assert.AreEqual("Field1 must contain 1. Field2 is required. Field2's value is incompatable with the int data type.", output[1][message].ToString().Replace("|", " ").TrimEnd());
                }
            }
        }
        public void LengthOfArrays()
        {
            const string xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData'>
          <rows>
            <add Input='1 2 3 4' />
          </rows>
          <fields>
            <add name='Input' />
          </fields>
          <calculated-fields>
            <add name='Length' type='int' t='copy(Input).split( ).length()' />
            <add name='Len' type='int' t='copy(Input).split( ).len()' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var logger     = new ConsoleLogger(LogLevel.Debug);
            var transforms = new List <TransformHolder>()
            {
                new TransformHolder((c) => new LengthTransform(c), new LengthTransform().GetSignatures()),
                new TransformHolder((c) => new SplitTransform(c), new SplitTransform().GetSignatures())
            }.ToArray();

            using (var cfgScope = new ConfigurationContainer(transforms).CreateScope(xml, logger)) {
                var process = cfgScope.Resolve <Process>();

                using (var scope = new Container(transforms).CreateScope(process, logger)) {
                    scope.Resolve <IProcessController>().Execute();
                    var output = process.Entities.First().Rows;

                    Assert.AreEqual(4, output[0]["Len"]);
                    Assert.AreEqual(4, output[0]["Length"]);
                }
            }
        }
Exemple #14
0
        public void TryDistinct()
        {
            const string xml = @"
    <add name='TestDistinct'>
      <connections>
        <add name='input' provider='internal' />
        <add name='output' provider='internal' />
      </connections>
      <entities>
        <add name='Dates'>
          <rows>
            <add Words='One Two Three One' />
            <add Words='111-222-3333 222-333-4444' />
          </rows>
          <fields>
            <add name='Words' />
          </fields>
          <calculated-fields>
            <add name='DistinctWords' t='copy(Words).split( ).distinct().join( )' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var logger = new ConsoleLogger(LogLevel.Debug);

            using (var cfgScope = new ConfigurationContainer().CreateScope(xml, logger)) {
                var process = cfgScope.Resolve <Process>();

                using (var scope = new Container().CreateScope(process, logger)) {
                    scope.Resolve <IProcessController>().Execute();
                    var row1 = process.Entities.First().Rows[0];
                    var row2 = process.Entities.First().Rows[1];

                    Assert.AreEqual("One Two Three", row1["DistinctWords"]);
                    Assert.AreEqual("111-222-3333 222-333-4444", row2["DistinctWords"]);
                }
            }
        }
Exemple #15
0
        public void TestIssue1()
        {
            const string xml = @"
<add name='TestProcess'>
    <entities>
        <add name='TestData'>
            <rows>
                <add Pile='1Stories: 2Installed on: 09/14/2016 FSO: scpActual Appoi' />
            </rows>
            <fields>
                <add name='Pile' length='max'/>
            </fields>
            <calculated-fields>
                <add name='WithShorthand' t='copy(Pile).tolower().matching(installed on:\s*\d{1,2}\/\d{1,2}\/\d{2,4})' />
                <add name='WithLonghand'>
                  <transforms>
                     <add method='copy' value='Pile' />
                     <add method='tolower' />
                     <add method='matching' pattern='installed on:\s*\d{1,2}\/\d{1,2}\/\d{2,4}' />
                  </transforms>
                </add>
            </calculated-fields>
        </add>
    </entities>
</add>";

            var logger = new ConsoleLogger();

            using (var outer = new ConfigurationContainer().CreateScope(xml, logger)) {
                var process = outer.Resolve <Process>();
                using (var inner = new Container().CreateScope(process, logger)) {
                    var row           = inner.Resolve <IProcessController>().Read().ToArray()[0];
                    var withShorthand = process.Entities[0].CalculatedFields[0];
                    var withLonghand  = process.Entities[0].CalculatedFields[1];
                    Assert.AreEqual("installed on: 09/14/2016", row[withShorthand]);
                    Assert.AreEqual("installed on: 09/14/2016", row[withLonghand]);
                }
            }
        }
        public void DatePart1()
        {
            const string xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData' >
          <rows>
            <add StartDate='2016-06-01' EndDate='2016-08-01' />
          </rows>
          <fields>
            <add name='StartDate' type='datetime' />
            <add name='EndDate' type='datetime' />
          </fields>
          <calculated-fields>
            <add name='StartYear' type='int' t='copy(StartDate).datepart(year)' />
            <add name='EndYear' type='int' t='copy(EndDate).datepart(year)' />
            <add name='StartWeek' type='int' t='copy(StartDate).datepart(weekofyear)' />
            <add name='EndWeek' type='int' t='copy(EndDate).datepart(weekofyear)' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var logger = new ConsoleLogger(LogLevel.Debug);

            using (var cfgScope = new ConfigurationContainer().CreateScope(xml, logger)) {
                var process = cfgScope.Resolve <Process>();

                using (var scope = new Container().CreateScope(process, logger)) {
                    var output = scope.Resolve <IProcessController>().Read().ToArray();

                    var cf = process.Entities.First().CalculatedFields.ToArray();
                    Assert.AreEqual(2016, output[0][cf[0]]);
                    Assert.AreEqual(2016, output[0][cf[1]]);
                    Assert.AreEqual(23, output[0][cf[2]]);
                    Assert.AreEqual(32, output[0][cf[3]]);
                }
            }
        }
Exemple #17
0
        public void TryIt()
        {
            const string xml = @"
    <add name='TestProcess'>
        <connections>
            <add name='input' provider='internal' />
            <add name='output' provider='internal' />
        </connections>
      <entities>
        <add name='TestData'>
          <rows>
            <add input=' Wave 1' />
            <add input='Flight 1' />
          </rows>
          <fields>
            <add name='input' t='trim()' />
          </fields>
          <calculated-fields>
            <add name='output' type='bool' t='copy(input).startsWith(W)' />
          </calculated-fields>
        </add>
      </entities>
    </add>";


            var logger = new ConsoleLogger(LogLevel.Debug);

            using (var cfgScope = new ConfigurationContainer().CreateScope(xml, logger)) {
                var process = cfgScope.Resolve <Process>();

                using (var scope = new Container().CreateScope(process, logger)) {
                    var output = scope.Resolve <IProcessController>().Read().ToArray();

                    Assert.AreEqual(true, output[0][process.GetField("output")]);
                    Assert.AreEqual(false, output[1][process.GetField("output")]);
                }
            }
        }
        public void DateDiff1()
        {
            var xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData' >
          <rows>
            <add StartDate='2016-06-01' EndDate='2016-08-01' />
          </rows>
          <fields>
            <add name='StartDate' type='datetime' />
            <add name='EndDate' type='datetime' />
          </fields>
          <calculated-fields>
            <add name='Years' type='int' t='copy(StartDate,EndDate).datediff(year)' />
            <add name='Days' type='int' t='copy(StartDate,EndDate).datediff(day)' />
            <add name='Minutes' type='int' t='copy(StartDate,EndDate).datediff(minute)' />
            <add name='Hours' type='double' t='copy(StartDate,EndDate).datediff(hour)' />
          </calculated-fields>
        </add>
      </entities>
    </add>
            ".Replace('\'', '"');

            var transform = new TransformHolder((c) => new DateDiffTransform(c), new DateDiffTransform().GetSignatures());

            using (var outer = new ConfigurationContainer(transform).CreateScope(xml, new DebugLogger())) {
                var process = outer.Resolve <Process>();
                using (var inner = new Container(transform).CreateScope(process, new DebugLogger())) {
                    var output = inner.Resolve <IProcessController>().Read().ToArray();
                    var cf     = process.Entities.First().CalculatedFields.ToArray();
                    Assert.AreEqual(0, output[0][cf[0]]);
                    Assert.AreEqual(61, output[0][cf[1]]);
                    Assert.AreEqual(87840, output[0][cf[2]]);
                    Assert.AreEqual(1464d, output[0][cf[3]]);
                }
            }
        }
        public void Join()
        {
            const string xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData'>
          <rows>
            <add Input1='2' Input2='4' Input3='6' />
          </rows>
          <fields>
            <add name='Input1' />
            <add name='Input2' />
            <add name='Input3' />
          </fields>
          <calculated-fields>
            <add name='Joined' t='copy(Input1,Input2,Input3).toArray().join(-)' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var logger     = new ConsoleLogger(LogLevel.Debug);
            var transforms = new List <TransformHolder>()
            {
                new TransformHolder((c) => new JoinTransform(c), new JoinTransform().GetSignatures()),
                new TransformHolder((c) => new ToArrayTransform(c), new ToArrayTransform().GetSignatures())
            }.ToArray();

            using (var cfgScope = new ConfigurationContainer(transforms).CreateScope(xml, logger)) {
                var process = cfgScope.Resolve <Process>();

                using (var scope = new Container(transforms).CreateScope(process, logger)) {
                    scope.Resolve <IProcessController>().Execute();
                    var output = process.Entities.First().Rows;
                    Assert.AreEqual("2-4-6", output[0]["Joined"]);
                }
            }
        }
Exemple #20
0
        public void Tag()
        {
            const string xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData' pipeline='linq'>
          <rows>
            <add Field1='1' />
            <add Field1='5' />
          </rows>
          <fields>
            <add name='Field1' />
          </fields>
          <calculated-fields>
            <add name='span' t='copy(Field1).tag(span)' />
            <add name='div' t='copy(Field1).tag(div,class:fun)' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var logger = new ConsoleLogger(LogLevel.Debug);

            using (var cfgScope = new ConfigurationContainer().CreateScope(xml, logger)) {
                var process = cfgScope.Resolve <Process>();

                using (var scope = new Container().CreateScope(process, logger)) {
                    var output = scope.Resolve <IProcessController>().Read().ToArray();

                    var cf = process.Entities.First().CalculatedFields.ToArray();
                    Assert.AreEqual("<span>1</span>", output[0][cf[0]]);
                    Assert.AreEqual("<div class=\"fun\">1</div>", output[0][cf[1]]);
                    Assert.AreEqual("<span>5</span>", output[1][cf[0]]);
                    Assert.AreEqual("<div class=\"fun\">5</div>", output[1][cf[1]]);
                }
            }
        }
        public void In()
        {
            const string xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData' pipeline='linq'>
          <rows>
            <add Field1='1' />
            <add Field1='5' />
          </rows>
          <fields>
            <add name='Field1' />
          </fields>
          <calculated-fields>
            <add name='In123' type='bool' t='copy(Field1).in(1,2,3)' />
            <add name='In456' type='bool' t='copy(Field1).in(4,5,6)' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var logger = new ConsoleLogger(LogLevel.Debug);

            using (var cfgScope = new ConfigurationContainer().CreateScope(xml, logger)) {
                var process = cfgScope.Resolve <Process>();

                using (var scope = new Container().CreateScope(process, logger)) {
                    var output = scope.Resolve <IProcessController>().Read().ToArray();

                    var cf = process.Entities.First().CalculatedFields.ToArray();
                    Assert.AreEqual(true, output[0][cf[0]]);
                    Assert.AreEqual(false, output[0][cf[1]]);
                    Assert.AreEqual(false, output[1][cf[0]]);
                    Assert.AreEqual(true, output[1][cf[1]]);
                }
            }
        }
Exemple #22
0
        public void EqualsValidator()
        {
            var xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData'>
          <rows>
            <add Field1='11' Field2='12' Field3='13' />
            <add Field1='11' Field2='11' Field3='11' />
          </rows>
          <fields>
            <add name='Field1' />
            <add name='Field2' />
            <add name='Field3' />
          </fields>
          <calculated-fields>
            <add name='AreEqual' type='bool' t='copy(Field1,Field2,Field3).equals()' />
            
          </calculated-fields>
        </add>
      </entities>
    </add>";


            var logger = new ConsoleLogger(LogLevel.Debug);

            using (var cfgScope = new ConfigurationContainer().CreateScope(xml, logger)) {
                var process = cfgScope.Resolve <Process>();

                using (var scope = new Container().CreateScope(process, logger)) {
                    var output = scope.Resolve <IProcessController>().Read().ToArray();

                    Assert.AreEqual(false, output[0][process.GetField("AreEqual")]);
                    Assert.AreEqual(true, output[1][process.GetField("AreEqual")]);
                }
            }
        }
Exemple #23
0
        public void MakeSureTimeIsntChanging()
        {
            var xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData' >
          <rows>
            <add Date='2019-05-05 1:05 PM' />
          </rows>
          <fields>
            <add name='Date' type='datetime' />
          </fields>
          <calculated-fields>
            <add name='DateDefault' type='datetime' default='2019-05-05 1:07 PM' />
            <add name='DateWithZ' type='datetime' default='2019-05-05 1:08 PM Z' />
            <add name='DateWithOffSet' type='datetime' default='2019-05-05 1:09 PM +00:00' />
            <add name='DateWithOffSet4' type='datetime' default='2019-05-05 1:09 PM -04:00' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var logger = new ConsoleLogger(LogLevel.Debug);

            using (var outer = new ConfigurationContainer().CreateScope(xml, logger)) {
                var process = outer.Resolve <Process>();
                using (var inner = new Container().CreateScope(process, logger)) {
                    inner.Resolve <IProcessController>().Execute();
                    var row = process.Entities.First().Rows.First();
                    Assert.AreEqual(new DateTime(2019, 5, 5, 13, 5, 0), row["Date"]);
                    Assert.AreEqual(new DateTime(2019, 5, 5, 13, 7, 0), row["DateDefault"]);
                    Assert.AreEqual(new DateTime(2019, 5, 5, 13, 8, 0), row["DateWithZ"]);
                    Assert.AreEqual(new DateTime(2019, 5, 5, 13, 9, 0), row["DateWithOffSet"]);
                    Assert.AreEqual(new DateTime(2019, 5, 5, 17, 9, 0), row["DateWithOffSet4"]);
                }
            }
        }
Exemple #24
0
        public void Test()
        {
            const string xml         = @"
<add name='TestProcess'>
    <entities>
        <add name='TestData'>
            <rows>
                <add Date='2019-07-01 10:30 AM' />
            </rows>
            <fields>
                <add name='Date' type='datetime'/>
            </fields>
            <calculated-fields>
                <add name='Milliseconds' type='long' t='copy(Date).timezone(Eastern Standard Time,UTC).tounixtime(ms)' />
                <add name='Seconds' type='long' t='copy(Date).timezone(Eastern Standard Time,UTC).tounixtime(seconds)' />
            </calculated-fields>
        </add>
    </entities>
</add>";
            var          logger      = new ConsoleLogger(LogLevel.Debug);
            var          specifyKind = new TransformHolder((c) => new TimeZoneTransform(c), new TimeZoneTransform().GetSignatures());
            var          toUnixTime  = new TransformHolder((c) => new ToUnixTimeTransform(c), new ToUnixTimeTransform().GetSignatures());

            using (var outer = new ConfigurationContainer(new[] { specifyKind, toUnixTime }).CreateScope(xml, logger)) {
                var process = outer.Resolve <Process>();
                using (var inner = new Container(new[] { specifyKind, toUnixTime }).CreateScope(process, logger)) {
                    var controller   = inner.Resolve <IProcessController>();
                    var output       = controller.Read().ToArray();
                    var milliseconds = (long)output[0][process.Entities.First().CalculatedFields.First()];
                    var seconds      = (long)output[0][process.Entities.First().CalculatedFields.Last()];

                    Assert.AreEqual(1561991400000, milliseconds);
                    Assert.AreEqual(1561991400, seconds);
                }
            }
        }
Exemple #25
0
        public void Condense()
        {
            const string xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData' pipeline='linq'>
          <rows>
            <add Field1='Some  duplicates spa ces' />
            <add Field1='O n e  S p a c ee' />
          </rows>
          <fields>
            <add name='Field1' />
          </fields>
          <calculated-fields>
            <add name='CondenseField1' t='copy(Field1).condense()' />
            <add name='DuplicateE' t='copy(Field1).condense(e)' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var logger = new ConsoleLogger(LogLevel.Debug);

            using (var outer = new ConfigurationContainer().CreateScope(xml, logger, null, "@()")) {
                var process = outer.Resolve <Process>();
                using (var inner = new Container().CreateScope(process, logger)) {
                    var results = inner.Resolve <IProcessController>().Read().ToArray();

                    var condensed = process.Entities.First().CalculatedFields.First();
                    var duplicate = process.Entities.First().CalculatedFields.Last();
                    Assert.AreEqual("Some duplicates spa ces", results[0][condensed]);
                    Assert.AreEqual("O n e S p a c ee", results[1][condensed]);
                    Assert.AreEqual("O n e  S p a c e", results[1][duplicate]);
                }
            }
        }
Exemple #26
0
        public void Try()
        {
            var xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData' >
          <rows>
            <add Date1='2019-05-05 1:05 PM' Date2='2019-05-05 1:05 PM' Date3='2019-05-05 1:05 PM' Date4='2019-05-05 1:05 PM' Date5='2019-05-05T13:05:00Z' />
          </rows>
          <fields>
            <add name='Date1' type='datetime' t='specifyKind(unspecified)' />
            <add name='Date2' type='datetime' t='specifyKind(local)' />
            <add name='Date3' type='datetime' t='specifyKind(utc)' />
            <add name='Date4' type='datetime' />
            <add name='Date5' type='datetime' />
          </fields>
        </add>
      </entities>
    </add>";

            var logger    = new ConsoleLogger(LogLevel.Debug);
            var transform = new TransformHolder((c) => new SpecifyKindTransform(c), new SpecifyKindTransform().GetSignatures());

            using (var outer = new ConfigurationContainer(transform).CreateScope(xml, logger)) {
                var process = outer.Resolve <Process>();
                using (var inner = new Container(transform).CreateScope(process, logger)) {
                    inner.Resolve <IProcessController>().Execute();
                    var row = process.Entities.First().Rows.First();
                    Assert.AreEqual(DateTimeKind.Unspecified, ((DateTime)row["Date1"]).Kind);
                    Assert.AreEqual(DateTimeKind.Local, ((DateTime)row["Date2"]).Kind);
                    Assert.AreEqual(DateTimeKind.Utc, ((DateTime)row["Date3"]).Kind);
                    Assert.AreEqual(DateTimeKind.Unspecified, ((DateTime)row["Date4"]).Kind);
                    Assert.AreEqual(DateTimeKind.Utc, ((DateTime)row["Date5"]).Kind);
                }
            }
        }
        public void ToTime()
        {
            const string xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData'>
          <rows>
            <add intField='238' longField='500' />
          </rows>
          <fields>
            <add name='intField' type='int' />
            <add name='longField' type='long' />
          </fields>
          <calculated-fields>
            <add name='intFieldToTime' t='copy(intField).toTime(hour)' />
            <add name='longFieldToTime' t='copy(longField).toTime(seconds)' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var logger = new ConsoleLogger(LogLevel.Debug);

            using (var outer = new ConfigurationContainer().CreateScope(xml, logger)) {
                var process = outer.Resolve <Process>();
                using (var inner = new Container().CreateScope(process, logger)) {
                    var results = inner.Resolve <IProcessController>().Read().ToArray();

                    var intFieldToTime  = process.Entities[0].CalculatedFields[0];
                    var longFieldToTime = process.Entities[0].CalculatedFields[1];

                    Assert.AreEqual("9.22:00:00", results[0][intFieldToTime]);
                    Assert.AreEqual("00:08:20", results[0][longFieldToTime]);
                }
            }
        }
Exemple #28
0
        public void Run()
        {
            var logger = new ConsoleLogger();

            const string xml = @"
<add name='TestProcess'>
    <entities>
        <add name='TestData'>
            <rows>
                <add id='1' store='Walmart' other='' />
                <add id='2' store='Target' other='' />
                <add id='3' store='Other' other='' />
                <add id='4' store='Other' other='Costco' />
            </rows>
            <fields>
                <add name='id' type='int' primary-key='true' />
                <add name='store' />
                <add name='other' v=""jint(
   if(store === 'Other' && other === '') {
      otherMessage = 'other is required';
      false;
   } else {
      true;
   }
)""/>
            </fields>
            <calculated-fields>
               
            </calculated-fields>
        </add>
    </entities>

</add>";

            using (var outer = new ConfigurationContainer(new JintValidateModule()).CreateScope(xml, logger)) {
                var process = outer.Resolve <Process>();

                if (process.Errors().Any())
                {
                    foreach (var error in process.Errors())
                    {
                        System.Console.WriteLine(error);
                    }
                    return;
                }
                using (var inner = new Container(new JintValidateModule()).CreateScope(process, logger)) {
                    var controller = inner.Resolve <IProcessController>();
                    controller.Execute();
                    var rows = process.Entities.First().Rows;

                    Assert.AreEqual(true, rows[0]["otherValid"]);
                    Assert.AreEqual("", rows[0]["otherMessage"]);

                    Assert.AreEqual(true, rows[1]["otherValid"]);
                    Assert.AreEqual("", rows[1]["otherMessage"]);

                    Assert.AreEqual(false, rows[2]["otherValid"]);
                    Assert.AreEqual("other is required|", rows[2]["otherMessage"]);

                    Assert.AreEqual(true, rows[3]["otherValid"]);
                    Assert.AreEqual("", rows[3]["otherMessage"]);
                }
            }
        }
        public void Run()
        {
            var logger = new ConsoleLogger();

            const string xml = @"
<add name='TestProcess'>
    <maps>
      <add name='map'>
         <items>
            <add from='1' to='One' />
            <add from='2' to='Two' />
            <add from='3' to='Three' />
         </items>
      </add>
    </maps>
    <entities>
        <add name='TestData'>
            <rows>
                <add number1='1' />
                <add number1='2' />
                <add number1='4' />
            </rows>
            <fields>
                <add name='number1' type='int' primary-key='true'>
                  <validators>
                     <add method='jint' script=""var x = number1+'' in map; if(x) { number1Message = map[number1];} else { number1Message = number1 + ' does not exist'}; x;"" />
                  </validators>
                </add>
            </fields>
        </add>
    </entities>

</add>";

            using (var outer = new ConfigurationContainer(new JintValidateModule()).CreateScope(xml, logger)) {
                var process = outer.Resolve <Process>();

                if (process.Errors().Any())
                {
                    foreach (var error in process.Errors())
                    {
                        System.Console.WriteLine(error);
                    }
                    return;
                }
                using (var inner = new Container(new JintValidateModule()).CreateScope(process, logger)) {
                    var controller = inner.Resolve <IProcessController>();
                    controller.Execute();
                    var rows = process.Entities.First().Rows;

                    Assert.AreEqual(true, rows[0]["number1Valid"]);
                    Assert.AreEqual("", rows[0]["number1Message"]);

                    Assert.AreEqual(true, rows[1]["number1Valid"]);
                    Assert.AreEqual("", rows[1]["number1Message"]);

                    Assert.AreEqual(false, rows[2]["number1Valid"]);
                    Assert.AreEqual("4 does not exist|", rows[2]["number1Message"]);
                }
            }
        }