Skip to content

Commit 6c78808

Browse files
Make study crosstab report more robust
1 parent 2295f28 commit 6c78808

7 files changed

Lines changed: 52 additions & 46 deletions

File tree

api/src/org/labkey/api/query/UserIdForeignKey.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@
1616

1717
package org.labkey.api.query;
1818

19-
import org.labkey.api.data.ColumnInfo;
2019
import org.labkey.api.data.CoreSchema;
21-
import org.labkey.api.data.DisplayColumn;
22-
import org.labkey.api.data.DisplayColumnFactory;
2320
import org.labkey.api.data.MutableColumnInfo;
2421
import org.labkey.api.data.TableInfo;
2522

@@ -30,14 +27,7 @@ public class UserIdForeignKey extends LookupForeignKey
3027
static public <COL extends MutableColumnInfo> COL initColumn(COL column)
3128
{
3229
column.setFk(new UserIdForeignKey(column.getParentTable().getUserSchema()));
33-
column.setDisplayColumnFactory(new DisplayColumnFactory()
34-
{
35-
@Override
36-
public DisplayColumn createRenderer(ColumnInfo colInfo)
37-
{
38-
return new UserIdRenderer(colInfo);
39-
}
40-
});
30+
column.setDisplayColumnFactory(UserIdRenderer::new);
4131
return column;
4232
}
4333

api/src/org/labkey/api/reports/report/view/ReportDesignBean.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ public void setCached(boolean cached)
204204
_cached = cached;
205205
}
206206

207-
public R getReport(ContainerUser cu) throws Exception
207+
public R getReport(ContainerUser cu)
208208
{
209209
R report = null;
210210
if (null != getReportId())

api/src/org/labkey/api/reports/report/view/ScriptReportDesignBean.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public List<String> getIncludedReports()
108108
}
109109

110110
@Override
111-
public ScriptReport getReport(ContainerUser cu) throws Exception
111+
public ScriptReport getReport(ContainerUser cu)
112112
{
113113
Report report = super.getReport(cu);
114114

api/src/org/labkey/api/study/reports/CrosstabReport.java

Lines changed: 41 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,28 @@
2020
import org.labkey.api.data.ExcelWriter;
2121
import org.labkey.api.data.RenderContext;
2222
import org.labkey.api.data.Results;
23+
import org.labkey.api.data.RuntimeSQLException;
2324
import org.labkey.api.data.Table;
2425
import org.labkey.api.query.FieldKey;
2526
import org.labkey.api.query.QueryParam;
2627
import org.labkey.api.query.QueryService;
2728
import org.labkey.api.query.QuerySettings;
2829
import org.labkey.api.query.UserSchema;
30+
import org.labkey.api.query.ValidationException;
2931
import org.labkey.api.reports.Report;
3032
import org.labkey.api.reports.report.AbstractReport;
3133
import org.labkey.api.reports.report.ReportDescriptor;
3234
import org.labkey.api.reports.report.ReportUrls;
3335
import org.labkey.api.reports.report.view.ReportQueryView;
3436
import org.labkey.api.util.PageFlowUtil;
37+
import org.labkey.api.util.ResultSetUtil;
3538
import org.labkey.api.view.ActionURL;
3639
import org.labkey.api.view.DataView;
3740
import org.labkey.api.view.HttpView;
3841
import org.labkey.api.view.Stats;
3942
import org.labkey.api.view.ViewContext;
4043

44+
import java.sql.SQLException;
4145
import java.util.LinkedHashSet;
4246
import java.util.Set;
4347

@@ -67,7 +71,7 @@ public String getDescriptorType()
6771
return CrosstabReportDescriptor.TYPE;
6872
}
6973

