{"record":{"id":"53b25b6d3e60572e","repo":"apache/seatunnel","slug":"query-param-error","errorCode":"QUERY_PARAM_ERROR","errorMessage":"Query parameter error: ","messagePattern":"Query parameter error: ","errorType":"error_code","errorClass":"TypesenseConnectorException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-typesense/src/main/java/org/apache/seatunnel/connectors/seatunnel/typesense/util/URLParamsConverter.java","lineNumber":55,"sourceCode":"                        () ->\n                                new IllegalArgumentException(\n                                        \"Parameter string must not be null or empty.\"));\n    }\n\n    private static Map<String, String> parseParams(String paramsString) {\n        return Arrays.stream(\n                        Optional.ofNullable(paramsString)\n                                .filter(s -> !s.isEmpty())\n                                .orElseThrow(\n                                        () ->\n                                                new IllegalArgumentException(\n                                                        \"Parameter string must not be null or empty.\"))\n                                .split(\"&\"))\n                .map(part -> part.split(\"=\", 2))\n                .peek(\n                        keyValue -> {\n                            if (keyValue.length != 2) {\n                                throw new TypesenseConnectorException(\n                                        TypesenseConnectorErrorCode.QUERY_PARAM_ERROR,\n                                        \"Query parameter error: \" + Arrays.toString(keyValue));\n                            }\n                        })\n                .collect(Collectors.toMap(keyValue -> keyValue[0], keyValue -> keyValue[1]));\n    }\n}\n","sourceCodeStart":37,"sourceCodeEnd":63,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-typesense/src/main/java/org/apache/seatunnel/connectors/seatunnel/typesense/util/URLParamsConverter.java#L37-L63","documentation":"URLParamsConverter.parseParams parses a URL query string into a map by splitting on '&' then on '=' (max 2 parts). If any '&'-separated part does not contain exactly one '=' separator, it throws TypesenseConnectorException(QUERY_PARAM_ERROR, \"Query parameter error: \" + Arrays.toString(keyValue)).","triggerScenarios":"Passing a params string containing a token without '=' — e.g. a bare flag ('debug'), a trailing '&' producing an empty part, or a URL fragment — into the Typesense URL-params configuration.","commonSituations":"Copy-pasted query strings with trailing '&'; boolean flags written as bare keys instead of key=value; params containing encoded '=' inside values combined with other typos.","solutions":["Ensure every parameter is of the form key=value with no bare keys or trailing '&'.","Remove empty segments (e.g. 'a=1&&b=2' or 'a=1&').","Encode values so literal '=' is percent-encoded, or pass parameters as a map if the config supports it."],"exampleFix":"// before\nparams = \"filter_by=num_employees>100&pretty\"\n// after\nparams = \"filter_by=num_employees>100&pretty=true\" // every token must be key=value","handlingStrategy":"validation","validationCode":"// validate the params string before handing it to the connector\nif (params.endsWith(\"&\") || Arrays.stream(params.split(\"&\"))\n        .anyMatch(p -> !p.contains(\"=\") || p.isEmpty())) {\n    throw new IllegalArgumentException(\"every param must be key=value: \" + params);\n}","typeGuard":null,"tryCatchPattern":"try {\n    Map<String, String> m = URLParamsConverter.parseParams(params);\n} catch (TypesenseConnectorException e) {\n    // fix the offending key=value token reported in the message\n}","preventionTips":["Always write parameters as key=value pairs; avoid bare flags.","Strip trailing '&' and empty segments from query strings.","Percent-encode literal '=' inside values."],"tags":["typesense","url","query-parameters","parsing"],"backgroundTag":"invalid-query-parameter","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}