Coverage Summary for Class: SQL (net.sf.persism)
Class |
Method, %
|
Line, %
|
SQL |
100%
(7/7)
|
100%
(26/26)
|
SQL$SQLType |
100%
(1/1)
|
100%
(1/1)
|
Total |
100%
(8/8)
|
100%
(27/27)
|
1 package net.sf.persism;
2
3 import java.util.Scanner;
4 import java.util.regex.Pattern;
5
6 /**
7 * Simple wrapper for SQL String. Mainly to allow for overloads to fetch/query methods.
8 *
9 * @see <a href="https://sproket.github.io/Persism/manual2.html">Using the new Query/Fetch methods</a>
10 */
11 public final class SQL {
12
13 enum SQLType {Select, Where, StoredProc}
14
15 SQLType type;
16
17 final String sql;
18
19 String processedSQL = null;
20
21 private static final Pattern commentPattern = Pattern.compile("/\\*.*?\\*/", Pattern.DOTALL);
22
23 SQL(String sql) {
24 sql = sql.trim();
25
26 if (sql.startsWith("--") || sql.startsWith("/*")) {
27 // trim comments
28
29 // line comments
30 StringBuilder sb = new StringBuilder();
31 try (Scanner scanner = new Scanner(sql)) {
32 while (scanner.hasNextLine()) {
33 String line = scanner.nextLine().trim();
34 if (!line.startsWith("--")) {
35 sb.append(line).append("\n");
36 }
37 }
38 }
39 sql = sb.toString();
40
41 // /* */ comments
42 //Pattern commentPattern = Pattern.compile("/\\*.*?\\*/", Pattern.DOTALL);
43 sql = commentPattern.matcher(sql).replaceAll("").trim();
44 }
45
46 this.sql = sql;
47 this.type = SQLType.Select;
48 }
49
50 SQL(String sql, SQLType type) {
51 this.sql = sql.trim();
52 this.type = type;
53 }
54
55 /**
56 * Method to instantiate a regular SQL string.
57 * <pre>{@code
58 * Contact> contact;
59 * contact = session.fetch(Contact.class,
60 * sql("SELECT * FROM CONTACTS WHERE LAST_NAME = ? AND FIRST_NAME = ?"),
61 * params("Fred", "Flintstone");
62 * }</pre>
63 *
64 * @param sql String
65 * @return new SQL object
66 */
67 public static SQL sql(String sql) {
68 return new SQL(sql);
69 }
70
71 /**
72 * Method used to specify an SQL WHERE clause for an SQL Statement.
73 * The SELECT ... parts would be provided by Persism.
74 * Only here do we allow property names in the query
75 * <pre>{@code
76 * List<Contact> contacts;
77 * contacts = session.query(Contact.class,
78 * where("(:firstname = @name OR :company = @name) and :lastname = @last and :city = @city and :amountOwed > @owe ORDER BY :dateAdded"),
79 * named(Map.of("name", "Fred", "last", "Flintstone", "owe", 10, "city", "Somewhere")));
80 * }</pre>
81 *
82 * @param where String
83 * @return new SQL object
84 */
85 public static SQL where(String where) {
86 return new SQL("WHERE " + where, SQLType.Where);
87 }
88
89 /**
90 * Static initializer for a new SQL stored procedure string.
91 * <pre>{@code
92 * List<CustomerOrder> list;
93 * list = session.query(CustomerOrder.class, proc("[spCustomerOrders](?)"), params("123"));
94 * }</pre>
95 *
96 * @param storedProc String
97 * @return new SQL object
98 */
99 public static SQL proc(String storedProc) {
100 return new SQL(storedProc, SQLType.StoredProc);
101 }
102
103 /**
104 * @hidden
105 */
106 @Override
107 public String toString() {
108 if (processedSQL != null) {
109 return processedSQL;
110 }
111 return sql;
112 }
113 }