public ScopedTable Query(long ownerId, DateClause dateClause, OriginClause originClause)
        {
            DataTable table = null;

            if (Schema.DateColumn != null)
            {
                if (Schema.DateIsYear)
                {
                    table = myDB.Query(FindByOwnerIdAndFromToCmd, ownerId, dateClause.From.Year, dateClause.To.Year);
                }
                else
                {
                    table = myDB.Query(FindByOwnerIdAndFromToCmd, ownerId,
                                       Maui.TypeConverter.DateToString(dateClause.From), Maui.TypeConverter.DateToString(dateClause.To));
                }
            }
            else
            {
                table = myDB.Query(FindByOwnerIdCmd, ownerId);
            }

            table.RowChanged += OnRowChanged;
            table.RowDeleted += OnRowChanged;

            return(new ScopedTable(Schema, table, originClause));
        }
Beispiel #2
0
        private DataRow GetRowByGroup(IEnumerable <DataRow> rowGroup, object origin, OriginClause originClause)
        {
            // analyse the group
            if (originClause.IsMergeAllowed)
            {
                // merging is allowed so just take the best of ranking
                return(GetRowByRanking(rowGroup, originClause.Ranking));
            }

            if (origin == null)
            {
                // no origin yet selected -> free choise
                return(GetRowByRanking(rowGroup, originClause.Ranking));
            }
            else
            {
                // take the same origin as before
                var outRow = rowGroup.FirstOrDefault(r => r[Schema.OriginColumn].Equals(origin));
                if (outRow == null)
                {
                    // TODO: throwing an exception here??
                    //       but we could not simple ignore this group of rows ...
                    // TODO: get the string
                    string orderCol = (Schema.DateColumn != null ? Schema.DateColumn : Schema.OwnerIdColumn);
                    throw new Exception(string.Format("Could not get a value for {0} and {1}", rowGroup.First()[orderCol], origin));
                }

                return(outRow);
            }
        }
Beispiel #3
0
        public ScopedTable(TableSchema schema, DataTable table, OriginClause originClause, Func <DataRow, bool> rowFilter)
        {
            this.Require(x => table != null);
            this.Require(x => schema != null);

            Schema = schema;
            Table  = table;

            // set the row filter
            // -> no operation on deleted rows
            myRowFilter = r => r.RowState != DataRowState.Deleted && (rowFilter == null || rowFilter(r));

            myTableFilter = CreateOriginClause(originClause);
        }
Beispiel #4
0
        public ScopedTable( TableSchema schema, DataTable table, OriginClause originClause, Func<DataRow, bool> rowFilter )
        {
            this.Require( x => table != null );
            this.Require( x => schema != null );

            Schema = schema;
            Table = table;

            // set the row filter
            // -> no operation on deleted rows
            myRowFilter = r => r.RowState != DataRowState.Deleted && ( rowFilter == null || rowFilter( r ) );

            myTableFilter = CreateOriginClause( originClause );
        }
Beispiel #5
0
        private IEnumerable <DataRow> FilterByOrigin(OriginClause originClause, IEnumerable <DataRow> rows)
        {
            // 1. the sort may create groups
            // 2. foreach group (1-n rows) choose one row

            string orderCol = (Schema.DateColumn != null ? Schema.DateColumn : Schema.OwnerIdColumn);

            var    rowGroup = new List <DataRow>();
            object origin   = null;

            foreach (var row in rows.OrderBy(row => row[orderCol]))
            {
                if (rowGroup.Count == 0)
                {
                    rowGroup.Add(row);
                    continue;
                }

                // new group?
                if (rowGroup[0][orderCol].Equals(row[orderCol]))
                {
                    rowGroup.Add(row);
                    continue;
                }

                // analyse the group
                var outRow = GetRowByGroup(rowGroup, origin, originClause);
                if (outRow != null)
                {
                    origin = outRow[Schema.OriginColumn];
                    yield return(outRow);
                }

                rowGroup.Clear();
                rowGroup.Add(row);
            }

            // hanlde remaining group
            {
                var outRow = GetRowByGroup(rowGroup, origin, originClause);
                if (outRow != null)
                {
                    yield return(outRow);
                }
            }
        }
Beispiel #6
0
        public ScopedTable Query(long ownerId, DateClause dateClause, OriginClause originClause)
        {
            Expression <Func <DataRow, bool> > RowFilter = row => (long)row[Schema.OwnerIdColumn] == ownerId;

            if (Schema.DateColumn != null)
            {
                if (Schema.DateIsYear)
                {
                    RowFilter = RowFilter.And(row => dateClause.IsInRange(row.GetDate(Schema).Year));
                }
                else
                {
                    RowFilter = RowFilter.And(row => dateClause.IsInRange(row.GetDate(Schema)));
                }
            }

            return(new ScopedTable(Schema, Table, originClause, RowFilter.Compile()));
        }
Beispiel #7
0
 public ScopedTable(TableSchema schema, DataTable table, OriginClause originClause)
     : this(schema, table, originClause, null)
 {
 }
Beispiel #8
0
        private Func <IEnumerable <DataRow>, IEnumerable <DataRow> > CreateOriginClause(OriginClause originClause)
        {
            if (originClause == null)
            {
                return(rows => rows);
            }

            if (Schema.OriginColumn == null)
            {
                return(rows => rows);
            }

            return(rows => FilterByOrigin(originClause, rows));
        }
