From dc8a038ae18814ab8e747cec363871e42d23445b Mon Sep 17 00:00:00 2001 From: Maksim Tereshin Date: Mon, 7 Apr 2025 15:47:40 -0500 Subject: [PATCH] Add parameters --- .../org/micord/models/RequestArgument.java | 4 +- .../micord/models/requests/AqlRequest.java | 7 +- .../models/requests/AqlRequestParameter.java | 40 ++++++++ .../models/requests/AqlRequestParameters.java | 22 +++++ .../micord/models/requests/BaseRequest.java | 7 +- .../models/requests/RequestArgument.java | 3 +- .../downloads/AQLDownloadRequest.java | 13 ++- .../downloads/BaseDownloadRequest.java | 4 +- .../org/micord/service/RequestService.java | 93 +++++++++++++------ 9 files changed, 146 insertions(+), 47 deletions(-) create mode 100644 config-data-executor/src/main/java/org/micord/models/requests/AqlRequestParameter.java create mode 100644 config-data-executor/src/main/java/org/micord/models/requests/AqlRequestParameters.java diff --git a/config-data-executor/src/main/java/org/micord/models/RequestArgument.java b/config-data-executor/src/main/java/org/micord/models/RequestArgument.java index d05d7a6..407f582 100644 --- a/config-data-executor/src/main/java/org/micord/models/RequestArgument.java +++ b/config-data-executor/src/main/java/org/micord/models/RequestArgument.java @@ -1,13 +1,11 @@ package org.micord.models; -import lombok.Setter; import org.micord.enums.RequestArgumentType; import jakarta.xml.bind.annotation.XmlAttribute; import jakarta.xml.bind.annotation.XmlElement; -import jakarta.xml.bind.annotation.XmlElementWrapper; import jakarta.xml.bind.annotation.XmlRootElement; -import java.util.List; +import lombok.Setter; /** * @author Maksim Tereshin diff --git a/config-data-executor/src/main/java/org/micord/models/requests/AqlRequest.java b/config-data-executor/src/main/java/org/micord/models/requests/AqlRequest.java index 14089b6..138b46b 100644 --- a/config-data-executor/src/main/java/org/micord/models/requests/AqlRequest.java +++ b/config-data-executor/src/main/java/org/micord/models/requests/AqlRequest.java @@ -1,5 +1,7 @@ package org.micord.models.requests; +import java.util.List; + import jakarta.xml.bind.annotation.XmlAccessType; import jakarta.xml.bind.annotation.XmlAccessorType; import jakarta.xml.bind.annotation.XmlElement; @@ -7,8 +9,6 @@ import jakarta.xml.bind.annotation.XmlElementWrapper; import lombok.Getter; import lombok.Setter; -import java.util.List; - @Getter @Setter @XmlAccessorType(XmlAccessType.FIELD) @@ -17,6 +17,9 @@ public class AqlRequest extends BaseRequest { @XmlElement(name = "AqlConnectionParams") private AqlConnectionParams aqlConnectionParams; + @XmlElement(name = "AqlRequestParameters") + private AqlRequestParameters aqlRequestParameters; + @XmlElementWrapper(name = "AqlRequestCollections") @XmlElement(name = "AqlRequestCollection") private List aqlRequestCollections; diff --git a/config-data-executor/src/main/java/org/micord/models/requests/AqlRequestParameter.java b/config-data-executor/src/main/java/org/micord/models/requests/AqlRequestParameter.java new file mode 100644 index 0000000..fe74433 --- /dev/null +++ b/config-data-executor/src/main/java/org/micord/models/requests/AqlRequestParameter.java @@ -0,0 +1,40 @@ +package org.micord.models.requests; + +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "AqlRequestParameter") +public class AqlRequestParameter { + + private String type; + private SqlConnectionParams sqlConnectionParams; + private String aqlRequestParameterURL; + + @XmlAttribute(name = "type") + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + @XmlElement(name = "SqlConnectionParams") + public SqlConnectionParams getSqlConnectionParams() { + return sqlConnectionParams; + } + + public void setSqlConnectionParams(SqlConnectionParams sqlConnectionParams) { + this.sqlConnectionParams = sqlConnectionParams; + } + + @XmlElement(name = "AqlRequestParameterURL") + public String getAqlRequestParameterURL() { + return aqlRequestParameterURL; + } + + public void setAqlRequestParameterURL(String aqlRequestParameterURL) { + this.aqlRequestParameterURL = aqlRequestParameterURL; + } +} \ No newline at end of file diff --git a/config-data-executor/src/main/java/org/micord/models/requests/AqlRequestParameters.java b/config-data-executor/src/main/java/org/micord/models/requests/AqlRequestParameters.java new file mode 100644 index 0000000..cc4f3a5 --- /dev/null +++ b/config-data-executor/src/main/java/org/micord/models/requests/AqlRequestParameters.java @@ -0,0 +1,22 @@ +package org.micord.models.requests; + +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "AqlRequestParameters") +public class AqlRequestParameters { + + private List parameters = new ArrayList<>(); + + @XmlElement(name = "AqlRequestParameter") + public List getParameters() { + return parameters; + } + + public void setParameters(List parameters) { + this.parameters = parameters; + } +} \ No newline at end of file diff --git a/config-data-executor/src/main/java/org/micord/models/requests/BaseRequest.java b/config-data-executor/src/main/java/org/micord/models/requests/BaseRequest.java index 1207a82..59b2464 100644 --- a/config-data-executor/src/main/java/org/micord/models/requests/BaseRequest.java +++ b/config-data-executor/src/main/java/org/micord/models/requests/BaseRequest.java @@ -1,15 +1,12 @@ package org.micord.models.requests; +import java.util.List; + import jakarta.xml.bind.annotation.XmlAccessType; import jakarta.xml.bind.annotation.XmlAccessorType; import jakarta.xml.bind.annotation.XmlElement; -import jakarta.xml.bind.annotation.XmlSeeAlso; import lombok.Getter; import lombok.Setter; -import org.micord.models.requests.downloads.AQLDownloadRequest; -import org.micord.models.requests.downloads.SQLDownloadRequest; - -import java.util.List; @Getter @Setter diff --git a/config-data-executor/src/main/java/org/micord/models/requests/RequestArgument.java b/config-data-executor/src/main/java/org/micord/models/requests/RequestArgument.java index 3e2b127..9141454 100644 --- a/config-data-executor/src/main/java/org/micord/models/requests/RequestArgument.java +++ b/config-data-executor/src/main/java/org/micord/models/requests/RequestArgument.java @@ -1,10 +1,11 @@ package org.micord.models.requests; +import org.micord.enums.RequestArgumentType; + import jakarta.xml.bind.annotation.XmlAttribute; import jakarta.xml.bind.annotation.XmlElement; import jakarta.xml.bind.annotation.XmlRootElement; import lombok.Setter; -import org.micord.enums.RequestArgumentType; /** * @author Maksim Tereshin diff --git a/config-data-executor/src/main/java/org/micord/models/requests/downloads/AQLDownloadRequest.java b/config-data-executor/src/main/java/org/micord/models/requests/downloads/AQLDownloadRequest.java index 3e0015f..4aad112 100644 --- a/config-data-executor/src/main/java/org/micord/models/requests/downloads/AQLDownloadRequest.java +++ b/config-data-executor/src/main/java/org/micord/models/requests/downloads/AQLDownloadRequest.java @@ -1,13 +1,16 @@ package org.micord.models.requests.downloads; -import jakarta.xml.bind.annotation.*; -import lombok.Getter; -import lombok.Setter; +import java.util.List; + import org.micord.models.requests.AqlConnectionParams; import org.micord.models.requests.AqlRequestCollection; -import org.micord.models.requests.SqlConnectionParams; -import java.util.List; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlElementWrapper; +import lombok.Getter; +import lombok.Setter; @Getter diff --git a/config-data-executor/src/main/java/org/micord/models/requests/downloads/BaseDownloadRequest.java b/config-data-executor/src/main/java/org/micord/models/requests/downloads/BaseDownloadRequest.java index 6e75b76..61e29bb 100644 --- a/config-data-executor/src/main/java/org/micord/models/requests/downloads/BaseDownloadRequest.java +++ b/config-data-executor/src/main/java/org/micord/models/requests/downloads/BaseDownloadRequest.java @@ -1,12 +1,12 @@ package org.micord.models.requests.downloads; +import org.micord.models.requests.BaseRequest; + import jakarta.xml.bind.annotation.XmlAccessType; import jakarta.xml.bind.annotation.XmlAccessorType; import jakarta.xml.bind.annotation.XmlElement; -import jakarta.xml.bind.annotation.XmlSeeAlso; import lombok.Getter; import lombok.Setter; -import org.micord.models.requests.BaseRequest; @Getter @Setter diff --git a/config-data-executor/src/main/java/org/micord/service/RequestService.java b/config-data-executor/src/main/java/org/micord/service/RequestService.java index 0cca48f..3015ced 100644 --- a/config-data-executor/src/main/java/org/micord/service/RequestService.java +++ b/config-data-executor/src/main/java/org/micord/service/RequestService.java @@ -1,28 +1,5 @@ package org.micord.service; -import com.arangodb.ArangoCursor; -import com.arangodb.ArangoDBException; -import com.arangodb.ArangoDatabase; -import com.arangodb.entity.StreamTransactionEntity; -import com.arangodb.model.AqlQueryOptions; -import com.arangodb.model.StreamTransactionOptions; -import org.micord.config.ArangoDBConnection; -import org.micord.config.DatabaseConnection; -import org.micord.config.S3HttpConnection; -import org.micord.enums.RequestArgumentType; -import org.micord.exceptions.IllegalRequestParametersException; -import org.micord.models.requests.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.xml.sax.InputSource; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; import java.io.FileNotFoundException; import java.io.StringReader; import java.net.HttpURLConnection; @@ -34,10 +11,46 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.time.LocalDate; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.IntStream; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.micord.config.ArangoDBConnection; +import org.micord.config.DatabaseConnection; +import org.micord.config.S3HttpConnection; +import org.micord.enums.RequestArgumentType; +import org.micord.models.requests.AqlRequest; +import org.micord.models.requests.AqlRequestParameter; +import org.micord.models.requests.BaseRequest; +import org.micord.models.requests.RequestArgument; +import org.micord.models.requests.RequestParameters; +import org.micord.models.requests.Requests; +import org.micord.models.requests.S3Request; +import org.micord.models.requests.SqlRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.xml.sax.InputSource; + +import com.arangodb.ArangoCursor; +import com.arangodb.ArangoDBException; +import com.arangodb.ArangoDatabase; +import com.arangodb.entity.StreamTransactionEntity; +import com.arangodb.model.AqlQueryOptions; +import com.arangodb.model.StreamTransactionOptions; + @Service public class RequestService { @@ -549,23 +562,23 @@ public class RequestService { // TODO: implement for multiple request arguments RequestArgument requestArgument = request.getRequestArguments().get(0); - List collectionTypes = new ArrayList<>(); + List collectionNames = new ArrayList<>(); request.getAqlRequestCollections().forEach(collection -> { - collectionTypes.add(collection.getType()); + collectionNames.add(collection.getCollectionUrl()); // Use collection URL instead of type }); StreamTransactionEntity tx = null; try { StreamTransactionOptions options = new StreamTransactionOptions() - .writeCollections(collectionTypes.toArray(new String[0])) - .readCollections(collectionTypes.toArray(new String[0])); + .writeCollections(collectionNames.toArray(new String[0])) + .readCollections(collectionNames.toArray(new String[0])); tx = arangoDb.beginStreamTransaction(options); String transactionId = tx.getId(); logger.info("Stream transaction started with ID: {}", transactionId); - Map entities = executeSelectAqlRequest(arangoDb, requestArgument, ids, transactionId, validationResults); + Map entities = executeSelectAqlRequest(arangoDb, request, requestArgument, ids, transactionId, validationResults); if (entities.isEmpty()) { logger.warn("No entities found for main AQL request."); @@ -607,6 +620,7 @@ public class RequestService { } private Map executeSelectAqlRequest(ArangoDatabase arangoDb, + AqlRequest request, RequestArgument requestArgument, List ids, String transactionId, Map validationResults) { Map entities = new HashMap<>(); @@ -621,6 +635,27 @@ public class RequestService { if (!emptyIdsAllowed) bindVars.put("ids", ids); + if (request.getAqlRequestParameters() != null) { + for (AqlRequestParameter parameter : request.getAqlRequestParameters().getParameters()) { + try (Connection connection = DatabaseConnection.getConnection(parameter.getSqlConnectionParams())) { + String sqlQuery = parameter.getAqlRequestParameterURL(); + if (sqlQuery.contains("${endpointArguments}")) { + String inClause = ids.stream() + .map(id -> "'" + id + "'") + .collect(Collectors.joining(", ")); + sqlQuery = sqlQuery.replace("${endpointArguments}", "(" + inClause + ")"); + } + + logger.debug("Executing SQL query: {}", sqlQuery); + List parameterValues = fetchFileListFromDatabaseSQL(connection, sqlQuery); + bindVars.put(parameter.getType(), parameterValues); + } catch (SQLException e) { + logger.error("Failed to fetch parameter values for type: {}", parameter.getType(), e); + throw new RuntimeException("Failed to execute SQL query: " + e.getMessage(), e); + } + } + } + AqlQueryOptions aqlQueryOptions = new AqlQueryOptions().streamTransactionId(transactionId); try (ArangoCursor cursor = arangoDb.query(url, Map.class, bindVars, aqlQueryOptions)) {