@Override protected Optional<FlattenUnionProposal> evaluateNode(QueryNode node, IntermediateQuery query) { if (node instanceof UnionNode) { return evaluateUnionNode((UnionNode) node, query); } return Optional.empty(); }
private Optional<FlattenUnionProposal> evaluateUnionNode(UnionNode node, IntermediateQuery query) { ImmutableList<UnionNode> unionNodesToMerge = getUnionCluster(node, query) .collect(ImmutableCollectors.toList()); return unionNodesToMerge.size() > 1 ? Optional.of(makeFlattenProposal(node, unionNodesToMerge, query)) : Optional.empty(); }
private IntermediateQuery flattenUnions(IntermediateQuery query) { try { return unionflattener.optimize(query); } catch (EmptyQueryException e) { throw new MappingUnionNormalizationException("This normalization should not empty the query"); } } }
private Stream<UnionNode> getUnionCluster(UnionNode focusNode, IntermediateQuery query) { return Stream.concat( Stream.of(focusNode), query.getChildren(focusNode).stream() .filter(n -> n instanceof UnionNode) .flatMap(n -> getUnionCluster((UnionNode) n, query) )); }
/** * Lift substitutions and query modifiers, and get rid of resulting idle construction nodes. * Then flatten nested unions. */ private IntermediateQuery normalizeIQ(IntermediateQuery query) { try { IntermediateQuery queryAfterBindingLift = bindingLifter.optimize(query); IntermediateQuery queryAfterCNodeCleaning = constructionNodeCleaner.optimize(queryAfterBindingLift); return unionFlattener.optimize(queryAfterCNodeCleaning); }catch (EmptyQueryException e){ throw new IllegalStateException("The query should not be emptied by applying this normalization"); } } }
private Stream<UnionNode> getUnionCluster(UnionNode focusNode, IntermediateQuery query) { return Stream.concat( Stream.of(focusNode), query.getChildren(focusNode).stream() .filter(n -> n instanceof UnionNode) .flatMap(n -> getUnionCluster((UnionNode) n, query) )); }
log.debug("New query after fixed point join optimization: \n" + intermediateQuery.toString()); intermediateQuery = flattenUnionOptimizer.optimize(intermediateQuery); log.debug("New query after flattening Unions: \n" + intermediateQuery.toString());
private Optional<FlattenUnionProposal> evaluateUnionNode(UnionNode node, IntermediateQuery query) { ImmutableList<UnionNode> unionNodesToMerge = getUnionCluster(node, query) .collect(ImmutableCollectors.toList()); return unionNodesToMerge.size() > 1 ? Optional.of(makeFlattenProposal(node, unionNodesToMerge, query)) : Optional.empty(); }
@Override protected Optional<FlattenUnionProposal> evaluateNode(QueryNode node, IntermediateQuery query) { if (node instanceof UnionNode) { return evaluateUnionNode((UnionNode) node, query); } return Optional.empty(); }