Exemple #1
0
        public void CSharpTransformAdd()
        {
            // Problem is I am compiling code in advance,
            // but not remembering that there are actually two processes that run,
            // the entity processes,  and the calculated field process

            const string xml = @"
<add name='TestProcess' mode='default'>
    <entities>
        <add name='TestData'>
            <rows>
                <add Field1='1' Field2='2' Field3='3' />
                <add Field1='4' Field2='5' Field3='6' />
            </rows>
            <fields>
                <add name='Field1' />
                <add name='Field2' />
                <add name='Field3' />
            </fields>
            <calculated-fields>
                <add name='Add' t='copy(Field1,Field2,Field3).cs(Field1+Field2+Field3;)' />
                <add name='Format' t='copy(Field1,Field2,Field3).cs(string.Format(&quot;{0}-{1}-{2}&quot;,Field1,Field2,Field3);)' />
            </calculated-fields>
        </add>
    </entities>
</add>";


            var composer   = new CompositionRoot();
            var controller = composer.Compose(xml, LogLevel.Debug);
            var process    = composer.Process;

            controller.Execute();
            controller.Dispose();

            var entity = process.Entities.First();

            var row1 = entity.Rows[0];
            var row2 = entity.Rows[1];

            Assert.AreEqual("123", row1["Add"]);
            Assert.AreEqual("1-2-3", row1["Format"]);

            Assert.AreEqual("456", row2["Add"]);
            Assert.AreEqual("4-5-6", row2["Format"]);
        }
Exemple #2
0
        public void FromRegexWorks()
        {
            const string xml = @"
    <add name='Test'>
      <entities>
        <add name='Test'>
          <rows>
            <add address='1ST AV 1011' />
            <add address='1ST AV 402 APT 1' />
            <add address='ABLE RD 101 LOT 3' />
          </rows>
          <fields>
            <add name='address' length='128'>
                <transforms>
                    <add method='fromregex' pattern='( \d+)'>
                        <fields>
                            <add name='number' />
                        </fields>
                    </add>
                </transforms>
            </add>
          </fields>
          <calculated-fields>
            <add name='numberspace' t='copy(number).trim().append( )' />
            <add name='flipped' t='copy(address).replace(number,).prepend(numberspace)' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var composer   = new CompositionRoot();
            var controller = composer.Compose(xml);
            var output     = controller.Read().ToArray();
            var flipped    = composer.Process.Entities.First().CalculatedFields.Last();

            Assert.AreEqual(3, output.Length);

            Assert.AreEqual("1011 1ST AV", output[0][flipped]);
            Assert.AreEqual("402 1ST AV APT 1", output[1][flipped]);
            Assert.AreEqual("101 ABLE RD LOT 3", output[2][flipped]);

            foreach (var row in output)
            {
                Console.WriteLine(row);
            }
        }
Exemple #3
0
        public void MapTransformAdd()
        {
            const string xml = @"
<add name='TestProcess'>

    <maps>
        <add name='Map'>
            <items>
                <add from='1' to='One' />
                <add from='2' to='Two' />
                <add from='3' parameter='Field3' />
            </items>
        </add>
    </maps>

    <entities>
        <add name='TestData'>
            <rows>
                <add Field1='1' Field3='^' />
                <add Field1='2' Field3='#' />
                <add Field1='3' Field3='$THREE$' />
                <add Field1='4' Field3='@' />
            </rows>
            <fields>
                <add name='Field1' />
                <add name='Field3' />
            </fields>
            <calculated-fields>
                <add name='Map' t='copy(Field1).map(map)' default='None' />
            </calculated-fields>
        </add>
    </entities>

</add>";

            var composer   = new CompositionRoot();
            var controller = composer.Compose(xml);
            var field      = composer.Process.Entities.First().CalculatedFields.First();
            var output     = controller.Read().ToArray();

            Assert.AreEqual("One", output[0][field]);
            Assert.AreEqual("Two", output[1][field]);
            Assert.AreEqual("$THREE$", output[2][field]);
            Assert.AreEqual("None", output[3][field]);
        }
Exemple #4
0
        public void Validator()
        {
            const string xml = @"
    <add name='TestSignature'>
      <entities>
        <add name='TestData'>
          <rows>
            <add args='10,0' />
          </rows>
          <fields>
            <add name='args' length='128'>
                <transforms>
                    <add method='fromsplit' separator=','>
                        <fields>
                            <add name='TotalWidth' />
                            <add name='PaddingChar' />
                        </fields>
                    </add>
                </transforms>
            </add>
          </fields>
          <calculated-fields>
            <add name='length' type='int' t='copy(args).splitlength(\,)' />
            <add name='TotalWidthCheck' type='bool' t='copy(TotalWidth).is(int)' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var composer   = new CompositionRoot();
            var controller = composer.Compose(xml);
            var process    = composer.Process;
            var output     = controller.Read().ToArray();

            var field = process.Entities.First().CalculatedFields.First(cf => cf.Name == "length");

            Assert.AreEqual(2, output[0][field]);

            foreach (var row in output)
            {
                Console.WriteLine(row);
            }
        }
