Files
spark/src/DataStreamSuite/DataStream/Primitives/Join/JoinTable.cs
T
John Colvin 9311c27f47 feat: Resurrect DataStream primitives
They were originally commented out because the expression parsing utils
weren't ready (now they are).
2023-09-29 13:10:50 -04:00

85 lines
2.8 KiB
C#

using System;
using System.Collections;
using System.IO;
using BCG.Utilities.General;
namespace BCG
{
internal class JoinTable : IBlueRowCollection
{
protected JoinTableSchema mySchema;
protected IDictionary myIdIndex = new Hashtable ();
protected JoinDeletionIndex myLeftIndex, myRightIndex;
private int myNewRowId;
public JoinTable (JoinTableSchema schema)
{
mySchema = schema;
myLeftIndex = new JoinDeletionIndex (mySchema.getRenamedName ("id", true), true);
myRightIndex = new JoinDeletionIndex (mySchema.getRenamedName ("id", false), false);
}
public IBlueRow this [int id]
{
get
{
if (myIdIndex[id] == null)
throw new BlueDataException ("ID " + id.ToString() + " does not exist in table " + mySchema.tableName);
return (IBlueRow)myIdIndex[id];
}
}
#region JoinTable members
public virtual void addRow (IBlueRow leftRow, IBlueRow rightRow, DataPacket dp)
{
JoinRow newRow = new JoinRow (myNewRowId, leftRow, rightRow, mySchema);
myIdIndex[myNewRowId ++] = newRow;
((BlueTable)(dp.addedRows)).addRow (newRow);
myLeftIndex.add (newRow);
if (rightRow != null) //in case of left joins when right row is null
myRightIndex.add (newRow);
}
public virtual void deleteRow (bool isLeft, IBlueRow deletedRow, DataPacket dp)
{
JoinDeletionIndex thisIndex = myRightIndex, otherIndex = myLeftIndex;
if (isLeft)
{
thisIndex = myLeftIndex;
otherIndex = myRightIndex;
}
RowList matchingNodes = thisIndex.getMatchingRows (deletedRow["id"]);
foreach (RowNode node in matchingNodes)
{
JoinRow row = (JoinRow)node.row;
RowNode correspondingNode = isLeft ? row.rightNode : row.leftNode;
if (correspondingNode != null)
otherIndex.remove (correspondingNode); //in case of partial left joinss
myIdIndex.Remove (row["id"]);
((BlueTable)dp.deletedRows).addRow (row);
}
thisIndex.removeAll (deletedRow["id"]);
}
#endregion
#region ICollection members
public int Count{get{return myIdIndex.Count;}}
public bool IsSynchronized {get{return false;}}
public object SyncRoot{get{return this;}}
public void CopyTo (Array array, int index) {myIdIndex.Values.CopyTo (array, index);}
#endregion
#region IEnumerable members
public IEnumerator GetEnumerator () {return myIdIndex.Values.GetEnumerator ();}
#endregion
#region IBlueRowCollection members
public IBlueTableSchema schema {get{return mySchema;}}
public bool containsID (int id) {return myIdIndex[id] != null;}
#endregion
}
}