@@ -299,9 +299,20 @@ public RelOptCost computeSelfCost(RelOptPlanner planner)
299299 0 );
300300 }
301301
302- public void explain (RelOptPlanWriter pw )
303- {
304- pw .explain (this , Util .emptyStringArray , Util .emptyObjectArray );
302+ public final void explain (RelOptPlanWriter pw ) {
303+ explainTerms (pw ).done (this );
304+ }
305+
306+ /** Describes the inputs and attributes of this relational expression.
307+ * Each node should call {@code super.explainTerms}, then call the
308+ * {@link RelOptPlanWriter#input(String, RelNode)}
309+ * and {@link RelOptPlanWriter#item(String, Object)} methods for each input
310+ * and attribute.
311+ *
312+ * @param pw Plan writer
313+ */
314+ public RelOptPlanWriter explainTerms (RelOptPlanWriter pw ) {
315+ return pw ;
305316 }
306317
307318 public RelNode onRegister (RelOptPlanner planner )
@@ -380,8 +391,6 @@ public RelOptTable getTable()
380391
381392 /**
382393 * Computes the digest. Does not modify this object.
383- *
384- * @post return != null
385394 */
386395 protected String computeDigest ()
387396 {
@@ -391,54 +400,28 @@ protected String computeDigest()
391400 new PrintWriter (sw ),
392401 SqlExplainLevel .DIGEST_ATTRIBUTES )
393402 {
394- public void explain (
395- RelNode rel ,
396- String [] terms ,
397- Object [] values )
403+ protected void explain_ (
404+ RelNode rel , List <Pair <String , Object >> values )
398405 {
399- List <RelNode > inputs = rel .getInputs ();
400- RexNode [] childExps = rel .getChildExps ();
401- assert terms .length
402- == (inputs .size () + childExps .length + values .length )
403- : "terms.length="
404- + terms .length
405- + " inputs.length=" + inputs .size ()
406- + " childExps.length=" + childExps .length
407- + " values.length=" + values .length ;
408- write (getRelTypeName ());
409-
410- for (int i = 0 ; i < traitSet .size (); i ++) {
411- write ("." );
412- write (traitSet .getTrait (i ).toString ());
406+ pw .write (getRelTypeName ());
407+
408+ for (RelTrait trait : traitSet ) {
409+ pw .write ("." );
410+ pw .write (trait .toString ());
413411 }
414412
415- write ("(" );
413+ pw . write ("(" );
416414 int j = 0 ;
417- for (int i = 0 ; i < inputs .size (); i ++) {
418- if (j > 0 ) {
419- write ("," );
420- }
421- write (terms [j ++] + "=" + inputs .get (i ).getDigest ());
422- }
423- for (int i = 0 ; i < childExps .length ; i ++) {
424- if (j > 0 ) {
425- write ("," );
426- }
427- RexNode childExp = childExps [i ];
428- write (terms [j ++] + "=" + childExp .toString ());
429- }
430- for (int i = 0 ; i < values .length ; i ++) {
431- Object value = values [i ];
432- if (j > 0 ) {
433- write ("," );
415+ for (Pair <String , Object > value : values ) {
416+ if (j ++ > 0 ) {
417+ pw .write ("," );
434418 }
435- write (terms [ j ++] + "=" + value );
419+ pw . write (value . left + "=" + value . right );
436420 }
437- write (")" );
421+ pw . write (")" );
438422 }
439423 };
440424 explain (pw );
441- pw .flush ();
442425 return sw .toString ();
443426 }
444427}
0 commit comments