package waelti.statistics.queries; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Scanner; import ch.elexis.data.Patient; import ch.rgw.tools.Money; public class QueryUtil { /** * Extracts the year from a string formatted as given by Patient.getGeburtsdatum().<br> * If the string is empty, '0' is returned. * * @return year of birth as an integer. * @param date * a string in the format "DD.MM.YYYY" * @see Patient */ public static int extractYear(String date){ if (date.length() != 0) { return new Integer(date.substring(6, 10)); } else { return 0; } } /** * This method generates a list containing as many arrays as there are years between the given * firstYear integer and the actual year. Every array contains in the first column the year as * an integer. All other array elements are filled with integer values of 0.<br> * This is useful if you want to create some time series. * * @param firstYear * the first year of this time series. * @param arraySize * the array size of each year, inclusive the date. * @return list containing an array for each year in the time series and its value as an integer * in the first column of the array. * */ public static List<Object[]> initiateYears(int firstYear, int arraySize){ List<Object[]> result = new ArrayList<Object[]>(); // getting the actual Date. Calendar currentDate = Calendar.getInstance(); for (int i = firstYear; i <= currentDate.get(Calendar.YEAR); i++) { Object[] row = new Object[arraySize]; row[0] = i; for (int j = 1; j < arraySize; j++) { row[j] = 0; } result.add(row); } return result; } /** * Returns a new list with the cohorts given the size given. The array of the list has to * contain all numerical values. The result list will contain strings in the first element of * each array. * * @param intervall * the size of the cohorts. * @return a new list. */ public static List<Object[]> createCohorts(List<Object[]> list, int intervall){ List<Object[]> newList = new ArrayList<Object[]>(list.size() / intervall + 1); Object[] row = new Object[list.get(0).length]; int i = 0; for (Object[] objects : list) { if (i % intervall == 0) { if (i != 0) { // index == 0 --> nothing to add to list. newList.add(row); } row = new Object[list.get(0).length]; row[0] = QueryUtil.getCohortName(objects[0], intervall); for (int j = 1; j < row.length; j++) { row[j] = new Double(0); } } for (int j = 1; j < objects.length; j++) { Double num = Double.valueOf(objects[j].toString()); row[j] = (Double) row[j] + num; } i++; } newList.add(row); // add the last cohort return newList; } /** Returns a string in the format: "1990 - 1995" */ private static Object getCohortName(Object object, int intervall){ String name = object.toString(); name += " - "; Integer lastYear = Integer.valueOf(object.toString()); lastYear += intervall - 1; // start date is the first name += lastYear; return name; } /** * This methods converts any List containing arrays of objects into a list containing arrays of * strings. This is for convenience, since handling strings from the beginning of the * computation can be complicated and clutter the code. */ public static List<String[]> convertToString(List<Object[]> list){ assert (list != null); List<String[]> result = new ArrayList<String[]>(); for (Object[] row : list) { String[] newRow = new String[row.length]; for (int i = 0; i < newRow.length; i++) { newRow[i] = row[i].toString(); } result.add(newRow); } return result; } /** Converts a double value of Rappen to a string in CHF. */ public static void convertToCurrency(List<Object[]> list, int column){ for (Object[] objects : list) { Double value = Double.valueOf(objects[column].toString()); value /= 100; objects[column] = new Money(value); } } /** * Rounds a given amount of money in Rappen to the next 5 Rappen. * * @param Amount * of Rappen * @return Amounf of CHF, in steps of 5 Rappen */ public static double convertAndRoundMoney(int num){ int temp = num; if (temp % 5 != 0) { int add = 5 - (temp % 5); temp += add; } return (double) temp / 100; } /** InColumn1 / InColumn2 = resultColumn. ResultColumn will be a double. */ public static List<Object[]> addAverage(List<Object[]> list, int InColumn1, int InColumn2, int resultColumn){ for (Object[] objects : list) { // TODO check math rounding double div = Double.valueOf(objects[InColumn1].toString()); double div2 = Double.valueOf(objects[InColumn2].toString()); if (div2 != 0) { objects[resultColumn] = div / div2; } } return list; } /** * Converts a Patient's birth date to a calendar object. Format of the given String has to be of * 'dd.mm.yyyy' */ public static Calendar convertToCalendar(String dateString) throws NumberFormatException{ Calendar cal = Calendar.getInstance(); cal.setLenient(false); // throws exception if wrong date is set. Scanner scn = new Scanner(dateString).useDelimiter("\\."); int day = new Integer(scn.next()); int month = new Integer(scn.next()) - 1; // month 0 = january int year = new Integer(scn.next()); cal.set(year, month, day); return cal; } /** * Throws an IllegalArgumentException if one the the calendar values are wrong. */ public static String convertFromCalendar(Calendar cal){ StringBuffer str = new StringBuffer(10); str.append(cal.get(Calendar.DAY_OF_MONTH)); str.append("."); str.append(cal.get(Calendar.MONTH) + 1); // month 0 is january str.append("."); str.append(cal.get(Calendar.YEAR)); return str.toString(); } public static void convertDoubleToInteger(List<Object[]> list, int index){ for (Object[] objects : list) { Double d = (Double) objects[index]; int i = d.intValue(); objects[index] = i; } } }