70-
protected ReportQueryView createQueryView(ViewContext context, ReportDescriptor descriptor) throws Exception
74+
protected ReportQueryView createQueryView(ViewContext context, ReportDescriptor descriptor)
7175
{
7276
final String queryName = descriptor.getProperty(QueryParam.queryName.toString());
7377
final String viewName = descriptor.getProperty(QueryParam.viewName.toString());
@@ -111,7 +115,11 @@ public HttpView<?> renderReport(ViewContext context)
111115
return new CrosstabView(crosstab, exportAction);
112116
}
113117
}
114-
catch (Exception e)
118+
catch (SQLException e)
119+
{
120+
throw new RuntimeSQLException(e);
121+
}
122+
catch (ValidationException e)
115123
{
116124
throw new RuntimeException(e);
117125
}
@@ -124,7 +132,7 @@ public HttpView<?> renderReport(ViewContext context)
124132
}
125133

126134
@Override
127-
public Results generateResults(ViewContext context, boolean allowAsyncQuery) throws Exception
135+
public Results generateResults(ViewContext context, boolean allowAsyncQuery) throws SQLException, ValidationException
128136
{
129137
ReportQueryView view = createQueryView(context, getDescriptor());
130138
validateQueryView(view);
@@ -141,37 +149,44 @@ public Results generateResults(ViewContext context, boolean allowAsyncQuery) thr
141149
return null;
142150
}
143151

144-
protected Crosstab createCrosstab(ViewContext context, boolean allowAsyncQuery) throws Exception
152+
protected Crosstab createCrosstab(ViewContext context, boolean allowAsyncQuery) throws SQLException, ValidationException
145153
{
146154
CrosstabReportDescriptor descriptor = (CrosstabReportDescriptor)getDescriptor();
147155
Results results = generateResults(context, allowAsyncQuery);
148156
if (results != null)
149157
{
150-
FieldKey rowFieldKey = FieldKey.decode(descriptor.getProperty("rowField"));
151-
FieldKey colFieldKey = FieldKey.decode(descriptor.getProperty("colField"));
152-
FieldKey statFieldKey = FieldKey.decode(descriptor.getProperty("statField"));
158+
try
159+
{
160+
FieldKey rowFieldKey = FieldKey.decode(descriptor.getProperty("rowField"));
161+
FieldKey colFieldKey = FieldKey.decode(descriptor.getProperty("colField"));
162+
FieldKey statFieldKey = FieldKey.decode(descriptor.getProperty("statField"));
153163

154-
Set<Stats.StatDefinition> statSet = new LinkedHashSet<>();
155-
for (String stat : descriptor.getStats())
164+
Set<Stats.StatDefinition> statSet = new LinkedHashSet<>();
165+
for (String stat : descriptor.getStats())
166+
{
167+
if ("Count".equals(stat))
168+
statSet.add(Stats.COUNT);
169+
else if ("Sum".equals(stat))
170+
statSet.add(Stats.SUM);
171+
else if ("Mean".equals(stat))
172+
statSet.add(Stats.MEAN);
173+
else if ("Min".equals(stat))
174+
statSet.add(Stats.MIN);
175+
else if ("Max".equals(stat))
176+
statSet.add(Stats.MAX);
177+
else if ("StdDev".equals(stat))
178+
statSet.add(Stats.STDDEV);
179+
else if ("Var".equals(stat))
180+
statSet.add(Stats.VAR);
181+
else if ("Median".equals(stat))
182+
statSet.add(Stats.MEDIAN);
183+
}
184+
return new Crosstab(results, rowFieldKey, colFieldKey, statFieldKey, statSet);
185+
}
186+
finally
156187
{
157-
if ("Count".equals(stat))
158-
statSet.add(Stats.COUNT);
159-
else if ("Sum".equals(stat))
160-
statSet.add(Stats.SUM);
161-
else if ("Mean".equals(stat))
162-
statSet.add(Stats.MEAN);
163-
else if ("Min".equals(stat))
164-
statSet.add(Stats.MIN);
165-
else if ("Max".equals(stat))
166-
statSet.add(Stats.MAX);
167-
else if ("StdDev".equals(stat))
168-
statSet.add(Stats.STDDEV);
169-
else if ("Var".equals(stat))
170-
statSet.add(Stats.VAR);
171-
else if ("Median".equals(stat))
172-
statSet.add(Stats.MEDIAN);
188+
ResultSetUtil.close(results);
173189
}
174-
return new Crosstab(results, rowFieldKey, colFieldKey, statFieldKey, statSet);
175190
}
176191
return null;
177192
}