Exemple #5
0
        public void Eval()
        {
            const string xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData' pipeline='linq'>
          <rows>
            <add Field1='1' Field2='3' Field3='stuff' />
            <add Field1='5' Field2='4' Field3='more stuff'/>
          </rows>
          <fields>
            <add name='Field1' type='int' />
            <add name='Field2' type='int' />
            <add name='Field3' />
          </fields>
          <calculated-fields>
            <add name='First' type='int' t='copy(Field1,Field2).eval(Field1+Field2)' />
            <add name='Last' t='copy(Field1,Field2,Field3).eval(Field3 == ""stuff"" ? Field1 : Field2)' />
            <add name='Bad' t='eval(Field1+Field2+Field3)' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var composer   = new CompositionRoot();
            var controller = composer.Compose(xml);
            var output     = controller.Read().ToArray();

            var first = composer.Process.Entities.First().CalculatedFields.First();

            Assert.AreEqual(4, output[0][first]);
            Assert.AreEqual(9, output[1][first]);

            var last = composer.Process.Entities.First().CalculatedFields.First(f => f.Name == "Last");

            Assert.AreEqual("1", output[0][last]);
            Assert.AreEqual("4", output[1][last]);

            var bad = composer.Process.Entities.First().CalculatedFields.First(f => f.Name == "Bad");

            Assert.AreEqual("4stuff", output[0][bad]);
            Assert.AreEqual("9more stuff", output[1][bad]);
        }
Exemple #6
0
        public void SliceWorks()
        {
            const string xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData' pipeline='linq'>
          <rows>
            <add Field1='stranger things in the upside down' Field2='10.2' Field3='jobs.mineplex.com' />
          </rows>
          <fields>
            <add name='Field1' />
            <add name='Field2' type='double' />
            <add name='Field3' />
          </fields>
          <calculated-fields>
            <add name='t1' t='copy(Field1).slice(1:3, )' />
            <add name='t2' t='copy(Field2).slice(1,.)' />
            <add name='t3' t='copy(Field3).slice(0:1,.)' />
            <add name='t4' t='copy(Field1).slice(2, )' />
            <add name='t5' t='copy(Field3).slice(-2,.)' />
            <add name='t6' t='copy(Field1).slice(::2, )' />
            <add name='t7' t='copy(Field1).slice(3:0:-1, )' />
            <add name='t8' t='copy(Field2).slice(0:2)' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var composer   = new CompositionRoot();
            var controller = composer.Compose(xml);
            var output     = controller.Read().ToArray();

            var cf = composer.Process.Entities.First().CalculatedFields.ToArray();

            Assert.AreEqual("things in", output[0][cf[0]]);
            Assert.AreEqual("2", output[0][cf[1]]);
            Assert.AreEqual("jobs", output[0][cf[2]]);
            Assert.AreEqual("in the upside down", output[0][cf[3]]);
            Assert.AreEqual("mineplex.com", output[0][cf[4]]);
            Assert.AreEqual("stranger in upside", output[0][cf[5]]);
            Assert.AreEqual("the in things", output[0][cf[6]]);
            Assert.AreEqual("10", output[0][cf[7]]);
        }
        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 composer   = new CompositionRoot();
            var controller = composer.Compose(xml);
            var output     = controller.Read().ToArray();

            Assert.AreEqual(4, output.Length);

            var name = composer.Process.Entities.First().CalculatedFields.First();

            var first = output[0];

            Assert.AreEqual("deez", first[name]);

            var second = output[1];

            Assert.AreEqual("nutz", second[name]);
        }
Exemple #8
0
        public void DoMath()
        {
            const string xml = @"
    <add name='TestProcess'>
      <entities>
        <add name='TestData' pipeline='linq'>
          <rows>
            <add Field1='10.6954' Field2='129.992' Field3='7' Field4='3' />
          </rows>
          <fields>
            <add name='Field1' type='double' />
            <add name='Field2' type='decimal' />
            <add name='Field3' type='int' />
            <add name='Field4' type='int' />
          </fields>
          <calculated-fields>
            <add name='Ceiling' type='double' t='copy(Field1).ceiling()' />
            <add name='Floor' type='double' t='copy(Field1).floor()' />
            <add name='Round' type='decimal' t='copy(Field2).round(1)' />
            <add name='Abs' type='decimal' t='copy(Field2).abs()' />
            <add name='Add' type='decimal' t='copy(Field1,Field2,Field3).add()' />
            <add name='AddInts' type='int' t='copy(Field3,Field4).add()' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var composer   = new CompositionRoot();
            var controller = composer.Compose(xml);
            var output     = controller.Read().ToArray();

            var cf  = composer.Process.Entities.First().CalculatedFields.ToArray();
            var row = output.First();

            Assert.AreEqual(11d, row[cf[0]]);
            Assert.AreEqual(10d, row[cf[1]]);
            Assert.AreEqual((decimal)130.00, row[cf[2]]);
            Assert.AreEqual((decimal)129.992, row[cf[3]]);
            Assert.AreEqual(147.6874m, row[cf[4]]);

            Assert.AreEqual(10, row[cf[5]]);
        }
