├── .gitignore
├── .github
└── workflows
│ └── maven.yml
├── src
├── test
│ ├── java
│ │ ├── com
│ │ │ └── ivanceras
│ │ │ │ └── fluent
│ │ │ │ ├── CTest.java
│ │ │ │ ├── AllTests.java
│ │ │ │ ├── TestSQLBuilderEquality.java
│ │ │ │ ├── TestSQLBuilderUpdate.java
│ │ │ │ ├── TestSQLBuilderDelete.java
│ │ │ │ ├── TestSQLBuilderInsert.java
│ │ │ │ ├── TestSQLOrderBy.java
│ │ │ │ ├── TestQuery2HiveSQL.java
│ │ │ │ ├── TestSQLFieldsComma.java
│ │ │ │ ├── TestStaticCreate.java
│ │ │ │ ├── TestSQLBuilderSelect.java
│ │ │ │ ├── TestStringBuilderTechniques.java
│ │ │ │ ├── TestComplexQuery.java
│ │ │ │ ├── TestSQLBuilderNamedColumns.java
│ │ │ │ ├── TestSimpleComplexFunctions.java
│ │ │ │ ├── TestSQLBuilderFunctions.java
│ │ │ │ ├── TestSQLBuilderMoreComplexFunctions.java
│ │ │ │ ├── TestSQLBuilderIn.java
│ │ │ │ ├── TestSQLBuilderWithRecursive.java
│ │ │ │ ├── TestSQL1.java
│ │ │ │ ├── TestSQLBuilderRecursive.java
│ │ │ │ └── TestStaticSelects.java
│ │ └── eu
│ │ │ └── hadeco
│ │ │ └── crudapi
│ │ │ ├── PostgresqlTest.java
│ │ │ ├── MysqlTest.java
│ │ │ ├── OrderedTestRunner.java
│ │ │ ├── OracleTest.java
│ │ │ ├── TestApi.java
│ │ │ └── TestBase.java
│ └── resources
│ │ ├── blog_sqlite.sql
│ │ ├── blog_mysql.sql
│ │ ├── blog_oracle.sql
│ │ ├── blog_sqlserver.sql
│ │ └── blog_postgresql.sql
└── main
│ └── java
│ ├── com
│ └── ivanceras
│ │ └── fluent
│ │ └── sql
│ │ └── Breakdown.java
│ └── eu
│ └── hadeco
│ └── crudapi
│ ├── CrudApiHandler.java
│ ├── TableMeta.java
│ └── ApiConfig.java
├── java-crud-api.iml
├── lgpl-3.0.txt
├── LICENSE.md
└── pom.xml
/.gitignore:
--------------------------------------------------------------------------------
1 | .vscode
2 | .classpath
3 | .project
4 | .settings
5 | .idea
6 | target
7 | server.jar
8 | crudtest.db
9 | unittest.bat
10 | **/PostgresqlTest.java
11 | **/SqliteTest.java
12 | **/SqlServerTest.java
13 | **/MysqlTest.java
14 | **/OracleTest.java
15 |
--------------------------------------------------------------------------------
/.github/workflows/maven.yml:
--------------------------------------------------------------------------------
1 | name: Java CI
2 |
3 | on: [push]
4 |
5 | jobs:
6 | build:
7 |
8 | runs-on: ubuntu-latest
9 |
10 | steps:
11 | - uses: actions/checkout@v2
12 | - name: Set up JDK 1.8
13 | uses: actions/setup-java@v1
14 | with:
15 | java-version: 1.8
16 | - name: Build with Maven
17 | run: mvn -B package --file pom.xml
18 |
--------------------------------------------------------------------------------
/src/test/java/com/ivanceras/fluent/CTest.java:
--------------------------------------------------------------------------------
1 | package com.ivanceras.fluent;
2 |
3 | import static org.junit.Assert.assertEquals;
4 |
5 | public class CTest {
6 |
7 |
8 | public static void cassertEquals(String expected, String actual) {
9 | String cleansedExpected = cleanUpSpaces(expected).toLowerCase();
10 | String cleansedActual = cleanUpSpaces(actual).toLowerCase();
11 | System.out.println("cleansed expected:\n" + cleansedExpected);
12 | System.out.println("cleansed actual: \n" + cleansedActual);
13 | assertEquals(cleansedExpected, cleansedActual);
14 | }
15 |
16 | public static String cleanUpSpaces(String str) {
17 | return str.trim().replaceAll("\\s+", " ");
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/src/test/java/com/ivanceras/fluent/AllTests.java:
--------------------------------------------------------------------------------
1 | package com.ivanceras.fluent;
2 |
3 | import org.junit.runner.RunWith;
4 | import org.junit.runners.Suite;
5 | import org.junit.runners.Suite.SuiteClasses;
6 |
7 | @RunWith(Suite.class)
8 | @SuiteClasses({TestComplexQuery.class, TestQuery2HiveSQL.class,
9 | TestSimpleComplexFunctions.class, TestSQL1.class,
10 | TestSQLBuilderDelete.class, TestSQLBuilderEquality.class,
11 | TestSQLBuilderFunctions.class, TestSQLBuilderIn.class,
12 | TestSQLBuilderInsert.class, TestSQLBuilderMoreComplexFunctions.class,
13 | TestSQLBuilderNamedColumns.class, TestSQLBuilderRecursive.class,
14 | TestSQLBuilderSelect.class, TestSQLBuilderUpdate.class,
15 | TestSQLBuilderWithRecursive.class, TestSQLFieldsComma.class,
16 | TestSQLOrderBy.class, TestStaticCreate.class, TestStaticSelects.class,
17 | TestStringBuilderTechniques.class})
18 | public class AllTests {
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/src/test/java/com/ivanceras/fluent/TestSQLBuilderEquality.java:
--------------------------------------------------------------------------------
1 | package com.ivanceras.fluent;
2 |
3 | import org.junit.*;
4 |
5 | import static com.ivanceras.fluent.sql.SQL.Statics.DELETE;
6 |
7 |
8 | public class TestSQLBuilderEquality {
9 |
10 |
11 | @BeforeClass
12 | public static void setUpBeforeClass() throws Exception {
13 | }
14 |
15 | @AfterClass
16 | public static void tearDownAfterClass() throws Exception {
17 | }
18 |
19 | @Before
20 | public void setUp() throws Exception {
21 | }
22 |
23 | @After
24 | public void tearDown() throws Exception {
25 | }
26 |
27 | @Test
28 | public void test() {
29 | String expected = "DELETE FROM products WHERE price = ?";
30 | String actual = DELETE().FROM("products").WHERE("price").EQUAL_TO(10).build().getSql();
31 | String actual2 = DELETE().FROM("products").WHERE("price").EQUAL_TO("10").build().getSql();
32 | CTest.cassertEquals(expected, actual);
33 | CTest.cassertEquals(expected, actual2);
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/src/test/java/com/ivanceras/fluent/TestSQLBuilderUpdate.java:
--------------------------------------------------------------------------------
1 | package com.ivanceras.fluent;
2 |
3 | import com.ivanceras.fluent.sql.Breakdown;
4 | import org.junit.*;
5 |
6 | import static com.ivanceras.fluent.sql.SQL.Statics.UPDATE;
7 | import static org.junit.Assert.assertArrayEquals;
8 |
9 | public class TestSQLBuilderUpdate {
10 |
11 | @BeforeClass
12 | public static void setUpBeforeClass() throws Exception {
13 | }
14 |
15 | @AfterClass
16 | public static void tearDownAfterClass() throws Exception {
17 | }
18 |
19 | @Before
20 | public void setUp() throws Exception {
21 | }
22 |
23 | @After
24 | public void tearDown() throws Exception {
25 | }
26 |
27 | @Test
28 | public void test() {
29 | String expected = "UPDATE films SET kind = ? WHERE kind = ?";
30 | Breakdown actual = UPDATE("films").SET("kind").EQUAL("Dramatic").WHERE("kind").EQUAL_TO("Drama").build();
31 | Object[] expectedParam = new Object[]{"Dramatic", "Drama"};
32 | CTest.cassertEquals(expected, actual.getSql());
33 | assertArrayEquals(expectedParam, actual.getParameters());
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/src/test/java/com/ivanceras/fluent/TestSQLBuilderDelete.java:
--------------------------------------------------------------------------------
1 | package com.ivanceras.fluent;
2 |
3 | import org.junit.*;
4 |
5 | import static com.ivanceras.fluent.sql.SQL.Statics.DELETE;
6 |
7 | public class TestSQLBuilderDelete {
8 |
9 | @BeforeClass
10 | public static void setUpBeforeClass() throws Exception {
11 | }
12 |
13 | @AfterClass
14 | public static void tearDownAfterClass() throws Exception {
15 | }
16 |
17 | @Before
18 | public void setUp() throws Exception {
19 | }
20 |
21 | @After
22 | public void tearDown() throws Exception {
23 | }
24 |
25 | @Test
26 | public void test() {
27 | String expected = "DELETE FROM products WHERE price IS NOT NULL";
28 | String actual = DELETE().FROM("products").WHERE("price").IS_NOT_NULL().build().getSql();
29 | CTest.cassertEquals(expected, actual);
30 | }
31 |
32 | @Test
33 | public void test2() {
34 | String expected = "DELETE FROM products WHERE price = ? ";
35 | String actual2 = DELETE().FROM("products").WHERE("price").EQUAL_TO("10").build().getSql();
36 | CTest.cassertEquals(expected, actual2);
37 |
38 | }
39 |
40 | }
41 |
--------------------------------------------------------------------------------
/src/test/java/com/ivanceras/fluent/TestSQLBuilderInsert.java:
--------------------------------------------------------------------------------
1 | package com.ivanceras.fluent;
2 |
3 | import com.ivanceras.fluent.sql.Breakdown;
4 | import org.junit.*;
5 |
6 | import static com.ivanceras.fluent.sql.SQL.Statics.INSERT;
7 | import static com.ivanceras.fluent.sql.SQL.Statics.SELECT;
8 | import static org.junit.Assert.assertArrayEquals;
9 |
10 | public class TestSQLBuilderInsert {
11 |
12 | @BeforeClass
13 | public static void setUpBeforeClass() throws Exception {
14 | }
15 |
16 | @AfterClass
17 | public static void tearDownAfterClass() throws Exception {
18 | }
19 |
20 |
21 | @Before
22 | public void setUp() throws Exception {
23 | }
24 |
25 | @After
26 | public void tearDown() throws Exception {
27 | }
28 |
29 | @Test
30 | public void test() {
31 | String expected = "INSERT INTO films ( SELECT * FROM tmp_films WHERE date_prod < ? )";
32 | Breakdown actual = INSERT().INTO("films").FIELD(SELECT("*").FROM("tmp_films").WHERE("date_prod").LESS_THAN("2004-05007")).build();
33 | CTest.cassertEquals(expected, actual.getSql());
34 | assertArrayEquals(new Object[]{"2004-05007"}, actual.getParameters());
35 | }
36 |
37 | }
38 |
--------------------------------------------------------------------------------
/src/test/java/com/ivanceras/fluent/TestSQLOrderBy.java:
--------------------------------------------------------------------------------
1 | package com.ivanceras.fluent;
2 |
3 | import com.ivanceras.fluent.sql.Breakdown;
4 | import com.ivanceras.fluent.sql.SQL;
5 | import org.junit.*;
6 |
7 | import static com.ivanceras.fluent.sql.SQL.Statics.SELECT;
8 |
9 | public class TestSQLOrderBy {
10 |
11 | @BeforeClass
12 | public static void setUpBeforeClass() throws Exception {
13 | }
14 |
15 | @AfterClass
16 | public static void tearDownAfterClass() throws Exception {
17 | }
18 |
19 | @Before
20 | public void setUp() throws Exception {
21 | }
22 |
23 | @After
24 | public void tearDown() throws Exception {
25 | }
26 |
27 | @Test
28 | public void test() {
29 | String expected = "" +
30 | " SELECT Customers.CustomerName , Orders.OrderID " +
31 | " FROM Customers " +
32 | " ORDER BY name desc , description";
33 |
34 |
35 | SQL sql = SELECT("Customers.CustomerName", "Orders.OrderID")
36 | .FROM("Customers")
37 | .ORDER_BY("name").DESC()
38 | .FIELD("description");
39 | Breakdown bk = sql.build();
40 | CTest.cassertEquals(expected, bk.getSql());
41 | }
42 |
43 | }
44 |
--------------------------------------------------------------------------------
/src/test/java/com/ivanceras/fluent/TestQuery2HiveSQL.java:
--------------------------------------------------------------------------------
1 | package com.ivanceras.fluent;
2 |
3 | import org.junit.*;
4 |
5 | import static com.ivanceras.fluent.sql.SQL.Statics.SELECT;
6 | import static com.ivanceras.fluent.sql.SQL.Statics.SUM;
7 |
8 | public class TestQuery2HiveSQL {
9 |
10 | @BeforeClass
11 | public static void setUpBeforeClass() throws Exception {
12 | }
13 |
14 | @AfterClass
15 | public static void tearDownAfterClass() throws Exception {
16 |
17 | }
18 |
19 |
20 | @Before
21 | public void setUp() throws Exception {
22 |
23 | }
24 |
25 | @After
26 | public void tearDown() throws Exception {
27 | }
28 |
29 | @Test
30 | public void test() {
31 |
32 | String expected = "SELECT * FROM products WHERE price IS NOT NULL";
33 | String actual = SELECT("*").FROM("products").WHERE("price").IS_NOT_NULL().build().getSql();
34 | CTest.cassertEquals(expected, actual);
35 | }
36 |
37 |
38 | @Test
39 | public void test2() {
40 |
41 | String expected = "SELECT SUM ( price ) FROM products WHERE price IS NOT NULL";
42 | String actual = SELECT(SUM("price")).FROM("products").WHERE("price").IS_NOT_NULL().build().getSql();
43 | CTest.cassertEquals(expected, actual);
44 | }
45 |
46 |
47 | }
48 |
--------------------------------------------------------------------------------
/src/test/java/com/ivanceras/fluent/TestSQLFieldsComma.java:
--------------------------------------------------------------------------------
1 | package com.ivanceras.fluent;
2 |
3 | import org.junit.Test;
4 |
5 | import static com.ivanceras.fluent.sql.SQL.Statics.SELECT;
6 |
7 | public class TestSQLFieldsComma {
8 |
9 | @Test
10 | public void testFieldsAutoComma() {
11 | String expected = "" +
12 | " SELECT Customers.CustomerName , Orders.OrderID " +
13 | " FROM Customers ";
14 |
15 | String actual = SELECT()
16 | .FIELD("Customers.CustomerName")
17 | .FIELD("Orders.OrderID")
18 | .FROM("Customers").build().getSql();
19 |
20 | CTest.cassertEquals(expected, actual);
21 | }
22 |
23 |
24 | @Test
25 | public void testFieldsAutoCommaGroupBy() {
26 | String expected = "" +
27 | " SELECT Customers.CustomerName , Orders.OrderID " +
28 | " FROM Customers "
29 | + " GROUP BY CustomerName , Date";
30 |
31 | String actual = SELECT()
32 | .FIELD("Customers.CustomerName")
33 | .FIELD("Orders.OrderID")
34 | .FROM("Customers")
35 | .GROUP_BY("CustomerName", "Date")
36 | .build().getSql();
37 |
38 | CTest.cassertEquals(expected, actual);
39 | }
40 |
41 | }
42 |
--------------------------------------------------------------------------------
/src/test/java/com/ivanceras/fluent/TestStaticCreate.java:
--------------------------------------------------------------------------------
1 | package com.ivanceras.fluent;
2 |
3 |
4 | import com.ivanceras.fluent.sql.SQL;
5 | import org.junit.*;
6 |
7 | import static com.ivanceras.fluent.sql.SQL.Statics.CREATE_TABLE;
8 |
9 | public class TestStaticCreate {
10 |
11 |
12 | @BeforeClass
13 | public static void setUpBeforeClass() throws Exception {
14 | }
15 |
16 | @AfterClass
17 | public static void tearDownAfterClass() throws Exception {
18 | }
19 |
20 |
21 | @Before
22 | public void setUp() throws Exception {
23 | }
24 |
25 | @After
26 | public void tearDown() throws Exception {
27 |
28 | }
29 |
30 | @Test
31 | public void testReferences() {
32 | String expected = "CREATE TABLE portal.user\n" +
33 | "(\n" +
34 | " name character varying (60) ,\n" +
35 | " password character varying ,\n" +
36 | " firstname character varying ,\n" +
37 | " lastname character varying ,\n" +
38 | " email character varying ,\n" +
39 | " user_id character varying NOT NULL ,\n" +
40 | " photo character varying ,\n" +
41 | " CONSTRAINT user_pkey PRIMARY KEY ( user_id ) ,\n" +
42 | " CONSTRAINT unique_name UNIQUE ( name )\n" +
43 | ")";
44 |
45 | SQL sql = CREATE_TABLE("portal.user")
46 | .openParen()
47 | .FIELD("name").keyword("character varying").keyword("(60)").comma()
48 | .FIELD("password").keyword("character varying").comma()
49 | .FIELD("firstname").keyword("character varying").comma()
50 | .FIELD("lastname").keyword("character varying").comma()
51 | .FIELD("email").keyword("character varying").comma()
52 | .FIELD("user_id").keyword("character varying").NOT_NULL().comma()
53 | .FIELD("photo").keyword("character varying").comma()
54 | .CONSTRAINT("user_pkey").PRIMARY_KEY("user_id").comma()
55 | .CONSTRAINT("unique_name").UNIQUE("name")
56 | .closeParen();
57 | System.out.println(sql.build().getSql());
58 | CTest.cassertEquals(expected, sql.build().getSql());
59 | }
60 |
61 | }
62 |
--------------------------------------------------------------------------------
/src/main/java/com/ivanceras/fluent/sql/Breakdown.java:
--------------------------------------------------------------------------------
1 | package com.ivanceras.fluent.sql;
2 |
3 | import java.util.LinkedList;
4 |
5 | /**
6 | *
Breakdown class.
7 | *
8 | * @author ivankol
9 | * @version $Id: $Id
10 | */
11 | public class Breakdown {
12 |
13 | boolean doComma = false;
14 | private StringBuilder sql;
15 | private LinkedList