diff --git a/MATScommon b/MATScommon index b3141ef2a2..9b17e007fd 160000 --- a/MATScommon +++ b/MATScommon @@ -1 +1 @@ -Subproject commit b3141ef2a2a829b90d5e2dad2609ab3ec7b410b1 +Subproject commit 9b17e007fde376e37191a45684168a8bdce09c7e diff --git a/apps/cb-ceiling/server/dataFunctions/data_contour.js b/apps/cb-ceiling/server/dataFunctions/data_contour.js index 78f78f5a79..5a34dbe825 100644 --- a/apps/cb-ceiling/server/dataFunctions/data_contour.js +++ b/apps/cb-ceiling/server/dataFunctions/data_contour.js @@ -78,10 +78,10 @@ dataContour = function (plotParams, plotFunction) { cbPool.trfmListToCSVString(validTimes, null, false) ); } else { - queryTemplate = cbPool.trfmSQLRemoveClause(queryTemplate, "vxVALID_TIMES"); + queryTemplate = cbPool.trfmSQLRemoveClause(queryTemplate, "{{vxVALID_TIMES}}"); } } else { - queryTemplate = cbPool.trfmSQLRemoveClause(queryTemplate, "vxVALID_TIMES"); + queryTemplate = cbPool.trfmSQLRemoveClause(queryTemplate, "{{vxVALID_TIMES}}"); } if (xAxisParam !== "Fcst lead time" && yAxisParam !== "Fcst lead time") { @@ -91,9 +91,9 @@ dataContour = function (plotParams, plotFunction) { `INFO: ${label}'s forecast lead time is undefined. Please assign it a value.` ); } - queryTemplate = queryTemplate.replace(/vxFCST_LEN/g, forecastLength); + queryTemplate = queryTemplate.replace(/{{vxFCST_LEN}}/g, forecastLength); } else { - queryTemplate = cbPool.trfmSQLRemoveClause(queryTemplate, "vxFCST_LEN"); + queryTemplate = cbPool.trfmSQLRemoveClause(queryTemplate, "{{vxFCST_LEN}}"); } if ( @@ -105,7 +105,7 @@ dataContour = function (plotParams, plotFunction) { } else { dateString = "m0.fcstValidEpoch"; } - queryTemplate = queryTemplate.replace(/vxDATE_STRING/g, dateString); + queryTemplate = queryTemplate.replace(/{{vxDATE_STRING}}/g, dateString); const regionType = curve["region-type"]; if (regionType === "Select stations") { @@ -126,13 +126,13 @@ dataContour = function (plotParams, plotFunction) { { optionsMap: 1 } ).optionsMap; - queryTemplate = queryTemplate.replace(/vxFROM_SECS/g, fromSecs); - queryTemplate = queryTemplate.replace(/vxTO_SECS/g, toSecs); - queryTemplate = queryTemplate.replace(/vxTHRESHOLD/g, threshold); - queryTemplate = queryTemplate.replace(/vxREGION/g, region); - queryTemplate = queryTemplate.replace(/vxMODEL/g, model); - queryTemplate = queryTemplate.replace(/vxXVAL_CLAUSE/g, xValClause); - queryTemplate = queryTemplate.replace(/vxYVAL_CLAUSE/g, yValClause); + queryTemplate = queryTemplate.replace(/{{vxFROM_SECS}}/g, fromSecs); + queryTemplate = queryTemplate.replace(/{{vxTO_SECS}}/g, toSecs); + queryTemplate = queryTemplate.replace(/{{vxTHRESHOLD}}/g, threshold); + queryTemplate = queryTemplate.replace(/{{vxREGION}}/g, region); + queryTemplate = queryTemplate.replace(/{{vxMODEL}}/g, model); + queryTemplate = queryTemplate.replace(/{{vxXVAL_CLAUSE}}/g, xValClause); + queryTemplate = queryTemplate.replace(/{{vxYVAL_CLAUSE}}/g, yValClause); // For contours, this functions as the colorbar label. const statType = statisticOptionsMap[statisticSelect][0]; diff --git a/apps/cb-ceiling/server/dataFunctions/data_contour_diff.js b/apps/cb-ceiling/server/dataFunctions/data_contour_diff.js index a5caec245b..2daa5f140c 100644 --- a/apps/cb-ceiling/server/dataFunctions/data_contour_diff.js +++ b/apps/cb-ceiling/server/dataFunctions/data_contour_diff.js @@ -79,14 +79,14 @@ dataContourDiff = function (plotParams, plotFunction) { const validTimes = curve["valid-time"] === undefined ? [] : curve["valid-time"]; if (validTimes.length !== 0 && validTimes !== matsTypes.InputTypes.unused) { queryTemplate = queryTemplate.replace( - /vxVALID_TIMES/g, + /{{vxVALID_TIMES}}/g, cbPool.trfmListToCSVString(validTimes, null, false) ); } else { - queryTemplate = cbPool.trfmSQLRemoveClause(queryTemplate, "vxVALID_TIMES"); + queryTemplate = cbPool.trfmSQLRemoveClause(queryTemplate, "{{vxVALID_TIMES}}"); } } else { - queryTemplate = cbPool.trfmSQLRemoveClause(queryTemplate, "vxVALID_TIMES"); + queryTemplate = cbPool.trfmSQLRemoveClause(queryTemplate, "{{vxVALID_TIMES}}"); } if (xAxisParam !== "Fcst lead time" && yAxisParam !== "Fcst lead time") { @@ -96,9 +96,9 @@ dataContourDiff = function (plotParams, plotFunction) { `INFO: ${label}'s forecast lead time is undefined. Please assign it a value.` ); } - queryTemplate = queryTemplate.replace(/vxFCST_LEN/g, forecastLength); + queryTemplate = queryTemplate.replace(/{{vxFCST_LEN}}/g, forecastLength); } else { - queryTemplate = cbPool.trfmSQLRemoveClause(queryTemplate, "vxFCST_LEN"); + queryTemplate = cbPool.trfmSQLRemoveClause(queryTemplate, "{{vxFCST_LEN}}"); } if ( @@ -110,7 +110,7 @@ dataContourDiff = function (plotParams, plotFunction) { } else { dateString = "m0.fcstValidEpoch"; } - queryTemplate = queryTemplate.replace(/vxDATE_STRING/g, dateString); + queryTemplate = queryTemplate.replace(/{{vxDATE_STRING}}/g, dateString); const regionType = curve["region-type"]; if (regionType === "Select stations") { @@ -131,13 +131,13 @@ dataContourDiff = function (plotParams, plotFunction) { { optionsMap: 1 } ).optionsMap; - queryTemplate = queryTemplate.replace(/vxFROM_SECS/g, fromSecs); - queryTemplate = queryTemplate.replace(/vxTO_SECS/g, toSecs); - queryTemplate = queryTemplate.replace(/vxTHRESHOLD/g, threshold); - queryTemplate = queryTemplate.replace(/vxREGION/g, region); - queryTemplate = queryTemplate.replace(/vxMODEL/g, model); - queryTemplate = queryTemplate.replace(/vxXVAL_CLAUSE/g, xValClause); - queryTemplate = queryTemplate.replace(/vxYVAL_CLAUSE/g, yValClause); + queryTemplate = queryTemplate.replace(/{{vxFROM_SECS}}/g, fromSecs); + queryTemplate = queryTemplate.replace(/{{vxTO_SECS}}/g, toSecs); + queryTemplate = queryTemplate.replace(/{{vxTHRESHOLD}}/g, threshold); + queryTemplate = queryTemplate.replace(/{{vxREGION}}/g, region); + queryTemplate = queryTemplate.replace(/{{vxMODEL}}/g, model); + queryTemplate = queryTemplate.replace(/{{vxXVAL_CLAUSE}}/g, xValClause); + queryTemplate = queryTemplate.replace(/{{vxYVAL_CLAUSE}}/g, yValClause); // For contours, this functions as the colorbar label. var statType = statisticOptionsMap[statisticSelect][0]; diff --git a/apps/cb-ceiling/server/dataFunctions/data_dailymodelcycle.js b/apps/cb-ceiling/server/dataFunctions/data_dailymodelcycle.js index adc00ae497..16c4ac02d2 100644 --- a/apps/cb-ceiling/server/dataFunctions/data_dailymodelcycle.js +++ b/apps/cb-ceiling/server/dataFunctions/data_dailymodelcycle.js @@ -10,6 +10,7 @@ import { matsDataDiffUtils, matsDataCurveOpsUtils, matsDataProcessUtils, + matsMiddleValidTime, } from "meteor/randyp:mats-common"; import { moment } from "meteor/momentjs:moment"; @@ -42,6 +43,7 @@ dataDailyModelCycle = function (plotParams, plotFunction) { let xmin = Number.MAX_VALUE; let ymin = Number.MAX_VALUE; const idealValues = []; + let statement = ""; for (let curveIndex = 0; curveIndex < curvesLength; curveIndex++) { // initialize variables specific to each curve @@ -54,23 +56,13 @@ dataDailyModelCycle = function (plotParams, plotFunction) { "assets/app/sqlTemplates/tmpl_DailyModelCycle_region.sql", "utf8" ); - } else { - queryTemplate = fs.readFileSync( - "assets/app/sqlTemplates/tmpl_DailyModelCycle_stations.sql", - "utf8" - ); } - console.log(`\nqueryTemplate:\n${queryTemplate}`); - - queryTemplate = queryTemplate.replace(/{{vxFROM_SECS}}/g, fromSecs); - queryTemplate = queryTemplate.replace(/{{vxTO_SECS}}/g, toSecs); const { diffFrom } = curve; const { label } = curve; var { variable } = curve; const model = matsCollections["data-source"].findOne({ name: "data-source" }) .optionsMap[variable][curve["data-source"]][0]; - queryTemplate = queryTemplate.replace(/{{vxMODEL}}/g, model); var thresholdStr = curve.threshold; let threshold = Object.keys( matsCollections.threshold.findOne({ name: "threshold" }).valuesMap[variable] @@ -81,7 +73,6 @@ dataDailyModelCycle = function (plotParams, plotFunction) { ] === thresholdStr ); threshold = threshold.replace(/_/g, "."); - queryTemplate = queryTemplate.replace(/{{vxTHRESHOLD}}/g, threshold); if (curve["utc-cycle-start"].length !== 1) { throw new Error( "INFO: Please select exactly one UTC Cycle Init Hour for this plot type." @@ -89,10 +80,6 @@ dataDailyModelCycle = function (plotParams, plotFunction) { } const utcCycleStart = Number(curve["utc-cycle-start"][0]); utcCycleStarts[curveIndex] = utcCycleStart; - queryTemplate = queryTemplate.replace( - /{{vxUTC_CYCLE_START}}/g, - cbPool.trfmListToCSVString(utcCycleStart, null, false) - ); const statisticSelect = curve.statistic; const statisticOptionsMap = matsCollections.statistic.findOne( { name: "statistic" }, @@ -109,18 +96,17 @@ dataDailyModelCycle = function (plotParams, plotFunction) { regionStr ); queryTemplate = queryTemplate.replace(/{{vxREGION}}/g, region); + queryTemplate = queryTemplate.replace(/{{vxFROM_SECS}}/g, fromSecs); + queryTemplate = queryTemplate.replace(/{{vxTO_SECS}}/g, toSecs); + queryTemplate = queryTemplate.replace(/{{vxMODEL}}/g, model); + queryTemplate = queryTemplate.replace(/{{vxTHRESHOLD}}/g, threshold); + queryTemplate = queryTemplate.replace( + /{{vxUTC_CYCLE_START}}/g, + cbPool.trfmListToCSVString(utcCycleStart, null, false) + ); } else { - const sitesList = curve.sites === undefined ? [] : curve.sites; - if (sitesList.length > 0 && sitesList !== matsTypes.InputTypes.unused) { - queryTemplate = queryTemplate.replace( - /{{vxSITES_LIST_OBS}}/g, - cbPool.trfmListToCSVString(sitesList, "obs.data.", false) - ); - queryTemplate = queryTemplate.replace( - /{{vxSITES_LIST_MODELS}}/g, - cbPool.trfmListToCSVString(sitesList, "models.data.", false) - ); - } else { + sitesList = curve.sites === undefined ? [] : curve.sites; + if (sitesList.length === 0 && sitesList === matsTypes.InputTypes.unused) { throw new Error( "INFO: Please add sites in order to get a single/multi station plot." ); @@ -140,23 +126,45 @@ dataDailyModelCycle = function (plotParams, plotFunction) { var d; if (!diffFrom) { - // this is a database driven curve, not a difference curve - // prepare the query from the above parameters - statement = cbPool.trfmSQLForDbTarget(queryTemplate); - dataRequests[label] = statement; - var queryResult; const startMoment = moment(); var finishMoment; + try { - // send the query statement to the query function - queryResult = matsDataQueryUtils.queryDBSpecialtyCurve( - cbPool, - statement, - appParams, - statisticSelect - ); + if (regionType === "Predefined region") { + // this is a database driven curve, not a difference curve + // send the query statement to the query function + statement = cbPool.trfmSQLForDbTarget(queryTemplate); + queryResult = matsDataQueryUtils.queryDBSpecialtyCurve( + cbPool, + statement, + appParams, + statisticSelect + ); + } else { + // send to matsMiddle + const tss = new matsMiddleDailyModelCycle.MatsMiddleDailyModelCycle(cbPool); + + const rows = tss.processStationQuery( + "Ceiling", + sitesList, + model, + threshold, + fromSecs, + toSecs, + utcCycleStart + ); + + // send the query statement to the query function + queryResult = matsDataQueryUtils.queryDBSpecialtyCurve( + cbPool, + rows, + appParams, + statisticSelect + ); + } + finishMoment = moment(); dataRequests[`data retrieval (query) time - ${label}`] = { begin: startMoment.format(), diff --git a/apps/cb-ceiling/server/dataFunctions/data_map.js b/apps/cb-ceiling/server/dataFunctions/data_map.js index f9cab5ead4..af7f2cf02b 100644 --- a/apps/cb-ceiling/server/dataFunctions/data_map.js +++ b/apps/cb-ceiling/server/dataFunctions/data_map.js @@ -9,6 +9,7 @@ import { matsDataQueryUtils, matsDataCurveOpsUtils, matsDataPlotOpsUtils, + matsMiddleMap, } from "meteor/randyp:mats-common"; import { moment } from "meteor/momentjs:moment"; @@ -88,23 +89,37 @@ dataMap = function (plotParams, plotFunction) { "INFO: Please add sites in order to get a single/multi station plot." ); } - statement = cbPool.trfmSQLForDbTarget(queryTemplate); - - dataRequests[label] = statement; let queryResult; const startMoment = moment(); let finishMoment; + const statement = ""; + try { + // send to matsMiddle + const tss = new matsMiddleMap.MatsMiddleMap(cbPool); + + const rows = tss.processStationQuery( + "Ceiling", + sitesList, + model, + forecastLength, + threshold, + fromSecs, + toSecs, + validTimes + ); + // send the query statement to the query function queryResult = matsDataQueryUtils.queryDBMapCTC( cbPool, - statement, + rows, model, statistic, siteMap, appParams ); + finishMoment = moment(); dataRequests[`data retrieval (query) time - ${label}`] = { begin: startMoment.format(), diff --git a/apps/cb-ceiling/server/dataFunctions/data_series.js b/apps/cb-ceiling/server/dataFunctions/data_series.js index e3aa79053c..5492e8e7d6 100644 --- a/apps/cb-ceiling/server/dataFunctions/data_series.js +++ b/apps/cb-ceiling/server/dataFunctions/data_series.js @@ -149,6 +149,7 @@ dataSeries = function (plotParams, plotFunction) { try { if (regionType === "Predefined region") { statement = cbPool.trfmSQLForDbTarget(queryTemplate); + // send the query statement to the query function queryResult = matsDataQueryUtils.queryDBTimeSeries( cbPool, @@ -166,6 +167,7 @@ dataSeries = function (plotParams, plotFunction) { } else { // send to matsMiddle const tss = new matsMiddleTimeSeries.MatsMiddleTimeSeries(cbPool); + const rows = tss.processStationQuery( "Ceiling", sitesList, diff --git a/apps/cb-ceiling/server/dataFunctions/data_validtime.js b/apps/cb-ceiling/server/dataFunctions/data_validtime.js index cf07bf6a93..460d974894 100644 --- a/apps/cb-ceiling/server/dataFunctions/data_validtime.js +++ b/apps/cb-ceiling/server/dataFunctions/data_validtime.js @@ -10,6 +10,7 @@ import { matsDataDiffUtils, matsDataCurveOpsUtils, matsDataProcessUtils, + matsMiddleValidTime, } from "meteor/randyp:mats-common"; import { moment } from "meteor/momentjs:moment"; @@ -39,6 +40,7 @@ dataValidTime = function (plotParams, plotFunction) { let xmin = Number.MAX_VALUE; let ymin = Number.MAX_VALUE; const idealValues = []; + let statement = ""; for (let curveIndex = 0; curveIndex < curvesLength; curveIndex++) { // initialize variables specific to each curve @@ -51,11 +53,6 @@ dataValidTime = function (plotParams, plotFunction) { "assets/app/sqlTemplates/tmpl_ValidTime_region.sql", "utf8" ); - } else { - queryTemplate = fs.readFileSync( - "assets/app/sqlTemplates/tmpl_ValidTime_stations.sql", - "utf8" - ); } const { diffFrom } = curve; @@ -83,12 +80,7 @@ dataValidTime = function (plotParams, plotFunction) { { optionsMap: 1 } ).optionsMap; - queryTemplate = queryTemplate.replace(/{{vxFROM_SECS}}/g, fromSecs); - queryTemplate = queryTemplate.replace(/{{vxTO_SECS}}/g, toSecs); - queryTemplate = queryTemplate.replace(/{{vxMODEL}}/g, model); - queryTemplate = queryTemplate.replace(/{{vxTHRESHOLD}}/g, threshold); - queryTemplate = queryTemplate.replace(/{{vxFCST_LEN}}/g, forecastLength); - + let sitesList; if (regionType === "Predefined region") { var regionStr = curve.region; const region = Object.keys( @@ -99,18 +91,14 @@ dataValidTime = function (plotParams, plotFunction) { regionStr ); queryTemplate = queryTemplate.replace(/{{vxREGION}}/g, region); + queryTemplate = queryTemplate.replace(/{{vxFROM_SECS}}/g, fromSecs); + queryTemplate = queryTemplate.replace(/{{vxTO_SECS}}/g, toSecs); + queryTemplate = queryTemplate.replace(/{{vxMODEL}}/g, model); + queryTemplate = queryTemplate.replace(/{{vxTHRESHOLD}}/g, threshold); + queryTemplate = queryTemplate.replace(/{{vxFCST_LEN}}/g, forecastLength); } else { - const sitesList = curve.sites === undefined ? [] : curve.sites; - if (sitesList.length > 0 && sitesList !== matsTypes.InputTypes.unused) { - queryTemplate = queryTemplate.replace( - /{{vxSITES_LIST_OBS}}/g, - cbPool.trfmListToCSVString(sitesList, "obs.data.", false) - ); - queryTemplate = queryTemplate.replace( - /{{vxSITES_LIST_MODELS}}/g, - cbPool.trfmListToCSVString(sitesList, "models.data.", false) - ); - } else { + sitesList = curve.sites === undefined ? [] : curve.sites; + if (sitesList.length === 0 && sitesList === matsTypes.InputTypes.unused) { throw new Error( "INFO: Please add sites in order to get a single/multi station plot." ); @@ -130,21 +118,44 @@ dataValidTime = function (plotParams, plotFunction) { var d; if (!diffFrom) { - statement = cbPool.trfmSQLForDbTarget(queryTemplate); - dataRequests[label] = statement; - var queryResult; const startMoment = moment(); var finishMoment; + try { - // send the query statement to the query function - queryResult = matsDataQueryUtils.queryDBSpecialtyCurve( - cbPool, - statement, - appParams, - statisticSelect - ); + if (regionType === "Predefined region") { + // send the query statement to the query function + statement = cbPool.trfmSQLForDbTarget(queryTemplate); + queryResult = matsDataQueryUtils.queryDBSpecialtyCurve( + cbPool, + statement, + appParams, + statisticSelect + ); + } else { + // send to matsMiddle + const tss = new matsMiddleValidTime.MatsMiddleValidTime(cbPool); + + const rows = tss.processStationQuery( + "Ceiling", + sitesList, + model, + forecastLength, + threshold, + fromSecs, + toSecs + ); + + // send the query statement to the query function + queryResult = matsDataQueryUtils.queryDBSpecialtyCurve( + cbPool, + rows, + appParams, + statisticSelect + ); + } + finishMoment = moment(); dataRequests[`data retrieval (query) time - ${label}`] = { begin: startMoment.format(), diff --git a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_Contour.sql b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_Contour.sql index 2964ad29fc..7c58e0d2ca 100644 --- a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_Contour.sql +++ b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_Contour.sql @@ -1,26 +1,27 @@ -SELECT vxXVAL_CLAUSE AS xVal, - vxYVAL_CLAUSE yVal, +SELECT {{vxXVAL_CLAUSE}} AS xVal, + {{vxYVAL_CLAUSE}} yVal, COUNT(DISTINCT m0.fcstValidEpoch) N_times, MIN(m0.fcstValidEpoch) min_secs, MAX(m0.fcstValidEpoch) max_secs, - SUM(m0.data.['vxTHRESHOLD'].hits) hit, - SUM(m0.data.['vxTHRESHOLD'].false_alarms) fa, - SUM(m0.data.['vxTHRESHOLD'].misses) miss, - SUM(m0.data.['vxTHRESHOLD'].correct_negatives) cn, - ARRAY_SORT(ARRAY_AGG(TO_STRING(m0.fcstValidEpoch) || ';' || TO_STRING(m0.data.['vxTHRESHOLD'].hits) || ';' || TO_STRING(m0.data.['vxTHRESHOLD'].false_alarms) || ';' || TO_STRING(m0.data.['vxTHRESHOLD'].misses) || ';' || TO_STRING(m0.data.['vxTHRESHOLD'].correct_negatives))) sub_data, - COUNT(m0.data.['vxTHRESHOLD'].hits) N0 -FROM vxDBTARGET m0 + SUM(m0.data.['{{vxTHRESHOLD}}'].hits) hit, + SUM(m0.data.['{{vxTHRESHOLD}}'].false_alarms) fa, + SUM(m0.data.['{{vxTHRESHOLD}}'].misses) miss, + SUM(m0.data.['{{vxTHRESHOLD}}'].correct_negatives) cn, + ARRAY_SORT(ARRAY_AGG(TO_STRING(m0.fcstValidEpoch) || ';' || TO_STRING(m0.data.['{{vxTHRESHOLD}}'].hits) || ';' || TO_STRING(m0.data.['{{vxTHRESHOLD}}'].false_alarms) || ';' || TO_STRING(m0.data.['{{vxTHRESHOLD}}'].misses) || ';' || TO_STRING(m0.data.['{{vxTHRESHOLD}}'].correct_negatives))) sub_data, + COUNT(m0.data.['{{vxTHRESHOLD}}'].hits) N0 +FROM {{vxDBTARGET}} m0 WHERE m0.type='DD' AND m0.docType='CTC' + AND m0.subDocType = 'CEILING' AND m0.subset='METAR' AND m0.version='V01' - AND m0.model='vxMODEL' - AND m0.region='vxREGION' - AND vxDATE_STRING >= vxFROM_SECS - AND vxDATE_STRING <= vxTO_SECS - AND m0.fcstValidEpoch%(24*3600)/3600 IN[vxVALID_TIMES] - AND m0.fcstLen = vxFCST_LEN -GROUP BY vxXVAL_CLAUSE, - vxYVAL_CLAUSE + AND m0.model='{{vxMODEL}}' + AND m0.region='{{vxREGION}}' + AND {{vxDATE_STRING}} >= {{vxFROM_SECS}} + AND {{vxDATE_STRING}} <= {{vxTO_SECS}} + AND m0.fcstValidEpoch%(24*3600)/3600 IN[{{vxVALID_TIMES}}] + AND m0.fcstLen = {{vxFCST_LEN}} +GROUP BY {{vxXVAL_CLAUSE}}, + {{vxYVAL_CLAUSE}} ORDER BY xVal, yVal; \ No newline at end of file diff --git a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DailyModelCycle_region.sql b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DailyModelCycle_region.sql index 88bd79e45a..bbda9515fd 100644 --- a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DailyModelCycle_region.sql +++ b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DailyModelCycle_region.sql @@ -11,6 +11,7 @@ SELECT m0.fcstValidEpoch AS avtime, FROM {{vxDBTARGET}} m0 WHERE m0.type='DD' AND m0.docType='CTC' + AND m0.subDocType = 'CEILING' AND m0.subset='METAR' AND m0.version='V01' AND m0.model='{{vxMODEL}}' diff --git a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DailyModelCycle_stations.sql b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DailyModelCycle_stations.sql deleted file mode 100644 index a6c8fea205..0000000000 --- a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DailyModelCycle_stations.sql +++ /dev/null @@ -1,62 +0,0 @@ -SELECT m.mfve AS avtime, - ARRAY_MIN(stats[*].fve) AS min_secs, - ARRAY_MAX(stats[*].fve) AS max_secs, - ARRAY_SUM(stats[*].hit) AS hit, - ARRAY_SUM(stats[*].miss) AS miss, - ARRAY_SUM(stats[*].false_alarm) AS fa, - ARRAY_SUM(stats[*].correct_negative) AS cn, - ARRAY_SUM(stats[*].total) AS N0, - ARRAY_COUNT(ARRAY_DISTINCT(stats[*].fve)) AS N_times, - ARRAY_SORT(stats[*].sub) AS sub_data -FROM ( - SELECT sdu.ovfe AS ovfe, - ARRAY_AGG(sdu) AS data - FROM ( - SELECT stationData - FROM vxDBTARGET AS obs - LET ofve = obs.fcstValidEpoch, - stationData = ARRAY OBJECT_ADD(d, 'ofve', ofve ) FOR d IN ( [vxSITES_LIST_OBS] ) END - WHERE type = "DD" - AND docType = "obs" - AND version = "V01" - AND obs.fcstValidEpoch BETWEEN vxFROM_SECS AND vxTO_SECS ) sd - UNNEST sd.stationData sdu - GROUP BY sdu.ovfe - ORDER BY sdu.ovfe) o, -( - SELECT sdu.mfve AS mfve, - ARRAY_AGG(sdu) AS data - FROM ( - SELECT modelData - FROM vxDBTARGET AS models - LET mfve = models.fcstValidEpoch, - modelData_tmp = ARRAY OBJECT_ADD(d, 'mfve', mfve ) FOR d IN ( [vxSITES_LIST_MODELS] ) END, - modelData = ARRAY OBJECT_ADD(d, 'fcst', models.fcstLen ) FOR d IN ( modelData_tmp ) END - WHERE type = "DD" - AND docType = "model" - AND model = "vxMODEL" - AND version = "V01" - AND models.fcstLen < 24 - AND (models.fcstValidEpoch - models.fcstLen*3600)%(24*3600)/3600 IN[vxUTC_CYCLE_START] - AND models.fcstValidEpoch BETWEEN vxFROM_SECS AND vxTO_SECS) sd - UNNEST sd.modelData sdu - GROUP BY sdu.mfve - ORDER BY sdu.mfve) m -LET stats = ARRAY( FIRST { 'hit' :CASE WHEN mv.Ceiling < vxTHRESHOLD - AND ov.Ceiling < vxTHRESHOLD THEN 1 ELSE 0 END, - 'miss' :CASE WHEN NOT mv.Ceiling < vxTHRESHOLD - AND ov.Ceiling < vxTHRESHOLD THEN 1 ELSE 0 END, - 'false_alarm' :CASE WHEN mv.Ceiling < vxTHRESHOLD - AND NOT ov.Ceiling < vxTHRESHOLD THEN 1 ELSE 0 END, - 'correct_negative' :CASE WHEN NOT mv.Ceiling < vxTHRESHOLD - AND NOT ov.Ceiling < vxTHRESHOLD THEN 1 ELSE 0 END, - 'total' :CASE WHEN mv.Ceiling IS NOT MISSING - AND ov.Ceiling IS NOT MISSING THEN 1 ELSE 0 END, - 'fve': mv.mfve, - 'fcst': mv.fcst, - 'sub': TO_STRING(mv.mfve) || ';' || CASE WHEN mv.Ceiling < vxTHRESHOLD - AND ov.Ceiling < vxTHRESHOLD THEN '1' ELSE '0' END || ';' || CASE WHEN mv.Ceiling < vxTHRESHOLD - AND NOT ov.Ceiling < vxTHRESHOLD THEN '1' ELSE '0' END || ';' || CASE WHEN NOT mv.Ceiling < vxTHRESHOLD - AND ov.Ceiling < vxTHRESHOLD THEN '1' ELSE '0' END || ';' || CASE WHEN NOT mv.Ceiling < vxTHRESHOLD - AND NOT ov.Ceiling < vxTHRESHOLD THEN '1' ELSE '0' END } FOR ov IN o.data WHEN ov.ofve = mv.mfve - AND ov.name = mv.name END ) FOR mv IN m.data END \ No newline at end of file diff --git a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_region_DieOff.sql b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_region_DieOff.sql index 87877b8045..cf5e8aa813 100644 --- a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_region_DieOff.sql +++ b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_region_DieOff.sql @@ -11,6 +11,7 @@ SELECT m0.fcstLen AS fcst_lead, FROM {{vxDBTARGET}} m0 WHERE m0.type='DD' AND m0.docType='CTC' + AND m0.subDocType = 'CEILING' AND m0.subset='METAR' AND m0.version='V01' AND m0.model='{{vxMODEL}}' diff --git a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_region_SingleCycle.sql b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_region_SingleCycle.sql index 2fb3d25591..805484098a 100644 --- a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_region_SingleCycle.sql +++ b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_region_SingleCycle.sql @@ -11,6 +11,7 @@ SELECT m0.fcstLen AS fcst_lead, FROM {{vxDBTARGET}} m0 WHERE m0.type='DD' AND m0.docType='CTC' + AND m0.subDocType = 'CEILING' AND m0.subset='METAR' AND m0.version='V01' AND m0.model='{{vxMODEL}}' diff --git a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_region_UTC.sql b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_region_UTC.sql index 438d086df7..1dad01df02 100644 --- a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_region_UTC.sql +++ b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_region_UTC.sql @@ -11,6 +11,7 @@ SELECT m0.fcstLen AS fcst_lead, FROM {{vxDBTARGET}} m0 WHERE m0.type='DD' AND m0.docType='CTC' + AND m0.subDocType = 'CEILING' AND m0.subset='METAR' AND m0.version='V01' AND m0.model='{{vxMODEL}}' diff --git a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_stations_DieOff.sql b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_stations_DieOff.sql deleted file mode 100644 index 6946d110cd..0000000000 --- a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_stations_DieOff.sql +++ /dev/null @@ -1,61 +0,0 @@ -SELECT m.fcst AS fcst_lead, - ARRAY_MIN(stats[*].fve) AS min_secs, - ARRAY_MAX(stats[*].fve) AS max_secs, - ARRAY_SUM(stats[*].hit) AS hit, - ARRAY_SUM(stats[*].miss) AS miss, - ARRAY_SUM(stats[*].false_alarm) AS fa, - ARRAY_SUM(stats[*].correct_negative) AS cn, - ARRAY_SUM(stats[*].total) AS N0, - ARRAY_COUNT(ARRAY_DISTINCT(stats[*].fve)) AS N_times, - ARRAY_SORT(stats[*].sub) AS sub_data -FROM ( - SELECT sdu.ovfe AS ovfe, - ARRAY_AGG(sdu) AS data - FROM ( - SELECT stationData - FROM vxDBTARGET AS obs - LET ofve = obs.fcstValidEpoch, - stationData = ARRAY OBJECT_ADD(d, 'ofve', ofve ) FOR d IN ( [vxSITES_LIST_OBS] ) END - WHERE type = "DD" - AND docType = "obs" - AND version = "V01" - AND obs.fcstValidEpoch BETWEEN vxFROM_SECS AND vxTO_SECS ) sd - UNNEST sd.stationData sdu - GROUP BY sdu.ovfe - ORDER BY sdu.ovfe) o, -( - SELECT sdu.fcst AS fcst, - ARRAY_AGG(sdu) AS data - FROM ( - SELECT modelData - FROM vxDBTARGET AS models - LET mfve = models.fcstValidEpoch, - modelData_tmp = ARRAY OBJECT_ADD(d, 'mfve', mfve ) FOR d IN ( [vxSITES_LIST_MODELS] ) END, - modelData = ARRAY OBJECT_ADD(d, 'fcst', models.fcstLen ) FOR d IN ( modelData_tmp ) END - WHERE type = "DD" - AND docType = "model" - AND model = "vxMODEL" - AND version = "V01" - AND models.fcstValidEpoch BETWEEN vxFROM_SECS AND vxTO_SECS) sd - UNNEST sd.modelData sdu - GROUP BY sdu.fcst - ORDER BY sdu.fcst) m -LET stats = ARRAY( FIRST { 'hit' :CASE WHEN mv.Ceiling < vxTHRESHOLD - AND ov.Ceiling < vxTHRESHOLD THEN 1 ELSE 0 END, - 'miss' :CASE WHEN NOT mv.Ceiling < vxTHRESHOLD - AND ov.Ceiling < vxTHRESHOLD THEN 1 ELSE 0 END, - 'false_alarm' :CASE WHEN mv.Ceiling < vxTHRESHOLD - AND NOT ov.Ceiling < vxTHRESHOLD THEN 1 ELSE 0 END, - 'correct_negative' :CASE WHEN NOT mv.Ceiling < vxTHRESHOLD - AND NOT ov.Ceiling < vxTHRESHOLD THEN 1 ELSE 0 END, - 'total' :CASE WHEN mv.Ceiling IS NOT MISSING - AND ov.Ceiling IS NOT MISSING THEN 1 ELSE 0 END, - 'fve': mv.mfve, - 'fcst': mv.fcst, - 'sub': TO_STRING(mv.mfve) || ';' || CASE WHEN mv.Ceiling < vxTHRESHOLD - AND ov.Ceiling < vxTHRESHOLD THEN '1' ELSE '0' END || ';' || CASE WHEN mv.Ceiling < vxTHRESHOLD - AND NOT ov.Ceiling < vxTHRESHOLD THEN '1' ELSE '0' END || ';' || CASE WHEN NOT mv.Ceiling < vxTHRESHOLD - AND ov.Ceiling < vxTHRESHOLD THEN '1' ELSE '0' END || ';' || CASE WHEN NOT mv.Ceiling < vxTHRESHOLD - AND NOT ov.Ceiling < vxTHRESHOLD THEN '1' ELSE '0' END } FOR ov IN o.data WHEN ov.ofve = mv.mfve - AND ov.name = mv.name END ) FOR mv IN m.data END - \ No newline at end of file diff --git a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_stations_SingleCycle.sql b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_stations_SingleCycle.sql deleted file mode 100644 index 47dc5d9a1e..0000000000 --- a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_stations_SingleCycle.sql +++ /dev/null @@ -1,61 +0,0 @@ -SELECT m.fcst AS fcst_lead, - ARRAY_MIN(stats[*].fve) AS min_secs, - ARRAY_MAX(stats[*].fve) AS max_secs, - ARRAY_SUM(stats[*].hit) AS hit, - ARRAY_SUM(stats[*].miss) AS miss, - ARRAY_SUM(stats[*].false_alarm) AS fa, - ARRAY_SUM(stats[*].correct_negative) AS cn, - ARRAY_SUM(stats[*].total) AS N0, - ARRAY_COUNT(ARRAY_DISTINCT(stats[*].fve)) AS N_times, - ARRAY_SORT(stats[*].sub) AS sub_data -FROM ( - SELECT sdu.ovfe AS ovfe, - ARRAY_AGG(sdu) AS data - FROM ( - SELECT stationData - FROM vxDBTARGET AS obs - LET ofve = obs.fcstValidEpoch, - stationData = ARRAY OBJECT_ADD(d, 'ofve', ofve ) FOR d IN ( [vxSITES_LIST_OBS] ) END - WHERE type = "DD" - AND docType = "obs" - AND version = "V01" - AND obs.fcstValidEpoch-obs.fcstLen*3600 = vxFROM_SECS ) sd - UNNEST sd.stationData sdu - GROUP BY sdu.ovfe - ORDER BY sdu.ovfe) o, -( - SELECT sdu.fcst AS fcst, - ARRAY_AGG(sdu) AS data - FROM ( - SELECT modelData - FROM vxDBTARGET AS models - LET mfve = models.fcstValidEpoch, - modelData_tmp = ARRAY OBJECT_ADD(d, 'mfve', mfve ) FOR d IN ( [vxSITES_LIST_MODELS] ) END, - modelData = ARRAY OBJECT_ADD(d, 'fcst', models.fcstLen ) FOR d IN ( modelData_tmp ) END - WHERE type = "DD" - AND docType = "model" - AND model = "vxMODEL" - AND version = "V01" - AND models.fcstValidEpoch-models.fcstLen*3600 = vxFROM_SECS ) sd - UNNEST sd.modelData sdu - GROUP BY sdu.fcst - ORDER BY sdu.fcst) m -LET stats = ARRAY( FIRST { 'hit' :CASE WHEN mv.Ceiling < vxTHRESHOLD - AND ov.Ceiling < vxTHRESHOLD THEN 1 ELSE 0 END, - 'miss' :CASE WHEN NOT mv.Ceiling < vxTHRESHOLD - AND ov.Ceiling < vxTHRESHOLD THEN 1 ELSE 0 END, - 'false_alarm' :CASE WHEN mv.Ceiling < vxTHRESHOLD - AND NOT ov.Ceiling < vxTHRESHOLD THEN 1 ELSE 0 END, - 'correct_negative' :CASE WHEN NOT mv.Ceiling < vxTHRESHOLD - AND NOT ov.Ceiling < vxTHRESHOLD THEN 1 ELSE 0 END, - 'total' :CASE WHEN mv.Ceiling IS NOT MISSING - AND ov.Ceiling IS NOT MISSING THEN 1 ELSE 0 END, - 'fve': mv.mfve, - 'fcst': mv.fcst, - 'sub': TO_STRING(mv.mfve) || ';' || CASE WHEN mv.Ceiling < vxTHRESHOLD - AND ov.Ceiling < vxTHRESHOLD THEN '1' ELSE '0' END || ';' || CASE WHEN mv.Ceiling < vxTHRESHOLD - AND NOT ov.Ceiling < vxTHRESHOLD THEN '1' ELSE '0' END || ';' || CASE WHEN NOT mv.Ceiling < vxTHRESHOLD - AND ov.Ceiling < vxTHRESHOLD THEN '1' ELSE '0' END || ';' || CASE WHEN NOT mv.Ceiling < vxTHRESHOLD - AND NOT ov.Ceiling < vxTHRESHOLD THEN '1' ELSE '0' END } FOR ov IN o.data WHEN ov.ofve = mv.mfve - AND ov.name = mv.name END ) FOR mv IN m.data END - \ No newline at end of file diff --git a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_stations_UTC.sql b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_stations_UTC.sql deleted file mode 100644 index c90add1a29..0000000000 --- a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_DieOff_stations_UTC.sql +++ /dev/null @@ -1,63 +0,0 @@ -SELECT m.fcst AS fcst_lead, - ARRAY_MIN(stats[*].fve) AS min_secs, - ARRAY_MAX(stats[*].fve) AS max_secs, - ARRAY_SUM(stats[*].hit) AS hit, - ARRAY_SUM(stats[*].miss) AS miss, - ARRAY_SUM(stats[*].false_alarm) AS fa, - ARRAY_SUM(stats[*].correct_negative) AS cn, - ARRAY_SUM(stats[*].total) AS N0, - ARRAY_COUNT(ARRAY_DISTINCT(stats[*].fve)) AS N_times, - ARRAY_SORT(stats[*].sub) AS sub_data -FROM ( - SELECT sdu.ovfe AS ovfe, - ARRAY_AGG(sdu) AS data - FROM ( - SELECT stationData - FROM vxDBTARGET AS obs - LET ofve = obs.fcstValidEpoch, - stationData = ARRAY OBJECT_ADD(d, 'ofve', ofve ) FOR d IN ( [vxSITES_LIST_OBS] ) END - WHERE type = "DD" - AND docType = "obs" - AND version = "V01" - AND obs.fcstValidEpoch BETWEEN vxFROM_SECS AND vxTO_SECS - AND (obs.fcstValidEpoch - obs.fcstLen*3600)%(24*3600)/3600 IN[vxUTC_CYCLE_START]) sd - UNNEST sd.stationData sdu - GROUP BY sdu.ovfe - ORDER BY sdu.ovfe) o, -( - SELECT sdu.fcst AS fcst, - ARRAY_AGG(sdu) AS data - FROM ( - SELECT modelData - FROM vxDBTARGET AS models - LET mfve = models.fcstValidEpoch, - modelData_tmp = ARRAY OBJECT_ADD(d, 'mfve', mfve ) FOR d IN ( [vxSITES_LIST_MODELS] ) END, - modelData = ARRAY OBJECT_ADD(d, 'fcst', models.fcstLen ) FOR d IN ( modelData_tmp ) END - WHERE type = "DD" - AND docType = "model" - AND model = "vxMODEL" - AND version = "V01" - AND models.fcstValidEpoch BETWEEN vxFROM_SECS AND vxTO_SECS - AND (models.fcstValidEpoch - models.fcstLen*3600)%(24*3600)/3600 IN[vxUTC_CYCLE_START]) sd - UNNEST sd.modelData sdu - GROUP BY sdu.fcst - ORDER BY sdu.fcst) m -LET stats = ARRAY( FIRST { 'hit' :CASE WHEN mv.Ceiling < vxTHRESHOLD - AND ov.Ceiling < vxTHRESHOLD THEN 1 ELSE 0 END, - 'miss' :CASE WHEN NOT mv.Ceiling < vxTHRESHOLD - AND ov.Ceiling < vxTHRESHOLD THEN 1 ELSE 0 END, - 'false_alarm' :CASE WHEN mv.Ceiling < vxTHRESHOLD - AND NOT ov.Ceiling < vxTHRESHOLD THEN 1 ELSE 0 END, - 'correct_negative' :CASE WHEN NOT mv.Ceiling < vxTHRESHOLD - AND NOT ov.Ceiling < vxTHRESHOLD THEN 1 ELSE 0 END, - 'total' :CASE WHEN mv.Ceiling IS NOT MISSING - AND ov.Ceiling IS NOT MISSING THEN 1 ELSE 0 END, - 'fve': mv.mfve, - 'fcst': mv.fcst, - 'sub': TO_STRING(mv.mfve) || ';' || CASE WHEN mv.Ceiling < vxTHRESHOLD - AND ov.Ceiling < vxTHRESHOLD THEN '1' ELSE '0' END || ';' || CASE WHEN mv.Ceiling < vxTHRESHOLD - AND NOT ov.Ceiling < vxTHRESHOLD THEN '1' ELSE '0' END || ';' || CASE WHEN NOT mv.Ceiling < vxTHRESHOLD - AND ov.Ceiling < vxTHRESHOLD THEN '1' ELSE '0' END || ';' || CASE WHEN NOT mv.Ceiling < vxTHRESHOLD - AND NOT ov.Ceiling < vxTHRESHOLD THEN '1' ELSE '0' END } FOR ov IN o.data WHEN ov.ofve = mv.mfve - AND ov.name = mv.name END ) FOR mv IN m.data END - \ No newline at end of file diff --git a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_Histogram.sql b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_Histogram.sql index ba109fec2c..c35ccbe749 100644 --- a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_Histogram.sql +++ b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_Histogram.sql @@ -11,6 +11,7 @@ SELECT m0.fcstValidEpoch AS avtime, FROM {{vxDBTARGET}} m0 WHERE m0.type='DD' AND m0.docType='CTC' + AND m0.subDocType = 'CEILING' AND m0.subset='METAR' AND m0.version='V01' AND m0.model='{{vxMODEL}}' diff --git a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_PerformanceDiagram.sql b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_PerformanceDiagram.sql index f6d40f4cb8..548d031d3e 100644 --- a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_PerformanceDiagram.sql +++ b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_PerformanceDiagram.sql @@ -11,12 +11,13 @@ SELECT {{vxBIN_CLAUSE}} AS binVal, FROM {{vxDBTARGET}} m0 WHERE m0.type='DD' AND m0.docType='CTC' + AND m0.subDocType = 'CEILING' AND m0.subset='METAR' AND m0.version='V01' AND m0.model='{{vxMODEL}}' AND m0.region='{{vxREGION}}' - AND vxDATE_STRING >= {{vxFROM_SECS}} - AND vxDATE_STRING <= {{vxTO_SECS}} + AND {{vxDATE_STRING}} >= {{vxFROM_SECS}} + AND {{vxDATE_STRING}} <= {{vxTO_SECS}} AND m0.fcstValidEpoch%(24*3600)/3600 IN[{{vxVALID_TIMES}}] AND m0.fcstLen = {{vxFCST_LEN}} GROUP BY {{vxBIN_CLAUSE}} diff --git a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_Threshold.sql b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_Threshold.sql index 374bb80f90..0f031b2c30 100644 --- a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_Threshold.sql +++ b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_Threshold.sql @@ -11,6 +11,7 @@ SELECT {{vxTHRESHOLD}} AS thresh, FROM {{vxDBTARGET}} m0 WHERE m0.type='DD' AND m0.docType='CTC' + AND m0.subDocType = 'CEILING' AND m0.subset='METAR' AND m0.version='V01' AND m0.model='{{vxMODEL}}' diff --git a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_TimeSeries_region.sql b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_TimeSeries_region.sql index 2dd90640a0..b5faeb3476 100644 --- a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_TimeSeries_region.sql +++ b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_TimeSeries_region.sql @@ -11,6 +11,7 @@ SELECT {{vxAVERAGE}} AS avtime, FROM {{vxDBTARGET}} m0 WHERE m0.type = 'DD' AND m0.docType = 'CTC' + AND m0.subDocType = 'CEILING' AND m0.subset = 'METAR' AND m0.version = 'V01' AND m0.model = '{{vxMODEL}}' diff --git a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_ValidTime_region.sql b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_ValidTime_region.sql index b76fa7f0d4..a148d2f72d 100644 --- a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_ValidTime_region.sql +++ b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_ValidTime_region.sql @@ -11,6 +11,7 @@ SELECT m0.fcstValidEpoch%(24*3600)/3600 AS hr_of_day, FROM {{vxDBTARGET}} m0 WHERE m0.type='DD' AND m0.docType='CTC' + AND m0.subDocType = 'CEILING' AND m0.subset='METAR' AND m0.version='V01' AND m0.model='{{vxMODEL}}' diff --git a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_ValidTime_stations.sql b/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_ValidTime_stations.sql deleted file mode 100644 index c9c8e96650..0000000000 --- a/apps/cb-ceiling/server/dataFunctions/sqlTemplates/tmpl_ValidTime_stations.sql +++ /dev/null @@ -1,63 +0,0 @@ -SELECT m.mhod AS hr_of_day, - ARRAY_MIN(stats[*].fve) AS min_secs, - ARRAY_MAX(stats[*].fve) AS max_secs, - ARRAY_SUM(stats[*].hit) AS hit, - ARRAY_SUM(stats[*].miss) AS miss, - ARRAY_SUM(stats[*].false_alarm) AS fa, - ARRAY_SUM(stats[*].correct_negative) AS cn, - ARRAY_SUM(stats[*].total) AS N0, - ARRAY_COUNT(ARRAY_DISTINCT(stats[*].fve)) AS N_times, - ARRAY_SORT(stats[*].sub) AS sub_data -FROM ( - SELECT sdu.ohod AS ohod, - ARRAY_AGG(sdu) AS data - FROM ( - SELECT stationData - FROM {{vxDBTARGET}} AS obs - LET ofve = obs.fcstValidEpoch, - stationData_tmp = ARRAY OBJECT_ADD(d, 'ofve', ofve ) FOR d IN ( [{{vxSITES_LIST_OBS}}] ) END, - stationData = ARRAY OBJECT_ADD(d, 'ohod', ofve%(24*3600)/3600 ) FOR d IN ( stationData_tmp ) END - WHERE type = "DD" - AND docType = "obs" - AND version = "V01" - AND obs.fcstValidEpoch BETWEEN {{vxFROM_SECS}} AND {{vxTO_SECS}} ) sd - UNNEST sd.stationData sdu - GROUP BY sdu.ohod - ORDER BY sdu.ohod) o, -( - SELECT sdu.mhod AS mhod, - ARRAY_AGG(sdu) AS data - FROM ( - SELECT modelData - FROM {{vxDBTARGET}} AS models - LET mfve = models.fcstValidEpoch, - modelData_tmp = ARRAY OBJECT_ADD(d, 'mfve', mfve ) FOR d IN ( [{{vxSITES_LIST_MODELS}}] ) END, - modelData = ARRAY OBJECT_ADD(d, 'mhod', mfve%(24*3600)/3600 ) FOR d IN ( modelData_tmp ) END - WHERE type = "DD" - AND docType = "model" - AND model = "{{vxMODEL}}" - AND fcstLen = {{vxFCST_LEN}} - AND version = "V01" - AND models.fcstValidEpoch BETWEEN {{vxFROM_SECS}} AND {{vxTO_SECS}}) sd - UNNEST sd.modelData sdu - GROUP BY sdu.mhod - ORDER BY sdu.mhod) m -LET stats = ARRAY( FIRST { 'hit' :CASE WHEN mv.Ceiling < {{vxTHRESHOLD}} - AND ov.Ceiling < {{vxTHRESHOLD}} THEN 1 ELSE 0 END, - 'miss' :CASE WHEN NOT mv.Ceiling < {{vxTHRESHOLD}} - AND ov.Ceiling < {{vxTHRESHOLD}} THEN 1 ELSE 0 END, - 'false_alarm' :CASE WHEN mv.Ceiling < {{vxTHRESHOLD}} - AND NOT ov.Ceiling < {{vxTHRESHOLD}} THEN 1 ELSE 0 END, - 'correct_negative' :CASE WHEN NOT mv.Ceiling < {{vxTHRESHOLD}} - AND NOT ov.Ceiling < {{vxTHRESHOLD}} THEN 1 ELSE 0 END, - 'total' :CASE WHEN mv.Ceiling IS NOT MISSING - AND ov.Ceiling IS NOT MISSING THEN 1 ELSE 0 END, - 'fve': mv.mfve, - 'hr_of_day': mv.mhod, - 'sub': TO_STRING(mv.mfve) || ';' || CASE WHEN mv.Ceiling < {{vxTHRESHOLD}} - AND ov.Ceiling < {{vxTHRESHOLD}} THEN '1' ELSE '0' END || ';' || CASE WHEN mv.Ceiling < {{vxTHRESHOLD}} - AND NOT ov.Ceiling < {{vxTHRESHOLD}} THEN '1' ELSE '0' END || ';' || CASE WHEN NOT mv.Ceiling < {{vxTHRESHOLD}} - AND ov.Ceiling < {{vxTHRESHOLD}} THEN '1' ELSE '0' END || ';' || CASE WHEN NOT mv.Ceiling < {{vxTHRESHOLD}} - AND NOT ov.Ceiling < {{vxTHRESHOLD}} THEN '1' ELSE '0' END } FOR ov IN o.data WHEN ov.ofve = mv.mfve - AND ov.name = mv.name END ) FOR mv IN m.data END -WHERE m.mhod = o.ohod \ No newline at end of file