Exemple #9
0
        // ReSharper disable once InconsistentNaming
        public void IIfTransform1()
        {
            const string xml = @"
<add name='TestProcess'>
    <entities>
        <add name='TestData'>
            <rows>
                <add Field1='2' Field2='1' Field3='3' Field4='4' Field5='rockstar' Field6='rock' />
                <add Field1='2' Field2='2' Field3='3' Field4='4' Field5='rockstars' Field6='star' />
            </rows>
            <fields>
                <add name='Field1' type='int' />
                <add name='Field2' type='int' />
                <add name='Field3' type='int' />
                <add name='Field4' type='int' />
                <add name='Field5' />
                <add name='Field6' />
            </fields>
            <calculated-fields>
                <add name='Equal' type='int' t='iif(Field1=Field2,Field3,Field4)' />
                <add name='GreaterThan' type='int' t='iif(Field1 > Field2,Field3,Field4)' />
                <add name='StartsWith' type='int' t='iif(Field5 ^= Field6,Field3,Field4)' />
                <add name='Contains' type='int' t='iif(Field5*=Field6,Field3,Field4)' />
            </calculated-fields>
        </add>
    </entities>
</add>";

            var composer   = new CompositionRoot();
            var controller = composer.Compose(xml);

            var output = controller.Read().ToArray();
            var cf     = composer.Process.Entities.First().CalculatedFields;

            Assert.AreEqual(4, output[0][cf.First(f => f.Name == "Equal")], "Should be 4 because Field1 and Field2 are not equal.");
            Assert.AreEqual(3, output[1][cf.First(f => f.Name == "Equal")], "Should be 3 because Field1 and Field2 are equal.");
            Assert.AreEqual(3, output[0][cf.First(f => f.Name == "GreaterThan")], "Should be 3 because Field1 is greater than Field2.");
            Assert.AreEqual(4, output[1][cf.First(f => f.Name == "GreaterThan")], "Should be 4 because Field1 is NOT greater than Field2.");

            Assert.AreEqual(3, output[0][cf.First(f => f.Name == "StartsWith")], "Should be 3 because Field5 starts with Field6.");
            Assert.AreEqual(4, output[1][cf.First(f => f.Name == "StartsWith")], "Should be 4 because Field5 does not start with Field6.");
        }
Exemple #10
0
        public void Test1()
        {
            const string xml        = @"<cfg>
    <processes>
        <add name='one' mode='init'>
            <connections>
                <add name='input' provider='solr' server='***change-me***' port='8080' path='solr' core='TimeCard' />
            </connections>
            <entities>
                <add name='TimeCard'>
                    <filter>
                        <add expression='fullnamesearch:christ' />
                    </filter>
                    <fields>
                        <add name='tflkey' alias='key' type='int' />
                        <add name='tflbatchid' alias='batchid' type='int' />
                        <add name='tfldeleted' alias='deleted' type='bool' />
                        <add name='tflhashcode' alias='hashcode' type='int' />
                        <add name='exportcode' />
                        <add name='weekending' />
                        <add name='costcode' />
                        <add name='jobcode' />
                        <add name='acct' />
                        <add name='sub' />
                        <add name='regularhours' type='decimal' />
                        <add name='overtimehours' type='decimal' />
                        <add name='worklocation' />
                        <add name='firstname' />
                        <add name='lastname' />
                    </fields>
                </add>
            </entities>
        </add>
    </processes>
</cfg>";
            var          composer   = new CompositionRoot();
            var          controller = composer.Compose(xml);
            var          rows       = controller.Read().ToArray();

            Assert.AreEqual(2, rows.Length);
        }
Exemple #11
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 composer   = new CompositionRoot();
            var controller = composer.Compose(xml);

            controller.Execute();

            var process = composer.Process;
            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");
        }
Exemple #12
0
        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)' />
            <add name='MovingUtc' type='int' t='copy(EndDate).datediff(hour,UTC)' />
            <add name='MovingEst' type='int' t='copy(EndDate).datediff(hour,Eastern Standard Time)' />
          </calculated-fields>
        </add>
      </entities>
    </add>
            ".Replace('\'', '"');

            var composer   = new CompositionRoot();
            var controller = composer.Compose(xml);
            var output     = controller.Read().ToArray();

            var cf = composer.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]]);
            //Assert.AreEqual(1640, output[0][cf[4]]);
            //Assert.AreEqual(1644, output[0][cf[5]]);
        }
        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 composer   = new CompositionRoot();
            var controller = composer.Compose(xml);
            var output     = controller.Read().ToArray();

            var cf = composer.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]]);
        }
