content: /*
   * Licensed to the Apache Software Foundation (ASF) under one or more
   * contributor license agreements.  See the NOTICE file distributed with
   * this work for additional information regarding copyright ownership.
   * The ASF licenses this file to you under the Apache License, Version 2.0
   * (the "License"); you may not use this file except in compliance with
   * the License.  You may obtain a copy of the License at
   *
   * http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package org.apache.calcite.util.format.postgresql.format;
  
  import org.apache.calcite.util.format.postgresql.ChronoUnitEnum;
  import org.apache.calcite.util.format.postgresql.PatternModifier;
  import org.apache.calcite.util.format.postgresql.format.compiled.CompiledPattern;
  import org.apache.calcite.util.format.postgresql.format.compiled.NumberCompiledPattern;
  
  import java.time.ZonedDateTime;
  import java.util.Set;
  import java.util.function.Function;
  
  /**
   * A date/time format component that will parse a sequence of digits into a value
   * (such as "DD").
   */
  public class NumberFormatPattern extends FormatPattern {
    private final ChronoUnitEnum chronoUnit;
    private final Function<ZonedDateTime, Integer> dateTimeToIntFunction;
    private final Function<Integer, Integer> valueAdjuster;
    private final int minCharacters;
    private final int maxCharacters;
    private final int minValue;
    private final int maxValue;
  
    public NumberFormatPattern(String pattern, ChronoUnitEnum chronoUnit,
        Function<ZonedDateTime, Integer> dateTimeToIntConverter,
        Function<Integer, Integer> valueAdjuster, int minCharacters, int maxCharacters, int minValue,
        int maxValue) {
      super(pattern);
      this.chronoUnit = chronoUnit;
      this.dateTimeToIntFunction = dateTimeToIntConverter;
      this.valueAdjuster = valueAdjuster;
      this.minCharacters = minCharacters;
      this.maxCharacters = maxCharacters;
      this.minValue = minValue;
      this.maxValue = maxValue;
    }
  
    public NumberFormatPattern(String pattern, ChronoUnitEnum chronoUnit,
        Function<ZonedDateTime, Integer> dateTimeToIntConverter, int minCharacters,
        int maxCharacters, int minValue, int maxValue) {
      this(pattern, chronoUnit, dateTimeToIntConverter, v -> v, minCharacters, maxCharacters,
          minValue, maxValue);
    }
  
    @Override protected CompiledPattern buildCompiledPattern(Set<PatternModifier> modifiers) {
      return new NumberCompiledPattern(
          chronoUnit,
          dateTimeToIntFunction,
          valueAdjuster,
          minCharacters,
          maxCharacters,
          minValue,
          maxValue,
          pattern,
          modifiers);
    }
  }
  