PandaLib/src/main/java/fr/pandacube/util/orm/SQLOrderBy.java

98 lines
2.0 KiB
Java
Raw Normal View History

2019-10-26 23:15:49 +02:00
package fr.pandacube.util.orm;
import java.util.ArrayList;
import java.util.List;
public class SQLOrderBy {
private List<OBField> orderByFields = new ArrayList<>();
/**
* Construit une nouvelle clause ORDER BY
*/
private SQLOrderBy() {}
/**
* Ajoute un champ dans la clause ORDER BY en construction
*
* @param field le champ SQL à ordonner
* @param d le sens de tri (croissant ASC ou décroissant DESC)
* @return l'objet courant (permet de chainer les ajouts de champs)
*/
private SQLOrderBy add(SQLField<?, ?> field, Direction d) {
orderByFields.add(new OBField(field, d));
return this;
}
/**
* Ajoute un champ dans la clause ORDER BY en construction avec pour direction ASC
*
* @param field le champ SQL à ordonner
* @return l'objet courant (permet de chainer les ajouts de champs)
*/
public SQLOrderBy thenAsc(SQLField<?, ?> field) {
2017-09-15 01:33:45 +02:00
return add(field, Direction.ASC);
}
/**
* Ajoute un champ dans la clause ORDER BY en construction avec pour direction DESC
*
* @param field le champ SQL à ordonner
* @return l'objet courant (permet de chainer les ajouts de champs)
*/
public SQLOrderBy thenDesc(SQLField<?, ?> field) {
return add(field, Direction.DESC);
}
/* package */ String toSQL() {
String ret = "";
boolean first = true;
for (OBField f : orderByFields) {
if (!first) ret += ", ";
first = false;
2019-07-18 17:37:27 +02:00
ret += "`" + f.field.getName() + "` " + f.direction.name();
}
return ret;
}
@Override
public String toString() {
return toSQL();
}
private class OBField {
public final SQLField<?, ?> field;
public final Direction direction;
public OBField(SQLField<?, ?> f, Direction d) {
field = f;
direction = d;
}
}
private enum Direction {
ASC, DESC;
}
public static SQLOrderBy asc(SQLField<?, ?> field) {
return new SQLOrderBy().thenAsc(field);
}
public static SQLOrderBy desc(SQLField<?, ?> field) {
return new SQLOrderBy().thenDesc(field);
}
}