Skip to content

Commit

Permalink
[playframework#878] Add OrderBy support in simplified queries
Browse files Browse the repository at this point in the history
  • Loading branch information
Loic Descotte authored and mbknor committed Mar 12, 2012
1 parent 39aac78 commit b91659a
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 1 deletion.
2 changes: 2 additions & 0 deletions documentation/manual/jpa.textile
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,8 @@ bc. Post.find("byTitle", "My first post").fetch();
Post.find("byTitleLike", "%hello%").fetch();
Post.find("byAuthorIsNull").fetch();
Post.find("byTitleLikeAndAuthor", "%hello%", connectedUser).fetch();
Post.find("byTitleOrderByTitle", "%hello%").fetch(); //default for order is asc
Post.find("byTitleOrderByNbCommentsDesc", "%hello%").fetch();

Simple queries follow the following syntax <code>==[Property][Comparator]And?==</code> where Comparator can be the following:

Expand Down
22 changes: 21 additions & 1 deletion framework/src/play/db/jpa/JPQL.java
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,11 @@ public Query bindParameters(Query q, Map<String,Object> params) {
public String findByToJPQL(String findBy) {
findBy = findBy.substring(2);
StringBuffer jpql = new StringBuffer();
String[] parts = findBy.split("And");
String subRequest;
if (findBy.contains("OrderBy"))
subRequest = findBy.split("OrderBy")[0];
else subRequest = findBy;
String[] parts = subRequest.split("And");
for (int i = 0; i < parts.length; i++) {
String part = parts[i];
if (part.endsWith("NotEqual")) {
Expand Down Expand Up @@ -267,6 +271,22 @@ public String findByToJPQL(String findBy) {
jpql.append(" AND ");
}
}
// ORDER BY clause
if (findBy.contains("OrderBy")) {
jpql.append(" ORDER BY ");
String orderQuery = findBy.split("OrderBy")[1];
parts = orderQuery.split("And");
for (int i = 0; i < parts.length; i++) {
String part = parts[i];
String orderProp;
if (part.endsWith("Desc"))
orderProp = extractProp(part, "Desc") + " DESC";
else orderProp = part.toLowerCase();
if (i > 0)
jpql.append(", ");
jpql.append(orderProp);
}
}
return jpql.toString();
}

Expand Down
52 changes: 52 additions & 0 deletions framework/test-src/play/db/jpa/JPQLTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package play.db.jpa;


import org.junit.BeforeClass;
import org.junit.Test;

import java.util.Properties;
import java.util.Set;

import static play.db.jpa.JPQL.extractProp;

import static org.junit.Assert.*;

public class JPQLTest {

static JPQL jpql;

@BeforeClass
public static void setup(){
jpql = new JPQL(null);
}

@Test
public void testOrder() {

String query = "ByNameOrderByName";
String result = jpql.findByToJPQL(query);
assertTrue(result.endsWith(" ORDER BY name"));

query = "ByNameOrderByNameAndAge";
result = jpql.findByToJPQL(query);
assertTrue(result.endsWith(" ORDER BY name, age"));

query = "ByNameOrderByNameDesc";
result = jpql.findByToJPQL(query);
assertTrue(result.endsWith(" ORDER BY name DESC"));

query = "ByNameOrderByNameDescAndAge";
result = jpql.findByToJPQL(query);
assertTrue(result.endsWith(" ORDER BY name DESC, age"));

query = "ByNameOrderByNameAndAgeDesc";
result = jpql.findByToJPQL(query);
assertTrue(result.endsWith(" ORDER BY name, age DESC"));

query = "ByNameOrderByNameDescAndAgeDesc";
result = jpql.findByToJPQL(query);
assertTrue(result.endsWith(" ORDER BY name DESC, age DESC"));

}

}

0 comments on commit b91659a

Please sign in to comment.