{"record":{"id":"fe18246741dd07da","repo":"apache/skywalking","slug":"unsupported-filter","errorCode":null,"errorMessage":"Unsupported filter: {}","messagePattern":"Unsupported filter: (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/v2/generator/MetricDefinitionEnricher.java","lineNumber":497,"sourceCode":"                case LIKE: return \"likeMatch\";\n                case CONTAIN: return \"containMatch\";\n                case NOT_CONTAIN: return \"notContainMatch\";\n                default: throw new IllegalArgumentException(\"Unsupported string operator: \" + op);\n            }\n        } else if (value.isArray()) {\n            return \"inMatch\";\n        } else if (value.isNull()) {\n            return op == FilterOperator.EQUAL ? \"stringMatch\" : \"notEqualMatch\";\n        } else if (value.isEnum()) {\n            // Enum comparisons use string matching (e.g., type == RequestType.MQ)\n            switch (op) {\n                case EQUAL: return \"stringMatch\";\n                case NOT_EQUAL: return \"notEqualMatch\";\n                default: throw new IllegalArgumentException(\"Unsupported enum operator: \" + op);\n            }\n        }\n\n        throw new IllegalArgumentException(\"Unsupported filter: \" + filterExpr);\n    }\n\n    /**\n     * Collect persistent fields from metrics class @Column annotations.\n     */\n    private List<CodeGenModel.DataFieldV2> collectPersistentFields(Class<? extends Metrics> metricsClass) {\n        List<CodeGenModel.DataFieldV2> persistentFields = new ArrayList<>();\n        Class<?> c = metricsClass;\n        while (!c.equals(Object.class)) {\n            for (Field field : c.getDeclaredFields()) {\n                Column column = field.getAnnotation(Column.class);\n                if (column != null) {\n                    persistentFields.add(CodeGenModel.DataFieldV2.builder()\n                        .fieldName(field.getName())\n                        .columnName(column.name())\n                        .type(field.getType())\n                        .typeName(field.getType().getName())\n                        .build());","sourceCodeStart":479,"sourceCodeEnd":515,"githubUrl":"https://github.com/apache/skywalking/blob/102af09b4a56064e22050dded10e2c52e490d040/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/v2/generator/MetricDefinitionEnricher.java#L479-L515","documentation":"The final fallthrough in MetricDefinitionEnricher's operator-to-matcher mapping: the filter's value matched none of the known FilterValue kinds (boolean, number, string, array, null, enum). It indicates a value classification the enricher cannot lower to any matcher expression, so it refuses to generate code rather than emit a broken matcher.","triggerScenarios":"A FilterValue instance whose kind flags are all false — e.g. a new FilterValue variant added to the model without a mapping branch, or an internal inconsistency where a value is constructed with no type set. Not reachable through well-formed OAL text alone.","commonSituations":"Developing new FilterValue kinds in oal-rt; corrupt state from partial/incremental builds mixing old and new model classes.","solutions":["Rewrite the OAL filter to use a plainly supported value form (number, string, boolean, in-list, enum, null comparison)","If extending the model, add the new kind to mapOperatorToExpressionType before the fallthrough","Run mvnw clean install to eliminate stale-class inconsistency"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":null,"typeGuard":"// Guard: a FilterValue must carry exactly one recognized kind before enrichment\nboolean classified(FilterValue v) {\n    return v.isBoolean() || v.isNumber() || v.isString()\n        || v.isArray() || v.isNull() || v.isEnum();\n}","tryCatchPattern":"Only relevant to oal-rt contributors: assert in unit tests that every parsed filter classifies; a production hit means a model bug, so file/fix rather than catch.","preventionTips":["Keep FilterValue kinds closed: adding one requires parser, classifier, renderer and matcher mapping in the same change","Run mvnw clean install after model changes to avoid stale-class mismatches"],"tags":["oal","code-generation","filter","internal"],"backgroundTag":null,"analyzedSha":"102af09b4a56064e22050dded10e2c52e490d040","analyzedAt":"2026-08-14T10:47:52.647Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}