示例#1
0
        public void NotNullOk()
        {
            var col = new DataColumn("stock_id", typeof(long));

            col.AllowDBNull = false;

            TableSchema schema = new TableSchema("test1",
                                                 col,
                                                 new DataColumn("value", typeof(double)));

            DataTable t = schema.NewTempTable();

            ScopedTable table = new ScopedTable(schema, t, null);

            DataRow row = table.NewRow();

            row["stock_id"] = 1;
            row["value"]    = 23.0d;

            table.Add(row);

            var rows = table.Rows.ToList();

            Assert.AreEqual(1, rows.Count);
            Assert.AreEqual(1, row["stock_id"]);
            Assert.AreEqual(23.0d, row["value"]);
        }
示例#2
0
        public void Select()
        {
            TableSchema   schema = CreateSchema("test1");
            ITableManager mgr    = myScriptingInterface.GetManager(schema);

            mgr.CreateTable();

            // add some data
            ScopedTable table = mgr.Query(0);

            AddRow(table, 0, new DateTime(2001, 1, 1), 1);
            AddRow(table, 0, new DateTime(2002, 1, 1), 2);

            table = mgr.Query(1);
            AddRow(table, 1, new DateTime(2010, 1, 1), 12);

            // select
            var rows = mgr.Query(0).Rows.ToList();

            Assert.AreEqual(2, rows.Count);

            Assert.AreNotEqual(DBNull.Value, rows[0]["id"]);
            Assert.AreNotEqual(DBNull.Value, rows[1]["id"]);
            Assert.AreNotEqual(rows[0]["id"], rows[1]["id"]);

            Assert.AreEqual(0, rows[0]["stock_id"]);
            Assert.AreEqual(new DateTime(2001, 1, 1), rows[0].GetDate(schema));
            Assert.AreEqual(1, rows[0]["value"]);

            Assert.AreEqual(0, rows[1]["stock_id"]);
            Assert.AreEqual(new DateTime(2002, 1, 1), rows[1].GetDate(schema));
            Assert.AreEqual(2, rows[1]["value"]);

            Assert.IsTrue(rows.All(r => r.RowState == DataRowState.Unchanged));
        }
示例#3
0
        public void OriginAddOrUpdate()
        {
            TableSchema schema = new TableSchema("OriginTest",
                                                 new DataColumn("stock_id", typeof(long)),
                                                 new DataColumn("date", typeof(string)),
                                                 new DataColumn("datum_origin_id", typeof(long)),
                                                 new DataColumn("value", typeof(double)));

            DataTable t = schema.NewTempTable();

            ScopedTable table = new ScopedTable(schema, t, null);

            AddRow(table, 1, "2002-01-02 00:00", 1, 2.1d);
            AddRow(table, 1, "2002-01-02 00:00", 1, 2.2d);
            AddRow(table, 1, "2002-01-02 00:00", 1, 2.3d);
            AddRow(table, 1, "2003-01-02 00:00", 1, 3.1d);
            AddRow(table, 1, "2003-01-02 00:00", 3, 3.3d);
            AddRow(table, 1, "2004-01-02 00:00", 3, 4.3d);

            var rows = table.Rows.ToList();

            Assert.AreEqual(4, rows.Count);
            Assert.AreEqual(2.3d, (double)rows[0]["value"], 0.000001d);
            Assert.AreEqual(3.1d, (double)rows[1]["value"], 0.000001d);
            Assert.AreEqual(3.3d, (double)rows[2]["value"], 0.000001d);
            Assert.AreEqual(4.3d, (double)rows[3]["value"], 0.000001d);
        }
示例#4
0
        public void SelectMultiple()
        {
            TableSchema   schema = CreateSchema("test1");
            ITableManager mgr    = myScriptingInterface.GetManager(schema);

            mgr.CreateTable();

            // add some data
            ScopedTable table = mgr.Query(0);

            AddRow(table, 0, new DateTime(2001, 1, 1), 1);
            AddRow(table, 0, new DateTime(2002, 1, 1), 2);
            AddRow(table, 1, new DateTime(2010, 1, 1), 2);

            // first select
            var table1 = mgr.Query(0).Rows.ToList();

            Assert.AreEqual(2, table1.Count());
            Assert.AreEqual(1, table1[0]["value"]);
            Assert.AreEqual(2, table1[1]["value"]);
            Assert.IsTrue(table1.All(r => r.RowState == DataRowState.Unchanged));

            // now select again
            var table2 = mgr.Query(0).Rows.ToList();

            Assert.AreEqual(2, table1.Count());
            Assert.AreEqual(1, table1[0]["value"]);
            Assert.AreEqual(2, table1[1]["value"]);
            Assert.IsTrue(table1.All(r => r.RowState == DataRowState.Unchanged));
        }
