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

com.github.antelopeframework.mybatis.criterion.Order Maven / Gradle / Ivy

There is a newer version: 1.1.5
Show newest version
package com.github.antelopeframework.mybatis.criterion;

import java.io.Serializable;
import java.sql.Types;
import java.util.Locale;

import lombok.Getter;
import lombok.Setter;

@Getter
public class Order implements Serializable {
	private static final long serialVersionUID = 1L;
	
	private boolean ascending;
	private boolean ignoreCase;
	private String column;
	private int sqlType;
	@Setter
	private NullPrecedence nullPrecedence;
	
	/**
	 * Ascending order
	 *
	 * @param column The property to order on
	 * @param sqlType {@link java.sql.Types}
	 *
	 * @return The build Order instance
	 */
	public static Order asc(String column, int sqlType) {
		return new Order(column, sqlType, true);
	}

	/**
	 * Descending order.
	 *
	 * @param column The property to order on
	 * @param sqlType {@link java.sql.Types}
	 *
	 * @return The build Order instance
	 */
	public static Order desc(String column, int sqlType) {
		return new Order(column, sqlType, false);
	}

	/**
	 * Constructor for Order. Order instances are generally created by factory
	 * methods.
	 *
	 * @see #asc
	 * @see #desc
	 */
	protected Order(String column, int sqlType, boolean ascending) {
		this.column = column;
		this.sqlType = sqlType;
		this.ascending = ascending;
	}

	/**
	 * Should this ordering ignore case? Has no effect on non-character
	 * properties.
	 *
	 * @return {@code this}, for method chaining
	 */
	public Order ignoreCase() {
		ignoreCase = true;
		return this;
	}

	/**
	 * Render the SQL fragment
	 *
	 * @param criteria The criteria
	 * @param criteriaQuery The overall query
	 *
	 * @return The ORDER BY fragment for this ordering
	 */
	public String toSqlString(CriteriaQuery criteriaQuery) {
		final StringBuilder fragment = new StringBuilder();
		final StringBuilder expression = new StringBuilder();
		boolean lower = false;
		
		if (ignoreCase) {
			lower = sqlType == Types.VARCHAR || sqlType == Types.CHAR || sqlType == Types.LONGVARCHAR;
		}

		if (lower) {
			expression.append("lower").append('(');
		}
		
		expression.append(column);
		
		if (lower) {
			expression.append(')');
		}
		
		fragment.append(renderOrderByElement(expression.toString(), null, ascending ? "asc" : "desc", nullPrecedence != null ? nullPrecedence : NullPrecedence.LAST));
		
		return fragment.toString();
	}
	
	
	public String renderOrderByElement(String expression, String collation, String order, NullPrecedence nulls) {
		final StringBuilder orderByElement = new StringBuilder( expression );
		if ( collation != null ) {
			orderByElement.append( " " ).append( collation );
		}
		if ( order != null ) {
			orderByElement.append( " " ).append( order );
		}
		if ( nulls != NullPrecedence.NONE ) {
			orderByElement.append( " nulls " ).append( nulls.name().toLowerCase(Locale.ROOT) );
		}
		return orderByElement.toString();
	}
	
	@Override
	public String toString() {
		return column + ' ' + ( ascending ? "asc" : "desc" ) + ( nullPrecedence != null ? ' ' + nullPrecedence.name().toLowerCase(Locale.ROOT) : "" );
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy