private IntermediateQuery optimizeSubtree(QueryNode focusNode, IntermediateQuery query, ImmutableSet<Variable> retainedVariables) { Optional<ProjectionShrinkingProposal> optionalProposal = Optional.empty(); if (focusNode instanceof UnionNode || focusNode instanceof ConstructionNode) { optionalProposal = makeProposal((ExplicitVariableProjectionNode) focusNode, retainedVariables); } if (focusNode instanceof JoinOrFilterNode) { retainedVariables = updateRetainedVariables((JoinOrFilterNode) focusNode, query, retainedVariables); } else if (focusNode instanceof ConstructionNode) { retainedVariables = updateRetainedVariables((ConstructionNode) focusNode); } if (optionalProposal.isPresent()) { NodeCentricOptimizationResults<ExplicitVariableProjectionNode> optimizationResults; try { optimizationResults = query.applyProposal(optionalProposal.get()); } catch (EmptyQueryException e) { throw new IllegalStateException("The projection shrinker should not empty the query"); } focusNode = optimizationResults.getNewNodeOrReplacingChild().orElseThrow( () -> new IllegalStateException("A replacing node should be generated")); } for (QueryNode childNode : query.getChildren(focusNode)) { query = optimizeSubtree(childNode, query, retainedVariables); } return query; }
private IntermediateQuery optimizeSubtree(QueryNode focusNode, IntermediateQuery query, ImmutableSet<Variable> retainedVariables) { Optional<ProjectionShrinkingProposal> optionalProposal = Optional.empty(); if (focusNode instanceof UnionNode || focusNode instanceof ConstructionNode) { optionalProposal = makeProposal((ExplicitVariableProjectionNode) focusNode, query, retainedVariables); } if (focusNode instanceof JoinOrFilterNode) { retainedVariables = updateRetainedVariables((JoinOrFilterNode) focusNode, query, retainedVariables); } else if (focusNode instanceof ConstructionNode) { retainedVariables = updateRetainedVariables((ConstructionNode) focusNode, query, retainedVariables); } if (optionalProposal.isPresent()) { NodeCentricOptimizationResults<ExplicitVariableProjectionNode> optimizationResults; try { optimizationResults = query.applyProposal(optionalProposal.get()); } catch (EmptyQueryException e) { throw new IllegalStateException("The projection shrinker should not empty the query"); } focusNode = optimizationResults.getNewNodeOrReplacingChild().orElseThrow( () -> new IllegalStateException("A replacing node should be generated")); } for (QueryNode childNode : query.getChildren(focusNode)) { query = optimizeSubtree(childNode, query, retainedVariables); } return query; }