示例#5
0
        public override void SetUp()
        {
            base.SetUp();

            myDB = myMockery.NewMock <IDatabaseSC>();

            var serviceProvider = new ServiceProvider();

            serviceProvider.RegisterService("TOM Database", myDB);

            myScriptingInterface = new ScriptingInterface();
            myScriptingInterface.Init(serviceProvider);

            // prepare data
            mySchema = CreateSchema("test1");
            myMgr    = myScriptingInterface.GetManager(mySchema);
            myMgr.CreateTable();

            // add some data
            ScopedTable table = myMgr.Query(0);

            AddRow(table, 0, 0, new DateTime(2001, 1, 1), 1);
            AddRow(table, 0, 0, new DateTime(2002, 1, 1), 2);
            AddRow(table, 0, 1, new DateTime(2002, 1, 1), 12);
            AddRow(table, 0, 0, new DateTime(2003, 1, 1), 3);
            AddRow(table, 0, 1, new DateTime(2003, 1, 1), 13);
            AddRow(table, 0, 2, new DateTime(2003, 1, 1), 23);
            AddRow(table, 0, 0, new DateTime(2004, 1, 1), 4);
            AddRow(table, 0, 1, new DateTime(2005, 1, 1), 15);

            table = myMgr.Query(1);
            AddRow(table, 1, 1, new DateTime(2002, 1, 1), 112);
        }
示例#6
0
        public static void Single(this DataColumn col, object value)
        {
            var inputTable = Interpreter.Context.TomScripting.GetManager(col.Table.TableName);
            var stock      = Interpreter.Context.Scope.Stock;

            long ownerId = stock.GetId(inputTable.Schema.OwnerIdColumn);

            using (TransactionScope trans = new TransactionScope())
            {
                object obj = value;
                if (col.DataType == typeof(double))
                {
                    obj = Convert.ToDouble(value, CultureInfo.InvariantCulture);
                }

                ScopedTable result = inputTable.Query(ownerId);

                DataRow row = result.NewRow();
                row[inputTable.Schema.OwnerIdColumn] = ownerId;
                row[col.ColumnName] = obj;

                result.AddOrUpdate(row, col.ColumnName);

                trans.Complete();
            }
        }
示例#7
0
        private void SetupInterpreter()
        {
            AddDummyStock();

            TableSchema schema = new TableSchema("stock_price",
                                                 new DataColumn("traded_stock_id", typeof(long)),
                                                 new DataColumn("date", typeof(string)),
                                                 new DataColumn("close", typeof(double)))
                                 .Create();

            // we have a datum so we need the table now

            ScopedTable table = schema.Manager().Query(CurrentStockId);

            AddStockPrice(table, "2000-12-12 00:00", 12.2d);
            AddStockPrice(table, "2000-12-11 00:00", 12.1d);
            AddStockPrice(table, "2000-12-13 00:00", 12.3d);

            AddStockPrice(table, "2001-12-12 00:00", 13.2d);
            AddStockPrice(table, "2001-12-11 00:00", 13.1d);
            AddStockPrice(table, "2001-12-13 00:00", 13.3d);

            AddStockPrice(table, "2002-12-12 00:00", 14.2d);
            AddStockPrice(table, "2002-12-11 00:00", 14.1d);
            AddStockPrice(table, "2002-12-13 00:00", 14.3d);

            AddStockPrice(table, "2003-12-12 00:00", 15.2d);
            AddStockPrice(table, "2003-12-11 00:00", 15.1d);
            AddStockPrice(table, "2003-12-13 00:00", 15.3d);

            AddStockPrice(table, "2004-12-12 00:00", 16.2d);
            AddStockPrice(table, "2004-12-11 00:00", 16.1d);
            AddStockPrice(table, "2004-12-13 00:00", 16.3d);
        }
