/** * Creates an expression which references correlating variable <code> * correlName</code> from the context of <code>rel</code>. For example, if <code>correlName</code> * is set by the 1st child of <code>rel</code>'s 2nd child, then this method returns <code> * $input2.$input1</code>. */ public Expression makeReference(String correlName, RelNode rel) { JavaFrame frame = (JavaFrame) mapCorrel2Frame.get(correlName); assert (frame != null); assert Util.equal(frame.rel.getCorrelVariable(), correlName); assert (frame.hasVariable()); return frame.getVariable(); }
/** * Records the fact that instances of <code>rel</code> are available via <code>bind</code> (which * may be eager or lazy). */ private void bind(RelNode rel, Bind bind) { tracer.log(Level.FINE, "Bind " + rel.toString() + " to " + bind); JavaFrame frame = (JavaFrame) mapRel2Frame.get(rel); frame.bind = bind; boolean stupid = SaffronProperties.instance().stupid.get(); if (stupid) { // trigger the declaration of the variable, even though it // may not be used Util.discard(bind.getVariable()); } }
/** * Returns the variable which, in the generated program, will hold the current row of a given * relational expression. This method is only applicable if the relational expression is the * current one or an input; if it is an ancestor, there is no current value, and this method * returns null. */ public Variable findInputVariable(RelNode rel) { while (true) { JavaFrame frame = (JavaFrame) mapRel2Frame.get(rel); if ((frame != null) && frame.hasVariable()) { return frame.getVariable(); } List<RelNode> inputs = rel.getInputs(); if (inputs.size() == 1) { rel = inputs.get(0); } else { return null; } } }
public Variable getVariable() { final JavaFrame frame = findFrame(); return frame.getVariable(); }