/** * Copyright (C) 2009-2013 FoundationDB, LLC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.foundationdb.server.types.common.types; import com.foundationdb.server.types.TClass; import com.foundationdb.server.types.TInstance; import com.foundationdb.server.types.aksql.aktypes.*; import java.sql.Types; public class TypeValidator { private TypeValidator() { } // TODO: Some of these are properly constraints on the // store. Revisit when RowData is no longer the default. public static boolean isSupportedForColumn(TInstance type) { TClass tclass = TInstance.tClass(type); return ((tclass != null) && isSupportedForColumn(tclass)); } public static boolean isSupportedForColumn(TClass type) { return ((type.jdbcType() != Types.OTHER) || (type instanceof AkGUID)); } public static boolean isSupportedForIndex(TInstance type) { TClass tclass = TInstance.tClass(type); return ((tclass != null) && isSupportedForIndex(tclass)); } public static boolean isSupportedForNonPointSpatialIndex(TInstance type) { TClass tclass = TInstance.tClass(type); return tclass instanceof TString || tclass instanceof TBinary || tclass instanceof AkBlob; } public static boolean isSupportedForIndex(TClass type) { switch (type.jdbcType()) { case Types.BLOB: case Types.CLOB: case Types.LONGVARCHAR: case Types.LONGNVARCHAR: return false; default: return true; } } public static boolean isSupportedForJoin(TInstance type1, TInstance type2) { TClass tclass1 = TInstance.tClass(type1); TClass tclass2 = TInstance.tClass(type2); return ((tclass1 != null) && (tclass2 != null) && isSupportedForJoin(tclass1, tclass2)); } public static boolean isSupportedForJoin(TClass tclass1, TClass tclass2) { if (tclass1 == tclass2) { return true; } int jt1 = baseJoinType(tclass1); int jt2 = baseJoinType(tclass2); if (jt1 == jt2) { switch (jt1) { case Types.DISTINCT: case Types.JAVA_OBJECT: case Types.OTHER: case Types.STRUCT: return false; default: return true; } } else { return false; } } public static boolean isSupportedForGenerator(TInstance instance) { switch (instance.typeClass().jdbcType()) { case Types.BIGINT: case Types.INTEGER: case Types.SMALLINT: return true; default: return false; } } // Want to allow: CHAR & VARCHAR, INT & BIGINT, INT & INT UNSIGNED, etc. // TODO: Also allows DATETIME & TIMESTAMP, and even cross-bundle; // will that be okay? protected static int baseJoinType(TClass tclass) { int jdbcType = tclass.jdbcType(); switch (jdbcType) { case Types.BIGINT: if (tclass.isUnsigned()) return Types.OTHER; /* else falls through */ case Types.TINYINT: case Types.INTEGER: case Types.SMALLINT: return Types.BIGINT; case Types.NUMERIC: case Types.DECIMAL: return Types.DECIMAL; case Types.FLOAT: case Types.REAL: case Types.DOUBLE: return Types.DOUBLE; case Types.CHAR: case Types.NCHAR: case Types.NVARCHAR: case Types.VARCHAR: return Types.VARCHAR; case Types.LONGNVARCHAR: case Types.LONGVARCHAR: case Types.CLOB: return Types.LONGVARCHAR; case Types.BINARY: case Types.BIT: case Types.VARBINARY: return Types.VARBINARY; case Types.LONGVARBINARY: return Types.LONGVARBINARY; default: return jdbcType; } } }