Exemple #14
0
        public void SeeItWork()
        {
            const string xml = @"
<add name='TestProcess'>
    <parameters>
        <add name='File' value='' />
    </parameters>
    <connections>
        <add name='input' provider='internal' />
        <add name='output' provider='geojson' file='@(File)' />
    </connections>
    <entities>
        <add name='TestData'>
            <rows>
                <add Lat='39.0997' Lon='94.5786' Name='Kansas City' Bird='Eastern Bluebird' />
            </rows>
            <fields>
                <add name='Lat' type='double' />
                <add name='Lon' type='double' />
                <add name='Name' />
                <add name='Bird' />
            </fields>
        </add>
    </entities>
</add>";

            var composer   = new CompositionRoot();
            var filename   = Path.GetTempFileName();
            var controller = composer.Compose(xml, LogLevel.Info, new Dictionary <string, string> {
                { "File", filename }
            });

            controller.Execute();

            var results = File.ReadAllText(filename);

            Assert.AreNotEqual("", results);
        }
Exemple #15
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 composer   = new CompositionRoot();
            var controller = composer.Compose(xml);

            var output  = controller.Read().ToArray();
            var process = composer.Process;

            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 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 composer   = new CompositionRoot();
            var controller = composer.Compose(xml);
            var output     = controller.Read().ToArray();

            var cf = composer.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]]);
        }
Exemple #17
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 composer   = new CompositionRoot();
            var controller = composer.Compose(xml);

            controller.Execute();

            var process = composer.Process;
            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"]);
        }
        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).distinct()' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var composer   = new CompositionRoot();
            var controller = composer.Compose(xml);

            controller.Execute();

            var process = composer.Process;
            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 #19
0
        public void Test()
        {
            const string xml = @"
    <add name='TestProcess'>
        <connections>
            <add name='input' provider='web' url='' user='' password='' />
            <add name='output' provider='log' />
        </connections>
      <entities>
        <add name='TestData' >
          <fields>
            <add name='Content' length='max' output='false'>
                <transforms>
                    <add method='fromXml' xml-mode='all'>
                        <fields>
                            <add name='name' node-type='attribute' />
                            <add name='consumerCount' type='int' node-type='attribute' />
                        </fields>
                    </add>
                </transforms>
            </add>
          </fields>
          <calculated-fields>
            <add name='pass' type='bool' t='copy(pass,consumerCount).js(consumerCount &gt; 0).filter(false)' />
            <add name='message' length='128' t='copy(name,consumerCount).format({0} queue has {1} consumers!)' />
            <add name='level' default='error' />
          </calculated-fields>
        </add>
      </entities>
    </add>";

            var composer   = new CompositionRoot();
            var controller = composer.Compose(xml);

            controller.Execute();
        }
