{"id":20358132,"url":"https://github.com/irods/irods_api_plugin_genquery2","last_synced_at":"2026-03-09T04:31:26.259Z","repository":{"id":66171947,"uuid":"585988960","full_name":"irods/irods_api_plugin_genquery2","owner":"irods","description":"An experimental re-implementation of the iRODS GenQuery parser.","archived":false,"fork":false,"pushed_at":"2024-04-19T17:41:38.000Z","size":119,"stargazers_count":2,"open_issues_count":22,"forks_count":4,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-04-12T03:35:13.762Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/irods.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-01-06T16:29:54.000Z","updated_at":"2024-04-19T17:41:25.000Z","dependencies_parsed_at":null,"dependency_job_id":"5fb23ab6-aa50-4600-b223-449b67ea55af","html_url":"https://github.com/irods/irods_api_plugin_genquery2","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/irods/irods_api_plugin_genquery2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/irods%2Firods_api_plugin_genquery2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/irods%2Firods_api_plugin_genquery2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/irods%2Firods_api_plugin_genquery2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/irods%2Firods_api_plugin_genquery2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/irods","download_url":"https://codeload.github.com/irods/irods_api_plugin_genquery2/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/irods%2Firods_api_plugin_genquery2/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30283414,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-09T02:57:19.223Z","status":"ssl_error","status_checked_at":"2026-03-09T02:56:26.373Z","response_time":61,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":"2024-11-14T23:25:29.391Z","updated_at":"2026-03-09T04:31:26.210Z","avatar_url":"https://github.com/irods.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# iRODS GenQuery2 Parser\n\n**IMPORTANT: iRODS 4.3.2 has built-in support for GenQuery2. DO NOT install packages or binaries produced by this project on 4.3.2+ servers.**\n\nAn **experimental** re-implementation of the iRODS GenQuery parser.\n\nThis project exists as a means for allowing the iRODS community to test the implementation and provide feedback so that the iRODS Consortium can produce a GenQuery parser that is easy to understand, maintain, and enhance all while providing a syntax that mirrors standard SQL as much as possible.\n\nOnce stable, the code will be merged into the iRODS server making it available with future releases of iRODS.\n\n**If you use this project, please consider providing feedback through issues and/or discussions. We want to hear from you :-)**\n\n## Features\n\n- Enforces the iRODS permission model\n- Logical AND, OR, and NOT\n- Grouping via parentheses\n- SQL CAST\n- SQL GROUP BY\n- SQL aggregate functions (e.g. count, sum, avg, etc)\n- Per-column sorting via ORDER BY [ASC|DESC]\n- SQL FETCH FIRST N ROWS ONLY (LIMIT offered as an alias)\n- Metadata queries involving different iRODS entities (i.e. data objects, collections, users, and resources)\n- Operators: =, !=, \u003c, \u003c=, \u003e, \u003e=, LIKE, BETWEEN, IS [NOT] NULL\n- SQL keywords are case-insensitive\n- Federation is supported\n- Escaping of single quotes\n- Bytes encoded as hexadecimal\n\n## Limitations (for now)\n\n- Groups are not fully supported\n- Cannot resolve tickets to data objects and collections using a single query\n- Integer values must be treated as strings, except when used for OFFSET, LIMIT, FETCH FIRST _N_ ROWS ONLY\n\n## Building\n\nThis project provides an API Plugin, a Rule Engine Plugin, and an iCommand upon successfully compiling it.\n\n### Dependencies\n- irods-dev(el)\n- irods-runtime\n- irods-externals-boost\n- irods-externals-fmt\n- irods-externals-json\n- irods-externals-nanodbc\n- irods-externals-spdlog\n- openssl development libraries\n- flex 2.6.1\n- bison 3.0.4\n\nYou may need to install rpm-build for Almalinux 8.\n\nThe steps for building the package are:\n```bash\nmkdir build\ncd build\ncmake /path/to/git/repo\nninja package # Or, make -j package\n```\n\nSo far, this implementation has only run on Ubuntu 20.04 and Almalinux 8.\n\n## Usage\n\n### API Plugin\n\nThe following interface is not stable and may change over time.\n\n- API Number: 1000001\n- Input:\n    - `query_string`: A GenQuery2 string.\n    - `zone`: The name of the zone to execute the query in. If null, the query is executed in the local zone.\n    - `sql_only`: An integer which instructs the API plugin to return SQL without executing it.\n- Output: A JSON string (i.e. an array of array of strings) or iRODS error code.\n\n### Microservices\n\nIn order to use the microservices, you'll need to enable the Rule Engine Plugin.\n\nIn your server_config.json file, insert the following inside of the rule_engines stanza:\n```json\n{\n    \"instance_name\": \"irods_rule_engine_plugin-genquery2-instance\",\n    \"plugin_name\": \"irods_rule_engine_plugin-genquery2\",\n    \"plugin_specific_configuration\": {}\n}\n```\n\nWith that in place, you now have access to several microservices. Below is an example demonstrating their use via the iRODS Rule Language.\n\nLet the following rule exist in `/etc/irods/core.re`.\n```bash\ngenquery2_test_rule()\n{\n    # Execute a query. The results are stored in the Rule Engine Plugin.\n    genquery2_execute(*handle, \"select COLL_NAME, DATA_NAME order by DATA_NAME desc limit 1\");\n\n    # Iterate over the results.\n    while (errorcode(genquery2_next_row(*handle)) == 0) {\n        genquery2_column(*handle, '0', *coll_name); # Copy the COLL_NAME into *coll_name.\n        genquery2_column(*handle, '1', *data_name); # Copy the DATA_NAME into *data_name.\n        writeLine(\"stdout\", \"logical path =\u003e [*coll_name/*data_name]\");\n    }\n\n    # Free any resources used. This is handled for you when the agent is shut down as well.\n    genquery2_destroy(*handle);\n}\n```\n\nWe can run the rule using the following:\n```bash\nirule -r irods_rule_engine_plugin-irods_rule_language-instance genquery2_test_rule '*handle=%*coll_name=%*data_name=' ruleExecOut\n```\n\n### iCommand\n\n`iquery` is a very simple iCommand which allows users to run GenQuery2 queries from the command line.\n\nThis tool is not designed as a replacement for `iquest`. It was designed for testing so it lacks several features.\n\n#### Usage\n\n```\niquery \u003cquery_string\u003e\n```\n\nThe command returns a JSON string on success.\n\nIf there's an error, it is printed to the terminal as is. Error information is NOT guaranteed to return as a JSON string.\n\nSee the help text for additional options and information.\n```bash\niquery -h\n```\n\n#### Examples\n\nNOTE: You can pipe the results to `jq` (if installed) so that they are easy to read.\n\n```bash\n# List all data objects and collections the user has access to.\niquery \"select COLL_NAME, DATA_NAME\"\n\n# List all replicas the user has access to.\niquery \"select no distinct DATA_ID, COLL_NAME, DATA_NAME, DATA_REPL_NUM\"\n\n# List all data objects which exist in the following resource hierarchies.\niquery \"select COLL_NAME, DATA_NAME where DATA_RESC_HIER in ('demoResc', 'pt;repl;ufs0', 'otherResc')\"\n\n# List all data objects along with the resource name which satisfy the mixed metadata query.\niquery \"select COLL_NAME, DATA_NAME, RESC_NAME where META_COLL_ATTR_NAME = 'a1' and (META_DATA_ATTR_NAME = 'a2' or META_RESC_ATTR_VALUE not like 'v1%')\"\n\n# List all data objects and collections the user has access to in \"otherZone\".\niquery -z otherZone \"select COLL_NAME, DATA_NAME\"\n\n# Show the SQL that would be executed. The \"pg_format\" SQL formatter is only used for demonstration purposes.\niquery --sql-only \"select COLL_NAME, DATA_NAME where RESC_NAME = 'demoResc'\" | pg_format -\nSELECT DISTINCT\n    t0.coll_name,\n    t1.data_name\nFROM\n    R_COLL_MAIN t0\n    INNER JOIN R_DATA_MAIN t1 ON t0.coll_id = t1.coll_id\n    INNER JOIN R_RESC_MAIN t2 ON t1.resc_id = t2.resc_id\n    INNER JOIN R_OBJT_ACCESS pdoa ON t1.data_id = pdoa.object_id\n    INNER JOIN R_TOKN_MAIN pdt ON pdoa.access_type_id = pdt.token_id\n    INNER JOIN R_USER_MAIN pdu ON pdoa.user_id = pdu.user_id\n    INNER JOIN R_OBJT_ACCESS pcoa ON t0.coll_id = pcoa.object_id\n    INNER JOIN R_TOKN_MAIN pct ON pcoa.access_type_id = pct.token_id\n    INNER JOIN R_USER_MAIN pcu ON pcoa.user_id = pcu.user_id\nWHERE\n    t2.resc_name = ?\n    AND pdu.user_name = ?\n    AND pcu.user_name = ?\n    AND pdoa.access_type_id \u003e= 1050\n    AND pcoa.access_type_id \u003e= 1050 FETCH FIRST 16 ROWS ONLY\n```\n\n## Logging\n\nYou can instruct the parser to show additional information as it processes messages by adding the following line to the log_level stanza in server_config.json. For example:\n```javascript\n{\n    \"log_level\": {\n        // ... Other Log Categories ...\n\n        \"genquery2\": \"trace\",\n\n        // ... Other Log Categories ...\n    }\n}\n```\n\n## Available Columns\n\nNOTE: GenQuery2 column names are subject to change as the implementation is improved.\n\n| GenQuery2 Column | Database Table | Database Column |\n|---|---|---|\n| COLL_ACCESS_PERM_ID | R_OBJT_ACCESS | access_type_id |\n| COLL_ACCESS_PERM_NAME | R_TOKN_MAIN | token_name |\n| COLL_ACCESS_USER_ID | R_OBJT_ACCESS | user_id |\n| COLL_ACCESS_USER_NAME | R_USER_NAME | user_name |\n| COLL_COMMENTS | R_COLL_MAIN | r_comment |\n| COLL_CREATE_TIME | R_COLL_MAIN | create_ts |\n| COLL_ID | R_COLL_MAIN | coll_id |\n| COLL_INFO1 | R_COLL_MAIN | coll_info1 |\n| COLL_INFO2 | R_COLL_MAIN | coll_info2 |\n| COLL_INHERITANCE | R_COLL_MAIN | coll_inheritance |\n| COLL_MAP_ID | R_COLL_MAIN | coll_map_id |\n| COLL_MODIFY_TIME | R_COLL_MAIN | modify_ts |\n| COLL_NAME | R_COLL_MAIN | coll_name |\n| COLL_PARENT_NAME | R_COLL_MAIN | parent_coll_name |\n| COLL_TYPE | R_COLL_MAIN | coll_type |\n| DATA_ACCESS_PERM_ID | R_OBJT_ACCESS | access_type_id |\n| DATA_ACCESS_PERM_NAME | R_TOKN_MAIN | token_name |\n| DATA_ACCESS_USER_ID | R_OBJT_ACCESS | user_id |\n| DATA_ACCESS_USER_NAME | R_USER_MAIN | user_name |\n| DATA_CHECKSUM | R_DATA_MAIN | data_checksum |\n| DATA_COLL_ID | R_DATA_MAIN | coll_id |\n| DATA_COMMENTS | R_DATA_MAIN | r_comment |\n| DATA_CREATE_TIME | R_DATA_MAIN | create_ts |\n| DATA_EXPIRY | R_DATA_MAIN | data_expiry_ts |\n| DATA_ID | R_DATA_MAIN | data_id |\n| DATA_MAP_ID | R_DATA_MAIN | data_map_id |\n| DATA_MODE | R_DATA_MAIN | data_mode |\n| DATA_MODIFY_TIME | R_DATA_MAIN | modify_ts |\n| DATA_NAME | R_DATA_MAIN | data_name |\n| DATA_PATH | R_DATA_MAIN | data_path |\n| DATA_REPL_NUM | R_DATA_MAIN | data_repl_num |\n| DATA_REPL_STATUS | R_DATA_MAIN | data_is_dirty |\n| DATA_RESC_HIER | N/A | hier _(derived)_ |\n| DATA_RESC_ID | R_DATA_MAIN | resc_id |\n| DATA_SIZE | R_DATA_MAIN | data_size |\n| DATA_STATUS | R_DATA_MAIN | data_status |\n| DATA_TYPE_NAME | R_DATA_MAIN | data_type_name |\n| DATA_VERSION | R_DATA_MAIN | data_version |\n| DELAY_RULE_ESTIMATED_EXE_TIME | R_RULE_EXEC | estimated_exe_time |\n| DELAY_RULE_EXE_ADDRESS | R_RULE_EXEC | exe_address |\n| DELAY_RULE_EXE_FREQUENCY | R_RULE_EXEC | exe_frequency |\n| DELAY_RULE_EXE_TIME | R_RULE_EXEC | exe_time |\n| DELAY_RULE_ID | R_RULE_EXEC | rule_exec_id |\n| DELAY_RULE_LAST_EXE_TIME | R_RULE_EXEC | last_exe_time |\n| DELAY_RULE_NAME | R_RULE_EXEC | rule_name |\n| DELAY_RULE_NOTIFICATION_ADDR | R_RULE_EXEC | notification_addr |\n| DELAY_RULE_PRIORITY | R_RULE_EXEC | priority |\n| DELAY_RULE_REI_FILE_PATH | R_RULE_EXEC | rei_file_path |\n| DELAY_RULE_STATUS | R_RULE_EXEC | exe_status |\n| DELAY_RULE_USER_NAME | R_RULE_EXEC | user_name |\n| GROUP_ID | R_USER_GROUP | group_user_id |\n| GROUP_MEMBER_ID | R_USER_GROUP | user_id |\n| META_COLL_ATTR_ID | R_META_MAIN | meta_id |\n| META_COLL_ATTR_NAME | R_META_MAIN | meta_attr_name |\n| META_COLL_ATTR_UNITS | R_META_MAIN | meta_attr_unit |\n| META_COLL_ATTR_VALUE | R_META_MAIN | meta_attr_value |\n| META_COLL_CREATE_TIME | R_META_MAIN | create_ts |\n| META_COLL_MODIFY_TIME | R_META_MAIN | modify_ts |\n| META_DATA_ATTR_ID | R_META_MAIN | meta_id |\n| META_DATA_ATTR_NAME | R_META_MAIN | meta_attr_name |\n| META_DATA_ATTR_UNITS | R_META_MAIN | meta_attr_unit |\n| META_DATA_ATTR_VALUE | R_META_MAIN | meta_attr_value |\n| META_DATA_CREATE_TIME | R_META_MAIN | create_ts |\n| META_DATA_MODIFY_TIME | R_META_MAIN | modify_ts |\n| META_RESC_ATTR_ID | R_META_MAIN | meta_id |\n| META_RESC_ATTR_NAME | R_META_MAIN | meta_attr_name |\n| META_RESC_ATTR_UNITS | R_META_MAIN | meta_attr_unit |\n| META_RESC_ATTR_VALUE | R_META_MAIN | meta_attr_value |\n| META_RESC_CREATE_TIME | R_META_MAIN | create_ts |\n| META_RESC_MODIFY_TIME | R_META_MAIN | modify_ts |\n| META_USER_ATTR_ID | R_META_MAIN | meta_id |\n| META_USER_ATTR_NAME | R_META_MAIN | meta_attr_name |\n| META_USER_ATTR_UNITS | R_META_MAIN | meta_attr_unit |\n| META_USER_ATTR_VALUE | R_META_MAIN | meta_attr_value |\n| META_USER_CREATE_TIME | R_META_MAIN | create_ts |\n| META_USER_MODIFY_TIME | R_META_MAIN | modify_ts |\n| RESC_CHILDREN | R_RESC_MAIN | resc_children  |\n| RESC_CLASS_NAME | R_RESC_MAIN | resc_class_name |\n| RESC_COMMENT | R_RESC_MAIN | r_comment |\n| RESC_CONTEXT | R_RESC_MAIN | resc_context  |\n| RESC_CREATE_TIME | R_RESC_MAIN | create_ts |\n| RESC_FREE_SPACE | R_RESC_MAIN | free_space |\n| RESC_FREE_SPACE_TIME | R_RESC_MAIN | free_space_ts |\n| RESC_HOSTNAME | R_RESC_MAIN | resc_net |\n| RESC_ID | R_RESC_MAIN | resc_id |\n| RESC_INFO | R_RESC_MAIN | resc_info |\n| RESC_MODIFY_TIME | R_RESC_MAIN | modify_ts  |\n| RESC_NAME | R_RESC_MAIN | resc_name |\n| RESC_PARENT_CONTEXT | R_RESC_MAIN | resc_parent_context |\n| RESC_PARENT_ID | R_RESC_MAIN | resc_parent  |\n| RESC_STATUS | R_RESC_MAIN | resc_status |\n| RESC_TYPE_NAME | R_RESC_MAIN | resc_type_name |\n| RESC_VAULT_PATH | R_RESC_MAIN | resc_def_path  |\n| RESC_ZONE_NAME | R_RESC_MAIN | zone_name |\n| TICKET_ALLOWED_GROUP_NAME | R_TICKET_ALLOWED_GROUPS | group_name |\n| TICKET_ALLOWED_GROUP_TICKET_ID | R_TICKET_ALLOWED_GROUPS | ticket_id |\n| TICKET_ALLOWED_HOST | R_TICKET_ALLOWED_HOSTS | host |\n| TICKET_ALLOWED_HOST_TICKET_ID | R_TICKET_ALLOWED_HOSTS | ticket_id |\n| TICKET_ALLOWED_USER_NAME | R_TICKET_ALLOWED_USERS | user_name |\n| TICKET_ALLOWED_USER_TICKET_ID | R_TICKET_ALLOWED_USERS | ticket_id |\n| TICKET_CREATE_TIME | R_TICKET_MAIN | create_time |\n| TICKET_EXPIRY_TIME | R_TICKET_MAIN | ticket_expiry_ts |\n| TICKET_ID | R_TICKET_MAIN | ticket_id |\n| TICKET_MODIFY_TIME | R_TICKET_MAIN | modify_time |\n| TICKET_OBJECT_ID | R_TICKET_MAIN | object_id |\n| TICKET_OBJECT_TYPE | R_TICKET_MAIN | object_type |\n| TICKET_STRING | R_TICKET_MAIN | ticket_string |\n| TICKET_TYPE | R_TICKET_MAIN | ticket_type |\n| TICKET_USER_ID | R_TICKET_MAIN | user_id |\n| TICKET_USES_COUNT | R_TICKET_MAIN | uses_count |\n| TICKET_USES_LIMIT | R_TICKET_MAIN | uses_limit |\n| TICKET_WRITE_BYTE_COUNT | R_TICKET_MAIN | write_byte_count |\n| TICKET_WRITE_BYTE_LIMIT | R_TICKET_MAIN | write_byte_limit |\n| TICKET_WRITE_FILE_COUNT | R_TICKET_MAIN | write_file_count |\n| TICKET_WRITE_FILE_LIMIT | R_TICKET_MAIN | write_file_limit |\n| USER_AUTH_ID | R_USER_AUTH | user_id |\n| USER_COMMENT | R_USER_MAIN | r_comment |\n| USER_CREATE_TIME | R_USER_MAIN | create_ts |\n| USER_DN | R_USER_AUTH | user_auth_name |\n| USER_DN_INVALID | R_USER_MAIN | r_comment |\n| USER_ID | R_USER_MAIN | user_id |\n| USER_INFO | R_USER_MAIN | user_info |\n| USER_MODIFY_TIME | R_USER_MAIN | modify_ts |\n| USER_NAME | R_USER_MAIN | user_name |\n| USER_TYPE | R_USER_MAIN | user_type_name |\n| USER_ZONE | R_USER_MAIN | zone_name |\n| ZONE_COMMENT | R_ZONE_MAIN | r_comment |\n| ZONE_CONNECTION | R_ZONE_MAIN | zone_conn_string |\n| ZONE_CREATE_TIME | R_ZONE_MAIN | create_ts |\n| ZONE_ID | R_ZONE_MAIN | zone_id |\n| ZONE_MODIFY_TIME | R_ZONE_MAIN | modify_ts |\n| ZONE_NAME | R_ZONE_MAIN | zone_name |\n| ZONE_TYPE | R_ZONE_MAIN | zone_type_name |\n\n## Questions and Answers\n\n### Can I use the GenQuery2 microservices with the Python Rule Engine Plugin (PREP)?\n\nYes. The important thing to remember is that the GenQuery2 microservices can update input arguments. This behavior is fully supported by the iRODS Rule Language, but not the PREP. Changes to input arguments are only visible via the object returned from the microservice.\n\nBelow is an example demonstrating how to use the GenQuery2 microservices with the PREP. Pay close attention to the objects returned from each microservice call.\n\n```python\ndef list_all_data_objects(rule_args, callback, rei):\n    # Notice the first input argument. In the iRODS Rule Language, the microservice\n    # would write the handle to it. Here, it is only a placeholder.\n    result = callback.genquery2_execute('', 'select COLL_NAME, DATA_NAME')\n\n    # We can retrieve the handle by reading the \"arguments\" list like so. The\n    # \"arguments\" list is zero-indexed and each index maps to an argument in the call\n    # previously made.\n    handle = result['arguments'][0]\n\n    while True:\n        try:\n            callback.genquery2_next_row(handle)\n        except:\n            break\n\n        result = callback.genquery2_column(handle, '0', '')\n        coll_name = result['arguments'][2]\n\n        result = callback.genquery2_column(handle, '1', '')\n        data_name = result['arguments'][2]\n\n        callback.writeLine('stdout', 'logical path =\u003e [{}/{}]'.format(coll_name, data_name))\n                                                                                            \n    callback.genquery2_destroy(handle)\n```\n\n### How do I embed single quotes within a string literal?\n\nTo embed a single quote character within a string literal, write two adjacent single quotes.\n\nFor example, `'John''s file.txt'`.\n\n### How do I embed a hexadecimal byte within a string literal?\n\nTo embed a hexadecimal byte within a string literal, use `\\xNN`, where **NN** is the hexadecimal value of the byte.\n\nFor example, if the parser is passed `'Hello, GenQuery2\\x21'`, it will expand the string to `'Hello, GenQuery2!'`. This happens before any SQL is executed.\n\n`\\x` can only represent a single byte.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Firods%2Firods_api_plugin_genquery2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Firods%2Firods_api_plugin_genquery2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Firods%2Firods_api_plugin_genquery2/lists"}