| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| package org.apache.rya.indexing.external.matching; |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| import java.util.ArrayList; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| import java.util.Collections; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Set; |
| |
| import org.apache.rya.indexing.external.matching.QueryNodesToTupleExpr.TupleExprAndNodes; |
| import org.openrdf.query.algebra.BinaryTupleOperator; |
| import org.openrdf.query.algebra.Filter; |
| import org.openrdf.query.algebra.QueryModelNode; |
| import org.openrdf.query.algebra.TupleExpr; |
| import org.openrdf.query.algebra.UnaryTupleOperator; |
| import org.openrdf.query.algebra.evaluation.impl.ExternalSet; |
| |
| /** |
| * This class provides implementations of methods common to all implementations |
| * of the {@link ExternalSetMatcher} interface. |
| * |
| */ |
| public abstract class AbstractExternalSetMatcher<T extends ExternalSet> implements ExternalSetMatcher<T> { |
| |
| protected QuerySegment<T> segment; |
| protected List<QueryModelNode> segmentNodeList; |
| protected TupleExpr tuple; |
| protected Set<TupleExpr> unmatched; |
| protected Set<Filter> filters; |
| private final QuerySegmentFactory<T> factory = new QuerySegmentFactory<T>(); |
| |
| /** |
| * Matches {@link QuerySegment} with underlying QuerySegment. If match |
| * occurs, corresponding nodes are replaced by ExternalSet node. After each |
| * call of this method, call updateTuplesAndNodes to update related |
| * information. |
| * |
| * @param nodes |
| * - QuerySegment representation of ExternalSet to be used for |
| * matching |
| * @param set |
| * - {@link ExternalSet} used to replace matching ExternalSet |
| * nodes when match occurs |
| * @return - true is match and replace occurs and false otherwise |
| */ |
| protected abstract boolean match(QuerySegment<T> nodes, T set); |
| |
| /** |
| * In following method, order is determined by the order in which the node |
| * appear in the query. |
| * |
| * @return - an ordered view of the QueryModelNodes appearing tuple |
| * |
| */ |
| @Override |
| public List<QueryModelNode> getOrderedNodes() { |
| return Collections.unmodifiableList(segmentNodeList); |
| } |
| |
| @Override |
| public Set<Filter> getFilters() { |
| return filters; |
| } |
| |
| @Override |
| public TupleExpr getQuery() { |
| return tuple; |
| } |
| |
| @Override |
| public Set<TupleExpr> getUnmatchedArgNodes() { |
| return unmatched; |
| } |
| |
| @Override |
| public QuerySegment<T> nodeToQuerySegment(final QueryModelNode node) { |
| return factory.getQuerySegment(node); |
| } |
| |
| @Override |
| public List<QueryModelNode> getAllUnmatchedNodes() { |
| final List<QueryModelNode> unmatched = new ArrayList<>(); |
| for (final QueryModelNode node : segmentNodeList) { |
| if (!(node instanceof ExternalSet)) { |
| unmatched.add(node); |
| } |
| } |
| return unmatched; |
| } |
| |
| protected void updateTupleAndNodes() { |
| segmentNodeList = segment.getOrderedNodes(); |
| final TupleExprAndNodes tupAndNodes = segment.getQuery(); |
| tuple = tupAndNodes.getTupleExpr(); |
| filters = tupAndNodes.getFilters(); |
| unmatched = new HashSet<>(); |
| final List<QueryModelNode> nodes = tupAndNodes.getNodes(); |
| for (final QueryModelNode q : nodes) { |
| if (q instanceof UnaryTupleOperator || q instanceof BinaryTupleOperator) { |
| unmatched.add((TupleExpr) q); |
| } else if (q instanceof FlattenedOptional) { |
| final FlattenedOptional opt = (FlattenedOptional) q; |
| final TupleExpr rightArg = opt.getRightArg(); |
| if (rightArg instanceof UnaryTupleOperator || rightArg instanceof BinaryTupleOperator) { |
| unmatched.add(rightArg); |
| } |
| } |
| } |
| } |
| |
| } |