{"record":{"id":"66fab0fef9380253","repo":"apache/cassandra","slug":"options-to-normalize-terms-cannot-be-both-uppercas","errorCode":null,"errorMessage":"Options to normalize terms cannot be both uppercase and lowercase at the same time","messagePattern":"Options to normalize terms cannot be both uppercase and lowercase at the same time","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/index/sasi/analyzer/NonTokenizingOptions.java","lineNumber":93,"sourceCode":"            return this;\n        }\n\n        public OptionsBuilder upperCaseOutput(boolean upperCaseOutput)\n        {\n            this.upperCaseOutput = upperCaseOutput;\n            return this;\n        }\n\n        public OptionsBuilder lowerCaseOutput(boolean lowerCaseOutput)\n        {\n            this.lowerCaseOutput = lowerCaseOutput;\n            return this;\n        }\n\n        public NonTokenizingOptions build()\n        {\n            if (lowerCaseOutput && upperCaseOutput)\n                throw new IllegalArgumentException(\"Options to normalize terms cannot be \" +\n                        \"both uppercase and lowercase at the same time\");\n\n            NonTokenizingOptions options = new NonTokenizingOptions();\n            options.setCaseSensitive(caseSensitive);\n            options.setUpperCaseOutput(upperCaseOutput);\n            options.setLowerCaseOutput(lowerCaseOutput);\n            return options;\n        }\n    }\n\n    public static NonTokenizingOptions buildFromMap(Map<String, String> optionsMap)\n    {\n        OptionsBuilder optionsBuilder = new OptionsBuilder();\n\n        for (Map.Entry<String, String> entry : optionsMap.entrySet())\n        {\n            switch (entry.getKey())\n            {","sourceCodeStart":75,"sourceCodeEnd":111,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/index/sasi/analyzer/NonTokenizingOptions.java#L75-L111","documentation":"NonTokenizingOptions.Builder.build() enforces that case-normalization is one-directional: lowerCaseOutput and upperCaseOutput cannot both be true. Setting both is contradictory, so the builder throws IllegalArgumentException before constructing the options object.","triggerScenarios":"Calling new NonTokenizingOptions.Builder().setLowercaseOutput(true).setUppercaseOutput(true).build(), or building options from a map where both normalize_lowercase and normalize_uppercase are 'true'.","commonSituations":"Programmatically merging option maps where two sources each set a different normalization flag, or misreading the flags as independent booleans.","solutions":["Set only one of lowercase/uppercase output to true","Default: leave both false to keep original casing","Guard the flags before building"],"exampleFix":"// before\nbuilder.setLowercaseOutput(true).setUppercaseOutput(true).build();\n// after\nbuilder.setLowercaseOutput(true).setUppercaseOutput(false).build();","handlingStrategy":"validation","validationCode":"if (lowerCaseOutput && upperCaseOutput) throw new IllegalArgumentException(\"Choose only one of lowercase/uppercase normalization\");","typeGuard":null,"tryCatchPattern":"try { NonTokenizingOptions opts = builder.build(); } catch (IllegalArgumentException e) { if (e.getMessage().contains(\"both uppercase and lowercase\")) { builder.setUppercaseOutput(false); NonTokenizingOptions opts = builder.build(); } }","preventionTips":["Treat lowercase/uppercase normalization flags as mutually exclusive","Use a single enum (NONE|LOWER|UPPER) in your own config layer"],"tags":["sasi","options-builder","conflicting-options"],"backgroundTag":"mutually-exclusive-options","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}