{"record":{"id":"5d56715cd15420fd","repo":"OrchardCMS/OrchardCore","slug":"invalid-range-query","errorCode":null,"errorMessage":"Invalid range query","messagePattern":"Invalid range query","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/OrchardCore/OrchardCore.Lucene.Core/QueryProviders/Filters/RangeFilterProvider.cs","lineNumber":106,"sourceCode":"\n                        break;\n\n                    case JsonValueKind.String:\n                        var minString = gt?.Value<string>();\n                        var maxString = lt?.Value<string>();\n                        rangeQuery = TermRangeQuery.NewStringRange(field, minString, maxString, includeLower, includeUpper);\n                        break;\n\n                    default: throw new ArgumentException($\"Unsupported range value type: {type}\");\n                }\n\n                if (boost != null)\n                {\n                    rangeQuery.Boost = boost.Value;\n                }\n\n                break;\n            default: throw new ArgumentException(\"Invalid range query\");\n        }\n\n        booleanQuery.Add(rangeQuery, Occur.MUST);\n        var queryFilter = new QueryWrapperFilter(rangeQuery);\n\n        return new FilteredQuery(booleanQuery, queryFilter);\n    }\n}\n","sourceCodeStart":88,"sourceCodeEnd":115,"githubUrl":"https://github.com/OrchardCMS/OrchardCore/blob/4306c0717fe573f6fca1b4955909ddab6a192807/src/OrchardCore/OrchardCore.Lucene.Core/QueryProviders/Filters/RangeFilterProvider.cs#L88-L115","documentation":"This is RangeFilterProvider.CreateFilteredQuery's outer default switch branch. The range filter's overall value was neither an object (holding gt/gte/lt/lte bounds) nor the other handled node kind, so no range query could be constructed and the provider throws ArgumentException(\"Invalid range query\").","triggerScenarios":"Calling CreateFilteredQuery with {\"range\": {\"Price\": 42}} or {\"range\": {\"Price\": [1, 10]}} — a scalar or array value where an object with bounds (gt/gte/lt/lte) is required, so the outer switch falls to default.","commonSituations":"Writing bounds as a tuple-style array out of habit from other query DSLs; a serialized filter losing its nested object during JSON round-tripping; hand-edited saved queries where the bounds object was accidentally deleted.","solutions":["Express bounds as an object: {\"range\": {\"Price\": {\"gte\": 1, \"lte\": 10}}}.","Omit unused bounds instead of substituting arrays or scalars for them.","Validate that every range filter's value is a JSON object before executing the query.","Check recipes/saved queries for range filters whose object value was flattened during editing or migration."],"exampleFix":"// before\n{\"range\": {\"Price\": [1, 10]}}\n// after\n{\"range\": {\"Price\": {\"gte\": 1, \"lte\": 10}}}","handlingStrategy":"validation","validationCode":"if (filter.TryGetPropertyValue(field, out var v) && v.ValueKind != JsonValueKind.Object)\n{\n    throw new InvalidOperationException(\n        $\"range filter for '{field}' must be an object of gt/gte/lt/lte bounds, got {v.ValueKind}.\");\n}","typeGuard":"static bool IsRangeObject(JsonElement v) => v.ValueKind == JsonValueKind.Object;","tryCatchPattern":"try\n{\n    var query = provider.CreateFilteredQuery(context);\n}\ncatch (ArgumentException ex) when (ex.Message.Contains(\"Invalid range\"))\n{\n    _logger.LogError(ex, \"Range filter value is not an object: {Json}\", filterJson);\n    throw new QueryValidationException(\"range filters require an object with bounds.\", ex);\n}","preventionTips":["Always model ranges as {\"gt\"/\"gte\", \"lt\"/\"lte\"} objects, never arrays or scalars.","Validate filter JSON structure at query save time.","Avoid hand-editing saved query JSON without revalidation."],"tags":["lucene","query-filter","invalid-argument","range-query"],"backgroundTag":"invalid-argument-format","analyzedSha":"4306c0717fe573f6fca1b4955909ddab6a192807","analyzedAt":"2026-09-13T17:41:05.024Z","contentChangedAt":"2026-09-13T17:41:05.024Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}