package ro.nextreports.server.util;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Time;
import java.sql.Timestamp;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Iterator;
import java.util.Locale;
import java.util.ResourceBundle;
import org.apache.wicket.model.StringResourceModel;
import ro.nextreports.server.domain.Analysis;
import ro.nextreports.server.domain.AnalysisDeclaredColumn;
import ro.nextreports.server.domain.AnalysisFilter;
import ro.nextreports.server.domain.Settings;
import ro.nextreports.server.web.language.LanguageManager;
public class AnalysisUtil {
public static String COUNT = "COUNT";
public static String AVG = "AVG";
public static String MIN = "MIN";
public static String MAX = "MAX";
public static String SUM = "SUM";
public static List<String> aggregates = Arrays.asList(COUNT, AVG, MIN, MAX, SUM);
public static final String AS = " as ";
public static final String FREEZE_MARKUP = "-FREEZE-";
public static final String FREEZE_ACTION = "FREEZE";
public static final String FREEZE_FAILED = "FAILED:";
public static final String ANY_ACTION = "ACTION";
public static final String ANY_ACTION_FAILED = "FAILED:";
public static List<String> getJavaTypes() {
List<String> result = new ArrayList<String>();
result.add("java.lang.String");
result.add("java.lang.Boolean");
result.add("java.lang.Short");
result.add("java.lang.Integer");
result.add("java.lang.Float");
result.add("java.lang.Double");
result.add("java.util.Date");
result.add("java.math.BigInteger");
result.add("java.math.BigDecimal");
return result;
}
public static String getJavaType(int jdbcType) {
switch (jdbcType) {
case Types.BIT:
return Boolean.class.getName();
case Types.TINYINT:
return Byte.class.getName();
case Types.SMALLINT:
return Short.class.getName();
case Types.CHAR:
return String.class.getName();
case Types.VARCHAR:
return String.class.getName();
case Types.DATE:
return Date.class.getName();
case Types.TIME:
return Time.class.getName();
case Types.TIMESTAMP:
return Timestamp.class.getName();
case Types.DOUBLE:
return Double.class.getName();
case Types.FLOAT:
return Float.class.getName();
case Types.INTEGER:
return Integer.class.getName();
case Types.BIGINT:
return BigInteger.class.getName();
case Types.NUMERIC:
return BigDecimal.class.getName();
case Types.DECIMAL:
return BigDecimal.class.getName();
case Types.BINARY:
return byte[].class.getName();
case Types.VARBINARY:
return byte[].class.getName();
case Types.OTHER:
return Object.class.getName();
default:
return String.class.getName();
}
}
public static String getColumnAlias(String fullColumnName) {
if (fullColumnName.contains(AS)) {
int index = fullColumnName.indexOf(AS);
return fullColumnName.substring(index + AS.length());
} else {
return fullColumnName;
}
}
public static String getColumnFullName(List<String> columns, String alias) {
for (String col : columns) {
if (col.contains(AS)) {
if (alias.equals(getColumnAlias(col))) {
return col;
}
} else {
if (col.equals(alias)) {
return col;
}
}
}
return alias;
}
public static String getColumnWithoutAlias(List<String> columns, String name) {
for (String col : columns) {
if (col.contains(AS)) {
if (name.equals(getColumnAlias(col))) {
int index = col.indexOf(AS);
return col.substring(0, index);
}
} else {
if (col.equals(name)) {
return col;
}
}
}
return name;
}
public static boolean isAggregateColumn(String fullName) {
for (String agg : aggregates) {
if (fullName.toLowerCase().contains(agg.toLowerCase() + "(")) {
return true;
}
}
return false;
}
public static void removeFilterByColumnName(List<AnalysisFilter> list, String columnName) {
if (list == null) {
return;
}
for (Iterator<AnalysisFilter> it = list.iterator(); it.hasNext();) {
AnalysisFilter fo = it.next();
if (fo.getColumn().equals(columnName)) {
it.remove();
break;
}
}
}
public static boolean removeSortByColumnName(List<String> sortProperty, List<Boolean> ascending, String columnName) {
if (sortProperty == null) {
return false;
}
int index = -1;
for (int i = 0, size = sortProperty.size(); i < size; i++) {
String sort = sortProperty.get(i);
if (sort.equals(columnName)) {
index = i;
break;
}
}
if (index != -1) {
sortProperty.remove(index);
ascending.remove(index);
}
return (index == 0);
}
public static void removeGroupByColumnName(List<String> groups, String columnName) {
if (groups == null) {
return;
}
for (Iterator<String> it = groups.iterator(); it.hasNext();) {
String group = it.next();
if (group.equals(columnName)) {
it.remove();
break;
}
}
}
public static void removeSortColumns(List<String> selectColumns, List<String> sorts, List<Boolean> ascending) {
List<String> removedSorts = new ArrayList<String>();
for (String sort : sorts) {
if (!selectColumns.contains(sort)) {
removedSorts.add(sort);
}
}
for (String sort : removedSorts) {
removeSortByColumnName(sorts, ascending, sort);
}
}
// Group by columns must be removed if the columns from select sql are
// deleted
public static void removeGroupColumns(List<String> selectColumns, List<String> groups) {
List<String> removedGroups = new ArrayList<String>();
for (String group : groups) {
if (!containsColumnByAlias(selectColumns, group)) {
removedGroups.add(group);
}
}
groups.removeAll(removedGroups);
}
public static boolean containsColumnByAlias(List<String> columns, String alias) {
for (String column : columns) {
if (getColumnAlias(column).equals(alias)) {
return true;
}
}
return false;
}
public static List<AnalysisFilter> getFilters(List<String> columns, List<AnalysisFilter> list, boolean isAgg) {
List<AnalysisFilter> result = new ArrayList<AnalysisFilter>();
if (list == null) {
return result;
}
for (AnalysisFilter fo : list) {
String name = getColumnFullName(columns, fo.getColumn());
boolean isAggCol = isAggregateColumn(name);
if (isAgg) {
if (isAggCol) {
result.add(fo);
}
} else {
if (!isAggCol) {
result.add(fo);
}
}
}
return result;
}
public static String getAnalysisInfo(Analysis analysis, int restrictionNo, Settings settings) {
StringBuilder sb = new StringBuilder();
sb.append(getString("CreatePanel.create", settings));
sb.append(": ");
for (int i=0, size=analysis.getDeclaredColumns().size(); i<size; i++) {
AnalysisDeclaredColumn col = analysis.getDeclaredColumns().get(i);
sb.append(col.getColumnName());
if (i<size-1) {
sb.append(",");
if (restrictionNo-1 == i) {
sb.append("...");
break;
}
}
}
sb.append("\n");
sb.append(getString("ColumnsPanel.select", settings));
sb.append(": ");
for (int i=0, size=analysis.getSelectedColumns().size(); i<size; i++) {
sb.append(analysis.getSelectedColumns().get(i));
if (i<size-1) {
sb.append(",");
if (restrictionNo-1 == i) {
sb.append("...");
break;
}
}
}
sb.append("\n");
sb.append(getString("SortPanel.sort",settings));
sb.append(": ");
for (int i=0, size=analysis.getSortProperty().size(); i<size; i++) {
sb.append(analysis.getSortProperty().get(i));
if (i<size-1) {
sb.append(",");
if (restrictionNo-1 == i) {
sb.append("...");
break;
}
}
}
sb.append("\n");
sb.append(getString("FilterPanel.filter", settings));
sb.append(": ");
for (int i=0, size=analysis.getFilters().size(); i<size; i++) {
AnalysisFilter filter = analysis.getFilters().get(i);
sb.append(filter.getColumn());
sb.append(" ");
sb.append(filter.getOperator());
sb.append(" ");
sb.append(filter.getValue());
if (i<size-1) {
sb.append(",");
if (restrictionNo-1 == i) {
sb.append("...");
break;
}
}
}
sb.append("\n");
sb.append(getString("GroupPanel.group", settings));
sb.append(": ");
for (int i=0, size=analysis.getGroups().size(); i<size; i++) {
sb.append(analysis.getGroups().get(i));
if (i<size-1) {
sb.append(",");
if (restrictionNo-1 == i) {
sb.append("...");
break;
}
}
}
return sb.toString();
}
private static String getString(String key, Settings settings) {
Locale locale = LanguageManager.getInstance().getLocale(settings.getLanguage());
ResourceBundle bundle = ResourceBundle.getBundle("ro.nextreports.server.web.NextServerApplication", locale);
return bundle.getString(key);
}
}