{"record":{"id":"c5a64a92ad8041f0","repo":"apache/druid","slug":"makejsontreeextractor-has-not-been-implemented","errorCode":null,"errorMessage":"makeJsonTreeExtractor has not been implemented.","messagePattern":"makeJsonTreeExtractor has not been implemented\\.","errorType":"exception","errorClass":"UOE","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/java/util/common/parsers/ObjectFlatteners.java","lineNumber":247,"sourceCode":"     */\n    Object getRootField(T obj, String key);\n\n    /**\n     * Create a \"field\" extractor for {@link com.jayway.jsonpath.JsonPath} expressions\n     */\n    Function<T, Object> makeJsonPathExtractor(String expr);\n\n    /**\n     * Create a \"field\" extractor for 'jq' expressions\n     */\n    Function<T, Object> makeJsonQueryExtractor(String expr);\n\n    /**\n     * Create a \"field\" extractor for nested json expressions\n     */\n    default Function<T, Object> makeJsonTreeExtractor(List<String> nodes)\n    {\n      throw new UOE(\"makeJsonTreeExtractor has not been implemented.\");\n    }\n\n    /**\n     * Convert object to Java {@link Map} using {@link #getJsonProvider()} and {@link #finalizeConversionForMap} to\n     * extract and convert data\n     */\n    default Map<String, Object> toMap(T obj)\n    {\n      final Object mapOrNull = toPlainJavaType(obj);\n      if (mapOrNull == null) {\n        return Collections.emptyMap();\n      }\n      return (Map<String, Object>) mapOrNull;\n    }\n\n    /**\n     * Recursively traverse \"json\" object using a {@link JsonProvider}, converting to Java {@link Map} and {@link List},\n     * potentially transforming via {@link #finalizeConversionForMap} as we go","sourceCodeStart":229,"sourceCodeEnd":265,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/java/util/common/parsers/ObjectFlatteners.java#L229-L265","documentation":"The FlattenerMaker interface provides makeJsonTreeExtractor as an optional (default) method that throws UOE(\"makeJsonTreeExtractor has not been implemented.\"). It is only invoked when a flattenSpec contains a TREE-type fieldSpec; flattener implementations that never implemented tree extraction will throw this at create() time via ObjectFlatteners.create().","triggerScenarios":"Using a flattenSpec with a fieldSpec of type \"tree\" against a FlattenerMaker implementation (e.g. a parser whose flattener maker only supports PATH/JQ) that has not overridden makeJsonTreeExtractor.","commonSituations":"Adding \"type\":\"tree\" fieldSpecs to an ingestion spec for a format whose parser does not support tree extraction; upgrading/migrating specs across formats where only some parsers implement tree flattening.","solutions":["Remove the TREE-type fieldSpec or switch it to a supported type (path, jq, json_query) for this parser","Use a parser/flattener whose FlattenerMaker overrides makeJsonTreeExtractor (e.g. the JSON parser's default JSONFlattenerMaker)","Check which parseSpec format you are using and consult its supported flattener types"],"exampleFix":"// before\n{\"type\":\"tree\",\"name\":\"val\",\"nodes\":[\"a\",\"b\"]}\n// after\n{\"type\":\"path\",\"name\":\"val\",\"expr\":\"$.a.b\"}","handlingStrategy":"validation","validationCode":"boolean supportsTree = maker instanceof TreeCapableFlattenerMaker; // or per-parser documentation\nif (spec.getFlattener().stream().anyMatch(fs -> fs.getType().equals(\"tree\")) && !supportsTree) {\n  throw new IllegalArgumentException(\"tree fieldSpecs unsupported for this parser\");\n}","typeGuard":null,"tryCatchPattern":"try { flattener = ObjectFlatteners.create(spec, maker); } catch (UOE e) { if (e.getMessage().contains(\"makeJsonTreeExtractor\")) { /* fall back to path-based spec */ } throw e; }","preventionTips":["Use TREE fieldSpecs only with parsers whose flattener maker implements makeJsonTreeExtractor","Prefer path/jq types when unsure of parser support","Consult the parser's supported flattenSpec types in the Druid docs"],"tags":["flatten-spec","tree-extractor","unsupported-operation"],"backgroundTag":"method-not-implemented","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}