content: /*
   * Copyright 1999-2012 Alibaba Group.
   *  
   * Licensed 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.
   */
  /**
   * (created at 2011-1-21)
   */
  package com.alibaba.cobar.parser.ast.expression.primary.literal;
  
  import java.util.HashMap;
  import java.util.Map;
  
  import com.alibaba.cobar.parser.ast.expression.Expression;
  import com.alibaba.cobar.parser.visitor.SQLASTVisitor;
  
  /**
   * @author <a href="mailto:shuo.qius@alibaba-inc.com">QIU Shuo</a>
   */
  public class IntervalPrimary extends Literal {
      public static enum Unit {
          MICROSECOND,
          SECOND,
          MINUTE,
          HOUR,
          DAY,
          WEEK,
          MONTH,
          QUARTER,
          YEAR,
          SECOND_MICROSECOND,
          MINUTE_MICROSECOND,
          MINUTE_SECOND,
          HOUR_MICROSECOND,
          HOUR_SECOND,
          HOUR_MINUTE,
          DAY_MICROSECOND,
          DAY_SECOND,
          DAY_MINUTE,
          DAY_HOUR,
          YEAR_MONTH
      }
  
      private static final Map<String, Unit> unitMap = initUnitMap();
  
      private static Map<String, Unit> initUnitMap() {
          Unit[] units = Unit.class.getEnumConstants();
          Map<String, Unit> map = new HashMap<String, IntervalPrimary.Unit>(units.length);
          for (Unit unit : units) {
              map.put(unit.name(), unit);
          }
          return map;
      }
  
      /**
       * @param unitString must be upper case, null is forbidden
       */
      public static Unit getIntervalUnit(String unitString) {
          return unitMap.get(unitString);
      }
  
      private final Unit unit;
      private final Expression quantity;
  
      public IntervalPrimary(Expression quantity, Unit unit) {
          super();
          if (quantity == null)
              throw new IllegalArgumentException("quantity expression is null");
          if (unit == null)
              throw new IllegalArgumentException("unit of time is null");
          this.quantity = quantity;
          this.unit = unit;
      }
  
      /**
       * @return never null
       */
      public Unit getUnit() {
          return unit;
      }
  
      /**
       * @return never null
       */
      public Expression getQuantity() {
          return quantity;
      }
  
      @Override
      public void accept(SQLASTVisitor visitor) {
          visitor.visit(this);
      }
  }
  