anchor.diff:  * <<painless-group-by>>
   * <<painless-bucket-script>>
   
  +NOTE: While the context of the following examples is the {transform} use case, 
  +the Painless scripts in the snippets below can be used in other {es} search 
  +aggregations, too.
  +
   
   [discrete]
   [[painless-top-hits]]
  -==== Getting top hits by using scripted metric
  +==== Getting top hits by using scripted metric aggregation
   
   This snippet shows how to find the latest document, in other words the document 
   with the earliest timestamp. From a technical perspective, it helps to achieve 
   the function of a <<search-aggregations-metrics-top-hits-aggregation>> by using 
  -scripted metric aggregation which provides a metric output.
  +scripted metric aggregation in a {transform}, which provides a metric output.
   
   [source,js]
   --------------------------------------------------
  -"latest_doc": { 
  -  "scripted_metric": {
  -    "init_script": "state.timestamp_latest = 0L; state.last_doc = ''", <1>
  -    "map_script": """ <2>
  -      def current_date = doc['@timestamp'].getValue().toInstant().toEpochMilli(); 
  -      if (current_date > state.timestamp_latest) 
  -      {state.timestamp_latest = current_date;
  -      state.last_doc = new HashMap(params['_source']);}
  -    """,
  -    "combine_script": "return state", <3>
  -    "reduce_script": """ <4>
  -      def last_doc = '';
  -      def timestamp_latest = 0L;
  -      for (s in states) {if (s.timestamp_latest > (timestamp_latest))
  -      {timestamp_latest = s.timestamp_latest; last_doc = s.last_doc;}} 
  -      return last_doc
  -    """
  +"aggregations": {
  +  "latest_doc": { 
  +    "scripted_metric": {
  +      "init_script": "state.timestamp_latest = 0L; state.last_doc = ''", <1>
  +      "map_script": """ <2>
  +        def current_date = doc['@timestamp'].getValue().toInstant().toEpochMilli(); 
  +        if (current_date > state.timestamp_latest) 
  +        {state.timestamp_latest = current_date;
  +        state.last_doc = new HashMap(params['_source']);}
  +      """,
  +      "combine_script": "return state", <3>
  +      "reduce_script": """ <4>
  +        def last_doc = '';
  +        def timestamp_latest = 0L;
  +        for (s in states) {if (s.timestamp_latest > (timestamp_latest))
  +        {timestamp_latest = s.timestamp_latest; last_doc = s.last_doc;}} 
  +        return last_doc
  +      """
  +    }
     }
   }
   --------------------------------------------------
  
positive.code: `max` are variables mapped to `time_frame.gte.value` and `time_frame.lte.value`.
  <3> Finally, the script substracts the start date of the session from the end 
  date which results in the duration of the session.
  
negative.code: [[painless-time-features]]
  ==== Getting time features as scripted fields
  
  This snippet shows how to extract time based features by using Painless in a 
  {transform}. The snippet uses an index where `@timestamp` is defined as a `date` 
  type field.
  
  [source,js]
  --------------------------------------------------
  "aggregations": {
    "script_fields": {
        "hour_of_day": { <1>
          "script": {
            "lang": "painless",
            "source": """
              ZonedDateTime date =  doc['@timestamp'].value; <2>
              return date.getHour(); <3>
            """
          }
        },
        "month_of_year": { <4>
          "script": {
            "lang": "painless",
            "source": """
              ZonedDateTime date =  doc['@timestamp'].value; <5>
              return date.getMonthValue(); <6>
            """
          }
        }
      },
    ...
  }
  --------------------------------------------------
  // NOTCONSOLE
  
  