Skip to content

Commit a9e2a9d

Browse files
committed
Support for raw prepared queries
1 parent e257c8c commit a9e2a9d

2 files changed

Lines changed: 46 additions & 1 deletion

File tree

asql-core/src/main/java/me/zort/sqllib/internal/query/QueryNode.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,39 @@ public QueryNode(@Nullable P parent, List<QueryNode<?>> initial, int priority) {
4848
this.details = new ConcurrentHashMap<>();
4949
}
5050

51+
/**
52+
* Creates a new QueryNode from a query string in PreparedStatement format and
53+
* parameters to replace question marks in the query. This is useful if there is no
54+
* other way to create a query than using raw SQL details.
55+
* <p></p>
56+
* Example:
57+
* <pre>
58+
* Query query = QueryNode.fromRawQuery("SELECT * FROM table WHERE id = ?", 1);
59+
* </pre>
60+
*
61+
* @param query
62+
* @param params
63+
* @return
64+
*/
65+
public static QueryNode<?> fromRawQuery(String query, Object... params) {
66+
return new QueryNode<>(null, Collections.emptyList(), QueryPriority.GENERAL) {
67+
@Override
68+
public QueryDetails buildQueryDetails() {
69+
Map<String, Object> values = new HashMap<>();
70+
String preparedStr;
71+
int index = 0;
72+
while (true) {
73+
preparedStr = query.replaceFirst("\\?", String.format("<val_%d>", index));
74+
if (preparedStr.equals(query)) {
75+
break;
76+
}
77+
values.put("val_" + index, params[index]);
78+
}
79+
return new QueryDetails(preparedStr, values);
80+
}
81+
};
82+
}
83+
5184
/**
5285
* Builds the query string with placeholders containing values
5386
* for passing into PreparedStatement.

src/test/java/me/zort/sqllib/test/TestCase1.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import me.zort.sqllib.SQLConnectionBuilder;
66
import me.zort.sqllib.internal.annotation.NullableField;
77
import me.zort.sqllib.internal.annotation.PrimaryKey;
8+
import me.zort.sqllib.internal.query.QueryDetails;
9+
import me.zort.sqllib.internal.query.QueryNode;
810
import me.zort.sqllib.pool.SQLConnectionPool;
911
import me.zort.sqllib.SQLDatabaseConnection;
1012
import me.zort.sqllib.SQLDatabaseOptions;
@@ -14,6 +16,7 @@
1416
import me.zort.sqllib.api.provider.Select;
1517
import me.zort.sqllib.internal.impl.DefaultSQLEndpoint;
1618
import me.zort.sqllib.transaction.TransactionFlow;
19+
import me.zort.sqllib.util.Pair;
1720
import org.apache.logging.log4j.Level;
1821
import org.apache.logging.log4j.core.config.Configurator;
1922
import org.junit.jupiter.api.*;
@@ -196,7 +199,16 @@ public void test6_Transactions() {
196199
}
197200

198201
@Test
199-
public void test7_Close() {
202+
public void test7_RawNode() {
203+
String raw = "SELECT * FROM users WHERE nickname = ?";
204+
QueryNode<?> query = QueryNode.fromRawQuery(raw, "User1");
205+
Pair<String, Object[]> preparedQuery = query.toPreparedQuery();
206+
assertEquals(raw, preparedQuery.getFirst());
207+
assertArrayEquals(new Object[]{"User1"}, preparedQuery.getSecond());
208+
}
209+
210+
@Test
211+
public void test8_Close() {
200212
System.out.println("Closing connection...");
201213
connection.disconnect();
202214
System.out.println("Connection closed");

0 commit comments

Comments
 (0)