api/src/org/labkey/api/study/reports/CrosstabReportDescriptor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ public String[] getStats()
4343
final Object stats = _props.get(STATS);
4444
if (stats instanceof List)
4545
return ((List<String>)stats).toArray(new String[0]);
46-
else if (stats instanceof String)
47-
return new String[]{(String)stats};
46+
else if (stats instanceof String s)
47+
return new String[]{s};
4848

4949
return new String[]{""};
5050
}

assay/api-src/org/labkey/api/assay/DefaultAssaySaveHandler.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -216,9 +216,9 @@ protected ExpExperiment saveExperimentRun(
216216
}
217217
}
218218

219-
if (tsvData != null && dataRows != null)
219+
if (tsvData != null)
220220
{
221-
AssayRunUploadContext uploadContext = createRunUploadContext(context, protocol, runJson, dataRows,
221+
AssayRunUploadContext<?> uploadContext = createRunUploadContext(context, protocol, runJson, dataRows,
222222
inputData, outputData, inputMaterial, outputMaterial);
223223

224224
return saveAssayRun(uploadContext, batch, run, BaseViewAction.getTransactionAuditDetails(context));
@@ -229,6 +229,7 @@ protected ExpExperiment saveExperimentRun(
229229
/**
230230
* Handle any mv indicator columns plus any additional conversion on the results domain data before run creation.
231231
*/
232+
@NotNull
232233
private List<Map<String, Object>> convertRunData(JSONArray dataArray, Container container, ExpProtocol protocol)
233234
{
234235
Domain domain = _provider.getResultsDomain(protocol);
@@ -290,7 +291,7 @@ protected AssayRunUploadContext<?> createRunUploadContext(
290291
{
291292
if (dataRows != null)
292293
{
293-
AssayRunUploadContext.Factory<? extends AssayProvider, ? extends AssayRunUploadContext.Factory> factory = createRunUploadContext(protocol, context);
294+
AssayRunUploadContext.Factory<? extends AssayProvider, ? extends AssayRunUploadContext.Factory<?, ?>> factory = createRunUploadContext(protocol, context);
294295

295296
if (runJsonObject != null && runJsonObject.has(ExperimentJSONConverter.PROPERTIES))
296297
{
@@ -312,7 +313,7 @@ protected AssayRunUploadContext<?> createRunUploadContext(
312313
}
313314

314315
@NotNull
315-
protected AssayRunUploadContext.Factory<? extends AssayProvider, ? extends AssayRunUploadContext.Factory> createRunUploadContext(ExpProtocol protocol, ViewContext context)
316+
protected AssayRunUploadContext.Factory<? extends AssayProvider, ? extends AssayRunUploadContext.Factory<?, ?>> createRunUploadContext(ExpProtocol protocol, ViewContext context)
316317
{
317318
AssayProvider provider = getProvider();
318319
return provider.createRunUploadFactory(protocol, context);

query/src/org/labkey/query/QueryDefinitionImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ public CustomView getCustomView(@NotNull User owner, @Nullable HttpServletReques
217217
String referrer = request.getHeader("Referer");
218218
extra = " [url=" + request.getRequestURI() + (null != referrer ? ", referrer=" + referrer : "") + "]";
219219
}
220-
log.info("Could not find the requested custom view named '" + name + "'" + " in " + getSchemaPath() + "." + getQueryDef().getName() + " in the container " + _container.getPath() + " for user " + owner + extra);
220+
log.info(" Could not find the requested custom view named '" + name + "'" + " in " + getSchemaPath() + "." + getQueryDef().getName() + " in the container " + _container.getPath() + " for user " + owner + extra);
221221
}
222222
return result;
223223
}

0 commit comments

Comments
 (0)