diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataServiceImpl.java index f5f0416b1..b95debd82 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataServiceImpl.java @@ -94,9 +94,11 @@ public class ReadWriteNonCoreDataServiceImpl implements Long id) { long startTime = System.currentTimeMillis(); + GenericResultsetData result = fillExtraDataGenericResultSet(type, set, id); long elapsed = System.currentTimeMillis() - startTime; + logger.info("FINISHING SET: " + set + " Elapsed Time: " + elapsed); return result; } @@ -104,17 +106,31 @@ public class ReadWriteNonCoreDataServiceImpl implements private GenericResultsetData fillExtraDataGenericResultSet( final String type, final String set, final Long id) { - String sql = "select f.`name`, f.data_type, f.data_length, f.display_type, f.allowed_list_id from stretchydata_datasettype t join stretchydata_dataset d on d.datasettype_id = t.id join stretchydata_dataset_fields f on f.dataset_id = d.id where d.`name` = '" - + set + "' and t.`name` = '" + type + "' order by f.id"; + CachedRowSet columnDefinitions = getAdditionalFieldsMetaData(type, set); String sqlErrorMsg = "Additional Fields Type: " + type + " Set: " + set + " Id: " + id; - - CachedRowSet rsmd = genericDataService.getCachedResultSet(sql, - sqlErrorMsg); - List columnHeaders = getResultsetColumnHeaders( - rsmd, sqlErrorMsg, type, set); + columnDefinitions, sqlErrorMsg); + + String selectFieldList = getSelectFieldListFromColumnHeaders(columnHeaders); + + String unScopedSQL = "select " + selectFieldList + " from `" + type + + "` t ${dataScopeCriteria} left join `" + + getFullDatasetName(type, set) + "` s on s.id = t.id " + + " where t.id = " + id; + String sql = dataScopedSQL(unScopedSQL, type); + logger.info("addition fields sql: " + sql); + + List resultsetDataRows = getResultsetDataRows( + columnHeaders, sql, sqlErrorMsg); + + return new GenericResultsetData(columnHeaders, resultsetDataRows); + + } + + private String getSelectFieldListFromColumnHeaders( + List columnHeaders) { Boolean firstColumn = true; String selectFieldList = ""; @@ -130,105 +146,113 @@ public class ReadWriteNonCoreDataServiceImpl implements selectFieldList += selectFieldSeparator + "s.`" + columnHeader.getColumnName() + "`"; } + return selectFieldList; + } - String unScopedSQL = "select " + selectFieldList + " from `" + type - + "` t ${dataScopeCriteria} left join `" - + getFullDatasetName(type, set) + "` s on s.id = t.id " - + " where t.id = " + id; - sql = dataScopedSQL(unScopedSQL, type); - logger.info("addition fields sql: " + sql); - // maybe can reduce parameters a bit (type and id only needed - // because of exception) - List resultsetDataRows = getResultsetDataRows( - columnHeaders, sql, sqlErrorMsg, type, id); + private CachedRowSet getAdditionalFieldsMetaData(String type, String set) { + String sql = "select f.`name`, f.data_type, f.data_length, f.display_type, f.allowed_list_id " + + " from stretchydata_datasettype t " + + " join stretchydata_dataset d on d.datasettype_id = t.id " + + " join stretchydata_dataset_fields f on f.dataset_id = d.id " + + " where d.`name` = '" + + set + + "' and t.`name` = '" + + type + + "' order by f.id"; - return new GenericResultsetData(columnHeaders, resultsetDataRows); + String sqlErrorMsg = "Additional Fields Type: " + type + " Set: " + + set + " - SQL: " + sql; + CachedRowSet columnDefinitions = genericDataService.getCachedResultSet( + sql, sqlErrorMsg); + if (columnDefinitions.size() > 0) + return columnDefinitions; + + throw new PlatformDataIntegrityException("error.msg.sql.error", + "Additional Fields Meta Data Not Found - " + sqlErrorMsg); } private List getResultsetColumnHeaders( - CachedRowSet rsmd, String sqlErrorMsg, String type, String set) { + CachedRowSet columnDefinitions, String sqlErrorMsg) { List columnHeaders = null; try { - if (rsmd.next()) { - columnHeaders = new ArrayList(); - Integer allowedListId; - do { - ResultsetColumnHeader rsch = new ResultsetColumnHeader(); - rsch.setColumnName(rsmd.getString("name")); + columnHeaders = new ArrayList(); + Integer allowedListId; + while (columnDefinitions.next()) { + ResultsetColumnHeader rsch = new ResultsetColumnHeader(); + rsch.setColumnName(columnDefinitions.getString("name")); - rsch.setColumnType(rsmd.getString("data_type")); - if (rsmd.getInt("data_length") > 0) - rsch.setColumnLength(rsmd.getInt("data_length")); + rsch.setColumnType(columnDefinitions.getString("data_type")); + if (columnDefinitions.getInt("data_length") > 0) + rsch.setColumnLength(columnDefinitions + .getInt("data_length")); - rsch.setColumnDisplayType(rsmd.getString("display_type")); - allowedListId = rsmd.getInt("allowed_list_id"); + rsch.setColumnDisplayType(columnDefinitions + .getString("display_type")); + allowedListId = columnDefinitions.getInt("allowed_list_id"); - if (allowedListId > 0) { + if (allowedListId > 0) { - // logger.info("allowedListId != null: Column: " + - // rsch.getColumnName()); - String sql = "select v.`name` from stretchydata_allowed_value v where allowed_list_id = " - + allowedListId + " order by id"; - CachedRowSet rsValues = genericDataService - .getCachedResultSet(sql, sqlErrorMsg); - while (rsValues.next()) { - rsch.getColumnValues().add( - rsValues.getString("name")); - } + String sql = "select v.`name` from stretchydata_allowed_value v where allowed_list_id = " + + allowedListId + " order by id"; + CachedRowSet rsValues = genericDataService + .getCachedResultSet(sql, "SQL: " + sql); + while (rsValues.next()) { + rsch.getColumnValues().add(rsValues.getString("name")); } - columnHeaders.add(rsch); - } while (rsmd.next()); - return columnHeaders; - + } + columnHeaders.add(rsch); } + ; + return columnHeaders; } catch (SQLException e) { throw new PlatformDataIntegrityException("error.msg.sql.error", e.getMessage(), sqlErrorMsg); } - throw new AdditionalFieldsNotFoundException(type, set); } private List getResultsetDataRows( List columnHeaders, String sql, - String sqlErrorMsg, String type, Long id) { + String sqlErrorMsg) { List resultsetDataRows = null; CachedRowSet rs = genericDataService.getCachedResultSet(sql, sqlErrorMsg); - try { - if (rs.next()) { - String columnName = null; - String columnValue = null; - resultsetDataRows = new ArrayList(); - ResultsetDataRow resultsetDataRow; - do { - resultsetDataRow = new ResultsetDataRow(); - List columnValues = new ArrayList(); + if (rs.size() != 1) + throw new PlatformDataIntegrityException("error.msg.sql.error", + "Expected One Entry to be Returned But " + rs.size() + + " were Found - " + sqlErrorMsg); - for (int i = 0; i < columnHeaders.size(); i++) { - columnName = columnHeaders.get(i).getColumnName(); - columnValue = rs.getString(columnName); - columnValues.add(columnValue); - } - resultsetDataRow.setRow(columnValues); - resultsetDataRows.add(resultsetDataRow); - } while (rs.next()); - return resultsetDataRows; + String columnName = null; + String columnValue = null; + resultsetDataRows = new ArrayList(); + ResultsetDataRow resultsetDataRow; + + try { + while (rs.next()) { + resultsetDataRow = new ResultsetDataRow(); + List columnValues = new ArrayList(); + + for (int i = 0; i < columnHeaders.size(); i++) { + columnName = columnHeaders.get(i).getColumnName(); + columnValue = rs.getString(columnName); + columnValues.add(columnValue); + } + resultsetDataRow.setRow(columnValues); + resultsetDataRows.add(resultsetDataRow); } + return resultsetDataRows; + } catch (SQLException e) { throw new PlatformDataIntegrityException("error.msg.sql.error", e.getMessage(), sqlErrorMsg); } - // could also be not found because of data scope so need to split this - // up - throw new AdditionalFieldsNotFoundException(type, id); }