Exemple #20
0
        public void HumanizeTranformTests()
        {
            var date = DateTime.UtcNow.AddMonths(2).ToString("O");
            var now  = DateTime.UtcNow.ToString("O");

            var xml = $@"
<add name='TestProcess'>
    <entities>
        <add name='TestData'>
            <rows>
                <add text='sample text' date='{date}' metric='1k' roman='XXXVIII' number='1' />
                <add text='Sample_Texts' date='{date}' metric='16 twerps' roman='P' number='22' />
                <add text='$ample-text' date='{now}' metric='1000 μ' roman='CC' number='3000' />
            </rows>
            <fields>
                <add name='text' />
                <add name='date' type='datetime' />
                <add name='metric' />
                <add name='roman' />
                <add name='number' type='int' />
            </fields>
            <calculated-fields>
                <add name='Humanized' t='copy(text).humanize()' />
                <add name='Dehumanized' t='copy(text).dehumanize()' />
                <add name='HumanizedDate' t='copy(date).addminutes(30.1).humanize()' />
                <add name='Camelized' t='copy(text).camelize()' />
                <add name='FromMetric' type='double' t='copy(metric).fromMetric()' />
                <add name='FromRoman' type='double' t='copy(roman).fromRoman()' />
                <add name='Hyphenated' t='copy(text).hyphenate()' />
                <add name='Ordinalized' t='copy(number).ordinalize()' />
                <add name='Pascalized' t='copy(text).pascalize()' />
                <add name='Pluralized' t='copy(text).pluralize()' />
                <add name='Singularized' t='copy(text).singularize()' />
                <add name='Titleized' t='copy(text).titleize()' />
                <add name='ToMetric' t='copy(number).tometric()' />
                <add name='ToOrdinalWorded' t='copy(number).toOrdinalWords()' />
                <add name='ToRoman' t='copy(number).toRoman()' />
                <add name='ToWords' t='copy(number).toWords()' />
                <add name='Underscored' t='copy(text).underscore()' />
            </calculated-fields>
        </add>
    </entities>

</add>";

            var composer   = new CompositionRoot();
            var controller = composer.Compose(xml);

            var cf = composer.Process.Entities.First().CalculatedFields;

            var humanized       = cf.First();
            var dehumanized     = cf.First(f => f.Name == "Dehumanized");
            var humanizedDate   = cf.First(f => f.Name == "HumanizedDate");
            var camelized       = cf.First(f => f.Name == "Camelized");
            var fromMetric      = cf.First(f => f.Name == "FromMetric");
            var fromRoman       = cf.First(f => f.Name == "FromRoman");
            var hyphenated      = cf.First(f => f.Name == "Hyphenated");
            var ordinalized     = cf.First(f => f.Name == "Ordinalized");
            var pascalized      = cf.First(f => f.Name == "Pascalized");
            var pluralized      = cf.First(f => f.Name == "Pluralized");
            var singularized    = cf.First(f => f.Name == "Singularized");
            var titleized       = cf.First(f => f.Name == "Titleized");
            var toMetric        = cf.First(f => f.Name == "ToMetric");
            var toOrdinalWorded = cf.First(f => f.Name == "ToOrdinalWorded");
            var toRoman         = cf.First(f => f.Name == "ToRoman");
            var toWords         = cf.First(f => f.Name == "ToWords");
            var underscored     = cf.First(f => f.Name == "Underscored");

            var rows = controller.Read().ToArray();

            Assert.AreEqual("Sample text", rows[0][humanized]);
            Assert.AreEqual("Sample Texts", rows[1][humanized]);
            Assert.AreEqual("$ample text", rows[2][humanized]);

            Assert.AreEqual("SampleText", rows[0][dehumanized]);
            Assert.AreEqual("SampleTexts", rows[1][dehumanized]);
            Assert.AreEqual("$ampleText", rows[2][dehumanized]);

            Assert.AreEqual("2 months from now", rows[0][humanizedDate]);
            Assert.AreEqual("2 months from now", rows[1][humanizedDate]);
            Assert.AreEqual("30 minutes from now", rows[2][humanizedDate]);

            Assert.AreEqual("sample text", rows[0][camelized]);
            Assert.AreEqual("sampleTexts", rows[1][camelized]);
            Assert.AreEqual("$ample-text", rows[2][camelized]);

            Assert.AreEqual(1000d, rows[0][fromMetric]);
            Assert.AreEqual(16d, rows[1][fromMetric]);
            Assert.AreEqual(0.001d, rows[2][fromMetric]);

            Assert.AreEqual(38.0d, rows[0][fromRoman]);
            Assert.AreEqual(0d, rows[1][fromRoman]);
            Assert.AreEqual(200d, rows[2][fromRoman]);

            Assert.AreEqual("sample text", rows[0][hyphenated]);
            Assert.AreEqual("Sample-Texts", rows[1][hyphenated]);
            Assert.AreEqual("$ample-text", rows[2][hyphenated]);

            Assert.AreEqual("1st", rows[0][ordinalized]);
            Assert.AreEqual("22nd", rows[1][ordinalized]);
            Assert.AreEqual("3000th", rows[2][ordinalized]);

            Assert.AreEqual("Sample text", rows[0][pascalized]);
            Assert.AreEqual("SampleTexts", rows[1][pascalized]);
            Assert.AreEqual("$ample-text", rows[2][pascalized]);

            Assert.AreEqual("sample texts", rows[0][pluralized]);
            Assert.AreEqual("Sample_Texts", rows[1][pluralized]);
            Assert.AreEqual("$ample-texts", rows[2][pluralized]);

            Assert.AreEqual("sample text", rows[0][singularized]);
            Assert.AreEqual("Sample_Text", rows[1][singularized]);
            Assert.AreEqual("$ample-text", rows[2][singularized]);

            Assert.AreEqual("Sample Text", rows[0][titleized]);
            Assert.AreEqual("Sample Texts", rows[1][titleized]);
            Assert.AreEqual("$ample Text", rows[2][titleized]);

            Assert.AreEqual("1", rows[0][toMetric]);
            Assert.AreEqual("22", rows[1][toMetric]);
            Assert.AreEqual("3k", rows[2][toMetric]);

            Assert.AreEqual("first", rows[0][toOrdinalWorded]);
            Assert.AreEqual("twenty-second", rows[1][toOrdinalWorded]);
            Assert.AreEqual("three thousandth", rows[2][toOrdinalWorded]);

            Assert.AreEqual("I", rows[0][toRoman]);
            Assert.AreEqual("XXII", rows[1][toRoman]);
            Assert.AreEqual("MMM", rows[2][toRoman]);

            Assert.AreEqual("one", rows[0][toWords]);
            Assert.AreEqual("twenty-two", rows[1][toWords]);
            Assert.AreEqual("three thousand", rows[2][toWords]);

            Assert.AreEqual("sample_text", rows[0][underscored]);
            Assert.AreEqual("sample_texts", rows[1][underscored]);
            Assert.AreEqual("$ample_text", rows[2][underscored]);

            /*
             * sample text'
             * Sample_Texts
             * $ample-text'
             */
        }
