{"id":24775017,"url":"https://github.com/baranasoftware/query-parser","last_synced_at":"2026-06-30T20:32:06.724Z","repository":{"id":260334079,"uuid":"865536179","full_name":"baranasoftware/query-parser","owner":"baranasoftware","description":"A Go library (lexer and parser) for parsing query parameters.","archived":false,"fork":false,"pushed_at":"2025-04-17T19:22:50.000Z","size":27,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-03T13:37:12.319Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/baranasoftware.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-09-30T17:33:27.000Z","updated_at":"2025-04-17T19:22:53.000Z","dependencies_parsed_at":null,"dependency_job_id":"4646a39f-3b46-49a9-bed3-806737436302","html_url":"https://github.com/baranasoftware/query-parser","commit_stats":null,"previous_names":["baranasoftware/query-parser"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/baranasoftware/query-parser","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baranasoftware%2Fquery-parser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baranasoftware%2Fquery-parser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baranasoftware%2Fquery-parser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baranasoftware%2Fquery-parser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/baranasoftware","download_url":"https://codeload.github.com/baranasoftware/query-parser/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baranasoftware%2Fquery-parser/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34983170,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-30T02:00:05.919Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":"2025-01-29T06:37:29.920Z","updated_at":"2026-06-30T20:32:06.698Z","avatar_url":"https://github.com/baranasoftware.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Reference Materials\n* [Let's make a Teeny Tiny compiler series](https://austinhenley.com/blog/teenytinycompiler1.html)\n* [Writing A Compiler In Go](https://compilerbook.com/)\n* [Crafting Interpreters](https://craftinginterpreters.com/)\n* [Pratt Parsers](https://journal.stuffwithstuff.com/2011/03/19/pratt-parsers-expression-parsing-made-easy/)\n* [Demystifying Pratt Parsers](https://martin.janiczek.cz/2023/07/03/demystifying-pratt-parsers.html)\n\n# Lexer and Parser for Parsing Query Parameters\n\nA lexer and parser (API) for parsing REST query parameters.\n\n`?filter=expression`\n\n| Operation                         | \tFunction         | Example                                               |\n|-----------------------------------|-------------------|-------------------------------------------------------|\n| Equality                          | `equals`\t           | `?filter=equals(lastName,'Smith')`                      |\n| Less than                         | `lessThan`          | \t`?filter=lessThan(age,'25')`                           |\n| Less than or equal to             | `lessOrEqual`\t      | `?filter=lessOrEqual(lastModified,'2001-01-01')`        |\n| Greater than                      | `greaterThan`       | \t`?filter=greaterThan(duration,'6:12:14')`              |\n| Greater than or equal to\t         | `greaterOrEqual`\t   | `?filter=greaterOrEqual(percentage,'33.33')`            \n| Contains text                     | `contains`          | \t`?filter=contains(description,'cooking')`              |\n| Starts with text                  | `startsWith`\t       | `?filter=startsWith(description,'The')`                 \n| Ends with                 text    | `endsWith`          | \t\t`?filter=endsWith(description,'End')`                 |\n| Equals one   value       from set | `any`               | \t\t`?filter=any(chapter,'Intro','Summary','Conclusion')` |\n| Collection contains  items        | `has`               | \t\t`?filter=has(articles)`                               |\n| Negation                          | `not`             \t | `?filter=not(equals(lastName,null))`                    |\n| Conditional logical OR            | `or`                | `?filter=or(has(orders),has(invoices))`                 |\n| Conditional logical AND           | `and`               | \t\t`?filter=and(has(orders),has(invoices))`              |\n\n## Notes \n* Comparison operators compare an attribute against a constant value (between quotes), null or another attribute:\n  \n  `GET /users?filter=equals(displayName,'Brian Connor') HTTP/1.1`\n\n  `GET /users?filter=equals(displayName,null) HTTP/1.1`\n\n  `GET /users?filter=equals(displayName,lastName) HTTP/1.1`\n* Comparison operators can be combined with the count function, which acts on to-many relationships:\n    \n  `GET /customers?filter=greaterThan(count(orders),count(invoices)) HTTP/1.1`\n\n  `GET /blogs?filter=lessThan(count(owner.articles),'10') HTTP/1.1`\n* Complex filter:\n  \n  `GET /blogs?include=owner.articles.revisions\u0026filter=and(or(equals(title,'Technology'),has(owner.articles)),not(equals(owner.lastName,null)))\u0026filter[owner.articles]=equals(caption,'Two')\u0026filter[owner.articles.revisions]=greaterThan(publishTime,'2005-05-05') HTTP/1.1`  \n\n\n\n## Grammar\n\n```\ngrammar Filter;\n\nfilterExpression:\n    notExpression\n    | logicalExpression\n    | comparisonExpression\n    | matchTextExpression\n    | anyExpression\n    | hasExpression;\n\nnotExpression:\n    'not' LPAREN filterExpression RPAREN;\n\nlogicalExpression:\n    ( 'and' | 'or' ) LPAREN filterExpression ( COMMA filterExpression )* RPAREN;\n\ncomparisonExpression:\n    ( 'equals' | 'greaterThan' | 'greaterOrEqual' | 'lessThan' | 'lessOrEqual' ) LPAREN (\n        countExpression | fieldChain\n    ) COMMA (\n        countExpression | literalConstant | 'null' | fieldChain\n    ) RPAREN;\n\nmatchTextExpression:\n    ( 'contains' | 'startsWith' | 'endsWith' ) LPAREN fieldChain COMMA literalConstant RPAREN;\n\nanyExpression:\n    'any' LPAREN fieldChain ( COMMA literalConstant )+ RPAREN;\n\nhasExpression:\n    'has' LPAREN fieldChain ( COMMA filterExpression )? RPAREN;\n\ncountExpression:\n    'count' LPAREN fieldChain RPAREN;\n\nfieldChain:\n    FIELD ( '.' FIELD )*;\n\nliteralConstant:\n    ESCAPED_TEXT;\n\nLPAREN: '(';\nRPAREN: ')';\nCOMMA: ',';\n\nfragment OUTER_FIELD_CHARACTER: [A-Za-z0-9];\nfragment INNER_FIELD_CHARACTER: [A-Za-z0-9_-];\nFIELD: OUTER_FIELD_CHARACTER ( INNER_FIELD_CHARACTER* OUTER_FIELD_CHARACTER )?;\n\nESCAPED_TEXT: '\\'' ( ~['] | '\\'\\'' )* '\\'' ;\n\nLINE_BREAKS: [\\r\\n]+ -\u003e skip;\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbaranasoftware%2Fquery-parser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbaranasoftware%2Fquery-parser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbaranasoftware%2Fquery-parser/lists"}