示例#8
0
        protected void AddRow(ScopedTable table, long id, string value)
        {
            DataRow row = table.NewRow();

            row[table.Schema.OwnerIdColumn] = id;
            row["Value"] = value;

            table.Add(row);
        }
示例#9
0
        private void AddStockPrice(ScopedTable table, string date, double value)
        {
            DataRow row = table.NewRow();

            row["traded_stock_id"] = CurrentTradedStockId;
            row.SetDate(table.Schema, DateTime.Parse(date));
            row["close"] = value;
            table.Add(row);
        }
示例#10
0
        protected void AddRow(ScopedTable table, long id, DateTime date, int value)
        {
            DataRow row = table.NewRow();

            row[table.Schema.OwnerIdColumn] = id;
            row.SetDate(table.Schema, date);
            row["Value"] = value;

            table.Add(row);
        }
示例#11
0
        public static TableSchema Growth(this IMslScript script, DataColumn fromCol, DataColumn into)
        {
            if (into == null)
            {
                TempTable.RewriteOwnerId(fromCol).Create();
                into = TempTable["value"];
            }

            var inputTable = Interpreter.Context.TomScripting.GetManager(fromCol.Table.TableName);
            var outTable   = Interpreter.Context.TomScripting.GetManager(into.Table.TableName);

            var stock = Interpreter.Context.Scope.Stock;
            var from  = Interpreter.Context.Scope.From;
            var to    = Interpreter.Context.Scope.To;

            long ownerId = stock.GetId(inputTable.Schema.OwnerIdColumn);

            using (TransactionScope trans = new TransactionScope())
            {
                ScopedTable inputData = inputTable.Query(ownerId, new DateClause(from, to), OriginClause.Default);

                var q = from row in inputData.Rows
                        orderby row.GetDateString(inputData.Schema) ascending
                        select new
                {
                    Date  = row.GetDate(inputData.Schema),
                    Value = row.Field <double>(fromCol.ColumnName),
                };

                var result = outTable.Query(ownerId);

                double prev = double.MaxValue;
                foreach (var row in q)
                {
                    if (prev == double.MaxValue)
                    {
                        prev = row.Value;
                    }

                    double growth = row.Value - prev;
                    prev = row.Value;

                    DataRow outRow = result.NewRow();
                    outRow[result.Schema.OwnerIdColumn] = ownerId;
                    outRow.SetDate(result.Schema, row.Date);
                    outRow[into.ColumnName] = growth;

                    result.AddOrUpdate(outRow, into.ColumnName);
                }

                trans.Complete();
            }

            return(Interpreter.Context.TomScripting.GetManager(into.Table.TableName).Schema);
        }
示例#12
0
        private void AddRow(ScopedTable table, long ownerId, string date, long origin, double value)
        {
            DataRow row = table.NewRow();

            row[table.Schema.OwnerIdColumn] = ownerId;
            row.SetDate(table.Schema, DateTime.Parse(date));
            row[table.Schema.OriginColumn] = origin;
            row["value"] = value;

            table.AddOrUpdate(row);
        }
示例#13
0
        public static IEnumerable <double> ToSet(this IMslScript script, DataColumn fromCol)
        {
            var inputTable = Interpreter.Context.TomScripting.GetManager(fromCol.Table.TableName);

            var stock = Interpreter.Context.Scope.Stock;
            var from  = Interpreter.Context.Scope.From;
            var to    = Interpreter.Context.Scope.To;

            long        ownerId   = stock.GetId(inputTable.Schema.OwnerIdColumn);
            ScopedTable inputData = inputTable.Query(ownerId, new DateClause(from, to), OriginClause.Default);

            return(inputData.Rows.Select(row => row.Field <double>(fromCol.ColumnName)));
        }
 public void Dispose()
 {
     foreach (var scoped in ScopedTable)
     {
         var disposable = scoped.Value as IDisposable;
         if (disposable != null)
         {
             disposable.Dispose();
         }
     }
     DependencyEntryTable.Clear();
     PropertyEntryTable.Clear();
     HasPropertyEntryTable.Clear();
     CompileTable.Clear();
     ScopedTable.Clear();
 }