Exemple #21
0
        public void RunInit()
        {
            var composer = new CompositionRoot();

            composer.Compose(Cfg + @"?Mode=init", LogLevel.Info).Execute();
        }
Exemple #22
0
        public void StarSql()
        {
            var composer   = new CompositionRoot();
            var controller = composer.Compose(@"Files\Northwind.xml");

            Assert.AreEqual(0, composer.Process.Errors().Length);

            var pipe   = new PipelineContext(new TraceLogger(), composer.Process);
            var actual = new SqlFormattingManager().Format(pipe.SqlCreateStarView(new SqlServerConnectionFactory(new Connection())));

            Assert.IsNotNull(controller);
            const string expected = @"CREATE VIEW [NorthWindStar]
AS
SELECT A.[A1] AS [TflKey]
	,A.[A2] AS [TflBatchId]
	,A.[A3] AS [TflHashCode]
	,A.[A4] AS [TflDeleted]
	,A.[A5] AS [OrderDetailsDiscount]
	,A.[A6] AS [OrderDetailsOrderID]
	,A.[A7] AS [OrderDetailsProductID]
	,A.[A8] AS [OrderDetailsQuantity]
	,A.[A9] AS [OrderDetailsRowVersion]
	,A.[A10] AS [OrderDetailsUnitPrice]
	,A.[A11] AS [OrderDetailsExtendedPrice]
	,A.[A20] AS [CountryExchange]
	,A.[A21] AS [Test]
	,A.[B5] AS [OrdersCustomerID]
	,A.[B6] AS [OrdersEmployeeID]
	,A.[E12] AS [ProductsSupplierID]
	,A.[E5] AS [ProductsCategoryID]
	,A.[B19] AS [OrdersShipVia]
	,COALESCE(B.[B7], 0.0) AS [OrdersFreight]
	,COALESCE(B.[B8], '9999-12-31T00:00:00Z') AS [OrdersOrderDate]
	,COALESCE(B.[B10], '9999-12-31T00:00:00Z') AS [OrdersRequiredDate]
	,COALESCE(B.[B12], '') AS [OrdersShipAddress]
	,COALESCE(B.[B13], '') AS [OrdersShipCity]
	,COALESCE(B.[B14], '') AS [OrdersShipCountry]
	,COALESCE(B.[B15], '') AS [OrdersShipName]
	,COALESCE(B.[B16], '9999-12-31T00:00:00Z') AS [OrdersShippedDate]
	,COALESCE(B.[B17], '') AS [OrdersShipPostalCode]
	,COALESCE(B.[B18], '') AS [OrdersShipRegion]
	,COALESCE(B.[B20], '12-DEC') AS [TimeOrderMonth]
	,COALESCE(B.[B21], '9999-12-31') AS [TimeOrderDate]
	,COALESCE(B.[B22], '9999') AS [TimeOrderYear]
	,COALESCE(C.[C5], '') AS [CustomersAddress]
	,COALESCE(C.[C6], '') AS [CustomersCity]
	,COALESCE(C.[C7], '') AS [CustomersCompanyName]
	,COALESCE(C.[C8], '') AS [CustomersContactName]
	,COALESCE(C.[C9], '') AS [CustomersContactTitle]
	,COALESCE(C.[C10], '') AS [CustomersCountry]
	,COALESCE(C.[C12], '') AS [CustomersFax]
	,COALESCE(C.[C13], '') AS [CustomersPhone]
	,COALESCE(C.[C14], '') AS [CustomersPostalCode]
	,COALESCE(C.[C15], '') AS [CustomersRegion]
	,COALESCE(D.[D5], '') AS [EmployeesAddress]
	,COALESCE(D.[D6], '9999-12-31T00:00:00Z') AS [EmployeesBirthDate]
	,COALESCE(D.[D7], '') AS [EmployeesCity]
	,COALESCE(D.[D8], '') AS [EmployeesCountry]
	,COALESCE(D.[D10], '') AS [EmployeesExtension]
	,COALESCE(D.[D11], '') AS [EmployeesFirstName]
	,COALESCE(D.[D12], '9999-12-31T00:00:00Z') AS [EmployeesHireDate]
	,COALESCE(D.[D13], '') AS [EmployeesHomePhone]
	,COALESCE(D.[D14], '') AS [EmployeesLastName]
	,COALESCE(D.[D15], '') AS [EmployeesNotes]
	,COALESCE(D.[D18], '') AS [EmployeesPostalCode]
	,COALESCE(D.[D19], '') AS [EmployeesRegion]
	,COALESCE(D.[D21], '') AS [EmployeesTitle]
	,COALESCE(D.[D22], '') AS [EmployeesTitleOfCourtesy]
	,COALESCE(D.[D23], 0) AS [EmployeesReportsTo]
	,COALESCE(D.[D24], '') AS [EmployeesManager]
	,COALESCE(D.[D25], '') AS [Employee]
	,COALESCE(E.[E6], 0) AS [ProductsDiscontinued]
	,COALESCE(E.[E8], '') AS [ProductsProductName]
	,COALESCE(E.[E9], '') AS [ProductsQuantityPerUnit]
	,COALESCE(E.[E10], 0) AS [ProductsReorderLevel]
	,COALESCE(E.[E13], 0.0) AS [ProductsUnitPrice]
	,COALESCE(E.[E14], 0) AS [ProductsUnitsInStock]
	,COALESCE(E.[E15], 0) AS [ProductsUnitsOnOrder]
	,COALESCE(F.[F5], '') AS [SuppliersAddress]
	,COALESCE(F.[F6], '') AS [SuppliersCity]
	,COALESCE(F.[F7], '') AS [SuppliersCompanyName]
	,COALESCE(F.[F8], '') AS [SuppliersContactName]
	,COALESCE(F.[F9], '') AS [SuppliersContactTitle]
	,COALESCE(F.[F10], '') AS [SuppliersCountry]
	,COALESCE(F.[F11], '') AS [SuppliersFax]
	,COALESCE(F.[F12], '') AS [SuppliersHomePage]
	,COALESCE(F.[F13], '') AS [SuppliersPhone]
	,COALESCE(F.[F14], '') AS [SuppliersPostalCode]
	,COALESCE(F.[F15], '') AS [SuppliersRegion]
	,COALESCE(G.[G6], '') AS [CategoriesCategoryName]
	,COALESCE(G.[G7], '') AS [CategoriesDescription]
	,COALESCE(H.[H5], '') AS [ShippersCompanyName]
	,COALESCE(H.[H6], '') AS [ShippersPhone]
FROM [NorthWindOrder DetailsTable] A
LEFT OUTER JOIN [NorthWindOrdersTable] B ON (A.[A6] = B.[B9])
LEFT OUTER JOIN [NorthWindCustomersTable] C ON (A.[B5] = C.[C11])
LEFT OUTER JOIN [NorthWindEmployeesTable] D ON (A.[B6] = D.[D9])
LEFT OUTER JOIN [NorthWindProductsTable] E ON (A.[A7] = E.[E7])
LEFT OUTER JOIN [NorthWindSuppliersTable] F ON (A.[E12] = F.[F17])
LEFT OUTER JOIN [NorthWindCategoriesTable] G ON (A.[E5] = G.[G5])
LEFT OUTER JOIN [NorthWindShippersTable] H ON (A.[B19] = H.[H8]);
";

            Assert.AreEqual(expected, actual);
        }