Beispiel #9
0
        public ScopedTable Query( long ownerId, DateClause dateClause, OriginClause originClause )
        {
            Expression<Func<DataRow, bool>> RowFilter = row => (long)row[ Schema.OwnerIdColumn ] == ownerId;

            if ( Schema.DateColumn != null )
            {
                if ( Schema.DateIsYear )
                {
                    RowFilter = RowFilter.And( row => dateClause.IsInRange( row.GetDate( Schema ).Year ) );
                }
                else
                {
                    RowFilter = RowFilter.And( row => dateClause.IsInRange( row.GetDate( Schema ) ) );
                }
            }

            return new ScopedTable( Schema, Table, originClause, RowFilter.Compile() );
        }
Beispiel #10
0
 public ScopedTable( TableSchema schema, DataTable table, OriginClause originClause )
     : this(schema, table, originClause, null)
 {
 }
Beispiel #11
0
        private DataRow GetRowByGroup( IEnumerable<DataRow> rowGroup, object origin, OriginClause originClause )
        {
            // analyse the group
            if ( originClause.IsMergeAllowed )
            {
                // merging is allowed so just take the best of ranking
                return GetRowByRanking( rowGroup, originClause.Ranking );
            }

            if ( origin == null )
            {
                // no origin yet selected -> free choise
                return GetRowByRanking( rowGroup, originClause.Ranking );
            }
            else
            {
                // take the same origin as before
                var outRow = rowGroup.FirstOrDefault( r => r[ Schema.OriginColumn ].Equals( origin ) );
                if ( outRow == null )
                {
                    // TODO: throwing an exception here??
                    //       but we could not simple ignore this group of rows ...
                    // TODO: get the string
                    string orderCol = ( Schema.DateColumn != null ? Schema.DateColumn : Schema.OwnerIdColumn );
                    throw new Exception( string.Format( "Could not get a value for {0} and {1}", rowGroup.First()[ orderCol ], origin ) );
                }

                return outRow;
            }
        }
Beispiel #12
0
        private IEnumerable<DataRow> FilterByOrigin( OriginClause originClause, IEnumerable<DataRow> rows )
        {
            // 1. the sort may create groups
            // 2. foreach group (1-n rows) choose one row

            string orderCol = ( Schema.DateColumn != null ? Schema.DateColumn : Schema.OwnerIdColumn );

            var rowGroup = new List<DataRow>();
            object origin = null;
            foreach ( var row in rows.OrderBy( row => row[ orderCol ] ) )
            {
                if ( rowGroup.Count == 0 )
                {
                    rowGroup.Add( row );
                    continue;
                }

                // new group?
                if ( rowGroup[ 0 ][ orderCol ].Equals( row[ orderCol ] ) )
                {
                    rowGroup.Add( row );
                    continue;
                }

                // analyse the group
                var outRow = GetRowByGroup( rowGroup, origin, originClause );
                if ( outRow != null )
                {
                    origin = outRow[ Schema.OriginColumn ];
                    yield return outRow;
                }

                rowGroup.Clear();
                rowGroup.Add( row );
            }

            // hanlde remaining group
            {
                var outRow = GetRowByGroup( rowGroup, origin, originClause );
                if ( outRow != null )
                {
                    yield return outRow;
                }
            }
        }
Beispiel #13
0
        private Func<IEnumerable<DataRow>, IEnumerable<DataRow>> CreateOriginClause( OriginClause originClause )
        {
            if ( originClause == null )
            {
                return rows => rows;
            }

            if ( Schema.OriginColumn == null )
            {
                return rows => rows;
            }

            return rows => FilterByOrigin( originClause, rows );
        }
Beispiel #14
0
        public void OriginRankingWithMerge()
        {
            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();

            var originClause = new OriginClause( true, 2, 1 );

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

            AddRow( table, 1, "2002-01-02 00:00", 1, 2.1d );
            AddRow( table, 1, "2002-01-02 00:00", 2, 2.2d );
            AddRow( table, 1, "2002-01-02 00:00", 3, 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( 3, rows.Count );
            Assert.AreEqual( 2.2d, (double)rows[ 0 ][ "value" ], 0.000001d );
            Assert.AreEqual( 3.1d, (double)rows[ 1 ][ "value" ], 0.000001d );
            Assert.AreEqual( 4.3d, (double)rows[ 2 ][ "value" ], 0.000001d );
        }
Beispiel #15
0
        public ScopedTable Query( long ownerId, DateClause dateClause, OriginClause originClause )
        {
            DataTable table = null;
            if ( Schema.DateColumn != null )
            {
                if ( Schema.DateIsYear )
                {
                    table = myDB.Query( FindByOwnerIdAndFromToCmd, ownerId, dateClause.From.Year, dateClause.To.Year );
                }
                else
                {
                    table = myDB.Query( FindByOwnerIdAndFromToCmd, ownerId,
                        Maui.TypeConverter.DateToString( dateClause.From ), Maui.TypeConverter.DateToString( dateClause.To ) );
                }
            }
            else
            {
                table = myDB.Query( FindByOwnerIdCmd, ownerId );
            }

            table.RowChanged += OnRowChanged;
            table.RowDeleted += OnRowChanged;

            return new ScopedTable( Schema, table, originClause );
        }