Files
spark/src/DataStreamSuite/DataStream/Primitives/Project/ProjectedTable.cs
T

94 lines
2.2 KiB
C#

using Bts.DataStreamCore;
using System;
using System.Collections;
namespace BCG
{
/// <summary>
/// All what this type does is to keep a reference to the original rows, and all accessors
/// to the row, return a ProjectedRow (which is basically a wrapping around the original row)
/// </summary>
internal class ProjectedTable : IImmutableRowCollection
{
private IBlueRowCollection myRows;
private ProjectHelper myHelper;
internal ProjectedTable (IBlueRowCollection rows, ProjectHelper helper)
{
if (helper == null) throw new ArgumentException("helper");
myRows = rows ?? new BlueTable(helper.schema);
myHelper = helper;
}
#region IBlueRowCollection Members
public IBlueRow this [int id]
{
get {return new ProjectedRow (myRows[id], myHelper);}
}
public bool containsID(int id) {return myRows.containsID (id);}
public IBlueTableSchema schema {get {return myHelper.schema;}}
#endregion
#region ICollection Members
public bool IsSynchronized {get {return myRows.IsSynchronized;}}
public int Count {get {return myRows.Count;}}
public void CopyTo (Array array, int index)
{
foreach (IBlueRow r in myRows)
array.SetValue(this[r.Id()], index++);
}
public object SyncRoot {get {return myRows.SyncRoot;}}
#endregion
#region IEnumerable Members
public IEnumerator GetEnumerator ()
{
return new MyEnumerator (myRows, myHelper);
}
private class MyEnumerator : IEnumerator
{
#region IEnumerator Members
private IEnumerator myMaster;
private ProjectHelper myHelper;
public MyEnumerator (IBlueRowCollection master, ProjectHelper helper)
{
myMaster = master.GetEnumerator ();
myHelper = helper;
}
public void Reset() {myMaster.Reset();}
public object? Current =>
myMaster.Current is null
? null
: new ProjectedRow((IBlueRow)myMaster.Current, myHelper);
public bool MoveNext() {return myMaster.MoveNext ();}
#endregion
}
#endregion
}
}