/*
 * 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;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.eclipse.rdf4j.query.algebra.Filter;
import org.eclipse.rdf4j.query.algebra.Join;
import org.eclipse.rdf4j.query.algebra.LeftJoin;
import org.eclipse.rdf4j.query.algebra.QueryModelNode;
import org.eclipse.rdf4j.query.algebra.TupleExpr;
import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;

import com.google.common.base.Optional;

/**
 * This interface provides a framework for matching {@link ExternalSet}s to
 * subsets of a given {@link QuerySegment}.
 *
 */
public interface ExternalSetMatcher<T extends ExternalSet> {

    /**
     *
     *Matches specified ExternalSet to underlying QuerySegment and returns
     *true if match occurs and false otherwise.  Underlying QuerySegment is changed by
     *matching ExternalSet to matching query nodes.
     *
     * @param set
     *            - {@link ExternalSet} used to replace matching PCJ nodes when
     *            match occurs
     * @return - true is match and replace occurs and false otherwise
     */
    public boolean match(T set);
    
    /**
     *Matches specified ExternalSets to underlying QuerySegment and returns
     *the resulting matched QuerySegment.  Underlying QuerySegment is unchanged.
     * 
     * @param sets - Collection of ExternalSets to be matched to QuerySegment
     */
    public QuerySegment<T> match(Collection<T> sets);
    
    /**
     * Allows Matcher to iterate over different Collections of ExternalSets to find an optimal combination of matching ExternalSets.
     * Returns the QuerySegment whose node list has a minimum Rating according to either specified or default QueryNodeListRater.
     * 
     * @param sets - Iterator over Lists of ExternalSets to be matched to QuerySegment.
     * @param rater - Class that rates the resulting QuerySegment after each collection is matched for the purpose
     * of finding an optimal ExternalSet combination.  If the rater is not provided, the {@link BasicRater} is used.
     */
    public QuerySegment<T> match(Iterator<List<T>> sets, Optional<QueryNodeListRater> rater);

    /**
     * @return - TupleExpr constructed from {@link QuerySegment} with matched
     *         nodes
     */
    public TupleExpr getQuery();

    /**
     * Converts TupleExpr starting with given node to a {@link QuerySegment}.
     * Node must be a {@link Filter}, {@link Join}, or {@link LeftJoin}.
     * 
     * @param node
     * @return
     */
    public QuerySegment<T> nodeToQuerySegment(QueryModelNode node);

    /**
     * @return - all {@link TupleExpr} that haven't been matched to a PCJ
     */
    public Set<TupleExpr> getUnmatchedArgNodes();

    /**
     * Similar to {@link #getUnmatchedArgs()}, except does not ignore no arg
     * statements.
     * 
     * @return a list of all unmatched nodes.
     */
    public List<QueryModelNode> getAllUnmatchedNodes();

    /**
     *
     * @return - provided ordered view of QuerySegment nodes
     */
    public List<QueryModelNode> getOrderedNodes();

    /**
     *
     * @return - Set of {@link Filter}s of given QuerySegment
     */
    public Set<Filter> getFilters();

}
