From 2a36331e682ddef38ab7009fd8d3e21f64ce01d2 Mon Sep 17 00:00:00 2001
From: Pithon Kabiro <pithon.kabiro@hft-stuttgart.de>
Date: Fri, 24 Sep 2021 13:58:18 +0200
Subject: [PATCH] New functions: test plotting of line charts

Plot line charts using daily minimum and monthly maximum values
---
 public/js/appChart.js | 174 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 174 insertions(+)

diff --git a/public/js/appChart.js b/public/js/appChart.js
index 72fdec5..4a49952 100644
--- a/public/js/appChart.js
+++ b/public/js/appChart.js
@@ -41,6 +41,8 @@ import {
 } from "./src_modules/aggregateHelpers.mjs";
 
 import {
+  calculateMinimumObservationValuesWithinInterval,
+  calculateMaximumObservationValuesWithinInterval,
   calculateSumOfObservationValuesWithinInterval,
   calculateAverageOfObservationValuesWithinInterval,
 } from "./src_modules/aggregate.mjs";
@@ -585,6 +587,176 @@ const drawLineChartDailyAverageTest = async function () {
   }
 };
 
+/**
+ * Test drawing of line chart using aggregation / minimum result - daily
+ */
+const drawLineChartDailyMinTest = async function () {
+  try {
+    const sensorsOfInterestNestedArr = [
+      ["125", "vl", "60min"],
+      ["225", "vl", "60min"],
+    ];
+
+    const observationsPlusMetadata =
+      await getMetadataPlusObservationsFromSingleOrMultipleDatastreams(
+        BASE_URL,
+        QUERY_PARAMS_COMBINED,
+        sensorsOfInterestNestedArr
+      );
+
+    // Extract the observations and metadata for each sensor
+    // Array elements in same order as input array
+    const [obsNestedArr, metadataNestedArr] = observationsPlusMetadata;
+
+    // User-specified start date and end date
+    const startDate = "2020-02-01";
+    const endDate = "2020-05-31";
+
+    // Extract observations within the user-specified start and end date
+    const observationsNestedArr = obsNestedArr.map((obsArr) =>
+      extractObservationsWithinDatesInterval(
+        obsArr,
+        "60min",
+        startDate,
+        endDate
+      )
+    );
+
+    // Unique calendar dates
+    const uniqueCalendarDatesNestedArr = observationsNestedArr.map(
+      (observationsArr) =>
+        extractUniqueCalendarDatesFromTimestamp(observationsArr)
+    );
+
+    // Calculate average of values of observations - daily
+    const observationsMinimumDailyNestedArr =
+      calculateMinimumObservationValuesWithinInterval(
+        observationsNestedArr,
+        "60min",
+        uniqueCalendarDatesNestedArr,
+        "daily"
+      );
+
+    // Format the observations - daily
+    const formattedObservationsMinimumDailyNestedArr =
+      observationsMinimumDailyNestedArr.map((obsMinDailyArr, i) =>
+        formatAggregationResultForColumnChart(
+          uniqueCalendarDatesNestedArr[i],
+          obsMinDailyArr
+        )
+      );
+
+    // Format the metadata
+    const formattedMetadataNestedArr = metadataNestedArr.map((metadataObj) =>
+      formatDatastreamMetadataForChart(metadataObj)
+    );
+
+    // Extract the formatted metadata properties
+    const extractedFormattedDatastreamProperties =
+      extractPropertiesFromFormattedDatastreamMetadata(
+        formattedMetadataNestedArr,
+        true,
+        "daily",
+        "minimum"
+      );
+
+    drawLineChartHighcharts(
+      formattedObservationsMinimumDailyNestedArr,
+      extractedFormattedDatastreamProperties
+    );
+  } catch (err) {
+    console.error(err);
+  }
+};
+
+/**
+ * Test drawing of line chart using aggregation / maximum result - daily
+ */
+const drawLineChartMonthlyMaxTest = async function () {
+  try {
+    const sensorsOfInterestNestedArr = [
+      ["125", "vl", "60min"],
+      ["225", "vl", "60min"],
+    ];
+
+    const observationsPlusMetadata =
+      await getMetadataPlusObservationsFromSingleOrMultipleDatastreams(
+        BASE_URL,
+        QUERY_PARAMS_COMBINED,
+        sensorsOfInterestNestedArr
+      );
+
+    // Extract the observations and metadata for each sensor
+    // Array elements in same order as input array
+    const [obsNestedArr, metadataNestedArr] = observationsPlusMetadata;
+
+    // User-specified start date and end date
+    const startDate = "2020-02-01";
+    const endDate = "2020-12-31";
+
+    // Extract observations within the user-specified start and end date
+    const observationsNestedArr = obsNestedArr.map((obsArr) =>
+      extractObservationsWithinDatesInterval(
+        obsArr,
+        "60min",
+        startDate,
+        endDate
+      )
+    );
+
+    // Unique calendar dates
+    const uniqueCalendarDatesNestedArr = observationsNestedArr.map(
+      (observationsArr) =>
+        extractUniqueCalendarDatesFromTimestamp(observationsArr)
+    );
+
+    // Unique calendar months
+    const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
+      (uniqueCalendarDatesArr) =>
+        extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
+    );
+
+    // Calculate maximum values of observations - monthly
+    const observationsMaxMonthlyNestedArr =
+      calculateMaximumObservationValuesWithinInterval(
+        observationsNestedArr,
+        "60min",
+        uniqueCalendarMonthsNestedArr,
+        "monthly"
+      );
+
+    // Format the observations - monthly
+    const formattedObservationsMaxMonthlyNestedArr =
+      observationsMaxMonthlyNestedArr.map((obsMaxMonthlyArr, i) =>
+        formatAggregationResultForColumnChart(
+          uniqueCalendarMonthsNestedArr[i],
+          obsMaxMonthlyArr
+        )
+      );
+
+    // Format the metadata
+    const formattedMetadataNestedArr = metadataNestedArr.map((metadataObj) =>
+      formatDatastreamMetadataForChart(metadataObj)
+    );
+
+    // Extract the formatted metadata properties
+    const extractedFormattedDatastreamProperties =
+      extractPropertiesFromFormattedDatastreamMetadata(
+        formattedMetadataNestedArr,
+        true,
+        "monthly",
+        "maximum"
+      );
+
+    drawLineChartHighcharts(
+      formattedObservationsMaxMonthlyNestedArr,
+      extractedFormattedDatastreamProperties
+    );
+  } catch (err) {
+    console.error(err);
+  }
+};
+
 // drawScatterPlotHCTest2();
 // drawHeatmapHCUsingTempDifference();
 // testLineChartMultipleSeries();
@@ -593,3 +765,5 @@ const drawLineChartDailyAverageTest = async function () {
 // drawColumnChartNonAggregationTest();
 // drawLineChartMonthlyAverageTest();
 // drawLineChartDailyAverageTest();
+// drawLineChartDailyMinTest();
+// drawLineChartMonthlyMaxTest();
-- 
GitLab