public static FlowDef createWorkflow(Tap usersTap, Tap transactionsTap, Tap outputTap ){
Pipe transactionsPipe = new Pipe( "transactions_pipe" );
Pipe usersPipe = new Pipe("join");
Fields t_user_id = new Fields("user-id");
Fields u_user_id = new Fields("id");
Pipe joinPipe = new HashJoin( transactionsPipe, t_user_id, usersPipe, u_user_id, new LeftJoin() );
Pipe retainPipe = new Pipe( "retain", joinPipe );
retainPipe = new Retain( retainPipe, new Fields("product-id", "location"));
Pipe cdistPipe = new Pipe( "cdistPipe", retainPipe );
Fields selector = new Fields( "product-id", "location" );
cdistPipe = new Unique( cdistPipe, selector );
Fields cdist = new Fields( "cdist" );
Fields product_id = new Fields("product-id");
cdistPipe = new CountBy( cdistPipe, product_id, cdist );
FlowDef flowDef = FlowDef.flowDef()
.addSource( transactionsPipe, transactionsTap )
.addSource( usersPipe, usersTap )
.addTailSink( cdistPipe, outputTap );
return flowDef;
}