hono icon indicating copy to clipboard operation
hono copied to clipboard

Searching for devices using jsonFilter does not seem to work for string values

Open StFS opened this issue 8 months ago • 3 comments

According to the documentation, searching for devices can be done using a predicate specified by the filterJson request parameter. The example in the documentation for example is {"field": "/ext/brand","value": "eclipse*"} indicating that searching in nested fields should be supported.

However, it seems that it is not as demonstrated by the following example run against the Hono sandbox setup.

First we'll get a list of the devices that are registered on the DEFAULT_TENANT:

➜ curl -X GET https://hono.eclipseprojects.io:28443/v1/devices/DEFAULT_TENANT |jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   469  100   469    0     0   1167      0 --:--:-- --:--:-- --:--:--  1169
{
  "total": 5,
  "result": [
    {
      "status": {
        "created": "2024-06-07T10:27:16Z"
      },
      "id": "1111"
    },
    {
      "ext": {
        "ep": "IMEI4711"
      },
      "status": {
        "created": "2024-06-07T10:27:06Z"
      },
      "id": "1234"
    },
    {
      "enabled": true,
      "defaults": {
        "content-type": "application/vnd.bumlux",
        "importance": "high"
      },
      "status": {
        "created": "2024-06-06T16:30:30Z"
      },
      "id": "4711"
    },
    {
      "enabled": true,
      "via": [
        "gw-1"
      ],
      "status": {
        "created": "2024-06-06T16:30:31Z"
      },
      "id": "4712"
    },
    {
      "enabled": true,
      "status": {
        "created": "2024-06-06T16:30:31Z"
      },
      "id": "gw-1"
    }
  ]
}

Here we see that there is a device registered that we can try searching for by filtering on the value of /ext/ep:

    {
      "ext": {
        "ep": "IMEI4711"
      },
      "status": {
        "created": "2024-06-07T10:27:06Z"
      },
      "id": "1234"
    },

If we perform a GET request using {"field": "/ext/ep","value": "IMEI4711"} as the jsonFilter value, we see that no device is returned:

➜ curl -X GET https://hono.eclipseprojects.io:28443/v1/devices/DEFAULT_TENANT\?filterJson\=%7B%22field%22%3A%20%22%2Fext%2Fep%22%2C%22value%22%3A%20%22IMEI4711%22%7D
{"error":"no devices matching searching criteria"}

When trying to search by the /id field using the jsonFilter value of {"field": "/id","value": "1234"}, that does not work either:

➜ curl -X GET https://hono.eclipseprojects.io:28443/v1/devices/DEFAULT_TENANT\?filterJson\=%7B%22field%22%3A%20%22%2Fid%22%2C%22value%22%3A%20%221234%22%7D
{"error":"no devices matching searching criteria"}

However, if we search for devices that have the enabled field set to a true value, that seems to work as we only get the subset of devices that actually have that set:

➜ curl -X GET https://hono.eclipseprojects.io:28443/v1/devices/DEFAULT_TENANT\?filterJson\=%7B%22field%22%3A%20%22%2Fenabled%22%2C%22value%22%3A%20true%7D | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   329  100   329    0     0    795      0 --:--:-- --:--:-- --:--:--   794
{
  "total": 3,
  "result": [
    {
      "enabled": true,
      "defaults": {
        "content-type": "application/vnd.bumlux",
        "importance": "high"
      },
      "status": {
        "created": "2024-06-06T16:30:30Z"
      },
      "id": "4711"
    },
    {
      "enabled": true,
      "via": [
        "gw-1"
      ],
      "status": {
        "created": "2024-06-06T16:30:31Z"
      },
      "id": "4712"
    },
    {
      "enabled": true,
      "status": {
        "created": "2024-06-06T16:30:31Z"
      },
      "id": "gw-1"
    }
  ]
}

Note that we're only getting 3 devices with this query while we got 5 devices with our original query (using no jsonFilter).

So my gut feeling is that this must be a bug.

StFS avatar Jun 08 '24 01:06 StFS