LogicalPlan is the logical view of relational operations Pig will execute
for a given script. Note that it contains only relational operations.
All expressions will be contained in LogicalExpressionPlans inside
each relational operator.
Equality is checked by calling equals on every leaf in the plan. This
assumes that plans are always connected graphs. It is somewhat
inefficient since every leaf will test equality all the way to
every root. But it is only intended for use in testing, so that
should be ok. Checking predecessors (as opposed to successors) was
chosen because splits (which have multiple successors) do not depend
on order of outputs for correctness, whereas joins (with multiple
predecessors) do. That is, reversing the outputs of split in the
graph has no correctness implications, whereas reversing the inputs
of join can. This method of doing equals will detect predecessors
in different orders but not successors in different orders.
It will return false if either plan has non deterministic EvalFunc.
Returns the signature of the LogicalPlan. The signature is a unique identifier for a given
plan generated by a Pig script. The same script run multiple times with the same version of
Pig is guaranteed to produce the same signature, even if the input or output locations differ.