Giter Club home page Giter Club logo

Comments (4)

ganigeorgiev avatar ganigeorgiev commented on June 12, 2024 1

The error without parenthesis is expected as currently the parser doesn't evaluate expressions (see #4533).

For the FLOOR function - I have no idea whether this is the case of your issue but there are not enough details to reproduce it so I'm not sure how to help.

If you are able to consistently reproduce it, please share your collections configuration (Admin UI > Settings > Export collections) and I'll investigate it further.

Better error reporting exists in the roadmap but for now remains a low priority.

from pocketbase.

ganigeorgiev avatar ganigeorgiev commented on June 12, 2024 1

I've tried to reproduce the issue with the below sample collections configuration based on the field names in your query.

Sample collections json
[
    {
        "id": "_pb_users_auth_",
        "name": "users",
        "type": "auth",
        "system": false,
        "schema": [
            {
                "system": false,
                "id": "users_name",
                "name": "name",
                "type": "text",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "min": null,
                    "max": null,
                    "pattern": ""
                }
            },
            {
                "system": false,
                "id": "tcxscxid",
                "name": "current_program",
                "type": "text",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "min": null,
                    "max": null,
                    "pattern": ""
                }
            }
        ],
        "indexes": [],
        "listRule": "id = @request.auth.id",
        "viewRule": "id = @request.auth.id",
        "createRule": "",
        "updateRule": "id = @request.auth.id",
        "deleteRule": "id = @request.auth.id",
        "options": {
            "allowEmailAuth": true,
            "allowOAuth2Auth": true,
            "allowUsernameAuth": true,
            "exceptEmailDomains": null,
            "manageRule": null,
            "minPasswordLength": 8,
            "onlyEmailDomains": null,
            "onlyVerified": false,
            "requireEmail": false
        }
    },
    {
        "id": "wml91xqyyu5wgs6",
        "name": "programs",
        "type": "base",
        "system": false,
        "schema": [
            {
                "system": false,
                "id": "k5gglnfj",
                "name": "started_at",
                "type": "text",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "min": null,
                    "max": null,
                    "pattern": ""
                }
            },
            {
                "system": false,
                "id": "wznnbvfv",
                "name": "user",
                "type": "relation",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "_pb_users_auth_",
                    "cascadeDelete": false,
                    "minSelect": null,
                    "maxSelect": 1,
                    "displayFields": null
                }
            }
        ],
        "indexes": [],
        "listRule": null,
        "viewRule": null,
        "createRule": null,
        "updateRule": null,
        "deleteRule": null,
        "options": {}
    }
]

Testing with the latest PocketBase v0.22.7 version, the following View collection query works fine for me:

SELECT
  u.id,
  COALESCE(u.current_program, "") as current_program,
  COALESCE(p.started_at, "") as started_at,
  CAST(COALESCE(FLOOR((UNIXEPOCH('now') - UNIXEPOCH(p.started_at)) / 86400), 0) AS TEXT) AS days_since_start,
  CAST(COALESCE(FLOOR((UNIXEPOCH('now') - UNIXEPOCH(p.started_at)) / 604800), 0) AS TEXT) AS weeks_since_start
FROM users AS u
LEFT JOIN programs AS p ON u.id = p.user
GROUP BY u.id;

Note the column aliases for the 2nd and 3rd column.

Copy pasting your exact faulty query:

SELECT
  u.id,
  COALESCE(u.current_program, ""),
  COALESCE(p.started_at, ""),
  CAST(COALESCE(FLOOR((UNIXEPOCH('now') - UNIXEPOCH(p.started_at)) / 86400), 0) AS TEXT) AS days_since_start,
  CAST(COALESCE(FLOOR((UNIXEPOCH('now') - UNIXEPOCH(p.started_at)) / 604800), 0) AS TEXT) AS weeks_since_start
FROM users AS u
LEFT JOIN programs AS p ON u.id = p.user
GROUP BY u.id;

Produce the following error:

