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 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..1251711 --- /dev/null +++ b/src/test/java/com/alexfu/sqlitequerybuilder/InsertTest.java @@ -0,0 +1,25 @@ +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(); + + String iso8601 = DateUtils.iso8601().format(timestamp.getTime()); + String result = "INSERT INTO people (id,name,timestamp) values (1,'John','" + iso8601 + "')"; + assertThat(sql).isEqualTo(result); + } +}