Skip to content

Commit

Permalink
Support adding order by to SQL queries
Browse files Browse the repository at this point in the history
  • Loading branch information
rchodava committed Sep 7, 2016
1 parent 149227a commit fda712c
Show file tree
Hide file tree
Showing 8 changed files with 89 additions and 3 deletions.
@@ -0,0 +1,14 @@
package foundation.stack.datamill.db;

import foundation.stack.datamill.reflection.Member;

/**
* @author Ravi Chodavarapu (rchodava@gmail.com)
*/
public interface ConjoinedOrderBuilder<R> {
R all();
R limit(int count);
R limit(int offset, int count);
OrderBuilder<R> andOrderBy(String fragment);
OrderBuilder<R> andOrderBy(Member member);
}
@@ -0,0 +1,9 @@
package foundation.stack.datamill.db;

/**
* @author Ravi Chodavarapu (rchodava@gmail.com)
*/
public interface OrderBuilder<R> {
ConjoinedOrderBuilder<R> desc();
ConjoinedOrderBuilder<R> asc();
}
@@ -1,10 +1,13 @@
package foundation.stack.datamill.db;

import foundation.stack.datamill.LimitBuilder;
import foundation.stack.datamill.reflection.Member;

/**
* @author Ravi Chodavarapu (rchodava@gmail.com)
*/
public interface SelectLimitBuilder<R> extends LimitBuilder<R> {
R limit(int offset, int count);
OrderBuilder<R> orderBy(String fragment);
OrderBuilder<R> orderBy(Member member);
}
@@ -1,10 +1,12 @@
package foundation.stack.datamill.db;

import foundation.stack.datamill.reflection.Outline;
import foundation.stack.datamill.reflection.Member;

