diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ResultsetColumnHeader.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ResultsetColumnHeader.java index 94445e1dd..f6b8be3ad 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ResultsetColumnHeader.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ResultsetColumnHeader.java @@ -7,8 +7,10 @@ public class ResultsetColumnHeader { private String columnName; private String columnType; - private Integer columnLength; + private Long columnLength; private String columnDisplayType; + private boolean isColumnNullable; + private boolean isColumnPrimaryKey; private List columnValues = new ArrayList(); private List columnValuesNew = new ArrayList(); @@ -40,11 +42,11 @@ public class ResultsetColumnHeader { this.columnType = columnType; } - public Integer getColumnLength() { + public Long getColumnLength() { return columnLength; } - public void setColumnLength(Integer columnLength) { + public void setColumnLength(Long columnLength) { this.columnLength = columnLength; } @@ -64,4 +66,20 @@ public class ResultsetColumnHeader { this.columnValuesNew = columnValuesNew; } + public boolean isColumnNullable() { + return isColumnNullable; + } + + public void setColumnNullable(boolean isColumnNullable) { + this.isColumnNullable = isColumnNullable; + } + + public boolean isColumnPrimaryKey() { + return isColumnPrimaryKey; + } + + public void setColumnPrimaryKey(boolean isColumnPrimaryKey) { + this.isColumnPrimaryKey = isColumnPrimaryKey; + } + } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ResultsetColumnValue.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ResultsetColumnValue.java index a3f89eea7..63d65fd43 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ResultsetColumnValue.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ResultsetColumnValue.java @@ -2,27 +2,28 @@ package org.mifosng.platform.api.data; public class ResultsetColumnValue { - private Long id; - private String Value; - - public ResultsetColumnValue() { + private int id; + private String value; + public ResultsetColumnValue(int id, String value) { + this.id = id; + this.value = value; } - public Long getId() { + public int getId() { return id; } - public void setId(Long id) { + public void setId(int id) { this.id = id; } public String getValue() { - return Value; + return value; } public void setValue(String value) { - Value = value; + this.value = value; } } 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 4dacd7aee..2907bd6c1 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 @@ -13,6 +13,7 @@ import org.apache.commons.lang.StringUtils; import org.mifosng.platform.api.data.AdditionalFieldsSetData; import org.mifosng.platform.api.data.GenericResultsetData; import org.mifosng.platform.api.data.ResultsetColumnHeader; +import org.mifosng.platform.api.data.ResultsetColumnValue; import org.mifosng.platform.api.data.ResultsetDataRow; import org.mifosng.platform.exceptions.AdditionalFieldsNotFoundException; import org.mifosng.platform.exceptions.DataTableNotFoundException; @@ -183,7 +184,7 @@ public class ReadWriteNonCoreDataServiceImpl implements rsch.setColumnType(columnDefinitions.getString("data_type")); if (columnDefinitions.getInt("data_length") > 0) rsch.setColumnLength(columnDefinitions - .getInt("data_length")); + .getLong("data_length")); rsch.setColumnDisplayType(columnDefinitions .getString("display_type")); @@ -501,6 +502,11 @@ public class ReadWriteNonCoreDataServiceImpl implements checkMainResourceExistsWithinScope(applicationTableName, id); + CachedRowSet columnDefinitions = getDatatableMetaData(datatable); + + List columnHeaders = getDatatableResultsetColumnHeaders( + columnDefinitions); + String fkField = applicationTableName.substring(2) + "_id"; String sql = "select "; @@ -516,14 +522,37 @@ public class ReadWriteNonCoreDataServiceImpl implements if (sqlOrder != null) sql = sql + " order by " + sqlOrder; logger.info(sql); - GenericResultsetData result = genericDataService - .fillGenericResultSet(sql); + + + //GenericResultsetData result = genericDataService + // .fillGenericResultSet(sql); long elapsed = System.currentTimeMillis() - startTime; logger.info("FINISHING DATATABLE: " + datatable + " Elapsed Time: " + elapsed); - return result; + return new GenericResultsetData(columnHeaders, new ArrayList()); + +/* + List columnHeaders = getResultsetColumnHeaders( + columnDefinitions, sqlErrorMsg); + + String selectFieldList = getSelectFieldListFromColumnHeaders(columnHeaders); + + String sql = "select " + selectFieldList + " from `" + type + + "` t left join `" + getFullDatasetName(type, set) + + "` s on s.id = t.id where t.id = " + id; + logger.info("addition fields sql: " + sql); + + List resultsetDataRows = getResultsetDataRows( + columnHeaders, sql, sqlErrorMsg); + + long elapsed = System.currentTimeMillis() - startTime; + logger.info("FINISHING SET: " + set + " Elapsed Time: " + elapsed); + + return new GenericResultsetData(columnHeaders, resultsetDataRows); + */ + } private String getApplicationTableName(String datatable) { @@ -545,6 +574,96 @@ public class ReadWriteNonCoreDataServiceImpl implements } } + + private CachedRowSet getDatatableMetaData(String datatable) { + + String sql = "select COLUMN_NAME, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, COLUMN_KEY" + + " from INFORMATION_SCHEMA.COLUMNS " + + " where TABLE_SCHEMA = schema() and TABLE_NAME = '" + + datatable + "'order by ORDINAL_POSITION"; + + CachedRowSet columnDefinitions = genericDataService.getCachedResultSet( + sql, "SQL: " + sql); + + if (columnDefinitions.size() > 0) + return columnDefinitions; + + throw new DataTableNotFoundException(datatable); + } + + private List getDatatableResultsetColumnHeaders( + CachedRowSet columnDefinitions) { + + List columnHeaders = new ArrayList(); + + try { + + while (columnDefinitions.next()) { + ResultsetColumnHeader rsch = new ResultsetColumnHeader(); + + rsch.setColumnName(columnDefinitions.getString("COLUMN_NAME")); + + String isNullable = columnDefinitions.getString("IS_NULLABLE"); + if (isNullable.equalsIgnoreCase("YES")) rsch.setColumnNullable(true); + else rsch.setColumnNullable(false); + + String isPrimaryKey = columnDefinitions.getString("COLUMN_KEY"); + if (isPrimaryKey.equalsIgnoreCase("PRI")) rsch.setColumnPrimaryKey(true); + else rsch.setColumnPrimaryKey(false); + + Long columnLength = columnDefinitions.getLong("CHARACTER_MAXIMUM_LENGTH"); + if (columnLength > 0 ) rsch.setColumnLength(columnDefinitions.getLong("CHARACTER_MAXIMUM_LENGTH")); + + rsch.setColumnType(columnDefinitions.getString("DATA_TYPE")); + + rsch.setColumnDisplayType(null); + + /* look for codes */ + if (rsch.getColumnType().equalsIgnoreCase("varchar")) + addCodesValueIfNecessary(rsch, "_cv"); + + if (rsch.getColumnType().equalsIgnoreCase("int")) + addCodesValueIfNecessary(rsch, "_cd"); + + columnHeaders.add(rsch); + } + ; + return columnHeaders; + + } catch (SQLException e) { + throw new PlatformDataIntegrityException("error.msg.sql.error", + e.getMessage()); + } + + } + + + + + private void addCodesValueIfNecessary(ResultsetColumnHeader rsch, String code_suffix) { + int codePosition = rsch.getColumnName().indexOf(code_suffix); + if (codePosition > 0){ + String codeName = rsch.getColumnName().substring(0, codePosition); + + String sql = "select v.id, v.code_value from m_code m " + + " join m_code_value v on v.code_id = m.id " + + " where m.code_name = '" + codeName + "' order by v.order_position, v.id"; + + CachedRowSet rsValues = genericDataService + .getCachedResultSet(sql, "SQL: " + sql); + + try { + while (rsValues.next()) { + rsch.getColumnValuesNew().add( new ResultsetColumnValue(rsValues.getInt("id"), rsValues.getString("code_value"))); + } + } catch (SQLException e) { + throw new PlatformDataIntegrityException("error.msg.sql.error", + e.getMessage()); + } + } + + } + private static String generateJsonFromGenericResultsetData( GenericResultsetData result) {