{"record":{"id":"8b72fe55a644009a","repo":"refinedev/refine","slug":"value-array-must-contain-exactly-two-elements-for","errorCode":null,"errorMessage":"Value array must contain exactly two elements for \"between\" operator","messagePattern":"Value array must contain exactly two elements for \"between\" operator","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/appwrite/src/utils/generateFilter.ts","lineNumber":38,"sourceCode":"  switch (filter.operator) {\n    // Logical operators\n    case \"eq\":\n      return Query.equal(filter.field, filter.value);\n    case \"ne\":\n      return Query.notEqual(filter.field, filter.value);\n    case \"gt\":\n      return Query.greaterThan(filter.field, filter.value);\n    case \"gte\":\n      return Query.greaterThanEqual(filter.field, filter.value);\n    case \"lt\":\n      return Query.lessThan(filter.field, filter.value);\n    case \"lte\":\n      return Query.lessThanEqual(filter.field, filter.value);\n    case \"contains\":\n      return Query.search(filter.field, `%${filter.value}%`);\n    case \"between\":\n      if (!Array.isArray(filter.value) || filter.value.length !== 2) {\n        throw new Error(\n          `Value array must contain exactly two elements for \"between\" operator`,\n        );\n      }\n      return Query.between(filter.field, filter.value[0], filter.value[1]);\n    case \"null\":\n      return Query.isNull(filter.field);\n    case \"nnull\":\n      return Query.isNotNull(filter.field);\n    case \"startswith\":\n      return Query.startsWith(filter.field, filter.value);\n    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);","sourceCodeStart":20,"sourceCodeEnd":56,"githubUrl":"https://github.com/refinedev/refine/blob/779d52a20e29b0307ac0df04d135beba434370dc/packages/appwrite/src/utils/generateFilter.ts#L20-L56","documentation":"The Appwrite data provider requires the 'between' filter operator's value to be an array of exactly two elements (start and end) so it can map to Appwrite's Query.between(field, start, end). Any other shape throws this error.","triggerScenarios":"Using filters: [{ field: 'age', operator: 'between', value: 18 }] or value: [1,2,3], or value: 'a,b' — i.e. anything but a 2-element array.","commonSituations":"Copy-pasting filter values from a UI date-range/number-range component that emits a string, an object, or an array with empty entries; migrating filters from another data provider with different 'between' conventions.","solutions":["Ensure the value is a 2-element array: value: [start, end]","Check range picker components (e.g. Ant Design RangePicker) output and convert to [dayjs/Date, dayjs/Date] pairs","Validate filter shape before calling the data provider"],"exampleFix":"// before\nfilters: [{ field: 'createdAt', operator: 'between', value: '2023-01-01,2023-12-31' }]\n// after\nfilters: [{ field: 'createdAt', operator: 'between', value: ['2023-01-01', '2023-12-31'] }]","handlingStrategy":"validation","validationCode":"const ok = f.operator === 'between' && Array.isArray(f.value) && f.value.length === 2;\nif (!ok) throw new Error('between requires [start, end]');","typeGuard":"const isBetweenPair = (v: unknown): v is [unknown, unknown] => Array.isArray(v) && v.length === 2;","tryCatchPattern":null,"preventionTips":["Normalize range-picker output to 2-element arrays before use","Type filters as CrudFilter so TS catches wrong value shapes"],"tags":["appwrite","filter","between","validation"],"backgroundTag":"invalid-filter-value","analyzedSha":"779d52a20e29b0307ac0df04d135beba434370dc","analyzedAt":"2026-08-27T11:15:25.854Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}