// store D into 'whatever';
// A = load
LogicalPlan lp = new LogicalPlan();
{
LogicalSchema aschema = new LogicalSchema();
aschema.addField(new LogicalSchema.LogicalFieldSchema(
"x", null, DataType.INTEGER));
aschema.addField(new LogicalSchema.LogicalFieldSchema(
"y", null, DataType.INTEGER));
aschema.getField(0).uid = 1;
aschema.getField(1).uid = 2;
LOLoad A = new LOLoad(new FileSpec("bla", new FuncSpec("PigStorage", "\t")), aschema, lp);
lp.add(A);
// B = load
LogicalSchema bschema = new LogicalSchema();
bschema.addField(new LogicalSchema.LogicalFieldSchema(
"a", null, DataType.INTEGER));
bschema.addField(new LogicalSchema.LogicalFieldSchema(
"b", null, DataType.INTEGER));
bschema.getField(0).uid = 3;
bschema.getField(1).uid = 4;
LOLoad B = new LOLoad(null, bschema, lp);
lp.add(B);
// C = join
LogicalSchema cschema = new LogicalSchema();
cschema.addField(new LogicalSchema.LogicalFieldSchema(
"x", null, DataType.INTEGER));
cschema.addField(new LogicalSchema.LogicalFieldSchema(
"y", null, DataType.INTEGER));
cschema.addField(new LogicalSchema.LogicalFieldSchema(
"a", null, DataType.INTEGER));
cschema.addField(new LogicalSchema.LogicalFieldSchema(
"b", null, DataType.INTEGER));
cschema.getField(0).uid = 1;
cschema.getField(1).uid = 2;
cschema.getField(2).uid = 3;
cschema.getField(3).uid = 4;
LogicalExpressionPlan aprojplan = new LogicalExpressionPlan();
ProjectExpression x = new ProjectExpression(aprojplan, DataType.INTEGER, 0, 0);
x.neverUseForRealSetUid(1);
LogicalExpressionPlan bprojplan = new LogicalExpressionPlan();
ProjectExpression y = new ProjectExpression(bprojplan, DataType.INTEGER, 1, 0);
y.neverUseForRealSetUid(3);
MultiMap<Integer, LogicalExpressionPlan> mm =
new MultiMap<Integer, LogicalExpressionPlan>();
mm.put(0, aprojplan);
mm.put(1, bprojplan);
LOJoin C = new LOJoin(lp, mm, JOINTYPE.HASH, new boolean[] {true, true});
C.neverUseForRealSetSchema(cschema);
lp.add(C);
lp.connect(A, C);
lp.connect(B, C);
// D = filter
LogicalExpressionPlan filterPlan = new LogicalExpressionPlan();
ProjectExpression fx = new ProjectExpression(filterPlan, DataType.INTEGER, 0, 0);
fx.neverUseForRealSetUid(1);
ConstantExpression fc0 = new ConstantExpression(filterPlan, DataType.INTEGER, new Integer(0));
EqualExpression eq1 = new EqualExpression(filterPlan, fx, fc0);
ProjectExpression fanotherx = new ProjectExpression(filterPlan, DataType.INTEGER, 0, 0);
fanotherx.neverUseForRealSetUid(1);
ProjectExpression fa = new ProjectExpression(filterPlan, DataType.INTEGER, 0, 2);
fa.neverUseForRealSetUid(3);
EqualExpression eq2 = new EqualExpression(filterPlan, fanotherx, fa);
AndExpression and1 = new AndExpression(filterPlan, eq1, eq2);
ProjectExpression fb = new ProjectExpression(filterPlan, DataType.INTEGER, 0, 3);
fb.neverUseForRealSetUid(4);
ConstantExpression fc1 = new ConstantExpression(filterPlan, DataType.INTEGER, new Integer(1));
EqualExpression eq3 = new EqualExpression(filterPlan, fb, fc1);
AndExpression and2 = new AndExpression(filterPlan, and1, eq3);
ProjectExpression fanotherb = new ProjectExpression(filterPlan, DataType.INTEGER, 0, 3);
fanotherb.neverUseForRealSetUid(4);
ProjectExpression fy = new ProjectExpression(filterPlan, DataType.INTEGER, 0, 1);
fy.neverUseForRealSetUid(2);
EqualExpression eq4 = new EqualExpression(filterPlan, fy, fanotherb);
new AndExpression(filterPlan, and2, eq4);
LOFilter D = new LOFilter(lp, filterPlan);
D.neverUseForRealSetSchema(cschema);
// Connect D to B, since the transform has happened.
lp.add(D);
lp.connect(C, D);
}
LogicalPlanOptimizer optimizer = new LogicalPlanOptimizer(lp, 500);
optimizer.optimize();
LogicalPlan expected = new LogicalPlan();
{
// A = load
LogicalSchema aschema = new LogicalSchema();
aschema.addField(new LogicalSchema.LogicalFieldSchema(
"x", null, DataType.INTEGER));
aschema.addField(new LogicalSchema.LogicalFieldSchema(
"y", null, DataType.INTEGER));
aschema.getField(0).uid = 1;
aschema.getField(1).uid = 2;
LOLoad A = new LOLoad(new FileSpec("bla", new FuncSpec("PigStorage", "\t")), aschema, expected);
expected.add(A);
// DA = filter
LogicalExpressionPlan DAfilterPlan = new LogicalExpressionPlan();
ProjectExpression fx = new ProjectExpression(DAfilterPlan, DataType.INTEGER, 0, 0);
fx.neverUseForRealSetUid(1);
ConstantExpression fc0 = new ConstantExpression(DAfilterPlan, DataType.INTEGER, new Integer(0));
new EqualExpression(DAfilterPlan, fx, fc0);
LOFilter DA = new LOFilter(expected, DAfilterPlan);
DA.neverUseForRealSetSchema(aschema);
expected.add(DA);
expected.connect(A, DA);
// B = load
LogicalSchema bschema = new LogicalSchema();
bschema.addField(new LogicalSchema.LogicalFieldSchema(
"a", null, DataType.INTEGER));
bschema.addField(new LogicalSchema.LogicalFieldSchema(
"b", null, DataType.INTEGER));
bschema.getField(0).uid = 3;
bschema.getField(1).uid = 4;
LOLoad B = new LOLoad(null, bschema, expected);
expected.add(B);
// DB = filter
LogicalExpressionPlan DBfilterPlan = new LogicalExpressionPlan();
ProjectExpression fb = new ProjectExpression(DBfilterPlan, DataType.INTEGER, 0, 1);
fb.neverUseForRealSetUid(4);
ConstantExpression fc1 = new ConstantExpression(DBfilterPlan, DataType.INTEGER, new Integer(1));
new EqualExpression(DBfilterPlan, fb, fc1);
LOFilter DB = new LOFilter(expected, DBfilterPlan);
DB.neverUseForRealSetSchema(bschema);
expected.add(DB);
expected.connect(B, DB);
// C = join
LogicalSchema cschema = new LogicalSchema();
cschema.addField(new LogicalSchema.LogicalFieldSchema(
"x", null, DataType.INTEGER));
cschema.addField(new LogicalSchema.LogicalFieldSchema(
"y", null, DataType.INTEGER));
cschema.addField(new LogicalSchema.LogicalFieldSchema(
"a", null, DataType.INTEGER));
cschema.addField(new LogicalSchema.LogicalFieldSchema(
"b", null, DataType.INTEGER));
cschema.getField(0).uid = 1;
cschema.getField(1).uid = 2;
cschema.getField(2).uid = 3;
cschema.getField(3).uid = 4;
LogicalExpressionPlan aprojplan = new LogicalExpressionPlan();
ProjectExpression x = new ProjectExpression(aprojplan, DataType.INTEGER, 0, 0);
x.neverUseForRealSetUid(1);
LogicalExpressionPlan bprojplan = new LogicalExpressionPlan();
ProjectExpression y = new ProjectExpression(bprojplan, DataType.INTEGER, 1, 0);