@Override public boolean isEquivalentTo(QueryNode queryNode) { return (queryNode instanceof InnerJoinNode) && getOptionalFilterCondition().equals(((InnerJoinNode) queryNode).getOptionalFilterCondition()); }
@Override public IQTree transformInnerJoin(IQTree tree, InnerJoinNode rootNode, ImmutableList<IQTree> children) { return transformNaryCommutativeNode(rootNode.acceptNodeTransformer(nodeTransformer), children); }
@Override public InnerJoinNode transform(InnerJoinNode innerJoinNode) { return innerJoinNode.clone(); }
InnerJoinNode formerJoinNode = (InnerJoinNode) formerRootChild; ImmutableExpression newJoiningCondition = formerJoinNode.getOptionalFilterCondition() .map(e -> ImmutabilityTools.foldBooleanExpressions(e, filterCondition).get()) .orElse(filterCondition); InnerJoinNode newJoinNode = formerJoinNode.changeOptionalFilterCondition(Optional.of(newJoiningCondition));
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()); }
InnerJoinNode formerJoinNode = (InnerJoinNode) formerRootChild; ImmutableExpression newJoiningCondition = formerJoinNode.getOptionalFilterCondition() .map(e -> immutabilityTools.foldBooleanExpressions(e, filterCondition).get()) .orElse(filterCondition); InnerJoinNode newJoinNode = formerJoinNode.changeOptionalFilterCondition(Optional.of(newJoiningCondition));
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()); }
@Override public boolean isSyntacticallyEquivalentTo(QueryNode node) { return (node instanceof InnerJoinNode) && this.getOptionalFilterCondition().equals(((InnerJoinNode) node).getOptionalFilterCondition()); }
@Override public InnerJoinNode transform(InnerJoinNode innerJoinNode) { return innerJoinNode.clone(); }
@Override public boolean isSyntacticallyEquivalentTo(QueryNode node) { return (node instanceof InnerJoinNode) && this.getOptionalFilterCondition().equals(((InnerJoinNode) node).getOptionalFilterCondition()); }
@Override public void visit(InnerJoinNode innerJoinNode) { if (query.getChildren(innerJoinNode).size() < 2) { throw new InvalidIntermediateQueryException("JOIN node " + innerJoinNode +" does not have at least 2 children.\n" + query); } innerJoinNode.getOptionalFilterCondition() .ifPresent(e -> checkExpression(innerJoinNode, e)); }
@Deprecated public static ImmutableList<ImmutableExpression> extractBooleanExpressionsFromJoins(InnerJoinNode topJoinNode, IntermediateQuery query) { Queue<InnerJoinNode> joinNodesToExplore = new LinkedList<>(); joinNodesToExplore.add(topJoinNode); ImmutableList.Builder<ImmutableExpression> exprListBuilder = ImmutableList.builder(); while (!joinNodesToExplore.isEmpty()) { InnerJoinNode joinNode = joinNodesToExplore.poll(); Optional<ImmutableExpression> optionalFilterCondition = joinNode.getOptionalFilterCondition(); if (optionalFilterCondition.isPresent()) { exprListBuilder.add(optionalFilterCondition.get()); } /** * Children: only considers the inner joins and the filter nodes. */ for (QueryNode child : query.getChildren(joinNode)) { if (child instanceof InnerJoinNode) { // Continues exploring joinNodesToExplore.add((InnerJoinNode)child); } else if (child instanceof FilterNode) { exprListBuilder.add(((FilterNode)child).getFilterCondition()); } } } return exprListBuilder.build(); }
@Deprecated public static ImmutableList<ImmutableExpression> extractBooleanExpressionsFromJoins(InnerJoinNode topJoinNode, IntermediateQuery query) { Queue<InnerJoinNode> joinNodesToExplore = new LinkedList<>(); joinNodesToExplore.add(topJoinNode); ImmutableList.Builder<ImmutableExpression> exprListBuilder = ImmutableList.builder(); while (!joinNodesToExplore.isEmpty()) { InnerJoinNode joinNode = joinNodesToExplore.poll(); Optional<ImmutableExpression> optionalFilterCondition = joinNode.getOptionalFilterCondition(); if (optionalFilterCondition.isPresent()) { exprListBuilder.add(optionalFilterCondition.get()); } /** * Children: only considers the inner joins and the filter nodes. */ for (QueryNode child : query.getChildren(joinNode)) { if (child instanceof InnerJoinNode) { // Continues exploring joinNodesToExplore.add((InnerJoinNode)child); } else if (child instanceof FilterNode) { exprListBuilder.add(((FilterNode)child).getFilterCondition()); } } } return exprListBuilder.build(); }
@Override public void visit(InnerJoinNode innerJoinNode) { if (query.getChildren(innerJoinNode).size() < 2) { throw new InvalidIntermediateQueryException("JOIN node " + innerJoinNode +" does not have at least 2 children.\n" + query); } innerJoinNode.getOptionalFilterCondition() .ifPresent(e -> checkExpression(innerJoinNode, e)); }
private IQTree liftInnerJoin(NaryIQTree queryTree, ImmutableList<IQTree> newChildren, VariableGenerator variableGenerator) { InnerJoinNode joinNode = (InnerJoinNode) queryTree.getRootNode(); NaryIQTree newQueryTree = newChildren.equals(queryTree.getChildren()) ? queryTree : iqFactory.createNaryIQTree(joinNode, newChildren); return extractCandidateVariables(queryTree, joinNode.getOptionalFilterCondition(), newChildren) .map(newQueryTree::liftIncompatibleDefinitions) .filter(t -> !t.equals(queryTree)) .findFirst() .orElse(newQueryTree) .liftBinding(variableGenerator); }
@Override public InnerJoinNode transform(InnerJoinNode innerJoinNode) { return iqFactory.createInnerJoinNode(renameOptionalBooleanExpression(innerJoinNode.getOptionalFilterCondition())); }
@Override public InnerJoinNode transform(InnerJoinNode innerJoinNode) { return iqFactory.createInnerJoinNode(renameOptionalBooleanExpression(innerJoinNode.getOptionalFilterCondition())); }
throw new IllegalStateException("All triple patterns of BGP have been eliminated by Sigma-LIDs"); case 1: if (rootNode.getOptionalFilterCondition().isPresent()) return iqFactory.createUnaryIQTree( iqFactory.createFilterNode(rootNode.getOptionalFilterCondition().get()), result.get(0)); else return result.get(0);
@Override public IQTree transformInnerJoin(IQTree tree, InnerJoinNode rootNode, ImmutableList<IQTree> children) { ImmutableList<ImmutableExpression> filterChildExpressions = getChildExpressions(children); if (filterChildExpressions.isEmpty()) return tree; return iqFactory.createNaryIQTree( iqFactory.createInnerJoinNode( Optional.of( updateJoinCondition( rootNode.getOptionalFilterCondition(), filterChildExpressions ))), children.stream() .map(this::trimRootFilter) .collect(ImmutableCollectors.toList()) ); }
boolean isNested) { List<Function> body = new ArrayList<>(); Optional<ImmutableExpression> filter = node.getOptionalFilterCondition(); List<Function> atoms = new ArrayList<>(); List<QueryNode> listnode = te.getChildren(node);