diff --git a/backend/app/influxdb_service.py b/backend/app/influxdb_service.py index a34ec541090a39ca21ea0ce42a6d9ae6a14fe3aa..36e04e68bc45b0a77c41396901db5287b3cab1cd 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 40258a6449bdc336e4d083f40b0b566239df206b..bd83d95f3054e04706fc62404e1b7128e5b1ec24 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