{"record":{"id":"ea458cb4b66dd6ad","repo":"elastic/elasticsearch","slug":"member-variable-does-not-exist-for-date-objec","errorCode":null,"errorMessage":"Member variable [{}] does not exist for date object on field [{}].","messagePattern":"Member variable \\[(.+?)\\] does not exist for date object on field \\[(.+?)\\]\\.","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/lang-expression/src/main/java/org/elasticsearch/script/expression/DateObject.java","lineNumber":137,"sourceCode":"                fieldData,\n                MultiValueMode.MIN,\n                variable,\n                zdt -> zdt.get(DateFormatters.WEEK_FIELDS_ROOT.weekBasedYear())\n            );\n            case YEAR_VARIABLE -> new DateObjectValueSource(fieldData, MultiValueMode.MIN, variable, ZonedDateTime::getYear);\n            case YEAR_OF_CENTURY_VARIABLE -> new DateObjectValueSource(\n                fieldData,\n                MultiValueMode.MIN,\n                variable,\n                zdt -> zdt.get(ChronoField.YEAR_OF_ERA) % 100\n            );\n            case YEAR_OF_ERA_VARIABLE -> new DateObjectValueSource(\n                fieldData,\n                MultiValueMode.MIN,\n                variable,\n                zdt -> zdt.get(ChronoField.YEAR_OF_ERA)\n            );\n            default -> throw new IllegalArgumentException(\n                \"Member variable [\" + variable + \"] does not exist for date object on field [\" + fieldName + \"].\"\n            );\n        };\n    }\n\n    static DoubleValuesSource getMethod(IndexFieldData<?> fieldData, String fieldName, String method) {\n        return switch (method) {\n            case GETCENTURY_OF_ERA_METHOD -> new DateObjectValueSource(\n                fieldData,\n                MultiValueMode.MIN,\n                method,\n                zdt -> zdt.get(ChronoField.YEAR_OF_ERA) / 100\n            );\n            case GETDAY_OF_MONTH_METHOD -> new DateObjectValueSource(fieldData, MultiValueMode.MIN, method, ZonedDateTime::getDayOfMonth);\n            case GETDAY_OF_WEEK_METHOD -> new DateObjectValueSource(\n                fieldData,\n                MultiValueMode.MIN,\n                method,","sourceCodeStart":119,"sourceCodeEnd":155,"githubUrl":"https://github.com/elastic/elasticsearch/blob/db6a809a667c081ca1dc7500389d26975573215f/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/DateObject.java#L119-L155","documentation":"Thrown by DateObject.getVariable when an expression references an unsupported member VARIABLE on a date OBJECT (doc['<dateField>'].date.<var>). DateObject exposes a fixed vocabulary of Joda-style variables: centuryOfEra, dayOfMonth, dayOfWeek, dayOfYear, era, hourOfDay, millisOfDay, millisOfSecond, minuteOfDay, minuteOfHour, monthOfYear, secondOfDay, secondOfMinute, weekOfWeekyear, weekyear, year, yearOfCentury, yearOfEra. Anything else is rejected.","triggerScenarios":"Writing doc['timestamp'].date.<var> where <var> is misspelled or not in the supported set, e.g. doc['timestamp'].date.millis (correct: millisOfSecond) or doc['timestamp'].date.quarter (quarters are not supported).","commonSituations":"Typos; using java.time field names instead of the Joda-style names the engine expects; expecting a component (like quarter) that the engine never implemented.","solutions":["Use the exact Joda-style variable name from the supported list (e.g. dayOfMonth, monthOfYear, yearOfEra).","For methods, use the get*-prefixed form: doc['timestamp'].date.getDayOfMonth().","If the component is unsupported (e.g. quarter), compute it from supported pieces or index a derived field."],"exampleFix":"// before\ndoc['timestamp'].date.millis\n\n// after\ndoc['timestamp'].date.millisOfSecond","handlingStrategy":"validation","validationCode":"Set<String> OK = Set.of(\n    \"centuryOfEra\",\"dayOfMonth\",\"dayOfWeek\",\"dayOfYear\",\"era\",\"hourOfDay\",\n    \"millisOfDay\",\"millisOfSecond\",\"minuteOfDay\",\"minuteOfHour\",\"monthOfYear\",\n    \"secondOfDay\",\"secondOfMinute\",\"weekOfWeekyear\",\"weekyear\",\"year\",\n    \"yearOfCentury\",\"yearOfEra\");\nif (!OK.contains(variable)) {\n    throw new IllegalArgumentException(\"Unsupported date object variable: \" + variable);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use Joda-style variable names (e.g. monthOfYear, not monthValue).","Note some components like 'quarter' are unsupported - derive them or precompute.","Variable names are case-sensitive; match them exactly."],"tags":["elasticsearch","lang-expression","expression-script","date-object","variable","validation"],"analyzedSha":"db6a809a667c081ca1dc7500389d26975573215f","analyzedAt":"2026-08-12T01:39:14.192Z","schemaVersion":2},"datasetVersion":"2026-08-12T06:17:24.410Z"}