package org.jboss.windup.config.query;

import org.jboss.forge.furnace.util.Predicate;
import org.jboss.windup.graph.model.WindupVertexFrame;
import org.ocpsoft.rewrite.config.ConditionBuilder;

/**
 * @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
 */
public interface QueryBuilderWith extends ConditionBuilder, QueryBuilderAs {
    /**
     * Narrow the query via a {@link QueryGremlinCriterion} in order to execute Gremlin queries.
     */
    QueryBuilderPiped piped(QueryGremlinCriterion criterion);

    /**
     * Narrow the query to {@link WindupVertexFrame} instances that have the given property defined.
     */
    QueryBuilderWith withProperty(String property);

    /**
     * Narrow the query to {@link WindupVertexFrame} instances that contain the given property value.
     */
    QueryBuilderWith withProperty(String property, Object searchValue);

    /**
     * Narrow the query to {@link WindupVertexFrame} instances that contain any of the given property values.
     */
    QueryBuilderWith withProperty(String property, Iterable<?> values);

    /**
     * Narrow the query to {@link WindupVertexFrame} instances that contain any given property value.
     */
    QueryBuilderWith withProperty(String property, Object searchValue, Object... searchValues);

    /**
     * Narrow the query to {@link WindupVertexFrame} instances that satisfy the given property comparison.
     */
    QueryBuilderWith withProperty(String property, QueryPropertyComparisonType searchType,
                                  Object searchValue);

    /**
     * Narrow the query to {@link WindupVertexFrame} instances that satisfy the given property comparison.
     */
    QueryBuilderWith withoutProperty(String property);

    /**
     * Narrow the query with the given {@link Predicate}
     */
    <FRAMETYPE extends WindupVertexFrame> QueryBuilderAs filteredBy(Predicate<FRAMETYPE> predicate);
}