/**
* @author Ravi Chodavarapu (rchodava@gmail.com)
*/
public interface SelectWhereBuilder<R> extends WhereBuilder<R, SelectLimitBuilder<R>> {
R limit(int offset, int count);
OrderBuilder<R> orderBy(String fragment);
OrderBuilder<R> orderBy(Member member);
}
Expand Up @@ -10,7 +10,7 @@
public interface WhereBuilder<R, L extends LimitBuilder<R>> {
R all();
R limit(int count);
L where(Func1<ConditionBuilder, TerminalCondition> conditionBuilder);
JoinBuilder<R> leftJoin(String table);
JoinBuilder<R> leftJoin(Outline<?> outline);
L where(Func1<ConditionBuilder, TerminalCondition> conditionBuilder);
}
Expand Up @@ -4,9 +4,11 @@
* @author Ravi Chodavarapu (rchodava@gmail.com)
*/
public interface SqlSyntax {
String SQL_ASC = " ASC";
String SQL_ASSIGNMENT = " = ";
String SQL_DELETE_FROM = "DELETE FROM ";
String SQL_DELETE = "DELETE ";
String SQL_DESC = " DESC";
String SQL_EQ = " = ";
String SQL_FROM = " FROM ";
String SQL_GREATER_THAN = " > ";
Expand All @@ -26,6 +28,7 @@ public interface SqlSyntax {
String SQL_AND = " AND ";
String SQL_IN = " IN ";
String SQL_OR = " OR ";
String SQL_ORDER_BY = " ORDER BY ";
String OPEN_PARENTHESIS = "(";
String CLOSE_PARENTHESIS = ")";
String COMMA = ",";
Expand Down
Expand Up @@ -14,7 +14,7 @@
* @author Ravi Chodavarapu (rchodava@gmail.com)
*/
abstract class WhereBuilderImpl<R> implements SelectWhereBuilder<R>, ConditionBuilder, ConjunctionBuilder,
JoinBuilder<R>, SelectLimitBuilder<R> {
JoinBuilder<R>, SelectLimitBuilder<R>, OrderBuilder<R>, ConjoinedOrderBuilder<R> {
protected final StringBuilder query;
protected final List<Object> parameters;

Expand Down Expand Up @@ -87,6 +87,31 @@ public ConditionBuilder and() {
return this;
}

@Override
public OrderBuilder<R> andOrderBy(String fragment) {
query.append(SqlSyntax.COMMA);
query.append(' ');
query.append(fragment);
return this;
}

@Override
public OrderBuilder<R> andOrderBy(Member member) {
return andOrderBy(SqlSyntax.qualifiedName(member.outline().pluralName(), member.name()));
}

@Override
public ConjoinedOrderBuilder<R> asc() {
query.append(SqlSyntax.SQL_ASC);
return this;
}

@Override
public ConjoinedOrderBuilder<R> desc() {
query.append(SqlSyntax.SQL_DESC);
return this;
}

@Override
public TerminalCondition or(
Func1<ConditionBuilder, TerminalCondition> left,
Expand Down Expand Up @@ -244,6 +269,18 @@ public SelectWhereBuilder<R> onEq(String table1, String column1, Member member2)
return onEq(table1, column1, member2.outline().pluralName(), member2.name());
}

@Override
public OrderBuilder<R> orderBy(String fragment) {
query.append(SqlSyntax.SQL_ORDER_BY);
query.append(fragment);
return this;
}

@Override
public OrderBuilder<R> orderBy(Member member) {
return orderBy(SqlSyntax.qualifiedName(member.outline().pluralName(), member.name()));
}

@Override
public SelectLimitBuilder<R> where(Func1<ConditionBuilder, TerminalCondition> conditionBuilder) {
query.append(SqlSyntax.SQL_WHERE);
Expand Down
Expand Up @@ -118,6 +118,14 @@ public void selectQueries() {
assertEquals("SELECT * FROM table_name LIMIT 10, 20", queryBuilder.getLastQuery());
assertFalse(queryBuilder.getLastWasUpdate());

queryBuilder.selectAll().from("table_name").orderBy("column").asc().limit(1);
assertEquals("SELECT * FROM table_name ORDER BY column ASC LIMIT 1", queryBuilder.getLastQuery());
assertFalse(queryBuilder.getLastWasUpdate());

queryBuilder.selectAll().from("table_name").orderBy("column").asc().andOrderBy("column2").desc().limit(1);
assertEquals("SELECT * FROM table_name ORDER BY column ASC, column2 DESC LIMIT 1", queryBuilder.getLastQuery());
assertFalse(queryBuilder.getLastWasUpdate());

queryBuilder.selectAll().from(outline).all();
assertEquals("SELECT * FROM query_test_beans", queryBuilder.getLastQuery());
assertFalse(queryBuilder.getLastWasUpdate());
Expand All @@ -127,6 +135,11 @@ public void selectQueries() {
assertArrayEquals(new Object[] { 2 }, queryBuilder.getLastParameters());
assertFalse(queryBuilder.getLastWasUpdate());

queryBuilder.selectAll().from("table_name").where(c -> c.eq("int_column", 2)).orderBy("int_column").asc().all();
assertEquals("SELECT * FROM table_name WHERE int_column = ? ORDER BY int_column ASC", queryBuilder.getLastQuery());
assertArrayEquals(new Object[] { 2 }, queryBuilder.getLastParameters());
assertFalse(queryBuilder.getLastWasUpdate());

queryBuilder.selectAll().from("table_name").where(c -> c.eq("int_column", 2)).limit(1);
assertEquals("SELECT * FROM table_name WHERE int_column = ? LIMIT 1", queryBuilder.getLastQuery());
assertArrayEquals(new Object[] { 2 }, queryBuilder.getLastParameters());
Expand All @@ -137,6 +150,11 @@ public void selectQueries() {
assertArrayEquals(new Object[] { 2 }, queryBuilder.getLastParameters());
assertFalse(queryBuilder.getLastWasUpdate());

queryBuilder.selectAll().from("table_name").where(c -> c.eq("int_column", 2)).orderBy("int_column").desc().limit(10, 20);
assertEquals("SELECT * FROM table_name WHERE int_column = ? ORDER BY int_column DESC LIMIT 10, 20", queryBuilder.getLastQuery());
assertArrayEquals(new Object[] { 2 }, queryBuilder.getLastParameters());
assertFalse(queryBuilder.getLastWasUpdate());

queryBuilder.selectAll().from("table_name").where(c -> c.eq(outline.member(m -> m.getId()), 2)).all();
assertEquals("SELECT * FROM table_name WHERE query_test_beans.id = ?", queryBuilder.getLastQuery());
assertArrayEquals(new Object[] { 2 }, queryBuilder.getLastParameters());
Expand Down

0 comments on commit fda712c

Please sign in to comment.