{"id":13439932,"url":"https://github.com/ivanceras/inquerest","last_synced_at":"2025-04-13T21:20:46.947Z","repository":{"id":62440981,"uuid":"45709269","full_name":"ivanceras/inquerest","owner":"ivanceras","description":"url parameter parser for rest filter inquiry","archived":false,"fork":false,"pushed_at":"2020-08-07T12:05:09.000Z","size":687,"stargazers_count":24,"open_issues_count":1,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-11T15:26:03.700Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ivanceras.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-11-06T21:39:36.000Z","updated_at":"2024-11-28T16:31:50.000Z","dependencies_parsed_at":"2022-11-01T21:54:01.517Z","dependency_job_id":null,"html_url":"https://github.com/ivanceras/inquerest","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivanceras%2Finquerest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivanceras%2Finquerest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivanceras%2Finquerest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivanceras%2Finquerest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ivanceras","download_url":"https://codeload.github.com/ivanceras/inquerest/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248783213,"owners_count":21160890,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T03:01:18.280Z","updated_at":"2025-04-13T21:20:46.918Z","avatar_url":"https://github.com/ivanceras.png","language":"Rust","funding_links":["https://www.patreon.com/ivanceras"],"categories":["Libraries","库","库 Libraries"],"sub_categories":["Parsing","Parser","解析","解析 Parsing"],"readme":"# inquerest\n\nInquerest can parse complex url query into a SQL abstract syntax tree.\n\nExample this url:\n```rust\n /person?age=lt.42\u0026(student=eq.true|gender=eq.'M')\u0026group_by=sum(age),grade,gender\u0026having=min(age)=gt.42\u0026order_by=age.desc,height.asc\u0026page=20\u0026page_size=100\n```\nwill be parsed into:\n\n```rust\nSelect {\n        from_table: FromTable {\n            from: Table {\n                name: \"person\",\n            },\n            join: None,\n        },\n        filter: Some(\n            BinaryOperation(\n                BinaryOperation {\n                    left: BinaryOperation(\n                        BinaryOperation {\n                            left: Column(\n                                Column {\n                                    name: \"age\",\n                                },\n                            ),\n                            operator: Lt,\n                            right: Value(\n                                Number(\n                                    42.0,\n                                ),\n                            ),\n                        },\n                    ),\n                    operator: And,\n                    right: Nested(\n                        BinaryOperation(\n                            BinaryOperation {\n                                left: BinaryOperation(\n                                    BinaryOperation {\n                                        left: Column(\n                                            Column {\n                                                name: \"student\",\n                                            },\n                                        ),\n                                        operator: Eq,\n                                        right: Value(\n                                            Bool(\n                                                true,\n                                            ),\n                                        ),\n                                    },\n                                ),\n                                operator: Or,\n                                right: BinaryOperation(\n                                    BinaryOperation {\n                                        left: Column(\n                                            Column {\n                                                name: \"gender\",\n                                            },\n                                        ),\n                                        operator: Eq,\n                                        right: Value(\n                                            String(\n                                                \"M\",\n                                            ),\n                                        ),\n                                    },\n                                ),\n                            },\n                        ),\n                    ),\n                },\n            ),\n        ),\n        group_by: Some(\n            [\n                Function(\n                    Function {\n                        name: \"sum\",\n                        params: [\n                            Column(\n                                Column {\n                                    name: \"age\",\n                                },\n                            ),\n                        ],\n                    },\n                ),\n                Column(\n                    Column {\n                        name: \"grade\",\n                    },\n                ),\n                Column(\n                    Column {\n                        name: \"gender\",\n                    },\n                ),\n            ],\n        ),\n        having: Some(\n            BinaryOperation(\n                BinaryOperation {\n                    left: Function(\n                        Function {\n                            name: \"min\",\n                            params: [\n                                Column(\n                                    Column {\n                                        name: \"age\",\n                                    },\n                                ),\n                            ],\n                        },\n                    ),\n                    operator: Gt,\n                    right: Value(\n                        Number(\n                            42.0,\n                        ),\n                    ),\n                },\n            ),\n        ),\n        projection: None,\n        order_by: Some(\n            [\n                Order {\n                    expr: Column(\n                        Column {\n                            name: \"age\",\n                        },\n                    ),\n                    direction: Some(\n                        Desc,\n                    ),\n                },\n                Order {\n                    expr: Column(\n                        Column {\n                            name: \"height\",\n                        },\n                    ),\n                    direction: Some(\n                        Asc,\n                    ),\n                },\n            ],\n        ),\n        range: Some(\n            Page(\n                Page {\n                    page: 20,\n                    page_size: 100,\n                },\n            ),\n        ),\n    }\n```\nWhich translate to the sql statement:\n```sql\nSELECT * FROM person WHERE age \u003c 42 AND (student = true OR gender = 'M') GROUP BY sum(age), grade, gender HAVING min(age) \u003e 42 ORDER BY age DESC, height ASC LIMIT 100 OFFSET 1900 ROWS\n```\nNote: However, you don't want to convert to the sql statement directly to avoid sql injection\nattack. You need to validate the tables and columns if it is allowed to be accessed by the\nuser. You also need to extract the values yourself and supply it as a parameterized value into\nyour ORM.\n\n##### Please support this project:\n[![Become a patron](https://c5.patreon.com/external/logo/become_a_patron_button.png)](https://www.patreon.com/ivanceras)\n\nLicense: MIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fivanceras%2Finquerest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fivanceras%2Finquerest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fivanceras%2Finquerest/lists"}