org.pentaho.di.trans.steps.terafast.FastloadControlBuilder.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.di.trans.steps.terafast.FastloadControlBuilder.java

Source

/*! ******************************************************************************
 *
 * Pentaho Data Integration
 *
 * Copyright (C) 2002-2013 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.trans.steps.terafast;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.SystemUtils;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.row.ValueMeta;
import org.pentaho.di.core.row.ValueMetaInterface;
import org.pentaho.di.core.util.Assert;
import org.pentaho.di.core.util.StringListPluginProperty;

/**
 * @author <a href="mailto:thomas.hoedl@aschauer-edv.at">Thomas Hoedl(asc042)</a>
 *
 */
public class FastloadControlBuilder {

    public static final String DATAFILE_COLUMN_SEPERATOR = "|";

    public static final String RECORD_FORMAT_UNFORMATTED = "unformatted";

    public static final String RECORD_VARTEXT = "VARTEXT \"" + DATAFILE_COLUMN_SEPERATOR + "\"";

    /* Fastload default error tables */
    public static final String DEFAULT_ERROR_TABLE1 = "error1";

    public static final String DEFAULT_ERROR_TABLE2 = "error2";

    public static final String DEFAULT_DATE_FORMAT = "yyyy/MM/dd";

    public static final String DEFAULT_NULL_VALUE = "?";

    private final StringBuilder builder = new StringBuilder();

    /**
     * Append new line.
     *
     * @return this.
     */
    public FastloadControlBuilder newline() {
        this.builder.append(';');
        this.builder.append(SystemUtils.LINE_SEPARATOR);
        return this;
    }

    /**
     * Append log on. Connection string must be in form [DBHOST]/[USER],[PASSWORD], e.g. localtd/user,pass;
     *
     * @param connectionString
     *          the connection string.
     * @return this.
     * @throws IllegalArgumentException
     *           if connection string is blank.
     */
    public FastloadControlBuilder logon(final String connectionString) throws IllegalArgumentException {
        Assert.assertNotBlank(connectionString, "Connection must not be blank");
        this.builder.append("LOGON ").append(connectionString);
        return this.newline();
    }

    /**
     * Append log on.
     *
     * @param dbhost
     *          DB host, e.g localtd
     * @param user
     *          the user.
     * @param password
     *          the password.
     * @return this
     * @throws IllegalArgumentException
     *           if input is invalid.
     */
    public FastloadControlBuilder logon(final String dbhost, final String user, final String password)
            throws IllegalArgumentException {
        Assert.assertNotBlank(dbhost, "DB host must not be blank");
        Assert.assertNotBlank(user, "User must not be blank");
        Assert.assertNotNull(password, "Password must not be null");
        this.builder.append("LOGON ");
        this.builder.append(dbhost);
        this.builder.append('/');
        this.builder.append(user);
        this.builder.append(',');
        this.builder.append(password);
        return this.newline();
    }

    /**
     *
     * @param format
     *          the format.
     * @return this.
     * @throws IllegalArgumentException
     *           if format is invalid.
     */
    public FastloadControlBuilder setRecordFormat(final String format) throws IllegalArgumentException {
        Assert.assertNotBlank(format, "Format must not be blank");
        return line("SET RECORD " + format);
    }

    /**
     *
     * @param sessions
     *          the sesssions.
     * @return this.
     * @throws IllegalArgumentException
     *           if sessions <= 0
     */
    public FastloadControlBuilder setSessions(final int sessions) throws IllegalArgumentException {
        Assert.assertGreaterZero(sessions);
        return line("SESSIONS " + sessions);
    }

    /**
     *
     * @param errorLimit
     *          the errorLimit.
     * @return this.
     * @throws IllegalArgumentException
     *           if errorLimit <= 0
     */
    public FastloadControlBuilder setErrorLimit(final int errorLimit) throws IllegalArgumentException {
        Assert.assertGreaterZero(errorLimit);
        return line("ERRLIMIT " + errorLimit);
    }

