Fix ArangoDB

This commit is contained in:
Maksim Tereshin 2024-11-21 18:46:06 +01:00
parent 27501b82e1
commit 2ed088e415
No known key found for this signature in database

View file

@ -145,9 +145,9 @@ public class RequestService {
try (Connection connection = DatabaseConnection.getConnection( try (Connection connection = DatabaseConnection.getConnection(
request.getSqlConnectionParams())) { request.getSqlConnectionParams())) {
String requestURL = (String) query.get("requestURL"); String requestURL = (String) query.get("requestURL");
executeSqlQuery(connection, requestURL); executeSqlQuery(connection, requestURL);
List<String> queryIds = (List<String>) query.get("ids"); List<String> queryIds = (List<String>) query.get("ids");
if (queryIds != null && !queryIds.isEmpty()) { if (queryIds != null && !queryIds.isEmpty()) {
ids.addAll(queryIds); ids.addAll(queryIds);
} else { } else {
@ -163,64 +163,64 @@ public class RequestService {
} }
} }
private Map<String, Object> buildSqlQuery(SqlRequest request, List<String> ids) { private Map<String, Object> buildSqlQuery(SqlRequest request, List<String> ids) {
logger.debug("Starting building SQL query for request: {}", request.getRequestURL()); logger.debug("Starting building SQL query for request: {}", request.getRequestURL());
long startExecTime = System.currentTimeMillis(); long startExecTime = System.currentTimeMillis();
Map<String, Object> resultMap = new HashMap<>(); Map<String, Object> resultMap = new HashMap<>();
String endpointArguments; String endpointArguments;
String requestURL = request.getRequestURL(); String requestURL = request.getRequestURL();
if (requestURL.contains(":=")) { if (requestURL.contains(":=")) {
endpointArguments = "'{" + ids.stream() endpointArguments = "'{" + ids.stream()
.map(String::trim) .map(String::trim)
.collect(Collectors.joining(", ")) + "}'"; .collect(Collectors.joining(", ")) + "}'";
} else { } else {
endpointArguments = "(" + ids.stream() endpointArguments = "(" + ids.stream()
.map(s -> "'" + s.trim() + "'") .map(s -> "'" + s.trim() + "'")
.collect(Collectors.joining(", ")) + ")"; .collect(Collectors.joining(", ")) + ")";
} }
if (request.getRequestArguments() != null && !request.getRequestArguments().isEmpty()) { if (request.getRequestArguments() != null && !request.getRequestArguments().isEmpty()) {
for (RequestArgument argument : request.getRequestArguments()) { for (RequestArgument argument : request.getRequestArguments()) {
if (argument.getRequestArgumentConnectionParams() != null) { if (argument.getRequestArgumentConnectionParams() != null) {
logger.debug("Opening connection for SQL RequestArgument: {}", argument.getRequestArgumentName()); logger.debug("Opening connection for SQL RequestArgument: {}", argument.getRequestArgumentName());
try (Connection connection = DatabaseConnection.getConnection( try (Connection connection = DatabaseConnection.getConnection(
argument.getRequestArgumentConnectionParams())) { argument.getRequestArgumentConnectionParams())) {
String query = argument.getRequestArgumentURL(); String query = argument.getRequestArgumentURL();
List<String> result = fetchFileListFromDatabaseSQL(connection, query); List<String> result = fetchFileListFromDatabaseSQL(connection, query);
resultMap.put("ids", result); resultMap.put("ids", result);
if (result != null && !result.isEmpty()) { if (result != null && !result.isEmpty()) {
String resultSet = "(" + result.stream() String resultSet = "(" + result.stream()
.map(s -> "'" + s.trim() + "'") .map(s -> "'" + s.trim() + "'")
.collect(Collectors.joining(", ")) + ")"; .collect(Collectors.joining(", ")) + ")";
requestURL = requestURL.replace("${" + argument.getRequestArgumentName() + "}", resultSet); requestURL = requestURL.replace("${" + argument.getRequestArgumentName() + "}", resultSet);
}
} }
catch (SQLException e) {
} logger.error("Failed to execute query for RequestArgument", e);
catch (SQLException e) { }
logger.error("Failed to execute query for RequestArgument", e);
} }
} }
} }
resultMap.put("requestURL", requestURL
.replace("${DB}", request.getSqlConnectionParams().getJdbcDatabase())
.replace("${endpointArguments}", endpointArguments));
long endExecTime = System.currentTimeMillis();
logger.debug("SQL query built in {} ms", endExecTime - startExecTime);
return resultMap;
} }
resultMap.put("requestURL", requestURL
.replace("${DB}", request.getSqlConnectionParams().getJdbcDatabase())
.replace("${endpointArguments}", endpointArguments));
long endExecTime = System.currentTimeMillis();
logger.debug("SQL query built in {} ms", endExecTime - startExecTime);
return resultMap;
}
private boolean executeSqlQuery(Connection connection, String query) throws SQLException { private boolean executeSqlQuery(Connection connection, String query) throws SQLException {
try (PreparedStatement stmt = connection.prepareStatement(query)) { try (PreparedStatement stmt = connection.prepareStatement(query)) {
@ -282,9 +282,9 @@ private Map<String, Object> buildSqlQuery(SqlRequest request, List<String> ids)
} }
private Map<String, Object> executeSelectAqlRequest(ArangoDatabase arangoDb, private Map<String, Object> executeSelectAqlRequest(ArangoDatabase arangoDb,
String aqlCollectionWrite, String aqlCollectionWrite,
RequestArgument requestArgument, RequestArgument requestArgument,
List<String> ids, String transactionId) { List<String> ids, String transactionId) {
Map<String, Object> entities = new HashMap<>(); Map<String, Object> entities = new HashMap<>();
String url = requestArgument.getRequestArgumentURL(); String url = requestArgument.getRequestArgumentURL();
@ -338,14 +338,17 @@ private Map<String, Object> buildSqlQuery(SqlRequest request, List<String> ids)
Map<String, Object> bindVars = new HashMap<>(); Map<String, Object> bindVars = new HashMap<>();
// TODO: verify correctness of received entities and compare keys // TODO: verify correctness of received entities and compare keys
Object writeEntity = entities.get(aqlCollectionWrite); Object ids = entities.get(aqlCollectionWrite);
bindVars.put("ids", entities); bindVars.put("ids", ids);
AqlQueryOptions aqlQueryOptions = new AqlQueryOptions().streamTransactionId(transactionId); AqlQueryOptions aqlQueryOptions = new AqlQueryOptions().streamTransactionId(transactionId);
arangoDb.query(requestURL, null, bindVars, aqlQueryOptions); try {
arangoDb.query(requestURL, null, bindVars, aqlQueryOptions);
logger.info("Successfully removed {}: {}", aqlCollectionWrite, writeEntity); logger.info("Successfully removed {} for ids: {}", aqlCollectionWrite, ids);
} catch (Exception e) {
logger.error("Failed to execute AQL request: {}", e.getMessage(), e);
}
} }
} }