All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.iciql.QueryWhere Maven / Gradle / Ivy

/*
 * Copyright 2004-2011 H2 Group.
 * Copyright 2011 James Moger.
 *
 * Licensed 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 com.iciql;

import com.iciql.NestedConditions.And;
import com.iciql.NestedConditions.Or;

import java.util.List;

/**
 * This class represents a query with a condition.
 *
 * @param  the return type
 */

public class QueryWhere {

    Query query;

    QueryWhere(Query query) {
        this.query = query;
    }

    /**
     * Specify an AND condition with a mapped primitive boolean.
     *
     * @param x the primitive boolean field to query
     * @return a query condition to continue building the condition
     */
    public QueryCondition and(boolean x) {
        query.getFrom().getAliasDefinition().checkMultipleBooleans();
        return addPrimitive(ConditionAndOr.AND, x);
    }

    /**
     * Specify an AND condition with a mapped primitive byte.
     *
     * @param x the primitive byte field to query
     * @return a query condition to continue building the condition
     */
    public QueryCondition and(byte x) {
        return addPrimitive(ConditionAndOr.AND, x);
    }

    /**
     * Specify an AND condition with a mapped primitive short.
     *
     * @param x the primitive short field to query
     * @return a query condition to continue building the condition
     */
    public QueryCondition and(short x) {
        return addPrimitive(ConditionAndOr.AND, x);
    }

    /**
     * Specify an AND condition with a mapped primitive int.
     *
     * @param x the primitive int field to query
     * @return a query condition to continue building the condition
     */
    public QueryCondition and(int x) {
        return addPrimitive(ConditionAndOr.AND, x);
    }

    /**
     * Specify an AND condition with a mapped primitive long.
     *
     * @param x the primitive long field to query
     * @return a query condition to continue building the condition
     */
    public QueryCondition and(long x) {
        return addPrimitive(ConditionAndOr.AND, x);
    }

    /**
     * Specify an AND condition with a mapped primitive float.
     *
     * @param x the primitive float field to query
     * @return a query condition to continue building the condition
     */
    public QueryCondition and(float x) {
        return addPrimitive(ConditionAndOr.AND, x);
    }

    /**
     * Specify an AND condition with a mapped primitive double.
     *
     * @param x the primitive double field to query
     * @return a query condition to continue building the condition
     */
    public QueryCondition and(double x) {
        return addPrimitive(ConditionAndOr.AND, x);
    }

    private  QueryCondition addPrimitive(ConditionAndOr condition, A x) {
        query.addConditionToken(condition);
        A alias = query.getPrimitiveAliasByValue(x);
        if (alias == null) {
            // this will result in an unmapped field exception
            return new QueryCondition(query, x);
        }
        return new QueryCondition(query, alias);
    }

    /**
     * Specify an AND condition with a mapped Object field.
     *
     * @param x the Object field to query
     * @return a query condition to continue building the condition
     */
    public  QueryCondition and(A x) {
        query.getFrom().getAliasDefinition().checkMultipleEnums(x);
        query.addConditionToken(ConditionAndOr.AND);
        return new QueryCondition(query, x);
    }

    public QueryWhere and(And conditions) {
        andOpen();
        query.addConditionToken(conditions.where.query);
        return close();
    }

    public QueryWhere and(Or conditions) {
        andOpen();
        query.addConditionToken(conditions.where.query);
        return close();
    }

    public QueryWhere andOpen() {
        return open(ConditionAndOr.AND);
    }

    /**
     * Specify an OR condition with a mapped primitive boolean.
     *
     * @param x the primitive boolean field to query
     * @return a query condition to continue building the condition
     */
    public QueryCondition or(boolean x) {
        query.getFrom().getAliasDefinition().checkMultipleBooleans();
        return addPrimitive(ConditionAndOr.OR, x);
    }

    /**
     * Specify an OR condition with a mapped primitive byte.
     *
     * @param x the primitive byte field to query
     * @return a query condition to continue building the condition
     */
    public QueryCondition or(byte x) {
        return addPrimitive(ConditionAndOr.OR, x);
    }

    /**
     * Specify an OR condition with a mapped primitive short.
     *
     * @param x the primitive short field to query
     * @return a query condition to continue building the condition
     */
    public QueryCondition or(short x) {
        return addPrimitive(ConditionAndOr.OR, x);
    }

    /**
     * Specify an OR condition with a mapped primitive int.
     *
     * @param x the primitive int field to query
     * @return a query condition to continue building the condition
     */
    public QueryCondition or(int x) {
        return addPrimitive(ConditionAndOr.OR, x);
    }

    /**
     * Specify an OR condition with a mapped primitive long.
     *
     * @param x the primitive long field to query
     * @return a query condition to continue building the condition
     */
    public QueryCondition or(long x) {
        return addPrimitive(ConditionAndOr.OR, x);
    }

    /**
     * Specify an OR condition with a mapped primitive float.
     *
     * @param x the primitive float field to query
     * @return a query condition to continue building the condition
     */
    public QueryCondition or(float x) {
        return addPrimitive(ConditionAndOr.OR, x);
    }

