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)); }
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); } }
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); }
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 ); }
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); } } }
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())); }
public ScopedTable(TableSchema schema, DataTable table, OriginClause originClause) : this(schema, table, originClause, null) { }
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)); }
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() ); }
public ScopedTable( TableSchema schema, DataTable table, OriginClause originClause ) : this(schema, table, originClause, null) { }
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; } }
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; } } }
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 ); }
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 ); }
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 ); }