(Analyzer analyzer)
| 271 | abstract public boolean isBlockingJoinNode(); |
| 272 | |
| 273 | @Override |
| 274 | public void init(Analyzer analyzer) throws ImpalaException { |
| 275 | // Do not call super.init() to defer computeStats() until all conjuncts |
| 276 | // have been collected. |
| 277 | assignConjuncts(analyzer); |
| 278 | createDefaultSmap(analyzer); |
| 279 | // Mark slots used by 'conjuncts_' as materialized after substitution. Recompute |
| 280 | // memory layout for affected tuples. Note: only tuples of the masked tables could |
| 281 | // be affected if they are referenced by multi-tuple predicates. |
| 282 | for (TupleDescriptor tuple : analyzer.materializeSlots(conjuncts_)) { |
| 283 | if (LOG.isTraceEnabled()) { |
| 284 | LOG.trace("Recompute mem layout for " + tuple.debugString()); |
| 285 | } |
| 286 | Preconditions.checkNotNull(tuple.getMaskedByTuple()); |
| 287 | tuple.recomputeMemLayout(); |
| 288 | } |
| 289 | assignedConjuncts_ = analyzer.getAssignedConjuncts(); |
| 290 | otherJoinConjuncts_ = Expr.substituteList(otherJoinConjuncts_, |
| 291 | getCombinedChildSmap(), analyzer, false); |
| 292 | |
| 293 | List<SlotRef> slotRefs = new ArrayList<>(); |
| 294 | for (Expr e : getConjuncts()) { e.collect(SlotRef.class, slotRefs); } |
| 295 | for (Expr e : getOtherJoinConjuncts()) { e.collect(SlotRef.class, slotRefs); } |
| 296 | for (Expr e : getEqJoinConjuncts()) { e.collect(SlotRef.class, slotRefs); } |
| 297 | analyzer.addJoinColumns(slotRefs); |
| 298 | } |
| 299 | |
| 300 | /** |
| 301 | * Returns the estimated cardinality of an inner or outer join. |
no test coverage detected