/* * 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.eigenbase.sql; import org.eigenbase.sql.parser.*; import org.eigenbase.sql.type.*; import org.eigenbase.util.*; /** * A SQL literal representing a time interval. * * <p>Examples: * * <ul> * <li>INTERVAL '1' SECOND</li> * <li>INTERVAL '1:00:05.345' HOUR</li> * <li>INTERVAL '3:4' YEAR TO MONTH</li> * </ul> * * <p>YEAR/MONTH intervals are not implemented yet.</p> * * <p>The interval string, such as '1:00:05.345', is not parsed yet.</p> */ public class SqlIntervalLiteral extends SqlLiteral { //~ Constructors ----------------------------------------------------------- protected SqlIntervalLiteral( int sign, String intervalStr, SqlIntervalQualifier intervalQualifier, SqlTypeName sqlTypeName, SqlParserPos pos) { this( new IntervalValue(intervalQualifier, sign, intervalStr), sqlTypeName, pos); } private SqlIntervalLiteral( IntervalValue intervalValue, SqlTypeName sqlTypeName, SqlParserPos pos) { super( intervalValue, sqlTypeName, pos); } //~ Methods ---------------------------------------------------------------- public SqlNode clone(SqlParserPos pos) { return new SqlIntervalLiteral( (IntervalValue) value, getTypeName(), pos); } public void unparse( SqlWriter writer, int leftPrec, int rightPrec) { IntervalValue interval = (IntervalValue) value; writer.keyword("INTERVAL"); if (interval.getSign() == -1) { writer.print("-"); } writer.literal("'" + value.toString() + "'"); writer.keyword(interval.intervalQualifier.toString()); } public int signum() { return ((IntervalValue) value).signum(); } //~ Inner Classes ---------------------------------------------------------- /** * A Interval value. */ public static class IntervalValue { private final SqlIntervalQualifier intervalQualifier; private final String intervalStr; private final int sign; /** * Creates an interval value. * * @param intervalQualifier Interval qualifier * @param sign Sign (+1 or -1) * @param intervalStr Interval string */ IntervalValue( SqlIntervalQualifier intervalQualifier, int sign, String intervalStr) { assert (sign == -1) || (sign == 1); assert intervalQualifier != null; assert intervalStr != null; this.intervalQualifier = intervalQualifier; this.sign = sign; this.intervalStr = intervalStr; } public boolean equals(Object obj) { if (!(obj instanceof IntervalValue)) { return false; } IntervalValue that = (IntervalValue) obj; return this.intervalStr.equals(that.intervalStr) && (this.sign == that.sign) && this.intervalQualifier.equalsDeep(that.intervalQualifier, false); } public int hashCode() { int h = Util.hash(sign, intervalStr); int i = Util.hash(h, intervalQualifier); return i; } public SqlIntervalQualifier getIntervalQualifier() { return intervalQualifier; } public String getIntervalLiteral() { return intervalStr; } public int getSign() { return sign; } public int signum() { for (int i = 0; i < intervalStr.length(); i++) { char ch = intervalStr.charAt(i); if (ch >= '1' && ch <= '9') { // If non zero return sign. return getSign(); } } return 0; } public String toString() { return intervalStr; } } } // End SqlIntervalLiteral.java