package net.sf.minuteProject.utils.sql; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.minuteProject.configuration.bean.DataModel; import net.sf.minuteProject.configuration.bean.model.data.Column; import net.sf.minuteProject.configuration.bean.model.data.Database; import net.sf.minuteProject.configuration.bean.model.statement.Composite; import net.sf.minuteProject.configuration.bean.model.statement.CompositeQueryElement; import net.sf.minuteProject.configuration.bean.model.statement.Query; import net.sf.minuteProject.configuration.bean.model.statement.QueryParam; import net.sf.minuteProject.configuration.bean.model.statement.QueryParams; import net.sf.minuteProject.exception.MinuteProjectException; import net.sf.minuteProject.utils.ConnectionUtils; import net.sf.minuteProject.db.type.FieldType; import org.apache.commons.lang.StringUtils; public class QueryUtils { private static final String QUESTION_MARK = "?"; public static QueryParams getOutputParams(Query query) throws MinuteProjectException { DataModel dataModel = query.getQueries().getStatementModel().getModel() .getDataModel(); Connection connection = ConnectionUtils.getConnection(dataModel); if (connection != null) { String q = getFullQuerySample(query); try { return getOutputParams(connection, q, dataModel.getDatabase()); } catch (SQLException e) { e.printStackTrace(); throw new MinuteProjectException("Query Not working "+query,"QUERY_NOT_WORKING"); } } return null; } private static QueryParams getOutputParams(Connection connection, String query, Database database) throws SQLException { PreparedStatement prest = connection.prepareStatement(query); ResultSet rs = prest.executeQuery(); return getQueryParams(rs.getMetaData()); } private static QueryParams getQueryParams(ResultSetMetaData metaData) throws SQLException { QueryParams queryParams = new QueryParams(); queryParams.setQueryParams(getQueryParamsList(metaData)); return queryParams; } private static List<QueryParam> getQueryParamsList(ResultSetMetaData metaData) throws SQLException { List<QueryParam> list = new ArrayList<QueryParam>(); int size = metaData.getColumnCount(); for (int i = 1; i < size+1; i++) { list.add(getQueryParam(metaData, i)); } return list; } private static QueryParam getQueryParam(ResultSetMetaData metaData, int i) throws SQLException { QueryParam qp = new QueryParam(); qp.setName(metaData.getColumnName(i)); qp.setSize(metaData.getColumnDisplaySize(i)); qp.setScale(metaData.getScale(i)); qp.setType(metaData.getColumnTypeName(i)); return qp; } public static String getFullQueryQuestionMark(Query query) { return StringUtils.replace(getQueryQuestionMark(query), "\n", " "); } public static String getQueryQuestionMark(Query query) { return query.getQueryBody().getValue(); } public static String getFullQuerySample(Query query) { String querySt = getQueryQuestionMark(query); List<String> samples = getSamples (query); int samplesSize = samples.size(); int queryArgSize = StringUtils.countMatches(querySt, QUESTION_MARK); assert (samplesSize==queryArgSize); for (int i = 0; i < samplesSize; i++) { querySt = replaceFirstArgWith(querySt, samples.get(i)); } return querySt; } private static String replaceFirstArgWith(String text, String value) { return StringUtils.replace(text, QUESTION_MARK, value, 1); } private static List<String> getSamples(Query query) { List<String> list = new ArrayList<String>(); if (query.getQueryParams() != null) { for (QueryParam qp : query.getQueryParams().getQueryParams()) { list.add(getParamSample(qp)); } } return list; } private static String getParamSample(QueryParam queryParam) { String type = queryParam.getType(); String sample = queryParam.getSample(); if (StringUtils.isEmpty(type)) return sample; if (type.equals(FieldType.CHAR)) return "'"+sample+"'"; if (type.equals(FieldType.DATE)) return "'"+sample+"'"; return sample; } public static QueryParams getInputParams(Query query) { return query.getQueryParams(); } public static List<Column> getInputCompositeFull(Composite composite) { // #foreach ($q in $composite.getInputComposite().getQueries()) // #set ($query = $q.query) // #exposeQuerySpecific() // #foreach ($column in $inputBean.columns) // #putColumnParamNaming() // @QueryParam $columnType $columnVar // #end // #end List<Column> list = new ArrayList<Column>(); for (CompositeQueryElement q : composite.getInputComposite().getQueries()) { Query query = q.getQuery(); for (Column column:query.getInputBean().getColumns()) { list.add(column); } } return list; } public static Map<String,List<Column>> getInputCompositeDistinct(Composite composite) { Map<String,List<Column>> map = new HashMap<String, List<Column>>(); for (CompositeQueryElement q : composite.getInputComposite().getQueries()) { Query query = q.getQuery(); for (Column column:query.getInputBean().getColumns()) { //TODO check that the type of the column is the same, not only the name List<Column> list = map.get(column.getName()); if (list==null) list = new ArrayList<Column>(); list.add(column); map.put(column.getName(), list); } } return map; } public static boolean isChartLayout(Query query) { return "dashboard".equals(query.getType()); } public static boolean isPieChart(Query query) { return "pie-chart".equals(query.getCategory()); } public static boolean isBarChart(Query query) { return "bar-chart".equals(query.getCategory()); } public static Column getOutputBeanDimension(Query query, int i) { if (query.getOutputBean().getColumnCount()>=i+1) return query.getOutputBean().getColumn(i); return null; } public static List<Column> getOutputBeanDimension(Query query) { List<Column> dimensions = new ArrayList<Column>(); int cpt=0; for(Column column : query.getOutputBean().getColumns()) { if (cpt>0) { dimensions.add(column); } cpt++; } return dimensions; } public static Column getOutputBeanValue(Query query) { return query.getOutputBean().getColumn(query.getOutputBean().getColumnCount()-1); } }