{"record":{"id":"f6ee785d2cde3d85","repo":"refinedev/refine","slug":"operator-filter-operator-is-not-supported","errorCode":null,"errorMessage":"Operator ${filter.operator} is not supported","messagePattern":"Operator (.+?) is not supported","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/appwrite/src/utils/generateFilter.ts","lineNumber":67,"sourceCode":"    case \"endswith\":\n      return Query.endsWith(filter.field, filter.value);\n\n    // Conditional operators\n    case \"or\":\n      if (filter.value.length === 1 && filter.value[0]) {\n        //? \"OR\" queries require at least two queries in Appwrite\n        return generateFilter(filter.value[0], nextDeep);\n      }\n      return Query.or(filter.value.map((f) => generateFilter(f, nextDeep)));\n    case \"and\":\n      if (filter.value.length === 1 && filter.value[0]) {\n        //? \"AND\" queries require at least two queries in Appwrite\n        return generateFilter(filter.value[0], nextDeep);\n      }\n      return Query.and(filter.value.map((f) => generateFilter(f, nextDeep)));\n\n    default:\n      throw new Error(`Operator ${filter.operator} is not supported`);\n  }\n};\n","sourceCodeStart":49,"sourceCodeEnd":70,"githubUrl":"https://github.com/refinedev/refine/blob/779d52a20e29b0307ac0df04d135beba434370dc/packages/appwrite/src/utils/generateFilter.ts#L49-L70","documentation":"generateFilter in refine's Appwrite provider only supports a fixed set of CrudFilter operators (eq, ne, lt, lte, gt, gte, in, nin, contains, between, null, contains, and/or). Hitting the default branch means the filter.operator is not in that switch.","triggerScenarios":"Passing an unsupported operator such as 'nnull', 'startswith', 'endswith', 'containss', or a typo like 'contians' in filters to an Appwrite-backed resource.","commonSituations":"Migrating from another data provider (e.g. Strapi/Simple REST) whose filter grammar supports more operators; upgrading refine versions where operator names changed; typos in operator strings.","solutions":["Replace the unsupported operator with a supported equivalent ('nnull' → use 'null' semantics or restructure; 'startswith' → 'contains' or server-side logic)","Check the refine CrudFilter operator union type for the Appwrite-supported set","Move exotic filtering to meta/custom query parameters handled server-side"],"exampleFix":"// before\nfilters: [{ field: 'title', operator: 'startswith', value: 'Hello' }]\n// after\nfilters: [{ field: 'title', operator: 'contains', value: 'Hello' }]","handlingStrategy":"type-guard","validationCode":"const SUPPORTED = new Set(['eq','ne','lt','lte','gt','gte','in','nin','contains','between','null','and','or']);\nif (!SUPPORTED.has(filter.operator)) { /* map or drop filter */ }","typeGuard":"const isAppwriteOperator = (op: string) => new Set(['eq','ne','lt','lte','gt','gte','in','nin','contains','between','null','and','or']).has(op);","tryCatchPattern":null,"preventionTips":["Centralize operator mapping when migrating providers","Type filters as CrudFilter from @refinedev/core"],"tags":["appwrite","filter","unsupported-operator"],"backgroundTag":"unsupported-filter-operator","analyzedSha":"779d52a20e29b0307ac0df04d135beba434370dc","analyzedAt":"2026-08-27T11:15:25.854Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}