diff --git a/luminex/webapp/luminex/LeveyJenningsPlotHelpers.js b/luminex/webapp/luminex/LeveyJenningsPlotHelpers.js
index e523502ad1..9094763ed6 100644
--- a/luminex/webapp/luminex/LeveyJenningsPlotHelpers.js
+++ b/luminex/webapp/luminex/LeveyJenningsPlotHelpers.js
@@ -27,6 +27,32 @@ LABKEY.LeveyJenningsPlotHelper.getTrackingDataStore = function(config)
whereClause += config.whereClause;
}
+ // this version of the guide set range values SQL will prevent the need for multiple LEFT OUTER JOINs to the GuideSetCurveFit table
+ var guideSetRangeValuesSQL = "SELECT gs.RowId, gs.Created, gs.ValueBased,\n" +
+ " CASE WHEN gs.ValueBased=true THEN gs.EC504PLAverage ELSE cf.EC504PLAverage END AS GuideSetEC504PLAverage,\n" +
+ " CASE WHEN gs.ValueBased=true THEN gs.EC504PLStdDev ELSE cf.EC504PLStdDev END AS GuideSetEC504PLStdDev,\n" +
+ " CASE WHEN gs.ValueBased=true THEN gs.EC505PLAverage ELSE cf.EC505PLAverage END AS GuideSetEC505PLAverage,\n" +
+ " CASE WHEN gs.ValueBased=true THEN gs.EC505PLStdDev ELSE cf.EC505PLStdDev END AS GuideSetEC505PLStdDev,\n" +
+ " CASE WHEN gs.ValueBased=true THEN gs.AUCAverage ELSE cf.AUCAverage END AS GuideSetAUCAverage,\n" +
+ " CASE WHEN gs.ValueBased=true THEN gs.AUCStdDev ELSE cf.AUCStdDev END AS GuideSetAUCStdDev,\n" +
+ " CASE WHEN gs.ValueBased=true THEN gs.MaxFIAverage ELSE gs.TitrationMaxFIAverage END AS GuideSetHighMFIAverage,\n" +
+ " CASE WHEN gs.ValueBased=true THEN gs.MaxFIStdDev ELSE gs.TitrationMaxFIStdDev END AS GuideSetHighMFIStdDev,\n" +
+ " CASE WHEN gs.ValueBased=true THEN gs.MaxFIAverage ELSE gs.SinglePointControlFIAverage END AS GuideSetMFIAverage,\n" +
+ " CASE WHEN gs.ValueBased=true THEN gs.MaxFIStdDev ELSE gs.SinglePointControlFIStdDev END AS GuideSetMFIStdDev\n" +
+ "FROM GuideSet gs\n" +
+ "LEFT JOIN (\n" +
+ " SELECT\n" +
+ " GuideSetId,\n" +
+ " MIN(CASE WHEN CurveType = 'Trapezoidal' THEN AUCAverage ELSE NULL END) AS AUCAverage,\n" +
+ " MIN(CASE WHEN CurveType = 'Trapezoidal' THEN AUCStdDev ELSE NULL END) AS AUCStdDev,\n" +
+ " MIN(CASE WHEN CurveType = 'Four Parameter' THEN EC50Average ELSE NULL END) AS EC504PLAverage,\n" +
+ " MIN(CASE WHEN CurveType = 'Four Parameter' THEN EC50StdDev ELSE NULL END) AS EC504PLStdDev,\n" +
+ " MIN(CASE WHEN CurveType = 'Five Parameter' THEN EC50Average ELSE NULL END) AS EC505PLAverage,\n" +
+ " MIN(CASE WHEN CurveType = 'Five Parameter' THEN EC50StdDev ELSE NULL END) AS EC505PLStdDev\n" +
+ " FROM GuideSetCurveFit\n" +
+ " GROUP BY GuideSetId\n" +
+ ") cf ON gs.RowId = cf.GuideSetId";
+
// generate sql for the data store (columns depend on the control type)
// issue 22267 : add IFDEFINED to "optional" assay design fields
var sql = "SELECT Analyte"
@@ -45,9 +71,10 @@ LABKEY.LeveyJenningsPlotHelper.getTrackingDataStore = function(config)
+ ", IFDEFINED(" + controlTypeColName + ".Run.NotebookNo)"
+ ", IFDEFINED(" + controlTypeColName + ".Run.AssayType)"
+ ", IFDEFINED(" + controlTypeColName + ".Run.ExpPerformer)"
- + ", GuideSet.Created AS GuideSetCreated"
+ + ", GuideSet AS GuideSetId"
+ + ", gs.Created AS GuideSetCreated"
+ ", IncludeInGuideSetCalculation"
- + ", GuideSet.ValueBased AS GuideSetValueBased";
+ + ", gs.ValueBased AS GuideSetValueBased";
if (config.controlType == "Titration")
{
sql += ", \"Four ParameterCurveFit\".EC50 AS EC504PL, \"Four ParameterCurveFit\".EC50QCFlagsEnabled AS EC504PLQCFlagsEnabled"
@@ -55,48 +82,35 @@ LABKEY.LeveyJenningsPlotHelper.getTrackingDataStore = function(config)
+ ", TrapezoidalCurveFit.AUC, TrapezoidalCurveFit.AUCQCFlagsEnabled"
+ ", MaxFI AS HighMFI, MaxFIQCFlagsEnabled AS HighMFIQCFlagsEnabled"
//columns needed for guide set ranges (value based or run based)
- + ", CASE WHEN GuideSet.ValueBased=true THEN GuideSet.EC504PLAverage ELSE GuideSet.\"Four ParameterCurveFit\".EC50Average END AS GuideSetEC504PLAverage"
- + ", CASE WHEN GuideSet.ValueBased=true THEN GuideSet.EC504PLStdDev ELSE GuideSet.\"Four ParameterCurveFit\".EC50StdDev END AS GuideSetEC504PLStdDev"
- + ", CASE WHEN GuideSet.ValueBased=true THEN GuideSet.EC505PLAverage ELSE GuideSet.\"Five ParameterCurveFit\".EC50Average END AS GuideSetEC505PLAverage"
- + ", CASE WHEN GuideSet.ValueBased=true THEN GuideSet.EC505PLStdDev ELSE GuideSet.\"Five ParameterCurveFit\".EC50StdDev END AS GuideSetEC505PLStdDev"
- + ", CASE WHEN GuideSet.ValueBased=true THEN GuideSet.AUCAverage ELSE GuideSet.TrapezoidalCurveFit.AUCAverage END AS GuideSetAUCAverage"
- + ", CASE WHEN GuideSet.ValueBased=true THEN GuideSet.AUCStdDev ELSE GuideSet.TrapezoidalCurveFit.AUCStdDev END AS GuideSetAUCStdDev"
- + ", CASE WHEN GuideSet.ValueBased=true THEN GuideSet.MaxFIAverage ELSE GuideSet.TitrationMaxFIAverage END AS GuideSetHighMFIAverage"
- + ", CASE WHEN GuideSet.ValueBased=true THEN GuideSet.MaxFIStdDev ELSE GuideSet.TitrationMaxFIStdDev END AS GuideSetHighMFIStdDev"
+ + ", gs.GuideSetEC504PLAverage"
+ + ", gs.GuideSetEC504PLStdDev"
+ + ", gs.GuideSetEC505PLAverage"
+ + ", gs.GuideSetEC505PLStdDev"
+ + ", gs.GuideSetAUCAverage"
+ + ", gs.GuideSetAUCStdDev"
+ + ", gs.GuideSetHighMFIAverage"
+ + ", gs.GuideSetHighMFIStdDev"
+ " FROM AnalyteTitration "
+ + " LEFT JOIN (" + guideSetRangeValuesSQL + ") AS gs ON GuideSet = gs.RowId"
+ whereClause;
}
else if (config.controlType == "SinglePoint")
{
sql += ", AverageFiBkgd AS MFI, AverageFiBkgdQCFlagsEnabled AS MFIQCFlagsEnabled"
//columns needed for guide set ranges (value based or run based)
- + ", CASE WHEN GuideSet.ValueBased=true THEN GuideSet.MaxFIAverage ELSE GuideSet.SinglePointControlFIAverage END AS GuideSetMFIAverage"
- + ", CASE WHEN GuideSet.ValueBased=true THEN GuideSet.MaxFIStdDev ELSE GuideSet.SinglePointControlFIStdDev END AS GuideSetMFIStdDev"
+ + ", gs.GuideSetMFIAverage"
+ + ", gs.GuideSetMFIStdDev"
+ " FROM AnalyteSinglePointControl "
+ + " LEFT JOIN (" + guideSetRangeValuesSQL + ") AS gs ON GuideSet = gs.RowId"
+ whereClause;
}
- if (config.orderBy)
- sql += config.orderBy;
-
- // NOTE: watch out for this case. mixing with other params might end badly (consider override)
- // used in LABKEY.LeveyJenningsPlotHelper.getLeveyJenningsPlotWindow
- if (config.centerDate)
- {
- var finalSql = "( " + sql;
- finalSql += " AND Analyte.Data.AcquisitionDate >= CAST('" + config.centerDate + "' AS DATE)";
- finalSql += " ORDER BY Analyte.Data.AcquisitionDate ASC, "+controlTypeColName+".Run.Created ASC LIMIT 30 )";
- finalSql += " UNION ( " + sql;
- finalSql += " AND Analyte.Data.AcquisitionDate < CAST('" + config.centerDate + "' AS DATE)";
- finalSql += " ORDER BY Analyte.Data.AcquisitionDate DESC, "+controlTypeColName+".Run.Created DESC LIMIT 30 )";
-
- sql = finalSql; // swap back
- }
-
var store = new LABKEY.ext.Store({
autoLoad: false,
schemaName: 'assay.Luminex.' + LABKEY.QueryKey.encodePart(config.assayName),
sql: sql,
+ sort: config.sort ? config.sort : '-Analyte/Data/AcquisitionDate, -' + controlTypeColName + '/Run/Created',
+ maxRows: config.maxRows ? config.maxRows : -1,
containerFilter: LABKEY.Query.containerFilter.allFolders,
scope: config.scope
});
@@ -269,7 +283,6 @@ LABKEY.LeveyJenningsPlotHelper.getLeveyJenningsPlotWindow = function(protocolId,
var _getConfig = function(assayName)
{
// note make sure to mix assayName into config...
-
LABKEY.Query.selectRows({
schemaName: 'assay.Luminex.' + LABKEY.QueryKey.encodePart(assayName),
queryName: 'Analyte'+controlType,
@@ -291,7 +304,7 @@ LABKEY.LeveyJenningsPlotHelper.getLeveyJenningsPlotWindow = function(protocolId,
scope: this, // shouldn't matter but might blow up without it.
plotType: plotType,
runId: row[controlType+'/Run'],
- centerDate: row['Analyte/Data/AcquisitionDate']
+ sort: 'Analyte/Data/AcquisitionDate, ' + controlType + '/Run/Created',
};
_createWindow(config);
diff --git a/luminex/webapp/luminex/LeveyJenningsTrackingDataPanel.js b/luminex/webapp/luminex/LeveyJenningsTrackingDataPanel.js
index ae4dd4e7dd..f34d93b840 100644
--- a/luminex/webapp/luminex/LeveyJenningsTrackingDataPanel.js
+++ b/luminex/webapp/luminex/LeveyJenningsTrackingDataPanel.js
@@ -243,10 +243,6 @@ LABKEY.LeveyJenningsTrackingDataPanel = Ext.extend(Ext.grid.GridPanel, {
}
// create a new store now that the graph params are selected and bind it to the grid
- var controlTypeColName = this.controlType == "SinglePoint" ? "SinglePointControl" : this.controlType;
- var orderByClause = " ORDER BY Analyte.Data.AcquisitionDate DESC, " + controlTypeColName + ".Run.Created DESC"
- + " LIMIT " + (hasReportFilter ? "10000" : this.defaultRowSize);
-
var storeConfig = {
assayName: this.assayName,
controlName: this.controlName,
@@ -254,9 +250,9 @@ LABKEY.LeveyJenningsTrackingDataPanel = Ext.extend(Ext.grid.GridPanel, {
analyte: this.analyte,
isotype: this.isotype,
conjugate: this.conjugate,
+ maxRows: !hasReportFilter ? this.defaultRowSize : undefined,
scope: this,
loadListener: this.storeLoaded,
- orderBy: orderByClause
};
if (whereClause != "")
@@ -269,7 +265,7 @@ LABKEY.LeveyJenningsTrackingDataPanel = Ext.extend(Ext.grid.GridPanel, {
this.store.on('exception', function(store, type, action, options, response){
var errorJson = Ext.util.JSON.decode(response.responseText);
if (errorJson.exception) {
- Ext.get('EC504PLTrendPlotDiv').update("" + errorJson.exception + "");
+ Ext.get(document.querySelector('.ljTrendPlot').id).update("" + errorJson.exception + "");
}
});