blob: f1941b29fef15b02bc7c7aadf80e2250774abb9a [file] [log] [blame]
/*
* 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.sql.type;
import org.apache.calcite.avatica.util.ArrayImpl;
import com.google.common.collect.ImmutableMap;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.locationtech.jts.geom.Geometry;
import java.math.BigDecimal;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.List;
import java.util.Map;
/**
* JavaToSqlTypeConversionRules defines mappings from common Java types to
* corresponding SQL types.
*/
public class JavaToSqlTypeConversionRules {
//~ Static fields/initializers ---------------------------------------------
private static final JavaToSqlTypeConversionRules INSTANCE =
new JavaToSqlTypeConversionRules();
//~ Instance fields --------------------------------------------------------
private final Map<Class<?>, SqlTypeName> rules =
ImmutableMap.<Class<?>, SqlTypeName>builder()
.put(Integer.class, SqlTypeName.INTEGER)
.put(int.class, SqlTypeName.INTEGER)
.put(Long.class, SqlTypeName.BIGINT)
.put(long.class, SqlTypeName.BIGINT)
.put(Short.class, SqlTypeName.SMALLINT)
.put(short.class, SqlTypeName.SMALLINT)
.put(byte.class, SqlTypeName.TINYINT)
.put(Byte.class, SqlTypeName.TINYINT)
.put(Float.class, SqlTypeName.REAL)
.put(float.class, SqlTypeName.REAL)
.put(Double.class, SqlTypeName.DOUBLE)
.put(double.class, SqlTypeName.DOUBLE)
.put(boolean.class, SqlTypeName.BOOLEAN)
.put(Boolean.class, SqlTypeName.BOOLEAN)
.put(byte[].class, SqlTypeName.VARBINARY)
.put(String.class, SqlTypeName.VARCHAR)
.put(char[].class, SqlTypeName.VARCHAR)
.put(Character.class, SqlTypeName.CHAR)
.put(char.class, SqlTypeName.CHAR)
.put(java.util.Date.class, SqlTypeName.TIMESTAMP)
.put(Date.class, SqlTypeName.DATE)
.put(Timestamp.class, SqlTypeName.TIMESTAMP)
.put(Time.class, SqlTypeName.TIME)
.put(BigDecimal.class, SqlTypeName.DECIMAL)
.put(Geometry.class, SqlTypeName.GEOMETRY)
.put(ResultSet.class, SqlTypeName.CURSOR)
.put(ColumnList.class, SqlTypeName.COLUMN_LIST)
.put(ArrayImpl.class, SqlTypeName.ARRAY)
.put(List.class, SqlTypeName.ARRAY)
.put(Map.class, SqlTypeName.MAP)
.put(Void.class, SqlTypeName.NULL)
.build();
//~ Methods ----------------------------------------------------------------
/**
* Returns the
* {@link org.apache.calcite.util.Glossary#SINGLETON_PATTERN singleton}
* instance.
*/
public static JavaToSqlTypeConversionRules instance() {
return INSTANCE;
}
/**
* Returns a corresponding {@link SqlTypeName} for a given Java class.
*
* @param javaClass the Java class to lookup
* @return a corresponding SqlTypeName if found, otherwise null is returned
*/
public @Nullable SqlTypeName lookup(Class javaClass) {
return rules.get(javaClass);
}
/**
* Make this public when needed. To represent COLUMN_LIST SQL value, we need
* a type distinguishable from {@link List} in user-defined types.
*/
private interface ColumnList extends List {
}
}