From 94121baafefe53469de8b8955fac48b1fb0dc244 Mon Sep 17 00:00:00 2001
From: Emre Gezer <21geem1bif@hft-stuttgart.de>
Date: Wed, 30 Apr 2025 10:51:02 +0200
Subject: [PATCH] Added small changes to fluxQueryBuilder, but still needs to
 be finished

---
 backend/app/influxdb_service.py   |  4 +---
 backend/utils/fluxQueryBuilder.py | 20 ++++++++++++++++++++
 2 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/backend/app/influxdb_service.py b/backend/app/influxdb_service.py
index a34ec54..36e04e6 100644
--- a/backend/app/influxdb_service.py
+++ b/backend/app/influxdb_service.py
@@ -15,14 +15,12 @@ client = InfluxDBHelper(
     bucket=_bucket,
 )
 
-
-# 2) build a Flux query at runtime
 builder = (
     FluxQueryBuilder()
     .bucket(_bucket)
     .time_range("-30d", "now()")
     .filter_measurement("sensor_data")
-    .filter_fields("co2", "rh", "temp")
+    .filter_fields("co2", "rh", "temp") # with "or" we should implement "and" too 
     .mean()
 )
 
diff --git a/backend/utils/fluxQueryBuilder.py b/backend/utils/fluxQueryBuilder.py
index 40258a6..bd83d95 100644
--- a/backend/utils/fluxQueryBuilder.py
+++ b/backend/utils/fluxQueryBuilder.py
@@ -24,6 +24,7 @@ class FluxQueryBuilder:
         self._measurement: Optional[str] = None
         self._fields: List[str] = []
         self._mean : Optional[bool] = None
+        self._dict : Optional[dict] = None
 
     def bucket(self, name: str) -> "FluxQueryBuilder":
         """
@@ -57,7 +58,20 @@ class FluxQueryBuilder:
         self._measurement = measurement
         return self
     
+    def filter_field(self, field: str, value:str) -> "FluxQueryBuilder":
+        """
+        Add filters for one or more _field tags (OR-combined).
+        :param
 
+        Example: field = "room", value = "1/210"
+
+        Result: |> filter(fn: (r) => r["room"] == "1/210")
+        
+        :return: self (for method chaining)
+        """
+        # extend the list of fields to filter
+        self._dict[field] = value
+        return self
 
     def filter_fields(self, *fields: str) -> "FluxQueryBuilder":
         """
@@ -106,6 +120,12 @@ class FluxQueryBuilder:
             f'|> filter(fn: (r) => r["_measurement"] == "{self._measurement}")'
         )
 
+        # Add specified filter if any
+        #if self._dict:
+             #for key, value in self._dict.items():
+             #lines.append(f'|> filter(fn: (r) => r["_field"] == "{f}")')
+             #lines.append(f'r["_field"] == "{f}"')
+
         # Add field filters if any
         if self._fields:
             # create OR expression for fields
-- 
GitLab