From f74404bb03b45f7602d66af64eb805c4811cccb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A7alo=20Ferreira?= Date: Thu, 21 May 2015 04:47:33 +0100 Subject: [PATCH 1/2] Join operators. This adds LEFT OUTER JOIN, CROSS JOIN and the optional NATURAL operator. --- .../builder/JoinOnBuilder.java | 18 ++++++- .../sqlitequerybuilder/builder/JoinType.java | 19 ++++++++ .../builder/SelectFromBuilder.java | 18 ++++++- .../builder/SelectJoinBuilder.java | 6 ++- .../alexfu/sqlitequerybuilder/SelectTest.java | 47 +++++++++++++++++++ 5 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/alexfu/sqlitequerybuilder/builder/JoinType.java diff --git a/src/main/java/com/alexfu/sqlitequerybuilder/builder/JoinOnBuilder.java b/src/main/java/com/alexfu/sqlitequerybuilder/builder/JoinOnBuilder.java index 6ff914d..c30faba 100644 --- a/src/main/java/com/alexfu/sqlitequerybuilder/builder/JoinOnBuilder.java +++ b/src/main/java/com/alexfu/sqlitequerybuilder/builder/JoinOnBuilder.java @@ -17,7 +17,23 @@ public SelectWhereBuilder where(String condition) { } public SelectJoinBuilder join(String table) { - return new SelectJoinBuilder(this, table); + return new SelectJoinBuilder(this, table, JoinType.JOIN); + } + + public SelectJoinBuilder leftOuterJoin(String table) { + return new SelectJoinBuilder(this, table, JoinType.LEFT_OUTER_JOIN); + } + + public SelectJoinBuilder crossJoin(String table) { + return new SelectJoinBuilder(this, table, JoinType.CROSS_JOIN); + } + + public SelectJoinBuilder naturalJoin(String table) { + return new SelectJoinBuilder(this, table, JoinType.NATURAL_JOIN); + } + + public SelectJoinBuilder naturalLeftOuterJoin(String table) { + return new SelectJoinBuilder(this, table, JoinType.NATURAL_LEFT_OUTER_JOIN); } @Override diff --git a/src/main/java/com/alexfu/sqlitequerybuilder/builder/JoinType.java b/src/main/java/com/alexfu/sqlitequerybuilder/builder/JoinType.java new file mode 100644 index 0000000..8590d9e --- /dev/null +++ b/src/main/java/com/alexfu/sqlitequerybuilder/builder/JoinType.java @@ -0,0 +1,19 @@ +package com.alexfu.sqlitequerybuilder.builder; + +public enum JoinType { + JOIN("JOIN"), + CROSS_JOIN("CROSS JOIN"), + LEFT_OUTER_JOIN("LEFT OUTER JOIN"), + NATURAL_JOIN("NATURAL JOIN"), + NATURAL_LEFT_OUTER_JOIN("NATURAL LEFT OUTER JOIN"); + + private final String sql; + + JoinType(String sql) { + this.sql = sql; + } + + public final String toSQL() { + return sql; + } +} diff --git a/src/main/java/com/alexfu/sqlitequerybuilder/builder/SelectFromBuilder.java b/src/main/java/com/alexfu/sqlitequerybuilder/builder/SelectFromBuilder.java index 1005739..8f4608e 100644 --- a/src/main/java/com/alexfu/sqlitequerybuilder/builder/SelectFromBuilder.java +++ b/src/main/java/com/alexfu/sqlitequerybuilder/builder/SelectFromBuilder.java @@ -17,7 +17,23 @@ public SelectWhereBuilder where(String condition) { } public SelectJoinBuilder join(String table) { - return new SelectJoinBuilder(this, table); + return new SelectJoinBuilder(this, table, JoinType.JOIN); + } + + public SelectJoinBuilder leftOuterJoin(String table) { + return new SelectJoinBuilder(this, table, JoinType.LEFT_OUTER_JOIN); + } + + public SelectJoinBuilder crossJoin(String table) { + return new SelectJoinBuilder(this, table, JoinType.CROSS_JOIN); + } + + public SelectJoinBuilder naturalJoin(String table) { + return new SelectJoinBuilder(this, table, JoinType.NATURAL_JOIN); + } + + public SelectJoinBuilder naturalLeftOuterJoin(String table) { + return new SelectJoinBuilder(this, table, JoinType.NATURAL_LEFT_OUTER_JOIN); } public SelectOrderByBuilder orderBy(String column) { diff --git a/src/main/java/com/alexfu/sqlitequerybuilder/builder/SelectJoinBuilder.java b/src/main/java/com/alexfu/sqlitequerybuilder/builder/SelectJoinBuilder.java index 22ba306..70c692f 100644 --- a/src/main/java/com/alexfu/sqlitequerybuilder/builder/SelectJoinBuilder.java +++ b/src/main/java/com/alexfu/sqlitequerybuilder/builder/SelectJoinBuilder.java @@ -8,10 +8,12 @@ public class SelectJoinBuilder extends SegmentBuilder { private Builder prefix; private String table; + private JoinType joinType; - public SelectJoinBuilder(Builder prefix, String table) { + public SelectJoinBuilder(Builder prefix, String table, JoinType joinType) { this.prefix = prefix; this.table = table; + this.joinType = joinType; } public JoinOnBuilder on(String condition) { @@ -20,6 +22,6 @@ public JoinOnBuilder on(String condition) { @Override public String build() { - return join(" ", prefix.build(), "JOIN", table); + return join(" ", prefix.build(), joinType.toSQL(), table); } } diff --git a/src/test/java/com/alexfu/sqlitequerybuilder/SelectTest.java b/src/test/java/com/alexfu/sqlitequerybuilder/SelectTest.java index 1aadadf..9920606 100644 --- a/src/test/java/com/alexfu/sqlitequerybuilder/SelectTest.java +++ b/src/test/java/com/alexfu/sqlitequerybuilder/SelectTest.java @@ -4,6 +4,7 @@ import com.alexfu.sqlitequerybuilder.api.SQLiteQueryBuilder; import com.alexfu.sqlitequerybuilder.api.SelectType; +import com.alexfu.sqlitequerybuilder.builder.JoinType; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; @@ -63,6 +64,52 @@ public void selectJoinTest() { assertThat(query).isEqualTo( "SELECT * FROM mytable JOIN secondtable ON mytable.id = secondtable.id WHERE id = 1"); } + @Test + public void selectLeftOuterJoinTest() { + String query = SQLiteQueryBuilder + .select("*") + .from("mytable") + .leftOuterJoin("secondtable") + .on("mytable.id = secondtable.id") + .where("id = 1") + .build(); + + assertThat(query).isEqualTo( "SELECT * FROM mytable LEFT OUTER JOIN secondtable ON mytable.id = secondtable.id WHERE id = 1"); + } + + @Test + public void selectCrossJoinTest() { + String query = SQLiteQueryBuilder + .select("*") + .from("mytable") + .crossJoin("secondtable") + .build(); + + assertThat(query).isEqualTo( "SELECT * FROM mytable CROSS JOIN secondtable"); + } + + @Test + public void selectNaturalJoinTest() { + String query = SQLiteQueryBuilder + .select("*") + .from("mytable") + .naturalJoin("secondtable") + .build(); + + assertThat(query).isEqualTo( "SELECT * FROM mytable NATURAL JOIN secondtable"); + } + + @Test + public void selectNaturalLeftOuterJoinTest() { + String query = SQLiteQueryBuilder + .select("*") + .from("mytable") + .naturalLeftOuterJoin("secondtable") + .build(); + + assertThat(query).isEqualTo( "SELECT * FROM mytable NATURAL LEFT OUTER JOIN secondtable"); + } + @Test public void selectMultiJoinTest() { String query = SQLiteQueryBuilder From 79cb34d325654c6633e316871519b3b1e2645633 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A7alo=20Ferreira?= Date: Fri, 22 May 2015 21:53:20 +0100 Subject: [PATCH 2/2] Remove unused code and change code indentation to 2 spaces. --- .../builder/JoinOnBuilder.java | 16 ------------- .../sqlitequerybuilder/builder/JoinType.java | 24 +++++++++---------- 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/alexfu/sqlitequerybuilder/builder/JoinOnBuilder.java b/src/main/java/com/alexfu/sqlitequerybuilder/builder/JoinOnBuilder.java index c30faba..f88b8a2 100644 --- a/src/main/java/com/alexfu/sqlitequerybuilder/builder/JoinOnBuilder.java +++ b/src/main/java/com/alexfu/sqlitequerybuilder/builder/JoinOnBuilder.java @@ -20,22 +20,6 @@ public SelectJoinBuilder join(String table) { return new SelectJoinBuilder(this, table, JoinType.JOIN); } - public SelectJoinBuilder leftOuterJoin(String table) { - return new SelectJoinBuilder(this, table, JoinType.LEFT_OUTER_JOIN); - } - - public SelectJoinBuilder crossJoin(String table) { - return new SelectJoinBuilder(this, table, JoinType.CROSS_JOIN); - } - - public SelectJoinBuilder naturalJoin(String table) { - return new SelectJoinBuilder(this, table, JoinType.NATURAL_JOIN); - } - - public SelectJoinBuilder naturalLeftOuterJoin(String table) { - return new SelectJoinBuilder(this, table, JoinType.NATURAL_LEFT_OUTER_JOIN); - } - @Override public String build() { return StringUtils.join(" ", prefix.build(), "ON", condition); diff --git a/src/main/java/com/alexfu/sqlitequerybuilder/builder/JoinType.java b/src/main/java/com/alexfu/sqlitequerybuilder/builder/JoinType.java index 8590d9e..1fccb8d 100644 --- a/src/main/java/com/alexfu/sqlitequerybuilder/builder/JoinType.java +++ b/src/main/java/com/alexfu/sqlitequerybuilder/builder/JoinType.java @@ -1,19 +1,19 @@ package com.alexfu.sqlitequerybuilder.builder; public enum JoinType { - JOIN("JOIN"), - CROSS_JOIN("CROSS JOIN"), - LEFT_OUTER_JOIN("LEFT OUTER JOIN"), - NATURAL_JOIN("NATURAL JOIN"), - NATURAL_LEFT_OUTER_JOIN("NATURAL LEFT OUTER JOIN"); + JOIN("JOIN"), + CROSS_JOIN("CROSS JOIN"), + LEFT_OUTER_JOIN("LEFT OUTER JOIN"), + NATURAL_JOIN("NATURAL JOIN"), + NATURAL_LEFT_OUTER_JOIN("NATURAL LEFT OUTER JOIN"); - private final String sql; + private final String sql; - JoinType(String sql) { - this.sql = sql; - } + JoinType(String sql) { + this.sql = sql; + } - public final String toSQL() { - return sql; - } + public final String toSQL() { + return sql; + } }