From 2c77d957d25c2e0d79a3c4a1fbea695c2d3b9344 Mon Sep 17 00:00:00 2001
From: Pithon Kabiro <pithon.kabiro@hft-stuttgart.de>
Date: Tue, 26 Oct 2021 14:50:06 +0200
Subject: [PATCH] Create new modules for aggregation calculation

... and formatting
---
 .../dropDownListAggregationAverage.mjs        | 117 +++++
 .../dropDownListAggregationMaximum.mjs        | 117 +++++
 .../dropDownListAggregationMinimum.mjs        | 117 +++++
 .../dropDownListAggregationSum.mjs            | 117 +++++
 .../src_modules/dropDownListChartColumn.mjs   |  11 +-
 .../js/src_modules/dropDownListChartLine.mjs  |  11 +-
 .../js/src_modules/dropDownListProcessing.mjs | 434 ------------------
 7 files changed, 488 insertions(+), 436 deletions(-)
 create mode 100644 public/js/src_modules/dropDownListAggregationAverage.mjs
 create mode 100644 public/js/src_modules/dropDownListAggregationMaximum.mjs
 create mode 100644 public/js/src_modules/dropDownListAggregationMinimum.mjs
 create mode 100644 public/js/src_modules/dropDownListAggregationSum.mjs
 delete mode 100644 public/js/src_modules/dropDownListProcessing.mjs

