@Override public IntermediateQuery optimize(IntermediateQuery query) { /** * Contains all (non discarded) variables projected out by some node previously traversed, * plus all variables appearing in an (explicit or implicit) condition of some join node already traversed * * Immutable only for safety (updated in practice). * Question: shall we keep it as immutable ? */ QueryNode rootNode = query.getRootNode(); Optional<QueryNode> rootChild = query.getFirstChild(rootNode); if (rootChild.isPresent()) { return optimizeSubtree( rootChild.get(), query, rootNode.getLocallyRequiredVariables() ); } return query; }