Jump to content

Query API


Recommended Posts

Posted (edited)

Wrote this a while back, basically a replacement for EntityAPI

 

IQuery.java

import com.zenscripting.api.script.engine.Context;

import java.util.Comparator;
import java.util.List;
import java.util.function.Predicate;

/**
 * Created by Valkyr on 17/12/2015.
 */

/**
 * Query
 *
 * @param <T> Type of query
 * @param <R> Result table type
 * @param <Q> Query type
 */
public interface IQuery<T, R extends IQueryResult<T>> {

    /**
     * Returns the API context
     *
     * @return context
     */
    Context getContext();

    /**
     * Returns the list of T to be queried.
     *
     * @return List of T
     */
    List<T> load();

    /**
     * Returns the results from filtering items using the
     * provided predicate.
     *
     * @param predicate a predicate to filter the query
     * @return this query
     */
    IQuery<T, R> filter(Predicate<T> predicate);

    /**
     * Sorts results according to the comparator
     *
     * @return this query
     */

    IQuery<T, R> sort(Comparator<T> comparator);

    /**
     * Removes non-matching items
     *
     * @param subType
     * @return this query, modified for subclass
     */

    <ST extends T> Query<ST, QueryResult<ST>> bySubClass(Class<ST> subType);

    /**
     * Returns the results of the query
     *
     * @return result
     */
    R result();
}

IQueryBuilder.java

import org.osbot.rs07.script.Script;

/**
 * Created by Valkyr on 17/12/2015.
 */

/**
 * Query Builder
 * Builds a query using given parameters
 *
 * @param <T> Object to use
 * @param <R> QueryResult type to use
 */
public interface IQueryBuilder<T, R extends IQueryResult<T>, Q extends IQuery<T, R>> {

    /**
     * Returns the API context
     *
     * @return context
     */
    Script getScript();

    /**
     * Returns a new Query of type T
     *
     * @return new query
     */
    Q newQuery();
}

IQueryResult.java

import java.util.Comparator;
import java.util.List;

/**
 * Created by Valkyr on 17/12/2015.
 */

/**
 * Query Result
 *
 * @param <T> Type of query
 */
public interface IQueryResult<T> {

    /**
     * Returns the first item in the results table
     *
     * @return first found item
     */
    T first();

    /**
     * Returns the last item in the results table
     *
     * @return last found item
     */
    T last();

    /**
     * Returns the item at the provided index
     *
     * @param index
     * @return found item at index
     */
    T get(int index);

    /**
     * Returns all items in the results table
     *
     * @return last found item
     */
    List<T> all();

    /**
     * Determines whether or not the results table is empty.
     *
     * @return results table is empty
     */
    boolean isEmpty();
}

Query.java

import org.osbot.rs07.script.Script;

import java.util.Comparator;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
 * Created by Valkyr on 17/12/2015.
 */
public abstract class Query<T, R extends QueryResult<T>> implements IQuery<T, R> {

    private final Script script;
    private List<T> raw;

    public Query(Script script) {
        this.script = script;
        raw = load();
    }

    public final Script getScript() {
        return script;
    }

    @Override
    public final Query<T, R> filter(Predicate<T> predicate) {
        if (raw != null && raw.size() > 0) {
            raw.removeAll(raw.stream().filter(t -> !predicate.test(t)).collect(Collectors.toList()));
        }
        return getThis();
    }

    @Override
    public final Query<T, R> sort(Comparator<T> comparator) {
        raw = raw.stream().sorted(comparator).collect(Collectors.toList());
        return getThis();
    }


    @Override
    public final <ST extends T> Query<ST, QueryResult<ST>> bySubClass(Class<ST> subType) {
        if (raw != null && raw.size() > 0) {
            filter(t -> t != null && subType.isAssignableFrom(t.getClass()));
        }
        return (Query<ST, QueryResult<ST>>) getThis();
    }


    protected final List<T> getRaw() {
        return raw;
    }

    protected final <SQ extends Query<T, R>> SQ getThis() {
        return (SQ) this;
    }

    public abstract R result();

}

QueryBuilder.java

import org.osbot.rs07.script.Script;

/**
 * Created by Valkyr on 17/12/2015.
 */
public abstract class QueryBuilder<T, R extends IQueryResult<T>, Q extends IQuery<T, R>> implements IQueryBuilder<T, R, Q> {

    private final Script script;

    public QueryBuilder(Script context) {
        this.script = context;
    }

    public final Script getScript() {
        return script;
    }
}

QueryResult.java

import java.util.List;

/**
 * Created by Valkyr on 17/12/2015.
 */
public abstract class QueryResult<T> implements IQueryResult<T> {

    private final List<T> results;

    public QueryResult(List<T> results) {
        this.results = results;
    }


    @Override
    public T first() {
        if (!isEmpty()) return results.get(0);
        return null;
    }

    @Override
    public T last() {
        if (!isEmpty()) return results.get(results.size());
        return null;
    }

    @Override
    public T get(int index) {
        if (!isEmpty()) return results.get(index);
        return null;
    }

    @Override
    public List<T> all() {
        if (!isEmpty()) return results;
        return null;
    }

    @Override
    public boolean isEmpty() {
        return results.size() < 1;
    }
}
Edited by Valkyr
  • Like 3

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...