in grails-datastore-gorm-hibernate/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java [505:596]
protected String buildOrderByClause(String hqlOrderBy, PersistentClass associatedClass, String role, String defaultOrder) {
String orderByString = null;
if (hqlOrderBy != null) {
List<String> properties = new ArrayList<>();
List<String> ordering = new ArrayList<>();
StringBuilder orderByBuffer = new StringBuilder();
if (hqlOrderBy.length() == 0) {
//order by id
Iterator<?> it = associatedClass.getIdentifier().getColumnIterator();
while (it.hasNext()) {
Selectable col = (Selectable) it.next();
orderByBuffer.append(col.getText()).append(" asc").append(", ");
}
}
else {
StringTokenizer st = new StringTokenizer(hqlOrderBy, " ,", false);
String currentOrdering = defaultOrder;
//FIXME make this code decent
while (st.hasMoreTokens()) {
String token = st.nextToken();
if (isNonPropertyToken(token)) {
if (currentOrdering != null) {
throw new DatastoreConfigurationException(
"Error while parsing sort clause: " + hqlOrderBy
+ " (" + role + ")"
);
}
currentOrdering = token;
}
else {
//Add ordering of the previous
if (currentOrdering == null) {
//default ordering
ordering.add("asc");
}
else {
ordering.add(currentOrdering);
currentOrdering = null;
}
properties.add(token);
}
}
ordering.remove(0); //first one is the algorithm starter
// add last one ordering
if (currentOrdering == null) {
//default ordering
ordering.add(defaultOrder);
}
else {
ordering.add(currentOrdering);
currentOrdering = null;
}
int index = 0;
for (String property : properties) {
Property p = BinderHelper.findPropertyByName(associatedClass, property);
if (p == null) {
throw new DatastoreConfigurationException(
"property from sort clause not found: "
+ associatedClass.getEntityName() + "." + property
);
}
PersistentClass pc = p.getPersistentClass();
String table;
if (pc == null) {
table = "";
}
else if (pc == associatedClass
|| (associatedClass instanceof SingleTableSubclass &&
pc.getMappedClass().isAssignableFrom(associatedClass.getMappedClass()))) {
table = "";
} else {
table = pc.getTable().getQuotedName() + ".";
}
Iterator<?> propertyColumns = p.getColumnIterator();
while (propertyColumns.hasNext()) {
Selectable column = (Selectable) propertyColumns.next();
orderByBuffer.append(table)
.append(column.getText())
.append(" ")
.append(ordering.get(index))
.append(", ");
}
index++;
}
}
orderByString = orderByBuffer.substring(0, orderByBuffer.length() - 2);
}
return orderByString;
}