/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2016 by Pentaho : http://www.pentaho.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 org.pentaho.di.core.database;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
import org.pentaho.di.core.row.ValueMetaInterface;
import org.pentaho.di.core.row.value.ValueMetaNone;
import org.pentaho.di.core.row.value.ValueMetaNumber;
import org.pentaho.di.core.row.value.ValueMetaString;
public class MSSQLServerDatabaseMeta_FieldDefinitionTest {
private MSSQLServerDatabaseMeta dbMeta;
private static final String DEFAULT_TABLE_NAME = "table";
private static final String STRING_INT = "INT";
private static final String STRING_BIGINT = "BIGINT";
private static final String STRING_DECIMAL = "DECIMAL";
private static final String STRING_FLOAT = "FLOAT";
private static final String STRING_VARCHAR = "VARCHAR";
private static final String STRING_TEXT = "TEXT";
@Before
public void init() {
dbMeta = new MSSQLServerDatabaseMeta();
}
@Test
public void numberType_ZeroLength_ZeroPrecision() {
ValueMetaInterface valueMeta =
new MetaInterfaceBuilder( ValueMetaInterface.TYPE_NUMBER )
.length( 0 )
.precision( 0 )
.build();
assertEquals( STRING_INT, dbMeta.getFieldDefinition( valueMeta, null, null, false, false, false ) );
}
@Test
public void numberType_LessThanNineLength_ZeroPrecision() {
ValueMetaInterface valueMeta =
new MetaInterfaceBuilder( ValueMetaInterface.TYPE_NUMBER )
.length( 5 )
.precision( 0 )
.build();
assertEquals( STRING_INT, dbMeta.getFieldDefinition( valueMeta, null, null, false, false, false ) );
}
@Test
public void numberType_MoreThanNineLessThanEighteenLength_ZeroPrecision() {
ValueMetaInterface valueMeta =
new MetaInterfaceBuilder( ValueMetaInterface.TYPE_NUMBER )
.length( 17 )
.precision( 0 )
.build();
assertEquals( STRING_BIGINT, dbMeta.getFieldDefinition( valueMeta, null, null, false, false, false ) );
}
@Test
public void numberType_MoreThanEighteenLength_ZeroPrecision() {
ValueMetaInterface valueMeta =
new MetaInterfaceBuilder( ValueMetaInterface.TYPE_NUMBER )
.length( 19 )
.precision( 0 )
.build();
final String expected =
STRING_DECIMAL + "(" + valueMeta.getLength() + "," + valueMeta.getPrecision() + ")";
assertEquals( expected, dbMeta.getFieldDefinition( valueMeta, null, null, false, false, false ) );
}
@Test
public void numberType_NonZeroLength_NonZeroPrecision() {
ValueMetaInterface valueMeta =
new MetaInterfaceBuilder( ValueMetaInterface.TYPE_NUMBER )
.length( 5 )
.precision( 5 )
.build();
final String expected = STRING_DECIMAL + "(" + valueMeta.getLength() + "," + valueMeta.getPrecision() + ")";
assertEquals( expected, dbMeta.getFieldDefinition( valueMeta, null, null, false, false, false ) );
}
@Test
public void numberType_ZeroLength_NonZeroPrecision() {
ValueMetaInterface valueMeta = new MetaInterfaceBuilder( ValueMetaInterface.TYPE_NUMBER )
.length( 0 )
.precision( 5 )
.build();
final String definition = dbMeta.getFieldDefinition( valueMeta, null, null, false, false, false );
// There is actually returned FLOAT(53), where 53 is hardcoded string,
// but we don't wanna tie to it, so checking type only.
assertTrue( definition.contains( STRING_FLOAT ) );
}
@Test
public void stringType_ZeroLength() {
ValueMetaInterface valueMeta = new MetaInterfaceBuilder( ValueMetaInterface.TYPE_STRING )
.length( 0 )
.build();
final String definition = dbMeta.getFieldDefinition( valueMeta, null, null, false, false, false );
// There is actually returned VARCHAR(100), where 100 is hardcoded string,
// but we don't wanna tie to it, so checking type only.
assertTrue( definition.contains( STRING_VARCHAR ) );
}
@Test
public void stringType_NonZeroLength() {
ValueMetaInterface valueMeta = new MetaInterfaceBuilder( ValueMetaInterface.TYPE_STRING )
.length( 50 )
.build();
final String expected = STRING_VARCHAR + "(" + valueMeta.getLength() + ")";
assertEquals( expected, dbMeta.getFieldDefinition( valueMeta, null, null, false, false, false ) );
}
@Test
public void stringType_TenThousandLength() {
ValueMetaInterface valueMeta = new MetaInterfaceBuilder( ValueMetaInterface.TYPE_STRING )
.length( 10_000 )
.build();
assertEquals( STRING_TEXT, dbMeta.getFieldDefinition( valueMeta, null, null, false, false, false ) );
}
private static class MetaInterfaceBuilder {
private final ValueMetaInterface meta;
public MetaInterfaceBuilder( Integer type ) {
this( type, DEFAULT_TABLE_NAME );
}
public MetaInterfaceBuilder( Integer type, String name ) {
switch ( type ) {
case ValueMetaInterface.TYPE_NUMBER:
meta = new ValueMetaNumber( name );
break;
case ValueMetaInterface.TYPE_STRING:
meta = new ValueMetaString( name );
break;
default:
meta = new ValueMetaNone( name );
}
}
public MetaInterfaceBuilder length( int length ) {
meta.setLength( length );
return this;
}
public MetaInterfaceBuilder precision( int precision ) {
meta.setPrecision( precision );
return this;
}
public ValueMetaInterface build() {
return meta;
}
}
}