示例#15
0
        public void SelectDateTime()
        {
            TableSchema   schema = CreateSchema("test1");
            ITableManager mgr    = myScriptingInterface.GetManager(schema);

            mgr.CreateTable();

            // add some data
            ScopedTable table = mgr.Query(0);

            AddRow(table, 0, DateTime.Now, 25);

            // select
            var rows = mgr.Query(0, new DateClause(DateTime.Now)).Rows.ToList();

            Assert.AreEqual(1, rows.Count);

            Assert.AreEqual(25, rows[0]["value"]);
        }
示例#16
0
        public void SetTimestamp()
        {
            TableSchema schema = new TableSchema("test1",
                                                 new DataColumn("stock_id", typeof(long)),
                                                 new DataColumn("timestamp", typeof(string)),
                                                 new DataColumn("value", typeof(double)));

            DataTable t = schema.NewTempTable();

            ScopedTable table = new ScopedTable(schema, t, null);

            DataRow row = table.NewRow();

            row["stock_id"] = 1;
            row["value"]    = 23.0d;

            table.Add(row);

            Assert.IsTrue(DateTime.Now.AlmostEquals(row.GetDate("timestamp"), 1));
        }
示例#17
0
        public void NotNullIsNull()
        {
            var col = new DataColumn("stock_id", typeof(long));

            col.AllowDBNull = false;

            TableSchema schema = new TableSchema("test1",
                                                 col,
                                                 new DataColumn("value", typeof(double)));

            DataTable t = schema.NewTempTable();

            ScopedTable table = new ScopedTable(schema, t, null);

            DataRow row = table.NewRow();

            row["value"] = 23.0d;

            table.Add(row);
        }
示例#18
0
        public void SelectFromTo()
        {
            TableSchema   schema = CreateSchema("test1");
            ITableManager mgr    = myScriptingInterface.GetManager(schema);

            mgr.CreateTable();

            // add some data
            ScopedTable table = mgr.Query(0);

            AddRow(table, 0, new DateTime(2001, 1, 1), 1);
            AddRow(table, 0, new DateTime(2002, 1, 1), 2);
            AddRow(table, 0, new DateTime(2003, 1, 1), 3);
            AddRow(table, 0, new DateTime(2004, 1, 1), 4);
            AddRow(table, 0, new DateTime(2005, 1, 1), 5);
            table = mgr.Query(1);
            AddRow(table, 1, new DateTime(2005, 1, 1), 22);

            // select
            var rows = mgr.Query(0, new DateClause(new DateTime(2002, 1, 1), new DateTime(2005, 1, 1))).Rows.ToList();

            Assert.AreEqual(4, rows.Count);
            Assert.AreEqual(2002, rows[0].GetDate(schema).Year);
            Assert.AreEqual(2003, rows[1].GetDate(schema).Year);
            Assert.AreEqual(2004, rows[2].GetDate(schema).Year);
            Assert.AreEqual(2005, rows[3].GetDate(schema).Year);
            Assert.IsTrue(rows.All(r => r.RowState == DataRowState.Unchanged));

            // select with swapped to and from to check robustnes
            rows = mgr.Query(0, new DateClause(new DateTime(2005, 1, 1), new DateTime(2002, 1, 1))).Rows.ToList();

            Assert.AreEqual(4, rows.Count);
            Assert.AreEqual(2002, rows[0].GetDate(schema).Year);
            Assert.AreEqual(2003, rows[1].GetDate(schema).Year);
            Assert.AreEqual(2004, rows[2].GetDate(schema).Year);
            Assert.AreEqual(2005, rows[3].GetDate(schema).Year);
        }
