/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.eas.client; import com.eas.client.changes.ChangeValue; import com.eas.client.changes.Command; import com.eas.client.dataflow.FlowProvider; import com.eas.client.metadata.Fields; import com.eas.client.metadata.Parameter; import com.eas.client.metadata.Parameters; import com.eas.concurrent.CallableConsumer; import com.eas.script.Scripts; import java.sql.ResultSet; import java.util.Collection; import java.util.Map; import java.util.concurrent.Executor; import java.util.function.Consumer; import jdk.nashorn.api.scripting.JSObject; /** * A compiled SQL query. * * <p>An instance of this class contains JDBC-compliant SQL query text with "?" * placeholders for parameters and all parameters values.</p> * * @author pk, mg */ public class SqlCompiledQuery { protected DatabasesClient basesProxy; protected String datasourceName; protected String entityName; protected String sqlClause; protected Parameters parameters;// 1 - Based protected Fields expectedFields;// 1 - Based protected boolean procedure; private int pageSize = FlowProvider.NO_PAGING_PAGE_SIZE; /** * Creates an instance of compiled query. * * @param aClient * @param aSqlClause the SQL query text * @throws java.lang.Exception */ public SqlCompiledQuery(DatabasesClient aClient, String aSqlClause) throws Exception { super(); sqlClause = aSqlClause; parameters = new Parameters(); basesProxy = aClient; } /** * Creates an instance of compiled SQL query. * * <p> * This constructor is used when creating a compiled query out of SqlQuery, * providing parameters values.</p> * * @param sql the SQL query text. * @param params parameters' values vector. */ SqlCompiledQuery(DatabasesClient aClient, String aSqlClause, Parameters aParams) throws Exception { super(); sqlClause = aSqlClause; parameters = aParams; basesProxy = aClient; } SqlCompiledQuery(DatabasesClient aClient, String aDatasourceName, String aSqlClause, Parameters aParams) throws Exception { super(); sqlClause = aSqlClause; parameters = aParams; datasourceName = aDatasourceName; basesProxy = aClient; } public SqlCompiledQuery(DatabasesClient aClient, String aDatasourceName, String aSqlClause, Parameters aParams, Fields aExpectedFields) throws Exception { super(); sqlClause = aSqlClause; parameters = aParams; datasourceName = aDatasourceName; expectedFields = aExpectedFields; basesProxy = aClient; } public SqlCompiledQuery(DatabasesClient aClient, String aDatasourceName, String aEntityName, String aSqlClause, Parameters aParams, Fields aExpectedFields) throws Exception { super(); sqlClause = aSqlClause; parameters = aParams; datasourceName = aDatasourceName; entityName = aEntityName; expectedFields = aExpectedFields; basesProxy = aClient; } /** * Creates an instance of compiled query. * * @param aClient * @param aDatasourceName Database identifier. * @param aSqlClause the SQL query text * @throws java.lang.Exception */ public SqlCompiledQuery(DatabasesClient aClient, String aDatasourceName, String aSqlClause) throws Exception { super(); datasourceName = aDatasourceName; sqlClause = aSqlClause; parameters = new Parameters(); basesProxy = aClient; } public boolean isProcedure() { return procedure; } public void setProcedure(boolean aValue) { procedure = aValue; } public void setParameters(Parameters aValue) { parameters = aValue; } public int getPageSize() { return pageSize; } public void setPageSize(int aPageSize) throws Exception { pageSize = aPageSize; } /** * Executes query and returns results whatever setted in procedure flag. * * @param <T> * @param aResultSetProcessor * @param aCallbacksExecutor * @param onSuccess * @param onFailure * @return Rowset insatance, representing query results. * @throws Exception */ public <T> T executeQuery(CallableConsumer<T, ResultSet> aResultSetProcessor, Executor aCallbacksExecutor, Consumer<T> onSuccess, Consumer<Exception> onFailure) throws Exception { if (basesProxy != null) { PlatypusJdbcFlowProvider flow = basesProxy.createFlowProvider(datasourceName, entityName, sqlClause, expectedFields); flow.setPageSize(pageSize); flow.setProcedure(procedure); return flow.<T>select(parameters, aResultSetProcessor, onSuccess != null ? (T t) -> { aCallbacksExecutor.execute(() -> { onSuccess.accept(t); }); } : null, onFailure != null ? (Exception ex) -> { aCallbacksExecutor.execute(() -> { onFailure.accept(ex); }); } : null); } else { return null; } } public JSObject executeQuery(Consumer<JSObject> onSuccess, Consumer<Exception> onFailure, Scripts.Space aSpace) throws Exception { if (basesProxy != null) { PlatypusJdbcFlowProvider flow = basesProxy.createFlowProvider(datasourceName, entityName, sqlClause, expectedFields); flow.setPageSize(pageSize); flow.setProcedure(procedure); Collection<Map<String, Object>> data = flow.refresh(parameters, onSuccess != null ? (Collection<Map<String, Object>> aData) -> { aSpace.process(() -> { JSObject aJsData = aSpace.readJsArray(aData); onSuccess.accept(aJsData); }); } : null, onFailure != null ? (Exception ex) -> { aSpace.process(() -> { onFailure.accept(ex); }); } : null); return data != null ? aSpace.readJsArray(data) : null; } else { return null; } } public FlowProvider getFlowProvider() throws Exception { PlatypusJdbcFlowProvider flow = basesProxy.createFlowProvider(datasourceName, entityName, sqlClause, expectedFields); flow.setPageSize(pageSize); flow.setProcedure(procedure); return flow; } public Command prepareCommand() { Command command = new Command(entityName); command.command = sqlClause; for (int i = 0; i < parameters.getParametersCount(); i++) { Parameter param = parameters.get(i + 1); command.getParameters().add(new ChangeValue(param.getName(), param.getValue())); } return command; } /** * Returns the SQL query text. * * @return the SQL query text. */ public String getSqlClause() { return sqlClause; } public void setSqlClause(String aValue) throws Exception { sqlClause = aValue; } /** * Returns the vector of parameters' values. * * @return the vector of parameters' values. */ public Parameters getParameters() { return parameters; } /** * @return the databaseId */ public String getDatasourceName() { return datasourceName; } public void setDatasourceName(String aValue) throws Exception { datasourceName = aValue; } public String getEntityName() { return entityName; } public void setEntityName(String aValue) throws Exception { entityName = aValue; } }