    /**
     * @param targetTableFields
     *          ...
     * @param dataFile
     *          ...
     * @return this
     */
    public FastloadControlBuilder define(final RowMetaInterface targetTableFields,
            StringListPluginProperty tableFieldList, final String dataFile) {
        Assert.assertNotNull(targetTableFields, "fields cannot be null");
        Assert.assertNotNull(dataFile, "dataFile cannot be null");

        this.builder.append("DEFINE ");
        for (int i = 0; i < targetTableFields.size(); i++) {
            ValueMetaInterface value = targetTableFields.getValueMeta(i);
            int tableIndex = tableFieldList.getValue().indexOf(value.getName());
            if (tableIndex >= 0) {
                this.builder.append(value.getName());
                // all fields of type VARCHAR. converted by fastload if necessary
                int length = 0;
                if (value.getType() == ValueMetaInterface.TYPE_DATE) {
                    length = DEFAULT_DATE_FORMAT.length();
                } else {
                    length = value.getLength();
                }
                this.builder.append("(" + "VARCHAR(" + length + "), nullif = '"
                        + String.format("%1$" + length + "s", DEFAULT_NULL_VALUE) + "'), ");
                this.builder.append(SystemUtils.LINE_SEPARATOR);
            }
        }
        this.builder.append(" NEWLINECHAR(VARCHAR(" + SystemUtils.LINE_SEPARATOR.length() + "))");
        this.builder.append(" FILE=" + dataFile);
        return this.newline();
    }

    /**
     * @param targetTableFields
     *          ...
     * @param tableFieldList
     * @param tableName
     *          ...
     * @return ...
     */
    public FastloadControlBuilder insert(final RowMetaInterface targetTableFields,
            StringListPluginProperty tableFieldList, final String tableName) {
        Assert.assertNotNull(targetTableFields, "targetTableFields cannot be null.");
        Assert.assertNotNull(tableName, "TableName cannot be null.");

        this.builder.append("INSERT INTO " + tableName + "(");
        for (int i = 0; i < targetTableFields.size(); i++) {
            int tableIndex = tableFieldList.getValue().indexOf(targetTableFields.getValueMeta(i).getName());
            if (tableIndex >= 0) {
                this.builder.append(":" + targetTableFields.getValueMeta(i).getName());
                if (targetTableFields.getValueMeta(i).getType() == ValueMeta.TYPE_DATE) {
                    this.builder.append("(DATE, FORMAT '");
                    this.builder.append(DEFAULT_DATE_FORMAT);
                    this.builder.append("')");
                }
                if (i < tableFieldList.size() - 1) {
                    this.builder.append(",");
                }
            }
        }
        this.builder.append(")");
        return this.newline();
    }

    /**
     * show field definition.
     *
     * @return this
     */
    public FastloadControlBuilder show() {
        return line("SHOW");
    }

    /**
     *
     * @return this
     */
    public FastloadControlBuilder endLoading() {
        return line("END LOADING");
    }

    /**
     * Issue begin loading with default error tables.
     *
     * @param table
     *          the target table.
     * @return this.
     * @throws IllegalArgumentException
     *           if table is invalid.
     */
    public FastloadControlBuilder beginLoading(final String schemaName, final String table)
            throws IllegalArgumentException {
        Assert.assertNotBlank(table);
        this.builder.append("BEGIN LOADING ");
        this.builder.append(table);
        this.builder.append(" ERRORFILES ");
        if (!Const.isEmpty(schemaName)) {
            this.builder.append(schemaName);
            this.builder.append(".");
            this.builder.append(DEFAULT_ERROR_TABLE1);
            this.builder.append(",");
            this.builder.append(schemaName);
            this.builder.append(".");
            this.builder.append(DEFAULT_ERROR_TABLE2);
        } else {
            this.builder.append(DEFAULT_ERROR_TABLE1);
            this.builder.append(",");
            this.builder.append(DEFAULT_ERROR_TABLE2);
        }
        return this.newline();
    }

    /**
     * Append line, nothing if line is blank.
     *
     * @param line
     *          line to append.
     * @return this.
     */
    public FastloadControlBuilder line(final String line) {
        if (StringUtils.isBlank(line)) {
            return this;
        }
        this.builder.append(line);
        return this.newline();
    }

    /**
     * Append log off.
     *
     * @return this.
     */
    public FastloadControlBuilder logoff() {
        this.builder.append("LOGOFF");
        return this.newline();
    }

    /**
     * {@inheritDoc}
     *
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return this.builder.toString();
    }

}