/* * Copyright (c) 2013-2015 Josef Hardi <josef.hardi@gmail.com> * * 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. */ package com.obidea.semantika.database.sql.dialect; import java.sql.Types; import java.util.List; import com.obidea.semantika.exception.SemantikaRuntimeException; public class MySqlDialect extends Sql99Dialect { public MySqlDialect() { super(); } @Override public String concat(List<String> parameters) { StringBuilder sb = new StringBuilder(); sb.append("CONCAT"); //$NON-NLS-1$ sb.append("("); //$NON-NLS-1$ boolean needConcat = false; for (String parameter : parameters) { if (needConcat) { sb.append(","); //$NON-NLS-1$ } sb.append(parameter); needConcat = true; } sb.append(")"); //$NON-NLS-1$ return sb.toString(); } @Override public String regex(String textExpr, String pattern, String flag) { return textExpr + " REGEXP " + pattern; //$NON-NLS-1$ } @Override public String lang(String textExpr) { return String.format("SUBSTRING(%s, LENGTH(%s) - LOCATE('@', REVERSE(%s)) + 2)", textExpr, textExpr, textExpr); //$NON-NLS-1$ } @Override public String cast(String column, int datatype) { return "CAST(" + column + " AS " + getTypeName(datatype) + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } private String getTypeName(int datatype) { switch (datatype) { case Types.VARCHAR: case Types.NVARCHAR: case Types.NCHAR: case Types.LONGVARCHAR: case Types.LONGNVARCHAR: return "CHAR"; //$NON-NLS-1$ case Types.NUMERIC: case Types.DECIMAL: case Types.BIGINT: case Types.INTEGER: case Types.SMALLINT: case Types.TINYINT: case Types.REAL: case Types.FLOAT: case Types.DOUBLE: return "DECIMAL"; //$NON-NLS-1$ case Types.DATE: return "DATE"; //$NON-NLS-1$ case Types.TIME: return "TIME"; //$NON-NLS-1$ case Types.TIMESTAMP: return "DATETIME"; //$NON-NLS-1$ case Types.OTHER: return "CHAR"; //$NON-NLS-1$ } throw new SemantikaRuntimeException("Failed to construct CAST (datatype: " + datatype + ")"); } }