    /**
     * Specify an OR condition with a mapped primitive double.
     *
     * @param x the primitive double field to query
     * @return a query condition to continue building the condition
     */
    public QueryCondition or(double x) {
        return addPrimitive(ConditionAndOr.OR, x);
    }

    /**
     * Specify an OR condition with a mapped Object field.
     *
     * @param x the Object field to query
     * @return a query condition to continue building the condition
     */
    public  QueryCondition or(A x) {
        query.getFrom().getAliasDefinition().checkMultipleEnums(x);
        query.addConditionToken(ConditionAndOr.OR);
        return new QueryCondition(query, x);
    }

    public QueryWhere or(And conditions) {
        orOpen();
        query.addConditionToken(conditions.where.query);
        return close();
    }

    public QueryWhere or(Or conditions) {
        orOpen();
        query.addConditionToken(conditions.where.query);
        return close();
    }

    public QueryWhere orOpen() {
        return open(ConditionAndOr.OR);
    }

    private QueryWhere open(ConditionAndOr andOr) {
        query.addConditionToken(andOr);
        query.addConditionToken(ConditionOpenClose.OPEN);
        return this;
    }

    public QueryWhere close() {
        query.addConditionToken(ConditionOpenClose.CLOSE);
        return this;
    }

    public QueryWhere limit(long limit) {
        query.limit(limit);
        return this;
    }

    public QueryWhere offset(long offset) {
        query.offset(offset);
        return this;
    }

    public String getSQL() {
        SQLStatement stat = new SQLStatement(query.getDb());
        stat.appendSQL("SELECT *");
        query.appendFromWhere(stat);
        return stat.getSQL().trim();
    }

    /**
     * toSQL returns a static string version of the query with runtime variables
     * properly encoded. This method is also useful when combined with the where
     * clause methods like isParameter() or atLeastParameter() which allows
     * iciql to generate re-usable parameterized string statements.
     *
     * @return the sql query as plain text
     */
    public String toSQL() {
        return query.toSQL(false);
    }

    /**
     * toSQL returns a static string version of the query with runtime variables
     * properly encoded. This method is also useful when combined with the where
     * clause methods like isParameter() or atLeastParameter() which allows
     * iciql to generate re-usable parameterized string statements.
     *
     * @param distinct if true SELECT DISTINCT is used for the query
     * @return the sql query as plain text
     */
    public String toSQL(boolean distinct) {
        return query.toSQL(distinct);
    }

    /**
     * toSQL returns a static string version of the query with runtime variables
     * properly encoded. This method is also useful when combined with the where
     * clause methods like isParameter() or atLeastParameter() which allows
     * iciql to generate re-usable parameterized string statements.
     *
     * @param distinct if true SELECT DISTINCT is used for the query
     * @param k        k is used to select only the columns of the specified alias
     *                 for an inner join statement. An example of a generated
     *                 statement is: SELECT DISTINCT t1.* FROM sometable AS t1 INNER
     *                 JOIN othertable AS t2 ON t1.id = t2.id WHERE t2.flag = true
     *                 without the alias parameter the statement would start with
     *                 SELECT DISTINCT * FROM...
     * @return the sql query as plain text
     */
    public  String toSQL(boolean distinct, K k) {
        return query.toSQL(distinct, k);
    }

    public  SubQuery subQuery(Z x) {
        return new SubQuery(query, x);
    }

    public SubQuery subQuery(boolean x) {
        return subQuery(query.getPrimitiveAliasByValue(x));
    }

    public SubQuery subQuery(byte x) {
        return subQuery(query.getPrimitiveAliasByValue(x));
    }

    public SubQuery subQuery(short x) {
        return subQuery(query.getPrimitiveAliasByValue(x));
    }

    public SubQuery subQuery(int x) {
        return subQuery(query.getPrimitiveAliasByValue(x));
    }

    public SubQuery subQuery(long x) {
        return subQuery(query.getPrimitiveAliasByValue(x));
    }

    public SubQuery subQuery(float x) {
        return subQuery(query.getPrimitiveAliasByValue(x));
    }

    public SubQuery subQuery(double x) {
        return subQuery(query.getPrimitiveAliasByValue(x));
    }

    public  List select(Z x) {
        return query.select(x);
    }

    public  List selectDistinct(Z x) {
        return query.selectDistinct(x);
    }

    public  X selectFirst(Z x) {
        List list = query.select(x);
        return list.isEmpty() ? null : list.get(0);
    }

    public List select() {
        return query.select();
    }

    public T selectFirst() {
        List list = select();
        return list.isEmpty() ? null : list.get(0);
    }

    public List selectDistinct() {
        return query.selectDistinct();
    }

    public void createView(Class viewClass) {
        query.createView(viewClass);
    }

    public void replaceView(Class viewClass) {
        query.replaceView(viewClass);
    }

    /**
     * Order by primitive boolean field
     *
     * @param field a primitive boolean field
     * @return the query
     */
    public QueryWhere orderBy(boolean field) {
        query.getFrom().getAliasDefinition().checkMultipleBooleans();
        return orderByPrimitive(field);
    }

