@Override public ImmutableSet<Variable> getRequiredVariables(IntermediateQuery query) { ImmutableMultiset<Variable> childrenVariableBag = query.getChildren(this).stream() .flatMap(c -> query.getVariables(c).stream()) .collect(ImmutableCollectors.toMultiset()); Stream<Variable> cooccuringVariableStream = childrenVariableBag.entrySet().stream() .filter(e -> e.getCount() > 1) .map(Multiset.Entry::getElement); return Stream.concat(cooccuringVariableStream, getLocallyRequiredVariables().stream()) .collect(ImmutableCollectors.toSet()); }
@Override public ImmutableSet<Variable> getRequiredVariables(IntermediateQuery query) { ImmutableMultiset<Variable> childrenVariableBag = query.getChildren(this).stream() .flatMap(c -> query.getVariables(c).stream()) .collect(ImmutableCollectors.toMultiset()); Stream<Variable> cooccuringVariableStream = childrenVariableBag.entrySet().stream() .filter(e -> e.getCount() > 1) .map(Multiset.Entry::getElement); return Stream.concat(cooccuringVariableStream, getLocallyRequiredVariables().stream()) .collect(ImmutableCollectors.toSet()); } }
private ImmutableList<InjectiveVar2VarSubstitution> computeSubstitutions(ImmutableList<IQTree> children) { if (children.size() < 2) { throw new ExplicitEqualityTransformerInternalException("At least 2 children are expected"); } ImmutableSet<Variable> repeatedVariables = children.stream() .flatMap(t -> t.getVariables().stream()) .collect(ImmutableCollectors.toMultiset()).entrySet().stream() .filter(e -> e.getCount() > 1) .map(Multiset.Entry::getElement) .collect(ImmutableCollectors.toSet()); return children.stream().sequential() .map(t -> computeSubstitution( repeatedVariables, children, t )) .collect(ImmutableCollectors.toList()); }
private ImmutableSet<Variable> extractRequiredAndCooccuringVariables(IntermediateQuery query, InnerJoinNode joinNode) { Stream<Variable> requiredVariablesByAncestorStream = Stream.concat( query.getVariablesRequiredByAncestors(joinNode).stream(), joinNode.getRequiredVariables(query).stream()); /* * NB: looks fro into multiple occurrences of a variable within the same data node */ Stream<Variable> innerCooccuringVariableStream = query.getChildren(joinNode).stream() .filter(c -> c instanceof ExtensionalDataNode) .map(c -> (ExtensionalDataNode) c) .flatMap(c -> // Multiset c.getProjectionAtom().getArguments().stream() .filter(t -> t instanceof Variable) .map(v -> (Variable) v) .collect(ImmutableCollectors.toMultiset()) .entrySet().stream() .filter(e -> e.getCount() > 1) .map(Multiset.Entry::getElement)); return Stream.concat(requiredVariablesByAncestorStream, innerCooccuringVariableStream) .collect(ImmutableCollectors.toSet()); }
private ImmutableSet<Variable> extractRequiredAndCooccuringVariables(IntermediateQuery query, InnerJoinNode joinNode) { Stream<Variable> requiredVariablesByAncestorStream = Stream.concat( query.getVariablesRequiredByAncestors(joinNode).stream(), joinNode.getRequiredVariables(query).stream()); /* * NB: looks fro into multiple occurrences of a variable within the same data node */ Stream<Variable> innerCooccuringVariableStream = query.getChildren(joinNode).stream() .filter(c -> c instanceof DataNode) .map(c -> (DataNode) c) .flatMap(c -> // Multiset c.getProjectionAtom().getArguments().stream() .filter(t -> t instanceof Variable) .map(v -> (Variable) v) .collect(ImmutableCollectors.toMultiset()) .entrySet().stream() .filter(e -> e.getCount() > 1) .map(Multiset.Entry::getElement)); return Stream.concat(requiredVariablesByAncestorStream, innerCooccuringVariableStream) .collect(ImmutableCollectors.toSet()); }