From f426f36ad623ad1f6ac6a2c8c22217f527f7a5ff Mon Sep 17 00:00:00 2001 From: Alex Fu Date: Thu, 14 Jan 2016 19:59:46 -0500 Subject: [PATCH 1/3] Initial insert implementation --- .../api/SQLiteQueryBuilder.java | 8 +++- .../builder/insert/InsertBuilder.java | 14 +++++++ .../builder/insert/InsertColumnsBuilder.java | 23 +++++++++++ .../builder/insert/InsertIntoBuilder.java | 23 +++++++++++ .../builder/insert/InsertValuesBuilder.java | 41 +++++++++++++++++++ .../sqlitequerybuilder/utils/DateUtils.java | 15 +++++++ .../alexfu/sqlitequerybuilder/InsertTest.java | 23 +++++++++++ 7 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/alexfu/sqlitequerybuilder/builder/insert/InsertBuilder.java create mode 100644 src/main/java/com/alexfu/sqlitequerybuilder/builder/insert/InsertColumnsBuilder.java create mode 100644 src/main/java/com/alexfu/sqlitequerybuilder/builder/insert/InsertIntoBuilder.java create mode 100644 src/main/java/com/alexfu/sqlitequerybuilder/builder/insert/InsertValuesBuilder.java create mode 100644 src/main/java/com/alexfu/sqlitequerybuilder/utils/DateUtils.java create mode 100644 src/test/java/com/alexfu/sqlitequerybuilder/InsertTest.java diff --git a/src/main/java/com/alexfu/sqlitequerybuilder/api/SQLiteQueryBuilder.java b/src/main/java/com/alexfu/sqlitequerybuilder/api/SQLiteQueryBuilder.java index 76cda85..a20d275 100644 --- a/src/main/java/com/alexfu/sqlitequerybuilder/api/SQLiteQueryBuilder.java +++ b/src/main/java/com/alexfu/sqlitequerybuilder/api/SQLiteQueryBuilder.java @@ -2,8 +2,14 @@ import com.alexfu.sqlitequerybuilder.builder.*; import com.alexfu.sqlitequerybuilder.builder.delete.DeleteBuilder; +import com.alexfu.sqlitequerybuilder.builder.insert.InsertBuilder; public class SQLiteQueryBuilder { + + public static InsertBuilder insert() { + return new InsertBuilder(); + } + public static SelectBuilder select(String... fields) { return new SelectFieldBuilder(fields); } @@ -15,7 +21,7 @@ public static SelectBuilder select(SelectType type) { public static CreateTableSegmentBuilder create() { return new CreateTableSegmentBuilder(); } - + public static DropSegmentBuilder drop() { return new DropSegmentBuilder(); } diff --git a/src/main/java/com/alexfu/sqlitequerybuilder/builder/insert/InsertBuilder.java b/src/main/java/com/alexfu/sqlitequerybuilder/builder/insert/InsertBuilder.java new file mode 100644 index 0000000..94a7b6c --- /dev/null +++ b/src/main/java/com/alexfu/sqlitequerybuilder/builder/insert/InsertBuilder.java @@ -0,0 +1,14 @@ +package com.alexfu.sqlitequerybuilder.builder.insert; + +import com.alexfu.sqlitequerybuilder.builder.SegmentBuilder; + +public class InsertBuilder extends SegmentBuilder { + public InsertIntoBuilder into(String table) { + return new InsertIntoBuilder(this, table); + } + + @Override + public String build() { + return "INSERT INTO"; + } +} diff --git a/src/main/java/com/alexfu/sqlitequerybuilder/builder/insert/InsertColumnsBuilder.java b/src/main/java/com/alexfu/sqlitequerybuilder/builder/insert/InsertColumnsBuilder.java new file mode 100644 index 0000000..93c79ad --- /dev/null +++ b/src/main/java/com/alexfu/sqlitequerybuilder/builder/insert/InsertColumnsBuilder.java @@ -0,0 +1,23 @@ +package com.alexfu.sqlitequerybuilder.builder.insert; + +import com.alexfu.sqlitequerybuilder.builder.SegmentBuilder; +import com.alexfu.sqlitequerybuilder.utils.StringUtils; + +public class InsertColumnsBuilder extends SegmentBuilder { + private final SegmentBuilder predicate; + private final String[] columns; + + public InsertColumnsBuilder(SegmentBuilder predicate, String[] columns) { + this.predicate = predicate; + this.columns = columns; + } + + public InsertValuesBuilder values(Object...values) { + return new InsertValuesBuilder(this, values); + } + + @Override + public String build() { + return predicate.build() + " (" + StringUtils.join(",", columns) + ")"; + } +} diff --git a/src/main/java/com/alexfu/sqlitequerybuilder/builder/insert/InsertIntoBuilder.java b/src/main/java/com/alexfu/sqlitequerybuilder/builder/insert/InsertIntoBuilder.java new file mode 100644 index 0000000..b8e617c --- /dev/null +++ b/src/main/java/com/alexfu/sqlitequerybuilder/builder/insert/InsertIntoBuilder.java @@ -0,0 +1,23 @@ +package com.alexfu.sqlitequerybuilder.builder.insert; + +import com.alexfu.sqlitequerybuilder.builder.SegmentBuilder; +import com.alexfu.sqlitequerybuilder.utils.StringUtils; + +public class InsertIntoBuilder extends SegmentBuilder { + private final InsertBuilder predicate; + private final String table; + + public InsertIntoBuilder(InsertBuilder predicate, String table) { + this.predicate = predicate; + this.table = table; + } + + public InsertColumnsBuilder columns(String...columns) { + return new InsertColumnsBuilder(this, columns); + } + + @Override + public String build() { + return StringUtils.join(" ", predicate.build(), table); + } +} diff --git a/src/main/java/com/alexfu/sqlitequerybuilder/builder/insert/InsertValuesBuilder.java b/src/main/java/com/alexfu/sqlitequerybuilder/builder/insert/InsertValuesBuilder.java new file mode 100644 index 0000000..206a9a0 --- /dev/null +++ b/src/main/java/com/alexfu/sqlitequerybuilder/builder/insert/InsertValuesBuilder.java @@ -0,0 +1,41 @@ +package com.alexfu.sqlitequerybuilder.builder.insert; + +import com.alexfu.sqlitequerybuilder.builder.SegmentBuilder; +import com.alexfu.sqlitequerybuilder.utils.DateUtils; +import com.alexfu.sqlitequerybuilder.utils.StringUtils; + +import java.util.Calendar; + +public class InsertValuesBuilder extends SegmentBuilder { + private final SegmentBuilder predicate; + private final Object[] values; + + public InsertValuesBuilder(SegmentBuilder predicate, Object[] values) { + this.predicate = predicate; + this.values = clean(values); + } + + private Object[] clean(Object[] values) { + Object[] clean = new Object[values.length]; + for (int i = 0; i < values.length; i++) { + Object item = values[i]; + + if (item instanceof String) { + item = "'" + item + "'"; + } + + if (item instanceof Calendar) { + Calendar date = (Calendar) item; + item = "'" + DateUtils.iso8601().format(date.getTime()) + "'"; + } + + clean[i] = item; + } + return clean; + } + + @Override + public String build() { + return predicate.build() + " values (" + StringUtils.join(",", values) + ")"; + } +} diff --git a/src/main/java/com/alexfu/sqlitequerybuilder/utils/DateUtils.java b/src/main/java/com/alexfu/sqlitequerybuilder/utils/DateUtils.java new file mode 100644 index 0000000..a79b5b0 --- /dev/null +++ b/src/main/java/com/alexfu/sqlitequerybuilder/utils/DateUtils.java @@ -0,0 +1,15 @@ +package com.alexfu.sqlitequerybuilder.utils; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; + +public class DateUtils { + private static DateFormat ISO8601; + + public static DateFormat iso8601() { + if (ISO8601 == null) { + ISO8601 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ"); + } + return ISO8601; + } +} diff --git a/src/test/java/com/alexfu/sqlitequerybuilder/InsertTest.java b/src/test/java/com/alexfu/sqlitequerybuilder/InsertTest.java new file mode 100644 index 0000000..a90d14a --- /dev/null +++ b/src/test/java/com/alexfu/sqlitequerybuilder/InsertTest.java @@ -0,0 +1,23 @@ +package com.alexfu.sqlitequerybuilder; + +import com.alexfu.sqlitequerybuilder.api.SQLiteQueryBuilder; +import com.alexfu.sqlitequerybuilder.utils.DateUtils; +import org.junit.Test; + +import java.util.Calendar; + +import static org.assertj.core.api.Assertions.assertThat; + +public class InsertTest { + @Test + public void simple() { + Calendar timestamp = Calendar.getInstance(); + String sql = SQLiteQueryBuilder.insert() + .into("people") + .columns("id", "name", "timestamp") + .values(1, "John", Calendar.getInstance()) + .build(); + + assertThat(sql).isEqualTo("INSERT INTO people (id,name,timestamp) values (1,'John','" + DateUtils.iso8601().format(timestamp.getTime()) + "')"); + } +} From a20bc619377e5ed28290602cd5d50aeb05df3575 Mon Sep 17 00:00:00 2001 From: Alex Fu Date: Fri, 15 Jan 2016 07:09:49 -0500 Subject: [PATCH 2/3] Fix checkstyle errors --- .../com/alexfu/sqlitequerybuilder/InsertTest.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/test/java/com/alexfu/sqlitequerybuilder/InsertTest.java b/src/test/java/com/alexfu/sqlitequerybuilder/InsertTest.java index a90d14a..1251711 100644 --- a/src/test/java/com/alexfu/sqlitequerybuilder/InsertTest.java +++ b/src/test/java/com/alexfu/sqlitequerybuilder/InsertTest.java @@ -13,11 +13,13 @@ public class InsertTest { public void simple() { Calendar timestamp = Calendar.getInstance(); String sql = SQLiteQueryBuilder.insert() - .into("people") - .columns("id", "name", "timestamp") - .values(1, "John", Calendar.getInstance()) - .build(); + .into("people") + .columns("id", "name", "timestamp") + .values(1, "John", Calendar.getInstance()) + .build(); - assertThat(sql).isEqualTo("INSERT INTO people (id,name,timestamp) values (1,'John','" + DateUtils.iso8601().format(timestamp.getTime()) + "')"); + String iso8601 = DateUtils.iso8601().format(timestamp.getTime()); + String result = "INSERT INTO people (id,name,timestamp) values (1,'John','" + iso8601 + "')"; + assertThat(sql).isEqualTo(result); } } From 806b272f0b2c833cac154c90c82a1bdeb33bbd99 Mon Sep 17 00:00:00 2001 From: Alex Fu Date: Fri, 15 Jan 2016 07:26:19 -0500 Subject: [PATCH 3/3] Update travis file --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 62fbb83..f714734 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,5 +7,5 @@ notifications: on_failure: always # options: [always|never|change] default: always on_start: true # default: false after_success: -- ./gradlew clean checkstyleMain checkstyleTest jacocoTestReport coveralls +- ./gradlew jacocoTestReport coveralls