Files
spark/src/DataStreamSuite/DataStream/Primitives/Join/JoinStream.cs
T
John Colvin e95997ea17 cleanup: Chip away a few nullability warnings in DataStreamSuite
This is a start, but there're still > 700 of them!
2024-05-25 15:37:33 +00:00

167 lines
5.9 KiB
C#

using System;
using System.Data;
using System.Collections;
using System.Text.RegularExpressions;
using BCG.Utilities;
using BCG.Utilities.General;
using bts;
namespace BCG
{
public class JoinStream : ViewStream
{
protected InternalJoinStream? myIjs;
protected ProjectStream? myPs;
protected ColumnMap? myLeftCm, myRightCm;
protected bool myIsProject = true;
private bool myUseSuperJoin = DataStreamLoadFileConfig.instance.useNewJoin;
protected JoinStream () {}
public JoinStream (ViewStream v1, string joinCol1, ColumnMap cm1,
ViewStream v2, string joinCol2, ColumnMap cm2)
{
if (myUseSuperJoin)
{
ViewStream rs = this is LeftJoinStream ?
new SuperLeftJoinStream(v1, joinCol1, cm1.columnExpression, v2, joinCol2, cm2.columnExpression) as ViewStream :
new SuperJoinStream(v1, joinCol1, cm1.columnExpression, v2, joinCol2, cm2.columnExpression) as ViewStream;
mySetRealSource(rs);
}
else
{
myLeftCm = cm1;
myRightCm = cm2;
//myIjs = new InternalJoinStream (v1, joinCol1, v2, joinCol2);
myIjs = myConstructInternalJoinStream(v1, joinCol1, v2, joinCol2);
}
}
public JoinStream (ViewStream v1, string joinCol1, string cmExp1,
ViewStream v2, string joinCol2, string cmExp2)
:
this (
v1,
joinCol1,
(cmExp1 == null ? new ColumnMap("!"):new ColumnMap(cmExp1)),
v2,
joinCol2,
(cmExp2 == null ? new ColumnMap("!"):new ColumnMap(cmExp2)))
{}
public JoinStream (ViewStream v1, string joinCol1, string cmExp1,
ViewStream v2, string joinCol2)
:
this (v1,joinCol1, new ColumnMap(cmExp1), v2, joinCol2)
{}
public JoinStream (ViewStream v1, string joinCol1,
ViewStream v2, string joinCol2, string cmExp2)
:
this (v1,joinCol1, v2, joinCol2, new ColumnMap(cmExp2))
{}
public JoinStream (ViewStream v1, string joinCol1, ViewStream v2, string joinCol2)
{
if (myUseSuperJoin)
{
ViewStream rs = this is LeftJoinStream ?
new SuperLeftJoinStream(v1, joinCol1, v2, joinCol2) as ViewStream :
new SuperJoinStream(v1, joinCol1, v2, joinCol2) as ViewStream;
mySetRealSource(rs);
}
else
{
//myIjs = new InternalJoinStream (v1, joinCol1, v2, joinCol2);
myIjs = myConstructInternalJoinStream(v1, joinCol1, v2, joinCol2);
myIsProject = false;
}
}
public JoinStream (ViewStream v1, string joinCol1, ColumnMap cm1, ViewStream v2, string joinCol2)
{
myLeftCm = cm1;
myRightCm = new ColumnMap ("!");
//myIjs = new InternalJoinStream (v1, joinCol1, v2, joinCol2);
myIjs = myConstructInternalJoinStream (v1, joinCol1, v2, joinCol2);
}
public JoinStream (ViewStream v1, string joinCol1, ViewStream v2, string joinCol2, ColumnMap cm2)
{
myLeftCm = new ColumnMap ("!");
myRightCm = cm2;
//myIjs = new InternalJoinStream (v1, joinCol1, v2, joinCol2);
myIjs = myConstructInternalJoinStream (v1, joinCol1, v2, joinCol2);
}
protected virtual InternalJoinStream myConstructInternalJoinStream (
ViewStream vs1,
string joinCol1,
ViewStream vs2,
string joinCol2)
{
return new InternalJoinStream (vs1, joinCol1, vs2, joinCol2);
}
protected void myInternalJoinChangeHandler (object o)
{
if (myIsProject)
{
if (myPs == null)
{
JoinNameResolver resolver = new JoinNameResolver ((JoinTableSchema)myIjs.schema, myIjs.getSchema (true), myLeftCm.columnExpression,
myIjs.getSchema (false), myRightCm.columnExpression);
IDictionary map = resolver.getMap ();
map["id"] = "id";
myPs = new ProjectStream (myIjs, map);
myPs.onChange += new DataStream.ChangeDelegate (myProjectChangeHandler);
return;
}
else
Log.assert(false, "This call back should not have been called");
}
else
myFireEvent ((o as ICloneable).Clone());
}
private void myProjectChangeHandler (object o)
{
if (myIjs.myOnChangeDelegate.GetInvocationList().Length > 1)
myIjs.onChange -= new DataStream.ChangeDelegate (myInternalJoinChangeHandler);
myFireEvent ((o as ICloneable).Clone());
}
protected override void myOnFirstSubscriber ()
{
myIjs.onChange += new DataStream.ChangeDelegate (myInternalJoinChangeHandler);
}
protected override void myOnLastSubscriber ()
{
// how does this relate to the -= in myProjectChangeHandler?
myIjs.onChange -= new DataStream.ChangeDelegate (myInternalJoinChangeHandler);
// if there is a project after the ijs we need to
// unsubscribe to it otherwise references will be kept and
// a memory leak will occur
if (myPs != null)
myPs.onChange -= new DataStream.ChangeDelegate (myProjectChangeHandler);
myPs = null;
}
/**************************************TEST METHOD(S)*********************************************/
/// <summary>
/// Used for testing purposes only. This enables the test to work without a DataSource (PubServer,
/// BaseServer etc), by directly calling the test method and passing data
/// </summary>
/// <param name="leftPacket"></param>
/// <param name="rightPacket"></param>
public void test (DataPacket dp, bool isLeft) {myIjs.test (dp, isLeft);}
/***********************************************************************************************/
}
}