Exemple #23
0
        public void FlatSql()
        {
            var composer   = new CompositionRoot();
            var controller = composer.Compose(@"Files\Northwind.xml");

            Assert.AreEqual(0, composer.Process.Errors().Length);

            var pipe   = new PipelineContext(new TraceLogger(), composer.Process);
            var actual = new SqlFormattingManager().Format(pipe.SqlCreateFlatTable(new SqlServerConnectionFactory(new Connection())));

            Assert.IsNotNull(controller);
            const string expected = @"CREATE TABLE [NorthWindFlat] (
	[TflKey] INT NOT NULL
	,[TflBatchId] INT NOT NULL
	,[TflHashCode] INT NOT NULL
	,[TflDeleted] BIT NOT NULL
	,[OrderDetailsDiscount] REAL NOT NULL
	,[OrderDetailsOrderID] INT NOT NULL
	,[OrderDetailsProductID] INT NOT NULL
	,[OrderDetailsQuantity] SMALLINT NOT NULL
	,[OrderDetailsRowVersion] VARBINARY(8) NOT NULL
	,[OrderDetailsUnitPrice] DECIMAL(19, 4) NOT NULL
	,[OrderDetailsExtendedPrice] DECIMAL(19, 4) NOT NULL
	,[CountryExchange] NVARCHAR(128) NOT NULL
	,[Test] NVARCHAR(64) NOT NULL
	,[OrdersCustomerID] NVARCHAR(5) NOT NULL
	,[OrdersEmployeeID] INT NOT NULL
	,[ProductsSupplierID] INT NOT NULL
	,[ProductsCategoryID] INT NOT NULL
	,[OrdersShipVia] INT NOT NULL
	,[OrdersFreight] DECIMAL(19, 4) NOT NULL
	,[OrdersOrderDate] DATETIME NOT NULL
	,[OrdersRequiredDate] DATETIME NOT NULL
	,[OrdersShipAddress] NVARCHAR(60) NOT NULL
	,[OrdersShipCity] NVARCHAR(15) NOT NULL
	,[OrdersShipCountry] NVARCHAR(15) NOT NULL
	,[OrdersShipName] NVARCHAR(40) NOT NULL
	,[OrdersShippedDate] DATETIME NOT NULL
	,[OrdersShipPostalCode] NVARCHAR(10) NOT NULL
	,[OrdersShipRegion] NVARCHAR(15) NOT NULL
	,[TimeOrderMonth] NVARCHAR(6) NOT NULL
	,[TimeOrderDate] NVARCHAR(10) NOT NULL
	,[TimeOrderYear] NVARCHAR(4) NOT NULL
	,[CustomersAddress] NVARCHAR(60) NOT NULL
	,[CustomersCity] NVARCHAR(15) NOT NULL
	,[CustomersCompanyName] NVARCHAR(40) NOT NULL
	,[CustomersContactName] NVARCHAR(30) NOT NULL
	,[CustomersContactTitle] NVARCHAR(30) NOT NULL
	,[CustomersCountry] NVARCHAR(15) NOT NULL
	,[CustomersFax] NVARCHAR(24) NOT NULL
	,[CustomersPhone] NVARCHAR(24) NOT NULL
	,[CustomersPostalCode] NVARCHAR(10) NOT NULL
	,[CustomersRegion] NVARCHAR(15) NOT NULL
	,[EmployeesAddress] NVARCHAR(60) NOT NULL
	,[EmployeesBirthDate] DATETIME NOT NULL
	,[EmployeesCity] NVARCHAR(15) NOT NULL
	,[EmployeesCountry] NVARCHAR(15) NOT NULL
	,[EmployeesExtension] NVARCHAR(4) NOT NULL
	,[EmployeesFirstName] NVARCHAR(10) NOT NULL
	,[EmployeesHireDate] DATETIME NOT NULL
	,[EmployeesHomePhone] NVARCHAR(24) NOT NULL
	,[EmployeesLastName] NVARCHAR(20) NOT NULL
	,[EmployeesNotes] NVARCHAR(max) NOT NULL
	,[EmployeesPostalCode] NVARCHAR(10) NOT NULL
	,[EmployeesRegion] NVARCHAR(15) NOT NULL
	,[EmployeesTitle] NVARCHAR(30) NOT NULL
	,[EmployeesTitleOfCourtesy] NVARCHAR(25) NOT NULL
	,[EmployeesReportsTo] INT NOT NULL
	,[EmployeesManager] NVARCHAR(64) NOT NULL
	,[Employee] NVARCHAR(64) NOT NULL
	,[ProductsDiscontinued] BIT NOT NULL
	,[ProductsProductName] NVARCHAR(40) NOT NULL
	,[ProductsQuantityPerUnit] NVARCHAR(20) NOT NULL
	,[ProductsReorderLevel] SMALLINT NOT NULL
	,[ProductsUnitPrice] DECIMAL(19, 4) NOT NULL
	,[ProductsUnitsInStock] SMALLINT NOT NULL
	,[ProductsUnitsOnOrder] SMALLINT NOT NULL
	,[SuppliersAddress] NVARCHAR(60) NOT NULL
	,[SuppliersCity] NVARCHAR(15) NOT NULL
	,[SuppliersCompanyName] NVARCHAR(40) NOT NULL
	,[SuppliersContactName] NVARCHAR(30) NOT NULL
	,[SuppliersContactTitle] NVARCHAR(30) NOT NULL
	,[SuppliersCountry] NVARCHAR(15) NOT NULL
	,[SuppliersFax] NVARCHAR(24) NOT NULL
	,[SuppliersHomePage] NVARCHAR(max) NOT NULL
	,[SuppliersPhone] NVARCHAR(24) NOT NULL
	,[SuppliersPostalCode] NVARCHAR(10) NOT NULL
	,[SuppliersRegion] NVARCHAR(15) NOT NULL
	,[CategoriesCategoryName] NVARCHAR(15) NOT NULL
	,[CategoriesDescription] NVARCHAR(max) NOT NULL
	,[ShippersCompanyName] NVARCHAR(40) NOT NULL
	,[ShippersPhone] NVARCHAR(24) NOT NULL
	,CONSTRAINT pk_NorthWindFlat_tflkey PRIMARY KEY ([TflKey])
	);
";

            Assert.AreEqual(expected, actual);
        }