ERROR PATCH /api/collections/isj0bn1ed6ozcxr
└─ Something went wrong while processing your request.
   └─ schema: (0: (name: must be in a valid format.); 1: (name: must be in a valid format.).).

Which is expected because the resolved columns must have a valid formatted collection field name identifier (there is help text below the query input that mentions this but I'll try to add it as part of the error message in the future to be more clear).

from pocketbase.

ganigeorgiev avatar ganigeorgiev commented on June 12, 2024 1

After further investigation I was able to reproduce the issue when running with CGO_ENABLED=1. A minimal failing query is:

select 1 as id, floor(10) as test

It is happening because you are probably running with CGO_ENABLED=1 (if you have gcc installed I think Go enables it by default; you can inspect your current defaults with go env).

When building/running with CGO_ENABLED=1 PocketBase uses the CGO SQLite driver - mattn/go-sqlite3 but the problem in your case is that the math functions are not available by default and they are opt-in (see also "Features/Extensions list"). Or in other words, if you want to use CGO and the math functions you can try building/running with the sqlite_math_functions build tag:

go run -tags "sqlite_math_functions" . serve

Alternatively, you can switch to the pure Go SQLite driver (cznic/sqlite) by building/running with CGO_ENABLED=0 since the Go translation has the math functions builtin:

CGO_ENABLED=0 go run . serve

In general I recommend always running/building with CGO_ENABLED=0 as this will make cross-compilation easier and will produce a standalone statically linked binary.

from pocketbase.

strash avatar strash commented on June 12, 2024

Thanks for the explanation! Indeed, I'm running without CGO_ENABLED=0 and it is set to CGO_ENABLED=1 by default.

My collections schema
[
    {
        "id": "_pb_users_auth_",
        "name": "users",
        "type": "auth",
        "system": false,
        "schema": [
            {
                "system": false,
                "id": "ldmbkftz",
                "name": "name",
                "type": "text",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "min": null,
                    "max": 64,
                    "pattern": ""
                }
            },
            {
                "system": false,
                "id": "users_avatar",
                "name": "avatar",
                "type": "file",
                "required": false,
                "presentable": true,
                "unique": false,
                "options": {
                    "mimeTypes": [
                        "image/jpeg",
                        "image/png",
                        "image/webp",
                        "image/heic"
                    ],
                    "thumbs": [
                        "200x200",
                        "300x300"
                    ],
                    "maxSelect": 1,
                    "maxSize": 5242880,
                    "protected": false
                }
            },
            {
                "system": false,
                "id": "nxaxfagg",
                "name": "avatarUrl",
                "type": "url",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "exceptDomains": [],
                    "onlyDomains": []
                }
            },
            {
                "system": false,
                "id": "4sb3gsth",
                "name": "current_program",
                "type": "relation",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "mi3je4efdj8po68",
                    "cascadeDelete": false,
                    "minSelect": null,
                    "maxSelect": 1,
                    "displayFields": null
                }
            }
        ],
        "indexes": [],
        "listRule": null,
        "viewRule": "id = @request.auth.id && @request.auth.verified = true",
        "createRule": "",
        "updateRule": "id = @request.auth.id && @request.auth.verified = true &&\n(@request.data.current_program.user.id = @request.auth.id || @request.data.current_program = null)",
        "deleteRule": "id = @request.auth.id && @request.auth.verified = true",
        "options": {
            "allowEmailAuth": true,
            "allowOAuth2Auth": true,
            "allowUsernameAuth": true,
            "exceptEmailDomains": null,
            "manageRule": null,
            "minPasswordLength": 6,
            "onlyEmailDomains": null,
            "onlyVerified": true,
            "requireEmail": false
        }
    },
    {
        "id": "j3vrc315kmtrszd",
        "name": "e_record_type",
        "type": "base",
        "system": false,
        "schema": [
            {
                "system": false,
                "id": "7zzp1cqx",
                "name": "type",
                "type": "select",
                "required": true,
                "presentable": true,
                "unique": false,
                "options": {
                    "maxSelect": 1,
                    "values": [
                        "repeat",
                        "time"
                    ]
                }
            },
            {
                "system": false,
                "id": "z7drljht",
                "name": "_seq",
                "type": "number",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "min": null,
                    "max": null,
                    "noDecimal": true
                }
            }
        ],
        "indexes": [],
        "listRule": "@request.auth.id != \"\" && @request.auth.verified = true",
        "viewRule": "@request.auth.id != \"\" && @request.auth.verified = true",
        "createRule": null,
        "updateRule": null,
        "deleteRule": null,
        "options": {}
    },
    {
        "id": "9lvuk7xy9hkwe6y",
        "name": "e_side_type",
        "type": "base",
        "system": false,
        "schema": [
            {
                "system": false,
                "id": "vhwhan5n",
                "name": "type",
                "type": "select",
                "required": true,
                "presentable": true,
                "unique": false,
                "options": {
                    "maxSelect": 1,
                    "values": [
                        "both",
                        "each"
                    ]
                }
            },
            {
                "system": false,
                "id": "1m6vnxwi",
                "name": "_seq",
                "type": "number",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "min": null,
                    "max": null,
                    "noDecimal": true
                }
            }
        ],
        "indexes": [
            "CREATE INDEX `idx_ESHQC8K` ON `e_side_type` (`type`)"
        ],
        "listRule": "@request.auth.id != \"\" && @request.auth.verified = true",
        "viewRule": "@request.auth.id != \"\" && @request.auth.verified = true",
        "createRule": null,
        "updateRule": null,
        "deleteRule": null,
        "options": {}
    },
    {
        "id": "5422m4ifkd3lm6u",
        "name": "e_standard_type",
        "type": "base",
        "system": false,
        "schema": [
            {
                "system": false,
                "id": "mopyoejk",
                "name": "type",
                "type": "select",
                "required": true,
                "presentable": true,
                "unique": false,
                "options": {
                    "maxSelect": 1,
                    "values": [
                        "easy",
                        "medium",
                        "hard",
                        "master"
                    ]
                }
            },
            {
                "system": false,
                "id": "jrddtd4x",
                "name": "_seq",
                "type": "number",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "min": null,
                    "max": null,
                    "noDecimal": true
                }
            }
        ],
        "indexes": [],
        "listRule": "@request.auth.id != \"\" && @request.auth.verified = true",
        "viewRule": "@request.auth.id != \"\" && @request.auth.verified = true",
        "createRule": null,
        "updateRule": null,
        "deleteRule": null,
        "options": {}
    },
    {
        "id": "3zgwl38k953uoqv",
        "name": "exercise_level_standards",
        "type": "base",
        "system": false,
        "schema": [
            {
                "system": false,
                "id": "yi5p6f7t",
                "name": "standard_type",
                "type": "relation",
                "required": true,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "5422m4ifkd3lm6u",
                    "cascadeDelete": true,
                    "minSelect": null,
                    "maxSelect": 1,
                    "displayFields": null
                }
            },
            {
                "system": false,
                "id": "2tifmixd",
                "name": "record_type",
                "type": "relation",
                "required": true,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "j3vrc315kmtrszd",
                    "cascadeDelete": true,
                    "minSelect": null,
                    "maxSelect": 1,
                    "displayFields": null
                }
            },
            {
                "system": false,
                "id": "qxokgege",
                "name": "side_type",
                "type": "relation",
                "required": true,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "9lvuk7xy9hkwe6y",
                    "cascadeDelete": true,
                    "minSelect": null,
                    "maxSelect": 1,
                    "displayFields": null
                }
            },
            {
                "system": false,
                "id": "jytafzjz",
                "name": "set_count",
                "type": "number",
                "required": false,
                "presentable": true,
                "unique": false,
                "options": {
                    "min": 0,
                    "max": null,
                    "noDecimal": true
                }
            },
            {
                "system": false,
                "id": "lugr1w8c",
                "name": "repeat_count",
                "type": "number",
                "required": false,
                "presentable": true,
                "unique": false,
                "options": {
                    "min": 0,
                    "max": null,
                    "noDecimal": true
                }
            }
        ],
        "indexes": [],
        "listRule": "@request.auth.id != \"\" && @request.auth.verified = true",
        "viewRule": "@request.auth.id != \"\" && @request.auth.verified = true",
        "createRule": null,
        "updateRule": null,
        "deleteRule": null,
        "options": {}
    },
    {
        "id": "sf5s60wly4pn581",
        "name": "exercise_levels",
        "type": "base",
        "system": false,
        "schema": [
            {
                "system": false,
                "id": "evkr1ymt",
                "name": "is_active",
                "type": "bool",
                "required": false,
                "presentable": true,
                "unique": false,
                "options": {}
            },
            {
                "system": false,
                "id": "0tzhchud",
                "name": "level",
                "type": "number",
                "required": true,
                "presentable": true,
                "unique": false,
                "options": {
                    "min": 1,
                    "max": 10,
                    "noDecimal": true
                }
            },
            {
                "system": false,
                "id": "uobuggfm",
                "name": "title",
                "type": "text",
                "required": true,
                "presentable": true,
                "unique": false,
                "options": {
                    "min": null,
                    "max": 255,
                    "pattern": ""
                }
            },
            {
                "system": false,
                "id": "ptvx1igs",
                "name": "description",
                "type": "text",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "min": null,
                    "max": null,
                    "pattern": ""
                }
            },
            {
                "system": false,
                "id": "q5qpzfsu",
                "name": "standards",
                "type": "relation",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "3zgwl38k953uoqv",
                    "cascadeDelete": false,
                    "minSelect": null,
                    "maxSelect": null,
                    "displayFields": null
                }
            },
            {
                "system": false,
                "id": "r3bwrmvl",
                "name": "images",
                "type": "file",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "mimeTypes": [
                        "image/jpeg",
                        "image/png",
                        "image/webp",
                        "image/heic"
                    ],
                    "thumbs": [],
                    "maxSelect": 99,
                    "maxSize": 5242880,
                    "protected": false
                }
            }
        ],
        "indexes": [],
        "listRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nis_active = true",
        "viewRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nis_active = true",
        "createRule": null,
        "updateRule": null,
        "deleteRule": null,
        "options": {}
    },
    {
        "id": "3eb1orvttr28h0u",
        "name": "exercises",
        "type": "base",
        "system": false,
        "schema": [
            {
                "system": false,
                "id": "mm5bipxj",
                "name": "is_active",
                "type": "bool",
                "required": false,
                "presentable": true,
                "unique": false,
                "options": {}
            },
            {
                "system": false,
                "id": "nnvgp0jw",
                "name": "title",
                "type": "text",
                "required": true,
                "presentable": true,
                "unique": false,
                "options": {
                    "min": null,
                    "max": 255,
                    "pattern": ""
                }
            },
            {
                "system": false,
                "id": "vzcxshbv",
                "name": "description",
                "type": "text",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "min": null,
                    "max": null,
                    "pattern": ""
                }
            },
            {
                "system": false,
                "id": "hl0rs0tu",
                "name": "levels",
                "type": "relation",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "sf5s60wly4pn581",
                    "cascadeDelete": false,
                    "minSelect": null,
                    "maxSelect": null,
                    "displayFields": null
                }
            }
        ],
        "indexes": [],
        "listRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nis_active = true",
        "viewRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nis_active = true",
        "createRule": null,
        "updateRule": null,
        "deleteRule": null,
        "options": {}
    },
    {
        "id": "xdjaojpdh8cry8o",
        "name": "legal",
        "type": "base",
        "system": false,
        "schema": [
            {
                "system": false,
                "id": "kb3xzszn",
                "name": "title",
                "type": "text",
                "required": true,
                "presentable": false,
                "unique": false,
                "options": {
                    "min": null,
                    "max": null,
                    "pattern": ""
                }
            },
            {
                "system": false,
                "id": "3rdxbxcw",
                "name": "content",
                "type": "text",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "min": null,
                    "max": null,
                    "pattern": ""
                }
            }
        ],
        "indexes": [],
        "listRule": "",
        "viewRule": "",
        "createRule": null,
        "updateRule": null,
        "deleteRule": null,
        "options": {}
    },
    {
        "id": "ynttxw3rygrbn3w",
        "name": "program_day_exercises",
        "type": "base",
        "system": false,
        "schema": [
            {
                "system": false,
                "id": "ltezsmg0",
                "name": "sort",
                "type": "number",
                "required": true,
                "presentable": true,
                "unique": false,
                "options": {
                    "min": 1,
                    "max": null,
                    "noDecimal": true
                }
            },
            {
                "system": false,
                "id": "8u4wjknw",
                "name": "exercise",
                "type": "relation",
                "required": true,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "3eb1orvttr28h0u",
                    "cascadeDelete": true,
                    "minSelect": null,
                    "maxSelect": 1,
                    "displayFields": null
                }
            },
            {
                "system": false,
                "id": "xilecnj1",
                "name": "user",
                "type": "relation",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "_pb_users_auth_",
                    "cascadeDelete": true,
                    "minSelect": null,
                    "maxSelect": 1,
                    "displayFields": null
                }
            }
        ],
        "indexes": [],
        "listRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\n(user = \"\" || user = @request.auth.id)",
        "viewRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\n(user = \"\" || user = @request.auth.id)",
        "createRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\[email protected] = @request.auth.id",
        "updateRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nuser = @request.auth.id &&\[email protected]:isset = false &&\[email protected]:isset = false",
        "deleteRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nuser = @request.auth.id",
        "options": {}
    },
    {
        "id": "fmu8uwzhttrg9e5",
        "name": "program_days",
        "type": "base",
        "system": false,
        "schema": [
            {
                "system": false,
                "id": "cf4lbros",
                "name": "sort",
                "type": "number",
                "required": true,
                "presentable": true,
                "unique": false,
                "options": {
                    "min": 1,
                    "max": null,
                    "noDecimal": true
                }
            },
            {
                "system": false,
                "id": "psef1esw",
                "name": "exercises",
                "type": "relation",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "ynttxw3rygrbn3w",
                    "cascadeDelete": false,
                    "minSelect": null,
                    "maxSelect": null,
                    "displayFields": null
                }
            },
            {
                "system": false,
                "id": "d69tlr1m",
                "name": "user",
                "type": "relation",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "_pb_users_auth_",
                    "cascadeDelete": true,
                    "minSelect": null,
                    "maxSelect": 1,
                    "displayFields": null
                }
            }
        ],
        "indexes": [],
        "listRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\n(user = \"\" || user = @request.auth.id)",
        "viewRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\n(user = \"\" || user = @request.auth.id)",
        "createRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\[email protected] = @request.auth.id",
        "updateRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nuser = @request.auth.id &&\[email protected]:isset = false",
        "deleteRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nuser = @request.auth.id",
        "options": {}
    },
    {
        "id": "mi3je4efdj8po68",
        "name": "programs",
        "type": "base",
        "system": false,
        "schema": [
            {
                "system": false,
                "id": "kmkvbuhi",
                "name": "is_template",
                "type": "bool",
                "required": false,
                "presentable": true,
                "unique": false,
                "options": {}
            },
            {
                "system": false,
                "id": "rdn2phzp",
                "name": "is_public",
                "type": "bool",
                "required": false,
                "presentable": true,
                "unique": false,
                "options": {}
            },
            {
                "system": false,
                "id": "nvgua5nv",
                "name": "title",
                "type": "text",
                "required": true,
                "presentable": true,
                "unique": false,
                "options": {
                    "min": null,
                    "max": null,
                    "pattern": ""
                }
            },
            {
                "system": false,
                "id": "8a5xdjzu",
                "name": "description",
                "type": "text",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "min": null,
                    "max": null,
                    "pattern": ""
                }
            },
            {
                "system": false,
                "id": "m3w16oxk",
                "name": "cover",
                "type": "file",
                "required": false,
                "presentable": true,
                "unique": false,
                "options": {
                    "mimeTypes": [
                        "image/jpeg",
                        "image/png",
                        "image/webp",
                        "image/heic"
                    ],
                    "thumbs": [
                        "500x500"
                    ],
                    "maxSelect": 1,
                    "maxSize": 5242880,
                    "protected": false
                }
            },
            {
                "system": false,
                "id": "h9kg9kgy",
                "name": "started_at",
                "type": "date",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "min": "",
                    "max": ""
                }
            },
            {
                "system": false,
                "id": "wpztegjj",
                "name": "days",
                "type": "relation",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "fmu8uwzhttrg9e5",
                    "cascadeDelete": false,
                    "minSelect": null,
                    "maxSelect": null,
                    "displayFields": null
                }
            },
            {
                "system": false,
                "id": "pomsrvsy",
                "name": "user",
                "type": "relation",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "_pb_users_auth_",
                    "cascadeDelete": true,
                    "minSelect": null,
                    "maxSelect": 1,
                    "displayFields": null
                }
            },
            {
                "system": false,
                "id": "et5fh7ng",
                "name": "origin",
                "type": "relation",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "mi3je4efdj8po68",
                    "cascadeDelete": false,
                    "minSelect": null,
                    "maxSelect": 1,
                    "displayFields": null
                }
            }
        ],
        "indexes": [],
        "listRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\n(user = \"\" && is_template = true || user = @request.auth.id || is_public = true)",
        "viewRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\n(user = \"\" && is_template = true || user = @request.auth.id || is_public = true)",
        "createRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\[email protected] = @request.auth.id &&\[email protected]_template = false",
        "updateRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nuser = @request.auth.id &&\[email protected]_template:isset = false &&\[email protected]:isset = false &&\[email protected]:isset = false",
        "deleteRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nuser = @request.auth.id",
        "options": {}
    },
    {
        "id": "2poh3azyrjt9r3c",
        "name": "training",
        "type": "base",
        "system": false,
        "schema": [
            {
                "system": false,
                "id": "tgakzvr3",
                "name": "date",
                "type": "date",
                "required": true,
                "presentable": false,
                "unique": false,
                "options": {
                    "min": "",
                    "max": ""
                }
            },
            {
                "system": false,
                "id": "fnv5zxs7",
                "name": "level",
                "type": "number",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "min": 1,
                    "max": 10,
                    "noDecimal": true
                }
            },
            {
                "system": false,
                "id": "x6jrnrbs",
                "name": "note",
                "type": "text",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "min": null,
                    "max": null,
                    "pattern": ""
                }
            },
            {
                "system": false,
                "id": "z9woid7v",
                "name": "exercises",
                "type": "relation",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "0xs3s3ybf2oqft9",
                    "cascadeDelete": false,
                    "minSelect": null,
                    "maxSelect": null,
                    "displayFields": null
                }
            },
            {
                "system": false,
                "id": "omnn0zjx",
                "name": "images",
                "type": "file",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "mimeTypes": [
                        "image/jpeg",
                        "image/png",
                        "image/heic",
                        "image/webp"
                    ],
                    "thumbs": [],
                    "maxSelect": 99,
                    "maxSize": 5242880,
                    "protected": true
                }
            },
            {
                "system": false,
                "id": "cdg6dfjo",
                "name": "user",
                "type": "relation",
                "required": true,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "_pb_users_auth_",
                    "cascadeDelete": true,
                    "minSelect": null,
                    "maxSelect": 1,
                    "displayFields": null
                }
            }
        ],
        "indexes": [],
        "listRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nuser = @request.auth.id &&\nexercises.exercise.is_active = true",
        "viewRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nuser = @request.auth.id &&\nexercises.exercise.is_active = true",
        "createRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\[email protected] = @request.auth.id",
        "updateRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nuser = @request.auth.id &&\[email protected]:isset = false &&\[email protected]:isset = false",
        "deleteRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nuser = @request.auth.id",
        "options": {}
    },
    {
        "id": "bd4wt0o3z9l87kz",
        "name": "training_exercise_sets",
        "type": "base",
        "system": false,
        "schema": [
            {
                "system": false,
                "id": "bz5fvtol",
                "name": "sort",
                "type": "number",
                "required": true,
                "presentable": true,
                "unique": false,
                "options": {
                    "min": 1,
                    "max": null,
                    "noDecimal": true
                }
            },
            {
                "system": false,
                "id": "jqyez0e0",
                "name": "count",
                "type": "number",
                "required": false,
                "presentable": true,
                "unique": false,
                "options": {
                    "min": 0,
                    "max": null,
                    "noDecimal": true
                }
            },
            {
                "system": false,
                "id": "qlot7zze",
                "name": "side",
                "type": "select",
                "required": true,
                "presentable": true,
                "unique": false,
                "options": {
                    "maxSelect": 1,
                    "values": [
                        "both",
                        "left",
                        "right"
                    ]
                }
            },
            {
                "system": false,
                "id": "ndgtye7l",
                "name": "user",
                "type": "relation",
                "required": true,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "_pb_users_auth_",
                    "cascadeDelete": true,
                    "minSelect": null,
                    "maxSelect": 1,
                    "displayFields": null
                }
            }
        ],
        "indexes": [],
        "listRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nuser = @request.auth.id",
        "viewRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nuser = @request.auth.id",
        "createRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\[email protected] = @request.auth.id",
        "updateRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nuser = @request.auth.id &&\[email protected]:isset = false &&\[email protected]:isset = false",
        "deleteRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nuser = @request.auth.id",
        "options": {}
    },
    {
        "id": "0xs3s3ybf2oqft9",
        "name": "training_exercises",
        "type": "base",
        "system": false,
        "schema": [
            {
                "system": false,
                "id": "s6cjh2sl",
                "name": "standard_type",
                "type": "relation",
                "required": true,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "5422m4ifkd3lm6u",
                    "cascadeDelete": true,
                    "minSelect": null,
                    "maxSelect": 1,
                    "displayFields": null
                }
            },
            {
                "system": false,
                "id": "0ikcpk8t",
                "name": "record_type",
                "type": "relation",
                "required": true,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "j3vrc315kmtrszd",
                    "cascadeDelete": true,
                    "minSelect": null,
                    "maxSelect": 1,
                    "displayFields": null
                }
            },
            {
                "system": false,
                "id": "9hq2ngkg",
                "name": "side_type",
                "type": "relation",
                "required": true,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "9lvuk7xy9hkwe6y",
                    "cascadeDelete": true,
                    "minSelect": null,
                    "maxSelect": 1,
                    "displayFields": null
                }
            },
            {
                "system": false,
                "id": "zgaukufw",
                "name": "exercise",
                "type": "relation",
                "required": true,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "3eb1orvttr28h0u",
                    "cascadeDelete": true,
                    "minSelect": null,
                    "maxSelect": 1,
                    "displayFields": null
                }
            },
            {
                "system": false,
                "id": "prosroek",
                "name": "sets",
                "type": "relation",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "bd4wt0o3z9l87kz",
                    "cascadeDelete": false,
                    "minSelect": null,
                    "maxSelect": null,
                    "displayFields": null
                }
            },
            {
                "system": false,
                "id": "pt2hjaqb",
                "name": "user",
                "type": "relation",
                "required": true,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "_pb_users_auth_",
                    "cascadeDelete": true,
                    "minSelect": null,
                    "maxSelect": 1,
                    "displayFields": null
                }
            }
        ],
        "indexes": [],
        "listRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nuser = @request.auth.id &&\nexercise.is_active = true",
        "viewRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nuser = @request.auth.id &&\nexercise.is_active = true",
        "createRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\[email protected] = @request.auth.id &&\[email protected]_active = true",
        "updateRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nuser = @request.auth.id &&\[email protected]_type:isset = false &&\[email protected]_type:isset = false &&\[email protected]_type:isset = false &&\[email protected]:isset = false &&\[email protected]:isset = false",
        "deleteRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nuser = @request.auth.id",
        "options": {}
    },
    {
        "id": "slypdvyjj0fvrdl",
        "name": "user_level_history",
        "type": "base",
        "system": false,
        "schema": [
            {
                "system": false,
                "id": "oxdmsr0j",
                "name": "level",
                "type": "number",
                "required": true,
                "presentable": true,
                "unique": false,
                "options": {
                    "min": 1,
                    "max": 10,
                    "noDecimal": true
                }
            },
            {
                "system": false,
                "id": "nruansfb",
                "name": "user",
                "type": "relation",
                "required": true,
                "presentable": true,
                "unique": false,
                "options": {
                    "collectionId": "_pb_users_auth_",
                    "cascadeDelete": true,
                    "minSelect": null,
                    "maxSelect": 1,
                    "displayFields": null
                }
            }
        ],
        "indexes": [],
        "listRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nuser = @request.auth.id",
        "viewRule": "@request.auth.id != \"\" && @request.auth.verified = true &&\nuser = @request.auth.id",
        "createRule": null,
        "updateRule": null,
        "deleteRule": null,
        "options": {}
    },
    {
        "id": "quc42922z57pwki",
        "name": "v_program_dates",
        "type": "view",
        "system": false,
        "schema": [
            {
                "system": false,
                "id": "r8wtiyl4",
                "name": "current_program",
                "type": "relation",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "collectionId": "mi3je4efdj8po68",
                    "cascadeDelete": false,
                    "minSelect": null,
                    "maxSelect": 1,
                    "displayFields": null
                }
            },
            {
                "system": false,
                "id": "z6czuo7l",
                "name": "days_in_program",
                "type": "json",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "maxSize": 1
                }
            },
            {
                "system": false,
                "id": "y3qnqehr",
                "name": "current_day_index",
                "type": "json",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "maxSize": 1
                }
            },
            {
                "system": false,
                "id": "qngf11b3",
                "name": "started_at",
                "type": "date",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "min": "",
                    "max": ""
                }
            },
            {
                "system": false,
                "id": "iejfybed",
                "name": "full_days_since_started",
                "type": "json",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "maxSize": 1
                }
            },
            {
                "system": false,
                "id": "af6no6ob",
                "name": "full_weeks_since_started",
                "type": "json",
                "required": false,
                "presentable": false,
                "unique": false,
                "options": {
                    "maxSize": 1
                }
            }
        ],
        "indexes": [],
        "listRule": null,
        "viewRule": "id = @request.auth.id && @request.auth.verified = true",
        "createRule": null,
        "updateRule": null,
        "deleteRule": null,
        "options": {
            "query": "SELECT\n  u.id,\n  p.id AS current_program,\n  JSON_ARRAY_LENGTH(p.days) AS days_in_program,\n  (((UNIXEPOCH() - UNIXEPOCH(p.started_at)) / 86400) % JSON_ARRAY_LENGTH(p.days)) AS current_day_index,\n  p.started_at,\n  ((UNIXEPOCH() - UNIXEPOCH(p.started_at)) / 86400) AS full_days_since_started,\n  ((UNIXEPOCH() - UNIXEPOCH(p.started_at)) / 604800) AS full_weeks_since_started\nFROM programs AS p\n  RIGHT JOIN users AS u ON u.current_program = p.id;"
        }
    }
]

from pocketbase.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.