示例#19
0
        public static TableSchema CopySeries(this IMslScript script, DataColumn fromCol, DataColumn toCol)
        {
            if (toCol == null)
            {
                TempTable.Create();
                toCol = TempTable["value"];
            }

            var inputTable = Interpreter.Context.TomScripting.GetManager(fromCol.Table.TableName);
            var outTable   = Interpreter.Context.TomScripting.GetManager(toCol.Table.TableName);

            var stock = Interpreter.Context.Scope.Stock;
            var from  = Interpreter.Context.Scope.From;
            var to    = Interpreter.Context.Scope.To;

            long ownerId = stock.GetId(inputTable.Schema.OwnerIdColumn);

            using (TransactionScope trans = new TransactionScope())
            {
                ScopedTable fromData = inputTable.Query(ownerId, new DateClause(from, to), OriginClause.Default);

                var result = outTable.Query(ownerId);
                foreach (DataRow row in fromData.Rows)
                {
                    DataRow outRow = result.NewRow();
                    outRow[result.Schema.OwnerIdColumn] = ownerId;
                    outRow.SetDate(outTable.Schema, row.GetDate(fromData.Schema));
                    outRow[toCol.ColumnName] = row[fromCol.ColumnName];

                    result.AddOrUpdate(outRow, toCol.ColumnName);
                }

                trans.Complete();
            }

            return(Interpreter.Context.TomScripting.GetManager(toCol.Table.TableName).Schema);
        }
示例#20
0
        public static TableSchema Aggregate(this IMslScript script, DataColumn fromCol, DataColumn toCol, Func <IEnumerable <double>, double> Calculator)
        {
            if (toCol == null)
            {
                TempTable.RewriteOwnerId(fromCol).Create();
                toCol = TempTable["value"];
            }

            var inputTable = Interpreter.Context.TomScripting.GetManager(fromCol.Table.TableName);
            var outTable   = Interpreter.Context.TomScripting.GetManager(toCol.Table.TableName);

            var stock = Interpreter.Context.Scope.Stock;
            var from  = Interpreter.Context.Scope.From;
            var to    = Interpreter.Context.Scope.To;

            long ownerId = stock.GetId(inputTable.Schema.OwnerIdColumn);

            using (TransactionScope trans = new TransactionScope())
            {
                ScopedTable inputData = inputTable.Query(ownerId, new DateClause(from, to), OriginClause.Default);

                // calculate
                var aggr = Calculator(inputData.Rows.Select(row => row.Field <double>(fromCol.ColumnName)));

                var outData = outTable.Query(ownerId);

                DataRow outRow = outData.NewRow();
                outRow[outData.Schema.OwnerIdColumn] = ownerId;
                outRow[toCol.ColumnName]             = aggr;

                outData.AddOrUpdate(outRow, toCol.ColumnName);

                trans.Complete();
            }

            return(Interpreter.Context.TomScripting.GetManager(toCol.Table.TableName).Schema);
        }
示例#21
0
        public void AddOrUpdateWithDate()
        {
            TableSchema schema = new TableSchema("test1",
                                                 new DataColumn("stock_id", typeof(long)),
                                                 new DataColumn("date", typeof(string)),
                                                 new DataColumn("value", typeof(double)));

            DataTable t = schema.NewTempTable();

            ScopedTable table = new ScopedTable(schema, t, null);

            // initial row
            {
                DataRow row = table.NewRow();
                row["stock_id"] = 1;
                row.SetDate(schema, DateTime.Parse("2002-01-01 00:00"));
                row["value"] = 23.0d;

                table.AddOrUpdate(row);
            }

            // same id, same date => update
            {
                DataRow row = table.NewRow();
                row["stock_id"] = 1;
                row.SetDate(schema, DateTime.Parse("2002-01-01 00:00"));
                row["value"] = 42.0d;

                table.AddOrUpdate(row);
            }

            // same id, new date => add
            {
                DataRow row = table.NewRow();
                row["stock_id"] = 1;
                row.SetDate(schema, DateTime.Parse("2002-01-02 00:00"));
                row["value"] = 25.0d;

                table.AddOrUpdate(row);
            }

            // new stock_id, same date => add
            {
                DataRow row = table.NewRow();
                row["stock_id"] = 2;
                row.SetDate(schema, DateTime.Parse("2002-01-02 00:00"));
                row["value"] = 37.0d;

                table.AddOrUpdate(row);
            }

            var rows = table.Rows.ToList();

            Assert.AreEqual(3, rows.Count);

            Assert.AreEqual(1, rows[0][schema.OwnerIdColumn]);
            Assert.AreEqual(42.0d, rows[0]["value"]);

            Assert.AreEqual(1, rows[1][schema.OwnerIdColumn]);
            Assert.AreEqual(25.0d, rows[1]["value"]);

            Assert.AreEqual(2, rows[2][schema.OwnerIdColumn]);
            Assert.AreEqual(37.0d, rows[2]["value"]);
        }
