wIP data tables

This commit is contained in:
John Woodlock
2012-09-19 11:17:35 +10:00
parent 360ae5a444
commit 08fc9ff4d6
3 changed files with 90 additions and 27 deletions
@@ -95,7 +95,7 @@ public class DataTableApiResource {
GenericResultsetData results = this.readWriteNonCoreDataService
.retrieveDataTableGenericResultSet(datatable, appTableId,
sqlFields, sqlOrder);
sqlFields, sqlOrder, null);
boolean prettyPrints = ApiParameterHelper.prettyPrint(uriInfo
.getQueryParameters());
@@ -135,7 +135,7 @@ public class DataTableApiResource {
@PathParam("datatable") final String datatable,
@PathParam("appTableId") final Long appTableId,
final String jsonRequestBody) {
/* for updating one to one relationships (where foreign key is the primary key)*/
checkUserPermissionForDatatable(datatable, "UPDATE");
Map<String, String> queryParams = getQueryParamsFromJsonRequestBody(jsonRequestBody);
@@ -148,6 +148,29 @@ public class DataTableApiResource {
return Response.ok().entity(entityIdentifier).build();
}
@PUT
@Path("{datatable}/{appTableId}/{datatableId}")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public Response updateDatatableEntryOnetoOne(
@PathParam("datatable") final String datatable,
@PathParam("appTableId") final Long appTableId,
@PathParam("datatableId") final Long datatableId,
final String jsonRequestBody) {
/* for updating one to many relationships (where foreign key isn't the primary key)*/
checkUserPermissionForDatatable(datatable, "UPDATE");
Map<String, String> queryParams = getQueryParamsFromJsonRequestBody(jsonRequestBody);
this.readWriteNonCoreDataService.updateDatatableEntryOnetoMany(datatable,
appTableId, datatableId, queryParams);
EntityIdentifier entityIdentifier = new EntityIdentifier(
Long.valueOf(appTableId));
return Response.ok().entity(entityIdentifier).build();
}
@DELETE
@Path("{datatable}/{appTableId}")
@@ -20,17 +20,20 @@ public interface ReadWriteNonCoreDataService {
List<DatatableData> retrieveDatatableNames(String appTable);
GenericResultsetData retrieveDataTableGenericResultSet(String datatable,
Long appTableId, String sqlFields, String sqlOrder);
Long appTableId, String sqlFields, String sqlOrder, Long id);
String retrieveDataTableJSONObject(String datatable, Long appTableId,
String sqlFields, String sqlOrder);
void newDatatableEntry(String datatable, Long appTableId,
Map<String, String> queryParams);
void updateDatatableEntryOnetoOne(String datatable, Long appTableId,
Map<String, String> queryParams);
void updateDatatableEntryOnetoMany(String datatable, Long appTableId,
Long datatableId, Map<String, String> queryParams);
void deleteDatatableEntries(String datatable, Long appTableId);
void deleteDatatableEntry(String datatable, Long appTableId,
@@ -510,13 +510,43 @@ public class ReadWriteNonCoreDataServiceImpl implements
long startTime = System.currentTimeMillis();
GenericResultsetData grs = retrieveDataTableGenericResultSet(datatable,
appTableId, null, null);
appTableId, null, null, null);
if (grs.getData().size() == 0)
throw new DataTableNotFoundException(datatable, appTableId);
String sql = getUpdateSql(grs, datatable,
getFKField(getApplicationTableName(datatable)), appTableId,
String fkName = getFKField(getApplicationTableName(datatable));
String sql = getUpdateSql(grs, datatable, fkName, appTableId,
queryParams);
if (sql != null)
genericDataService.updateSQL(sql, "SQL: " + sql);
else
logger.info("No Changes");
long elapsed = System.currentTimeMillis() - startTime;
logger.info("FINISHING updateDatatableEntryOnetoOne: Elapsed Time: "
+ elapsed
+ " - datatable: "
+ datatable
+ fkName
+ ": "
+ appTableId);
}
@Override
public void updateDatatableEntryOnetoMany(String datatable,
Long appTableId, Long datatableId, Map<String, String> queryParams) {
long startTime = System.currentTimeMillis();
GenericResultsetData grs = retrieveDataTableGenericResultSet(datatable,
appTableId, null, null, datatableId);
if (grs.getData().size() == 0)
throw new DataTableNotFoundException(datatable, appTableId);
String sql = getUpdateSql(grs, datatable, "id", datatableId,
queryParams);
if (sql != null)
@@ -530,8 +560,7 @@ public class ReadWriteNonCoreDataServiceImpl implements
+ " - datatable: "
+ datatable
+ " id: "
+ appTableId);
+ datatableId);
}
@Override
@@ -631,7 +660,7 @@ public class ReadWriteNonCoreDataServiceImpl implements
long startTime = System.currentTimeMillis();
GenericResultsetData result = retrieveDataTableGenericResultSet(
datatable, appTableId, sqlFields, sqlOrder);
datatable, appTableId, sqlFields, sqlOrder, null);
String jsonString = generateJsonFromGenericResultsetData(result);
@@ -643,7 +672,8 @@ public class ReadWriteNonCoreDataServiceImpl implements
@Override
public GenericResultsetData retrieveDataTableGenericResultSet(
String datatable, Long appTableId, String sqlFields, String sqlOrder) {
String datatable, Long appTableId, String sqlFields,
String sqlOrder, Long id) {
long startTime = System.currentTimeMillis();
@@ -658,17 +688,23 @@ public class ReadWriteNonCoreDataServiceImpl implements
else
sql = sql + " * ";
sql = sql + " from " + datatable + " where " + getFKField(appTable)
+ " = " + appTableId;
// id only used for reading a specific entry in a one to many datatable
// (when updating)
if (id == null) {
sql = sql + " from " + datatable + " where " + getFKField(appTable)
+ " = " + appTableId;
} else {
sql = sql + " from " + datatable + " where id = " + id;
}
if (sqlOrder != null)
sql = sql + " order by " + sqlOrder;
logger.info(sql);
List<ResultsetDataRow> result = fillDatatableResultSetDataRows(sql);
long elapsed = System.currentTimeMillis() - startTime;
logger.info("FINISHING DATATABLE: " + datatable + " Elapsed Time: "
+ elapsed);
+ elapsed + " SQL: " + sql);
return new GenericResultsetData(columnHeaders, result);
@@ -914,11 +950,11 @@ public class ReadWriteNonCoreDataServiceImpl implements
}
private String getAddSql(List<ResultsetColumnHeader> columnHeaders,
String datatable, String FKField, Long appTableId,
String datatable, String fkName, Long appTableId,
Map<String, String> queryParams) {
Map<String, String> affectedColumns = getAffectedColumns(columnHeaders,
queryParams);
queryParams, fkName);
String pValueWrite = "";
String addSql = "";
@@ -943,7 +979,7 @@ public class ReadWriteNonCoreDataServiceImpl implements
selectColumns += "," + pValueWrite + " as " + columnName;
}
addSql = "insert into `" + datatable + "` (`" + FKField + "` "
addSql = "insert into `" + datatable + "` (`" + fkName + "` "
+ insertColumns + ")" + " select " + appTableId + " as id"
+ selectColumns;
@@ -951,10 +987,10 @@ public class ReadWriteNonCoreDataServiceImpl implements
}
private String getUpdateSql(GenericResultsetData grs, String datatable,
String fkField, Long appTableId, Map<String, String> queryParams) {
String keyFieldName, Long keyFieldValue, Map<String, String> queryParams) {
Map<String, String> affectedAndChangedColumns = getAffectedAndChangedColumns(
grs, queryParams);
grs, queryParams, keyFieldName);
// just updating fields that have changed since pre-update read - though
// its possible these values are different from the page the user was
@@ -991,16 +1027,16 @@ public class ReadWriteNonCoreDataServiceImpl implements
sql += "`" + key + "` = " + pValueWrite;
}
sql += " where " + fkField + " = " + appTableId;
sql += " where " + keyFieldName + " = " + keyFieldValue;
return sql;
}
private Map<String, String> getAffectedAndChangedColumns(
GenericResultsetData grs, Map<String, String> queryParams) {
GenericResultsetData grs, Map<String, String> queryParams, String fkName) {
Map<String, String> affectedColumns = getAffectedColumns(
grs.getColumnHeaders(), queryParams);
grs.getColumnHeaders(), queryParams, fkName);
Map<String, String> affectedAndChangedColumns = new HashMap<String, String>();
String columnValue;
@@ -1043,7 +1079,7 @@ public class ReadWriteNonCoreDataServiceImpl implements
private Map<String, String> getAffectedColumns(
List<ResultsetColumnHeader> columnHeaders,
Map<String, String> queryParams) {
Map<String, String> queryParams, String keyFieldName) {
String underscore = "_";
String space = " ";
@@ -1055,10 +1091,11 @@ public class ReadWriteNonCoreDataServiceImpl implements
Map<String, String> affectedColumns = new HashMap<String, String>();
Set<String> keys = queryParams.keySet();
for (String key : keys) {
// ignores any id field and matches incoming fields with and without
// underscores (spaces and underscores considered the same)
if (!(key.equalsIgnoreCase("id"))) {
// ignores id and foreign key fields
if (!((key.equalsIgnoreCase("id")) || (key.equalsIgnoreCase(keyFieldName)))) {
notFound = true;
// ignores any id field and matches incoming fields with and without
// underscores (spaces and underscores considered the same)
queryParamColumnUnderscored = genericDataService.replace(key,
space, underscore);
for (ResultsetColumnHeader columnHeader : columnHeaders) {