{"record":{"id":"29b6cfc684366bf9","repo":"jd-opensource/joyagent-jdgenie","slug":"filter-is-null","errorCode":null,"errorMessage":"filter is null!","messagePattern":"filter is null!","errorType":"validation","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"genie-backend/src/main/java/com/jd/genie/service/VectorService.java","lineNumber":174,"sourceCode":"            throw new RuntimeException(\"vectorIdList is null!\");\n        }\n\n        try {\n            List<Points.PointId> pointIds = vectorIdList.stream().map(vId -> PointIdFactory.id(UUID.fromString(vId))).collect(Collectors.toList());\n            qdrantService.deletePointsSync(collectionName, pointIds);\n            return true;\n        } catch (Exception e) {\n            log.error(\"vector delete failed, collectionName:{}\", collectionName, e);\n            return false;\n        }\n    }\n\n    public Boolean deleteVector(String collectionName, Points.Filter filter) {\n        if (StringUtils.isBlank(collectionName)) {\n            throw new RuntimeException(\"collectionName is null!\");\n        }\n        if (filter == null) {\n            throw new RuntimeException(\"filter is null!\");\n        }\n        try {\n            qdrantService.deleteByFilterSync(collectionName, filter);\n            return true;\n        } catch (Exception e) {\n            log.error(\"vector delete failed, collectionName:{}\", collectionName, e);\n            return false;\n        }\n    }\n\n    private boolean isUuid(String uuid) {\n        try {\n            UUID.fromString(uuid);\n            return true;\n        } catch (Exception e) {\n            return false;\n        }\n    }","sourceCodeStart":156,"sourceCodeEnd":192,"githubUrl":"https://github.com/jd-opensource/joyagent-jdgenie/blob/2417e0b8b636d941ad5fb14c59b20dddfef5375d/genie-backend/src/main/java/com/jd/genie/service/VectorService.java#L156-L192","documentation":"The Filter-based deleteVector overload requires a non-null Points.Filter; passing null would be an invalid gRPC payload for Qdrant's delete-by-filter API, so the service fails fast with this RuntimeException.","triggerScenarios":"Calling VectorService.deleteVector(collectionName, filter) with filter == null — usually a filter builder that returned null or an uninitialized field.","commonSituations":"Conditional filter-building code paths that skip construction when no criteria match; refactors where a Filter field was never assigned.","solutions":["Construct a valid Points.Filter (even an empty match-none filter) before calling","Guard the call site and skip deletion when filter is null","Fix the filter builder so it always returns a Filter object","Use the vectorIdList overload instead when deleting by explicit IDs"],"exampleFix":"// before\nPoints.Filter filter = buildFilter(criteria); // may return null\nvectorService.deleteVector(\"my-collection\", filter);\n// after\nPoints.Filter filter = Optional.ofNullable(buildFilter(criteria))\n        .orElse(Points.Filter.newBuilder().build());\nvectorService.deleteVector(\"my-collection\", filter);","handlingStrategy":"validation","validationCode":"if (filter == null) {\n    filter = Points.Filter.newBuilder().build(); // or skip the call\n}\nvectorService.deleteVector(collectionName, filter);","typeGuard":null,"tryCatchPattern":"try {\n    vectorService.deleteVector(collectionName, filter);\n} catch (RuntimeException e) {\n    log.error(\"filter-based delete failed: {}\", e.getMessage(), e);\n}","preventionTips":["Ensure filter-builder functions always return a Filter, never null","Use Optional<Filter> internally and unwrap with orElseThrow at construction time","Add null-checks in code that assembles delete criteria","Cover filter construction with unit tests for empty-criteria cases"],"tags":["java","validation","qdrant","null-argument"],"backgroundTag":"null-argument","analyzedSha":"2417e0b8b636d941ad5fb14c59b20dddfef5375d","analyzedAt":"2026-09-08T11:28:19.414Z","contentChangedAt":"2026-09-08T11:28:19.414Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}