示例#22
0
文件: HighLow.cs 项目: riyanhax/Maui
        public static TableSchema HighLow(this IMslScript script, DataColumn value, TimeGrouping grouping, DataColumn intoHigh, DataColumn intoLow)
        {
            if (intoHigh == null)
            {
                TempTable.Create();
                intoHigh = TempTable["high"];
            }
            if (intoLow == null)
            {
                TempTable.Create();
                intoLow = TempTable["low"];
            }

            if (intoHigh.Table.TableName != intoLow.Table.TableName)
            {
                throw new Exception("High and low columns need to belong to the same table");
            }

            var inputTable = Interpreter.Context.TomScripting.GetManager(value.Table.TableName);
            var outTable   = Interpreter.Context.TomScripting.GetManager(intoHigh.Table.TableName);

            var stock = Interpreter.Context.Scope.Stock;
            var from  = Interpreter.Context.Scope.From;
            var to    = Interpreter.Context.Scope.To;

            using (TransactionScope trans = new TransactionScope())
            {
                long ownerId = stock.GetId(outTable.Schema.OwnerIdColumn);
                var  result  = outTable.Query(ownerId);

                ScopedTable inputData = inputTable.Query(ownerId, new DateClause(from, to), OriginClause.Default);

                DateTime?currentPeriod = null;
                DateTime?newPeriod     = null;
                double   low           = double.MaxValue;
                double   high          = double.MinValue;

                // helper Lambda which adds a found result to the result table
                Action AddResult = delegate()
                {
                    // handle no min, max could be determined
                    if (low == double.MaxValue)
                    {
                        myLogger.Warning("stock_price_low could not be determined for: TradedStockId = {0}", stock.TradedStock.Id);
                        low = -1;
                    }
                    if (high == double.MinValue)
                    {
                        myLogger.Warning("stock_price_high could not be determined for: TradedStockId = {0}", stock.TradedStock.Id);
                        high = -1;
                    }

                    DataRow outRow = result.NewRow();
                    outRow[result.Schema.OwnerIdColumn] = ownerId;
                    outRow.SetDate(result.Schema, currentPeriod.Value);
                    outRow[intoHigh.ColumnName] = high;
                    outRow[intoLow.ColumnName]  = low;

                    result.AddOrUpdate(outRow, intoHigh.ColumnName, intoLow.ColumnName);
                };

                foreach (DataRow row in inputData.Rows.OrderBy(row => row[inputTable.Schema.DateColumn]))
                {
                    DateTime date = row.GetDate(inputTable.Schema);

                    // convert the new period
                    if (grouping == TimeGrouping.Year)
                    {
                        newPeriod = Blade.DateTimeExtensions.FirstOfYear(date.Year);
                    }
                    else if (grouping == TimeGrouping.Month)
                    {
                        newPeriod = new DateTime(date.Year, date.Month, 1);
                    }
                    else
                    {
                        throw new InvalidOperationException("Unsupported time period definition: " + grouping);
                    }

                    // new period start detected other than the first one?
                    if (currentPeriod != newPeriod && currentPeriod != null)
                    {
                        AddResult();

                        // reset temp variables
                        currentPeriod = newPeriod;
                        high          = double.MinValue;
                        low           = double.MaxValue;
                    }
                    else if (currentPeriod == null)
                    {
                        // handle first period
                        currentPeriod = newPeriod;
                    }

                    double close = (double)row[value.ColumnName];

                    if (close == -1)
                    {
                        myLogger.Warning("Ignoring invalid close price for: TradedStockId = {0}", stock.TradedStock.Id);
                        continue;
                    }

                    low  = Math.Min(close, low);
                    high = Math.Max(close, high);
                }

                // we left the time scope but is there s.th. left to store?
                if (low != double.MaxValue && high != double.MinValue)
                {
                    AddResult();
                }

                trans.Complete();
            }

            return(Interpreter.Context.TomScripting.GetManager(intoHigh.Table.TableName).Schema);
        }