diff --git a/public/js/src_modules/dropDownListAggregationAverage.mjs b/public/js/src_modules/dropDownListAggregationAverage.mjs
new file mode 100644
index 0000000..98098af
--- /dev/null
+++ b/public/js/src_modules/dropDownListAggregationAverage.mjs
@@ -0,0 +1,117 @@
+"use strict";
+
+import {
+  extractUniqueCalendarMonthsFromCalendarDates,
+  formatAggregationResultForChart,
+} from "./aggregateHelpers.mjs";
+
+import { calculateAverageOfObservationValuesWithinInterval } from "./aggregate.mjs";
+
+import { extractPropertiesFromFormattedDatastreamMetadata } from "./fetchedDataProcessing.mjs";
+
+/**
+ * Calculate the daily average of observations and format these aggregated observations
+ *
+ * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
+ * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
+ * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
+ * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
+ * @returns {Array} An array whose first element is the formatted aggregated (daily average) observations. The second element is an object made up of extracted & formatted datastream properties
+ */
+const calculateAndFormatDailyAverageObservations = function (
+  uniqueCalendarDatesNestedArr,
+  observationsAggregationNestedArr,
+  selectedSamplingRateAbbrev,
+  formattedMetadataNestedArr
+) {
+  // Calculate AVERAGE / DAILY of values of observations
+  const observationsAverageDailyNestedArr =
+    calculateAverageOfObservationValuesWithinInterval(
+      observationsAggregationNestedArr,
+      selectedSamplingRateAbbrev,
+      uniqueCalendarDatesNestedArr,
+      "daily"
+    );
+
+  // Format the observations
+  const formattedObservationsAverageDailyNestedArr =
+    observationsAverageDailyNestedArr.map((obsAverageDailyArr, i) =>
+      formatAggregationResultForChart(
+        uniqueCalendarDatesNestedArr[i],
+        obsAverageDailyArr
+      )
+    );
+
+  // Extract the formatted metadata properties
+  const extractedFormattedDatastreamProperties =
+    extractPropertiesFromFormattedDatastreamMetadata(
+      formattedMetadataNestedArr,
+      true,
+      "daily",
+      "average"
+    );
+
+  return [
+    formattedObservationsAverageDailyNestedArr,
+    extractedFormattedDatastreamProperties,
+  ];
+};
+
+/**
+ * Calculate the monthly average of observations and format these aggregated observations
+ *
+ * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
+ * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
+ * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
+ * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
+ * @returns {Array} An array whose first element is the formatted aggregated (monthly average) observations. The second element is an object made up of extracted & formatted datastream properties
+ */
+const calculateAndFormatMonthlyAverageObservations = function (
+  uniqueCalendarDatesNestedArr,
+  observationsAggregationNestedArr,
+  selectedSamplingRateAbbrev,
+  formattedMetadataNestedArr
+) {
+  // Unique calendar months
+  const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
+    (uniqueCalendarDatesArr) =>
+      extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
+  );
+
+  // Calculate AVERAGE / MONTHLY of values of observations
+  const observationsAverageMonthlyNestedArr =
+    calculateAverageOfObservationValuesWithinInterval(
+      observationsAggregationNestedArr,
+      selectedSamplingRateAbbrev,
+      uniqueCalendarMonthsNestedArr,
+      "monthly"
+    );
+
+  // Format the observations
+  const formattedObservationsAverageMonthlyNestedArr =
+    observationsAverageMonthlyNestedArr.map((obsAverageMonthlyArr, i) =>
+      formatAggregationResultForChart(
+        uniqueCalendarMonthsNestedArr[i],
+        obsAverageMonthlyArr
+      )
+    );
+
+  // Extract the formatted metadata properties
+  const extractedFormattedDatastreamProperties =
+    extractPropertiesFromFormattedDatastreamMetadata(
+      formattedMetadataNestedArr,
+      true,
+      "monthly",
+      "average"
+    );
+
+  return [
+    formattedObservationsAverageMonthlyNestedArr,
+    extractedFormattedDatastreamProperties,
+  ];
+};
+
+export {
+  calculateAndFormatDailyAverageObservations,
+  calculateAndFormatMonthlyAverageObservations,
+};
diff --git a/public/js/src_modules/dropDownListAggregationMaximum.mjs b/public/js/src_modules/dropDownListAggregationMaximum.mjs
new file mode 100644
index 0000000..3ef25d3
--- /dev/null
+++ b/public/js/src_modules/dropDownListAggregationMaximum.mjs
@@ -0,0 +1,117 @@
+"use strict";
+
+import {
+  extractUniqueCalendarMonthsFromCalendarDates,
+  formatAggregationResultForChart,
+} from "./aggregateHelpers.mjs";
+
+import { calculateMaximumObservationValuesWithinInterval } from "./aggregate.mjs";
+
+import { extractPropertiesFromFormattedDatastreamMetadata } from "./fetchedDataProcessing.mjs";
+
+/**
+ * Calculate the daily maximum of observations and format these aggregated observations
+ *
+ * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
+ * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
+ * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
+ * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
+ * @returns {Array} An array whose first element is the formatted aggregated (daily maximum) observations. The second element is an object made up of extracted & formatted datastream properties
+ */
+const calculateAndFormatDailyMaximumObservations = function (
+  uniqueCalendarDatesNestedArr,
+  observationsAggregationNestedArr,
+  selectedSamplingRateAbbrev,
+  formattedMetadataNestedArr
+) {
+  // Calculate MAXIMUM / DAILY of values of observations
+  const observationsMaximumDailyNestedArr =
+    calculateMaximumObservationValuesWithinInterval(
+      observationsAggregationNestedArr,
+      selectedSamplingRateAbbrev,
+      uniqueCalendarDatesNestedArr,
+      "daily"
+    );
+
+  // Format the observations
+  const formattedObservationsMaximumDailyNestedArr =
+    observationsMaximumDailyNestedArr.map((obsMinDailyArr, i) =>
+      formatAggregationResultForChart(
+        uniqueCalendarDatesNestedArr[i],
+        obsMinDailyArr
+      )
+    );
+
+  // Extract the formatted metadata properties
+  const extractedFormattedDatastreamProperties =
+    extractPropertiesFromFormattedDatastreamMetadata(
+      formattedMetadataNestedArr,
+      true,
+      "daily",
+      "maximum"
+    );
+
+  return [
+    formattedObservationsMaximumDailyNestedArr,
+    extractedFormattedDatastreamProperties,
+  ];
+};
+
+/**
+ * Calculate the monthly maximum of observations and format these aggregated observations
+ *
+ * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
+ * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
+ * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
+ * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
+ * @returns {Array} An array whose first element is the formatted aggregated (monthly maximum) observations. The second element is an object made up of extracted & formatted datastream properties
+ */
+const calculateAndFormatMonthlyMaximumObservations = function (
+  uniqueCalendarDatesNestedArr,
+  observationsAggregationNestedArr,
+  selectedSamplingRateAbbrev,
+  formattedMetadataNestedArr
+) {
+  // Unique calendar months
+  const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
+    (uniqueCalendarDatesArr) =>
+      extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
+  );
+
+  // Calculate MAXIMUM / MONTHLY of values of observations
+  const observationsMaximumMonthlyNestedArr =
+    calculateMaximumObservationValuesWithinInterval(
+      observationsAggregationNestedArr,
+      selectedSamplingRateAbbrev,
+      uniqueCalendarMonthsNestedArr,
+      "monthly"
+    );
+
+  // Format the observations
+  const formattedObservationsMaximumMonthlyNestedArr =
+    observationsMaximumMonthlyNestedArr.map((obsMaxMonthlyArr, i) =>
+      formatAggregationResultForChart(
+        uniqueCalendarMonthsNestedArr[i],
+        obsMaxMonthlyArr
+      )
+    );
+
+  // Extract the formatted metadata properties
+  const extractedFormattedDatastreamProperties =
+    extractPropertiesFromFormattedDatastreamMetadata(
+      formattedMetadataNestedArr,
+      true,
+      "monthly",
+      "maximum"
+    );
+
+  return [
+    formattedObservationsMaximumMonthlyNestedArr,
+    extractedFormattedDatastreamProperties,
+  ];
+};
+
+export {
+  calculateAndFormatDailyMaximumObservations,
+  calculateAndFormatMonthlyMaximumObservations,
+};
diff --git a/public/js/src_modules/dropDownListAggregationMinimum.mjs b/public/js/src_modules/dropDownListAggregationMinimum.mjs
new file mode 100644
index 0000000..2fec44e
--- /dev/null
+++ b/public/js/src_modules/dropDownListAggregationMinimum.mjs
@@ -0,0 +1,117 @@
+"use strict";
+
+import {
+  extractUniqueCalendarMonthsFromCalendarDates,
+  formatAggregationResultForChart,
+} from "./aggregateHelpers.mjs";
+
+import { calculateMinimumObservationValuesWithinInterval } from "./aggregate.mjs";
+
+import { extractPropertiesFromFormattedDatastreamMetadata } from "./fetchedDataProcessing.mjs";
+
+/**
+ * Calculate the daily minimum of observations and format these aggregated observations
+ *
+ * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
+ * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
+ * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
+ * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
+ * @returns {Array} An array whose first element is the formatted aggregated (daily minimum) observations. The second element is an object made up of extracted & formatted datastream properties
+ */
+const calculateAndFormatDailyMinimumObservations = function (
+  uniqueCalendarDatesNestedArr,
+  observationsAggregationNestedArr,
+  selectedSamplingRateAbbrev,
+  formattedMetadataNestedArr
+) {
+  // Calculate MINIMUM / DAILY of values of observations
+  const observationsMinimumDailyNestedArr =
+    calculateMinimumObservationValuesWithinInterval(
+      observationsAggregationNestedArr,
+      selectedSamplingRateAbbrev,
+      uniqueCalendarDatesNestedArr,
+      "daily"
+    );
+
+  // Format the observations
+  const formattedObservationsMinimumDailyNestedArr =
+    observationsMinimumDailyNestedArr.map((obsMinDailyArr, i) =>
+      formatAggregationResultForChart(
+        uniqueCalendarDatesNestedArr[i],
+        obsMinDailyArr
+      )
+    );
+
+  // Extract the formatted metadata properties
+  const extractedFormattedDatastreamProperties =
+    extractPropertiesFromFormattedDatastreamMetadata(
+      formattedMetadataNestedArr,
+      true,
+      "daily",
+      "minimum"
+    );
+
+  return [
+    formattedObservationsMinimumDailyNestedArr,
+    extractedFormattedDatastreamProperties,
+  ];
+};
+
+/**
+ * Calculate the monthly minimum of observations and format these aggregated observations
+ *
+ * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
+ * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
+ * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
+ * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
+ * @returns {Array} An array whose first element is the formatted aggregated (monthly minimum) observations. The second element is an object made up of extracted & formatted datastream properties
+ */
+const calculateAndFormatMonthlyMinimumObservations = function (
+  uniqueCalendarDatesNestedArr,
+  observationsAggregationNestedArr,
+  selectedSamplingRateAbbrev,
+  formattedMetadataNestedArr
+) {
+  // Unique calendar months
+  const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
+    (uniqueCalendarDatesArr) =>
+      extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
+  );
+
+  // Calculate MINIMUM / MONTHLY of values of observations
+  const observationsMinimumMonthlyNestedArr =
+    calculateMinimumObservationValuesWithinInterval(
+      observationsAggregationNestedArr,
+      selectedSamplingRateAbbrev,
+      uniqueCalendarMonthsNestedArr,
+      "monthly"
+    );
+
+  // Format the observations
+  const formattedObservationsMinimumMonthlyNestedArr =
+    observationsMinimumMonthlyNestedArr.map((obsMinMonthlyArr, i) =>
+      formatAggregationResultForChart(
+        uniqueCalendarMonthsNestedArr[i],
+        obsMinMonthlyArr
+      )
+    );
+
+  // Extract the formatted metadata properties
+  const extractedFormattedDatastreamProperties =
+    extractPropertiesFromFormattedDatastreamMetadata(
+      formattedMetadataNestedArr,
+      true,
+      "monthly",
+      "minimum"
+    );
+
+  return [
+    formattedObservationsMinimumMonthlyNestedArr,
+    extractedFormattedDatastreamProperties,
+  ];
+};
+
+export {
+  calculateAndFormatDailyMinimumObservations,
+  calculateAndFormatMonthlyMinimumObservations,
+};
diff --git a/public/js/src_modules/dropDownListAggregationSum.mjs b/public/js/src_modules/dropDownListAggregationSum.mjs
new file mode 100644
index 0000000..472db00
--- /dev/null
+++ b/public/js/src_modules/dropDownListAggregationSum.mjs
@@ -0,0 +1,117 @@
+"use strict";
+
+import {
+  extractUniqueCalendarMonthsFromCalendarDates,
+  formatAggregationResultForChart,
+} from "./aggregateHelpers.mjs";
+
+import { calculateSumOfObservationValuesWithinInterval } from "./aggregate.mjs";
+
+import { extractPropertiesFromFormattedDatastreamMetadata } from "./fetchedDataProcessing.mjs";
+
+/**
+ * Calculate the daily sum of observations and format these aggregated observations
+ *
+ * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
+ * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
+ * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
+ * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
+ * @returns {Array} An array whose first element is the formatted aggregated (daily sum) observations. The second element is an object made up of extracted & formatted datastream properties
+ */
+const calculateAndFormatDailySumObservations = function (
+  uniqueCalendarDatesNestedArr,
+  observationsAggregationNestedArr,
+  selectedSamplingRateAbbrev,
+  formattedMetadataNestedArr
+) {
+  // Calculate SUM / DAILY of values of observations
+  const observationsSumDailyNestedArr =
+    calculateSumOfObservationValuesWithinInterval(
+      observationsAggregationNestedArr,
+      selectedSamplingRateAbbrev,
+      uniqueCalendarDatesNestedArr,
+      "daily"
+    );
+
+  // Format the observations
+  const formattedObservationsSumDailyNestedArr =
+    observationsSumDailyNestedArr.map((obsSumDailyArr, i) =>
+      formatAggregationResultForChart(
+        uniqueCalendarDatesNestedArr[i],
+        obsSumDailyArr
+      )
+    );
+
+  // Extract the formatted metadata properties
+  const extractedFormattedDatastreamProperties =
+    extractPropertiesFromFormattedDatastreamMetadata(
+      formattedMetadataNestedArr,
+      true,
+      "daily",
+      "sum"
+    );
+
+  return [
+    formattedObservationsSumDailyNestedArr,
+    extractedFormattedDatastreamProperties,
+  ];
+};
+
+/**
+ * Calculate the monthly sum of observations and format these aggregated observations
+ *
+ * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
+ * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
+ * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
+ * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
+ * @returns {Array} An array whose first element is the formatted aggregated (monthly sum) observations. The second element is an object made up of extracted & formatted datastream properties
+ */
+const calculateAndFormatMonthlySumObservations = function (
+  uniqueCalendarDatesNestedArr,
+  observationsAggregationNestedArr,
+  selectedSamplingRateAbbrev,
+  formattedMetadataNestedArr
+) {
+  // Unique calendar months
+  const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
+    (uniqueCalendarDatesArr) =>
+      extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
+  );
+
+  // Calculate SUM / MONTHLY of values of observations
+  const observationsSumMonthlyNestedArr =
+    calculateSumOfObservationValuesWithinInterval(
+      observationsAggregationNestedArr,
+      selectedSamplingRateAbbrev,
+      uniqueCalendarMonthsNestedArr,
+      "monthly"
+    );
+
+  // Format the observations
+  const formattedObservationsSumMonthlyNestedArr =
+    observationsSumMonthlyNestedArr.map((obsSumMonthlyArr, i) =>
+      formatAggregationResultForChart(
+        uniqueCalendarMonthsNestedArr[i],
+        obsSumMonthlyArr
+      )
+    );
+
+  // Extract the formatted metadata properties
+  const extractedFormattedDatastreamProperties =
+    extractPropertiesFromFormattedDatastreamMetadata(
+      formattedMetadataNestedArr,
+      true,
+      "monthly",
+      "sum"
+    );
+
+  return [
+    formattedObservationsSumMonthlyNestedArr,
+    extractedFormattedDatastreamProperties,
+  ];
+};
+
+export {
+  calculateAndFormatDailySumObservations,
+  calculateAndFormatMonthlySumObservations,
+};
diff --git a/public/js/src_modules/dropDownListChartColumn.mjs b/public/js/src_modules/dropDownListChartColumn.mjs
index eda51d7..e412fdc 100644
--- a/public/js/src_modules/dropDownListChartColumn.mjs
+++ b/public/js/src_modules/dropDownListChartColumn.mjs
@@ -5,13 +5,22 @@ import { drawColumnChartHighcharts } from "./chartColumn.mjs";
 import {
   calculateAndFormatDailySumObservations,
   calculateAndFormatMonthlySumObservations,
+} from "./dropDownListAggregationSum.mjs";
+
+import {
   calculateAndFormatDailyMaximumObservations,
   calculateAndFormatMonthlyMaximumObservations,
+} from "./dropDownListAggregationMaximum.mjs";
+
+import {
   calculateAndFormatDailyMinimumObservations,
   calculateAndFormatMonthlyMinimumObservations,
+} from "./dropDownListAggregationMinimum.mjs";
+
+import {
   calculateAndFormatDailyAverageObservations,
   calculateAndFormatMonthlyAverageObservations,
-} from "./dropDownListProcessing.mjs";
+} from "./dropDownListAggregationAverage.mjs";
 
 /**
  * Draw a column chart based on the selected aggregation options from a drop-down list
diff --git a/public/js/src_modules/dropDownListChartLine.mjs b/public/js/src_modules/dropDownListChartLine.mjs
index 7d10a0d..70e721d 100644
--- a/public/js/src_modules/dropDownListChartLine.mjs
+++ b/public/js/src_modules/dropDownListChartLine.mjs
@@ -5,13 +5,22 @@ import { drawLineChartHighcharts } from "./chartLine.mjs";
 import {
   calculateAndFormatDailySumObservations,
   calculateAndFormatMonthlySumObservations,
+} from "./dropDownListAggregationSum.mjs";
+
+import {
   calculateAndFormatDailyMaximumObservations,
   calculateAndFormatMonthlyMaximumObservations,
+} from "./dropDownListAggregationMaximum.mjs";
+
+import {
   calculateAndFormatDailyMinimumObservations,
   calculateAndFormatMonthlyMinimumObservations,
+} from "./dropDownListAggregationMinimum.mjs";
+
+import {
   calculateAndFormatDailyAverageObservations,
   calculateAndFormatMonthlyAverageObservations,
-} from "./dropDownListProcessing.mjs";
+} from "./dropDownListAggregationAverage.mjs";
 
 /**
  * Draw a line chart based on the selected aggregation options from a drop-down list
diff --git a/public/js/src_modules/dropDownListProcessing.mjs b/public/js/src_modules/dropDownListProcessing.mjs
deleted file mode 100644
index 508a73d..0000000
--- a/public/js/src_modules/dropDownListProcessing.mjs
+++ /dev/null
@@ -1,434 +0,0 @@
-"use strict";
-
-import {
-  extractUniqueCalendarMonthsFromCalendarDates,
-  formatAggregationResultForChart,
-} from "./aggregateHelpers.mjs";
-
-import {
-  calculateMinimumObservationValuesWithinInterval,
-  calculateMaximumObservationValuesWithinInterval,
-  calculateSumOfObservationValuesWithinInterval,
-  calculateAverageOfObservationValuesWithinInterval,
-} from "./aggregate.mjs";
-
-import { extractPropertiesFromFormattedDatastreamMetadata } from "./fetchedDataProcessing.mjs";
-
-/**
- * Calculate the daily sum of observations and format these aggregated observations
- *
- * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
- * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
- * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
- * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
- * @returns {Array} An array whose first element is the formatted aggregated (daily sum) observations. The second element is an object made up of extracted & formatted datastream properties
- */
-const calculateAndFormatDailySumObservations = function (
-  uniqueCalendarDatesNestedArr,
-  observationsAggregationNestedArr,
-  selectedSamplingRateAbbrev,
-  formattedMetadataNestedArr
-) {
-  // Calculate SUM / DAILY of values of observations
-  const observationsSumDailyNestedArr =
-    calculateSumOfObservationValuesWithinInterval(
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      uniqueCalendarDatesNestedArr,
-      "daily"
-    );
-
-  // Format the observations
-  const formattedObservationsSumDailyNestedArr =
-    observationsSumDailyNestedArr.map((obsSumDailyArr, i) =>
-      formatAggregationResultForChart(
-        uniqueCalendarDatesNestedArr[i],
-        obsSumDailyArr
-      )
-    );
-
-  // Extract the formatted metadata properties
-  const extractedFormattedDatastreamProperties =
-    extractPropertiesFromFormattedDatastreamMetadata(
-      formattedMetadataNestedArr,
-      true,
-      "daily",
-      "sum"
-    );
-
-  return [
-    formattedObservationsSumDailyNestedArr,
-    extractedFormattedDatastreamProperties,
-  ];
-};
-
-/**
- * Calculate the monthly sum of observations and format these aggregated observations
- *
- * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
- * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
- * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
- * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
- * @returns {Array} An array whose first element is the formatted aggregated (monthly sum) observations. The second element is an object made up of extracted & formatted datastream properties
- */
-const calculateAndFormatMonthlySumObservations = function (
-  uniqueCalendarDatesNestedArr,
-  observationsAggregationNestedArr,
-  selectedSamplingRateAbbrev,
-  formattedMetadataNestedArr
-) {
-  // Unique calendar months
-  const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
-    (uniqueCalendarDatesArr) =>
-      extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
-  );
-
-  // Calculate SUM / MONTHLY of values of observations
-  const observationsSumMonthlyNestedArr =
-    calculateSumOfObservationValuesWithinInterval(
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      uniqueCalendarMonthsNestedArr,
-      "monthly"
-    );
-
-  // Format the observations
-  const formattedObservationsSumMonthlyNestedArr =
-    observationsSumMonthlyNestedArr.map((obsSumMonthlyArr, i) =>
-      formatAggregationResultForChart(
-        uniqueCalendarMonthsNestedArr[i],
-        obsSumMonthlyArr
-      )
-    );
-
-  // Extract the formatted metadata properties
-  const extractedFormattedDatastreamProperties =
-    extractPropertiesFromFormattedDatastreamMetadata(
-      formattedMetadataNestedArr,
-      true,
-      "monthly",
-      "sum"
-    );
-
-  return [
-    formattedObservationsSumMonthlyNestedArr,
-    extractedFormattedDatastreamProperties,
-  ];
-};
-
-/**
- * Calculate the daily maximum of observations and format these aggregated observations
- *
- * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
- * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
- * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
- * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
- * @returns {Array} An array whose first element is the formatted aggregated (daily maximum) observations. The second element is an object made up of extracted & formatted datastream properties
- */
-const calculateAndFormatDailyMaximumObservations = function (
-  uniqueCalendarDatesNestedArr,
-  observationsAggregationNestedArr,
-  selectedSamplingRateAbbrev,
-  formattedMetadataNestedArr
-) {
-  // Calculate MAXIMUM / DAILY of values of observations
-  const observationsMaximumDailyNestedArr =
-    calculateMaximumObservationValuesWithinInterval(
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      uniqueCalendarDatesNestedArr,
-      "daily"
-    );
-
-  // Format the observations
-  const formattedObservationsMaximumDailyNestedArr =
-    observationsMaximumDailyNestedArr.map((obsMinDailyArr, i) =>
-      formatAggregationResultForChart(
-        uniqueCalendarDatesNestedArr[i],
-        obsMinDailyArr
-      )
-    );
-
-  // Extract the formatted metadata properties
-  const extractedFormattedDatastreamProperties =
-    extractPropertiesFromFormattedDatastreamMetadata(
-      formattedMetadataNestedArr,
-      true,
-      "daily",
-      "maximum"
-    );
-
-  return [
-    formattedObservationsMaximumDailyNestedArr,
-    extractedFormattedDatastreamProperties,
-  ];
-};
-
-/**
- * Calculate the monthly maximum of observations and format these aggregated observations
- *
- * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
- * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
- * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
- * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
- * @returns {Array} An array whose first element is the formatted aggregated (monthly maximum) observations. The second element is an object made up of extracted & formatted datastream properties
- */
-const calculateAndFormatMonthlyMaximumObservations = function (
-  uniqueCalendarDatesNestedArr,
-  observationsAggregationNestedArr,
-  selectedSamplingRateAbbrev,
-  formattedMetadataNestedArr
-) {
-  // Unique calendar months
-  const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
-    (uniqueCalendarDatesArr) =>
-      extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
-  );
-
-  // Calculate MAXIMUM / MONTHLY of values of observations
-  const observationsMaximumMonthlyNestedArr =
-    calculateMaximumObservationValuesWithinInterval(
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      uniqueCalendarMonthsNestedArr,
-      "monthly"
-    );
-
-  // Format the observations
-  const formattedObservationsMaximumMonthlyNestedArr =
-    observationsMaximumMonthlyNestedArr.map((obsMaxMonthlyArr, i) =>
-      formatAggregationResultForChart(
-        uniqueCalendarMonthsNestedArr[i],
-        obsMaxMonthlyArr
-      )
-    );
-
-  // Extract the formatted metadata properties
-  const extractedFormattedDatastreamProperties =
-    extractPropertiesFromFormattedDatastreamMetadata(
-      formattedMetadataNestedArr,
-      true,
-      "monthly",
-      "maximum"
-    );
-
-  return [
-    formattedObservationsMaximumMonthlyNestedArr,
-    extractedFormattedDatastreamProperties,
-  ];
-};
-
-/**
- * Calculate the daily minimum of observations and format these aggregated observations
- *
- * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
- * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
- * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
- * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
- * @returns {Array} An array whose first element is the formatted aggregated (daily minimum) observations. The second element is an object made up of extracted & formatted datastream properties
- */
-const calculateAndFormatDailyMinimumObservations = function (
-  uniqueCalendarDatesNestedArr,
-  observationsAggregationNestedArr,
-  selectedSamplingRateAbbrev,
-  formattedMetadataNestedArr
-) {
-  // Calculate MINIMUM / DAILY of values of observations
-  const observationsMinimumDailyNestedArr =
-    calculateMinimumObservationValuesWithinInterval(
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      uniqueCalendarDatesNestedArr,
-      "daily"
-    );
-
-  // Format the observations
-  const formattedObservationsMinimumDailyNestedArr =
-    observationsMinimumDailyNestedArr.map((obsMinDailyArr, i) =>
-      formatAggregationResultForChart(
-        uniqueCalendarDatesNestedArr[i],
-        obsMinDailyArr
-      )
-    );
-
-  // Extract the formatted metadata properties
-  const extractedFormattedDatastreamProperties =
-    extractPropertiesFromFormattedDatastreamMetadata(
-      formattedMetadataNestedArr,
-      true,
-      "daily",
-      "minimum"
-    );
-
-  return [
-    formattedObservationsMinimumDailyNestedArr,
-    extractedFormattedDatastreamProperties,
-  ];
-};
-
-/**
- * Calculate the monthly minimum of observations and format these aggregated observations
- *
- * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
- * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
- * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
- * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
- * @returns {Array} An array whose first element is the formatted aggregated (monthly minimum) observations. The second element is an object made up of extracted & formatted datastream properties
- */
-const calculateAndFormatMonthlyMinimumObservations = function (
-  uniqueCalendarDatesNestedArr,
-  observationsAggregationNestedArr,
-  selectedSamplingRateAbbrev,
-  formattedMetadataNestedArr
-) {
-  // Unique calendar months
-  const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
-    (uniqueCalendarDatesArr) =>
-      extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
-  );
-
-  // Calculate MINIMUM / MONTHLY of values of observations
-  const observationsMinimumMonthlyNestedArr =
-    calculateMinimumObservationValuesWithinInterval(
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      uniqueCalendarMonthsNestedArr,
-      "monthly"
-    );
-
-  // Format the observations
-  const formattedObservationsMinimumMonthlyNestedArr =
-    observationsMinimumMonthlyNestedArr.map((obsMinMonthlyArr, i) =>
-      formatAggregationResultForChart(
-        uniqueCalendarMonthsNestedArr[i],
-        obsMinMonthlyArr
-      )
-    );
-
-  // Extract the formatted metadata properties
-  const extractedFormattedDatastreamProperties =
-    extractPropertiesFromFormattedDatastreamMetadata(
-      formattedMetadataNestedArr,
-      true,
-      "monthly",
-      "minimum"
-    );
-
-  return [
-    formattedObservationsMinimumMonthlyNestedArr,
-    extractedFormattedDatastreamProperties,
-  ];
-};
-
-/**
- * Calculate the daily average of observations and format these aggregated observations
- *
- * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
- * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
- * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
- * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
- * @returns {Array} An array whose first element is the formatted aggregated (daily average) observations. The second element is an object made up of extracted & formatted datastream properties
- */
-const calculateAndFormatDailyAverageObservations = function (
-  uniqueCalendarDatesNestedArr,
-  observationsAggregationNestedArr,
-  selectedSamplingRateAbbrev,
-  formattedMetadataNestedArr
-) {
-  // Calculate AVERAGE / DAILY of values of observations
-  const observationsAverageDailyNestedArr =
-    calculateAverageOfObservationValuesWithinInterval(
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      uniqueCalendarDatesNestedArr,
-      "daily"
-    );
-
-  // Format the observations
-  const formattedObservationsAverageDailyNestedArr =
-    observationsAverageDailyNestedArr.map((obsAverageDailyArr, i) =>
-      formatAggregationResultForChart(
-        uniqueCalendarDatesNestedArr[i],
-        obsAverageDailyArr
-      )
-    );
-
-  // Extract the formatted metadata properties
-  const extractedFormattedDatastreamProperties =
-    extractPropertiesFromFormattedDatastreamMetadata(
-      formattedMetadataNestedArr,
-      true,
-      "daily",
-      "average"
-    );
-
-  return [
-    formattedObservationsAverageDailyNestedArr,
-    extractedFormattedDatastreamProperties,
-  ];
-};
-
-/**
- * Calculate the monthly average of observations and format these aggregated observations
- *
- * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
- * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
- * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
- * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
- * @returns {Array} An array whose first element is the formatted aggregated (monthly average) observations. The second element is an object made up of extracted & formatted datastream properties
- */
-const calculateAndFormatMonthlyAverageObservations = function (
-  uniqueCalendarDatesNestedArr,
-  observationsAggregationNestedArr,
-  selectedSamplingRateAbbrev,
-  formattedMetadataNestedArr
-) {
-  // Unique calendar months
-  const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
-    (uniqueCalendarDatesArr) =>
-      extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
-  );
-
-  // Calculate AVERAGE / MONTHLY of values of observations
-  const observationsAverageMonthlyNestedArr =
-    calculateAverageOfObservationValuesWithinInterval(
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      uniqueCalendarMonthsNestedArr,
-      "monthly"
-    );
-
-  // Format the observations
-  const formattedObservationsAverageMonthlyNestedArr =
-    observationsAverageMonthlyNestedArr.map((obsAverageMonthlyArr, i) =>
-      formatAggregationResultForChart(
-        uniqueCalendarMonthsNestedArr[i],
-        obsAverageMonthlyArr
-      )
-    );
-
-  // Extract the formatted metadata properties
-  const extractedFormattedDatastreamProperties =
-    extractPropertiesFromFormattedDatastreamMetadata(
-      formattedMetadataNestedArr,
-      true,
-      "monthly",
-      "average"
-    );
-
-  return [
-    formattedObservationsAverageMonthlyNestedArr,
-    extractedFormattedDatastreamProperties,
-  ];
-};
-
-export {
-  calculateAndFormatDailySumObservations,
-  calculateAndFormatMonthlySumObservations,
-  calculateAndFormatDailyMaximumObservations,
-  calculateAndFormatMonthlyMaximumObservations,
-  calculateAndFormatDailyMinimumObservations,
-  calculateAndFormatMonthlyMinimumObservations,
-  calculateAndFormatDailyAverageObservations,
-  calculateAndFormatMonthlyAverageObservations,
-};
-- 
GitLab