    /**
     * Order by primitive byte field
     *
     * @param field a primitive byte field
     * @return the query
     */
    public QueryWhere orderBy(byte field) {
        return orderByPrimitive(field);
    }

    /**
     * Order by primitive short field
     *
     * @param field a primitive short field
     * @return the query
     */
    public QueryWhere orderBy(short field) {
        return orderByPrimitive(field);
    }

    public QueryWhere orderBy(int field) {
        return orderByPrimitive(field);
    }

    /**
     * Order by primitive long field
     *
     * @param field a primitive long field
     * @return the query
     */
    public QueryWhere orderBy(long field) {
        return orderByPrimitive(field);
    }

    /**
     * Order by primitive float field
     *
     * @param field a primitive float field
     * @return the query
     */
    public QueryWhere orderBy(float field) {
        return orderByPrimitive(field);
    }

    /**
     * Order by primitive double field
     *
     * @param field a primitive double field
     * @return the query
     */
    public QueryWhere orderBy(double field) {
        return orderByPrimitive(field);
    }

    private QueryWhere orderByPrimitive(Object field) {
        query.orderByPrimitive(field);
        return this;
    }

    public QueryWhere orderBy(Object field) {
        query.getFrom().getAliasDefinition().checkMultipleEnums(field);
        query.orderBy(field);
        return this;
    }

    /**
     * Order by a number of Object columns.
     *
     * @param expressions the order by expressions
     * @return the query
     */

    public QueryWhere orderBy(Object... expressions) {
        query.orderBy(expressions);
        return this;
    }

    public QueryWhere orderByNullsFirst(Object expr) {
        query.getFrom().getAliasDefinition().checkMultipleEnums(expr);
        OrderExpression e = new OrderExpression(query, expr, false, true, false);
        query.addOrderBy(e);
        return this;
    }

    public QueryWhere orderByNullsLast(Object expr) {
        query.getFrom().getAliasDefinition().checkMultipleEnums(expr);
        OrderExpression e = new OrderExpression(query, expr, false, false, true);
        query.addOrderBy(e);
        return this;
    }

    public QueryWhere orderByDesc(Object expr) {
        query.getFrom().getAliasDefinition().checkMultipleEnums(expr);
        OrderExpression e = new OrderExpression(query, expr, true, false, false);
        query.addOrderBy(e);
        return this;
    }

    public QueryWhere orderByDescNullsFirst(Object expr) {
        query.getFrom().getAliasDefinition().checkMultipleEnums(expr);
        OrderExpression e = new OrderExpression(query, expr, true, true, false);
        query.addOrderBy(e);
        return this;
    }

    public QueryWhere orderByDescNullsLast(Object expr) {
        query.getFrom().getAliasDefinition().checkMultipleEnums(expr);
        OrderExpression e = new OrderExpression(query, expr, true, false, true);
        query.addOrderBy(e);
        return this;
    }

    /**
     * Group by primitive boolean field
     *
     * @param field a primitive boolean field
     * @return the query
     */
    public QueryWhere groupBy(boolean field) {
        query.getFrom().getAliasDefinition().checkMultipleBooleans();
        return groupByPrimitive(field);
    }

    /**
     * Group by primitive byte field
     *
     * @param field a primitive byte field
     * @return the query
     */
    public QueryWhere groupBy(byte field) {
        return groupByPrimitive(field);
    }

    /**
     * Group by primitive short field
     *
     * @param field a primitive short field
     * @return the query
     */
    public QueryWhere groupBy(short field) {
        return groupByPrimitive(field);
    }

    public QueryWhere groupBy(int field) {
        return groupByPrimitive(field);
    }

    /**
     * Group by primitive long field
     *
     * @param field a primitive long field
     * @return the query
     */
    public QueryWhere groupBy(long field) {
        return groupByPrimitive(field);
    }

    /**
     * Group by primitive float field
     *
     * @param field a primitive float field
     * @return the query
     */
    public QueryWhere groupBy(float field) {
        return groupByPrimitive(field);
    }

    /**
     * Group by primitive double field
     *
     * @param field a primitive double field
     * @return the query
     */
    public QueryWhere groupBy(double field) {
        return groupByPrimitive(field);
    }

    private QueryWhere groupByPrimitive(Object field) {
        query.groupByPrimitive(field);
        return this;
    }

    public QueryWhere groupBy(Object field) {
        query.getFrom().getAliasDefinition().checkMultipleEnums(field);
        query.groupBy(field);
        return this;
    }

    /**
     * Group by a number of Object columns.
     *
     * @param expressions the group by expressions
     * @return the query
     */

    public QueryWhere groupBy(Object... expressions) {
        query.groupBy(expressions);
        return this;
    }

    public int delete() {
        return query.delete();
    }

    public int update() {
        return query.update();
    }

    public long selectCount() {
        return query.selectCount();
    }

    public  List> selectCount(X x) {
        return query.selectCount(x, false);
    }

    public  List> selectCountDesc(X x) {
        return query.selectCount(x, true);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy