use of org.finos.legend.engine.plan.execution.stores.relational.connection.driver.DatabaseManager in project legend-engine by finos.
the class RelationalExecutionNodeExecutor method createTempTableFromRealizedRelationalResultInBlockConnection.
private void createTempTableFromRealizedRelationalResultInBlockConnection(RealizedRelationalResult realizedRelationalResult, String tempTableName, DatabaseConnection databaseConnection, String databaseType, String databaseTimeZone) {
try (Scope ignored = GlobalTracer.get().buildSpan("create temp table").withTag("tempTableName", tempTableName).withTag("databaseType", databaseType).startActive(true)) {
RelationalStoreExecutionState relationalStoreExecutionState = (RelationalStoreExecutionState) this.executionState.getStoreExecutionState(StoreType.Relational);
DatabaseManager databaseManager = DatabaseManager.fromString(databaseType);
BlockConnection blockConnection = relationalStoreExecutionState.getBlockConnectionContext().getBlockConnection(relationalStoreExecutionState, databaseConnection, this.profiles);
databaseManager.relationalDatabaseSupport().accept(RelationalDatabaseCommandsVisitorBuilder.getStreamResultToTempTableVisitor(relationalStoreExecutionState.getRelationalExecutor().getRelationalExecutionConfiguration(), blockConnection, realizedRelationalResult, tempTableName, databaseTimeZone));
blockConnection.addCommitQuery(databaseManager.relationalDatabaseSupport().dropTempTable(tempTableName));
blockConnection.addRollbackQuery(databaseManager.relationalDatabaseSupport().dropTempTable(tempTableName));
blockConnection.close();
}
}
use of org.finos.legend.engine.plan.execution.stores.relational.connection.driver.DatabaseManager in project legend-engine by finos.
the class SQLExecutionResult method close.
@Override
public void close() {
DatabaseManager databaseManager = DatabaseManager.fromString(this.SQLExecutionNode.getDatabaseTypeName());
if (this.temporaryTables != null && this.statement != null) {
this.temporaryTables.forEach((Consumer<? super String>) table -> {
try {
statement.execute(databaseManager.relationalDatabaseSupport().dropTempTable(table));
} catch (Exception ignored) {
}
});
}
Consumer<AutoCloseable> closingFunction = (AutoCloseable c) -> {
if (c != null) {
try {
c.close();
} catch (Exception e) {
}
}
};
FastList.newListWith(this.resultSet, this.statement, this.connection).forEach((Procedure<AutoCloseable>) closingFunction::accept);
}
use of org.finos.legend.engine.plan.execution.stores.relational.connection.driver.DatabaseManager in project legend-engine by finos.
the class RelationalExecutor method prepareForSQLExecution.
private void prepareForSQLExecution(ExecutionNode node, Connection connection, String databaseTimeZone, String databaseTypeName, List<String> tempTableList, MutableList<CommonProfile> profiles, ExecutionState executionState) {
String sqlQuery;
sqlQuery = node instanceof RelationalExecutionNode ? ((RelationalExecutionNode) node).sqlQuery() : ((SQLExecutionNode) node).sqlQuery();
DatabaseManager databaseManager = DatabaseManager.fromString(databaseTypeName);
for (Map.Entry<String, Result> var : executionState.getResults().entrySet()) {
if (var.getValue() instanceof StreamingResult && sqlQuery.contains("(${" + var.getKey() + "})")) {
String tableName = databaseManager.relationalDatabaseSupport().processTempTableName(var.getKey());
this.prepareTempTable(connection, (StreamingResult) var.getValue(), tableName, databaseTypeName, databaseTimeZone, tempTableList);
tempTableList.add(tableName);
sqlQuery = sqlQuery.replace("(${" + var.getKey() + "})", tableName);
} else if (var.getValue() instanceof PreparedTempTableResult && sqlQuery.contains("(${" + var.getKey() + "})")) {
sqlQuery = sqlQuery.replace("(${" + var.getKey() + "})", ((PreparedTempTableResult) var.getValue()).getTempTableName());
}
}
if (sqlQuery == null) {
throw new RuntimeException("Relational execution not supported on external server");
}
try {
sqlQuery = FreeMarkerExecutor.process(sqlQuery, executionState, databaseTypeName, databaseTimeZone);
Span span = GlobalTracer.get().activeSpan();
if (span != null) {
span.setTag("generatedSQL", sqlQuery);
}
} catch (Exception e) {
throw new IllegalStateException("Reprocessing sql failed with vars " + executionState.getResults().keySet(), e);
}
LOGGER.info(new LogInfo(profiles, LoggingEventType.EXECUTION_RELATIONAL_REPROCESS_SQL, "Reprocessing sql with vars " + executionState.getResults().keySet() + ": " + sqlQuery).toString());
executionState.activities.add(new RelationalExecutionActivity(sqlQuery));
}
use of org.finos.legend.engine.plan.execution.stores.relational.connection.driver.DatabaseManager in project legend-engine by finos.
the class RelationalExecutionNodeExecutor method executeRelationalChildren.
private void executeRelationalChildren(RelationalGraphFetchExecutionNode node, String tempTableNameFromNode, RealizedRelationalResult realizedRelationalResult, DatabaseConnection databaseConnection, String databaseType, String databaseTimeZone, DoubleStrategyHashMap<Object, Object, SQLExecutionResult> parentMap, List<Method> parentKeyGetters) {
try (Scope ignored1 = GlobalTracer.get().buildSpan("Graph Query Relational: Execute Children").startActive(true)) {
RelationalStoreExecutionState relationalStoreExecutionState = (RelationalStoreExecutionState) this.executionState.getStoreExecutionState(StoreType.Relational);
String tempTableName = "temp_table_" + tempTableNameFromNode;
DatabaseManager databaseManager = DatabaseManager.fromString(databaseType);
try (Scope ignored2 = GlobalTracer.get().buildSpan("Graph Query Relational: Create Temp Table").startActive(true)) {
this.createTempTableFromRealizedRelationalResultInBlockConnection(realizedRelationalResult, tempTableName, databaseConnection, databaseType, databaseTimeZone);
}
this.executionState.addResult(tempTableNameFromNode, new PreparedTempTableResult(tempTableName));
for (RelationalGraphFetchExecutionNode childNode : node.children) {
try (Scope ignored3 = GlobalTracer.get().buildSpan("Graph Query Relational: Execute Child").startActive(true)) {
this.executeLocalRelationalGraphOperation(childNode, parentMap, parentKeyGetters);
}
}
}
}
Aggregations