Commit d80c0459 authored by Giannis Kepas's avatar Giannis Kepas
Browse files

fix temporal queries

parent 6f07476d
Loading
Loading
Loading
Loading
+28 −16
Original line number Diff line number Diff line
@@ -55,9 +55,8 @@ const fetchEntities = async (type, attrs, fetcher, additionalParams, res) => {
        }

        const apiResponse = await fetcher(type, measurementTypes, additionalParams);

        if (!apiResponse || apiResponse.data.length === 0) {
            return res.status(500).json({ error: "Failed to retrieve data from API." });
            return res.status(500).json({ error: "Failed to retrieve data from API. See http-bridge logs for info." });
        }

        const ngsiData = NGSITranslator.toNGSI(apiResponse.data, type);
@@ -83,14 +82,14 @@ const fetchTemporalData = async (type, measurementTypes, params) => {
                const response = await axios.get(`${process.env.API_URL}/device_measurement`, {
                    params: {
                        measurement_type: `in.(${measurementTypes.join(",")})`,
                        ts: params.time, // TODO: Implement proper time handling according to postgres timestamp format
                        limit: params.limit,
                        ts: params.ts, // Pass as an array to avoid encoding issues
                        limit: params.limit || 100,
                    }
                });

                return response;
            } catch (error) {
                console.error("Error fetching temporal data:", error.message);
                console.error(`Error fetching temporal data: ${JSON.stringify(error.response.data)}\npath: ${error.request.path}`);
                return { data: [] };
            }

@@ -120,7 +119,7 @@ const fetchRealTimeData = async (type, measurementTypes, params) => {

                return response;
            } catch (error) {
                console.error("Error fetching real-time data:", error.message);
                console.error(`Error fetching temporal data: ${JSON.stringify(error.response.data)}\npath: ${error.request.path}`);
                return { data: [] };
            }

@@ -141,20 +140,33 @@ const fetchRealTimeData = async (type, measurementTypes, params) => {
 */
const getTemporalEntities = async (req, res) => {
    console.log("Incoming temporal request:", req.query);
    const { type, timerel, time, endTime, attrs, limit } = req.query;
    let { type, timerel, time, endTime, attrs, limit } = req.query;

    let tsParams = [];

    switch (timerel) {
        case "after":
            tsParams.push(`gte.${time}`);
            break;

    let adjustedEndTime = endTime;
    const now = new Date().toISOString();
        case "before":
            const adjustedStartTime = new Date(new Date(time).setDate(new Date(time).getDate() - 30)).toISOString();
            tsParams.push(`gte.${adjustedStartTime}`, `lt.${time}`);
            break;

    // TODO: Implement "between" timerel and fix temporal queries not working at all.
    if (timerel === "after") {
        adjustedEndTime = now;
    } else if (timerel === "before") {
        adjustedEndTime = time;
        time = new Date(new Date(adjustedEndTime).setDate(new Date(adjustedEndTime).getDate() - 30)).toISOString();
        case "between":
            if (!endTime) {
                return res.status(400).json({ error: "endTime is required for 'between' queries" });
            }
            tsParams.push(`gte.${time}`, `lt.${endTime}`);
            break;

        default:
            return res.status(400).json({ error: "Invalid timerel value" });
    }

    await fetchEntities(type, attrs, fetchTemporalData, { time, endTime: adjustedEndTime, limit }, res);
    // console.log("Final timestamp:", finalTimestamp);
    await fetchEntities(type, attrs, fetchTemporalData, { ts: tsParams, limit }, res);
};

/**