package com.taobao.yugong.translator;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;

import javax.sql.DataSource;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;

import com.taobao.yugong.common.db.meta.ColumnMeta;
import com.taobao.yugong.common.db.meta.ColumnValue;
import com.taobao.yugong.common.model.record.Record;

/**
 * 一个迁移的例子,提供源库多张表join的例子
 *
 * <pre>
 * 例子说明:
 * 1. 源库有两张表:yugong_example_join和name_join,两张表为1:1模型,通过 yugong_example_join.id =
 * name_join.join_id进行关联
 * 2. 目标库一张表:yugong_example_join
 * 
 * 测试的表结构:
 * oralce:
 * create table yugong_example_join
 * (
 *     id NUMBER(11)  ,
 *     alias_name  char(32) default ' ' not null,
 *     CONSTRAINT yugong_example_join_pk_id  PRIMARY   KEY (id)
 * );
 * 
 * create table join_name
 * (
 *     id NUMBER(11)  ,
 *     name  char(32) default ' ' not null,
 *     join_id NUMBER(11)  ,
 *     CONSTRAINT join_name_join_pk_id  PRIMARY   KEY (id)
 * );
 * 
 * mysql:
 * create table test.yugong_example_join
 * (
 *     id bigint(20) unsigned auto_increment,
 *     name varchar(32) ,
 *     alias_name varchar(32),
 *     CONSTRAINT yugong_example_join_pk_id  PRIMARY KEY (id)
 * );
 * </pre>
 *
 * @author agapple 2013-11-21 上午11:05:20
 */
public class YugongExampleJoinDataTranslator extends BackTableDataTranslator implements DataTranslator {

    public boolean translator(DataSource sourceDs, Record record) {
        ColumnValue idColum = record.getColumnByName("id");
        if (idColum != null) {
            // 需要根据test.id字段,和另一张表做join,提取到关联id记录的name字段,合并输出到一个目标表
            JdbcTemplate jdbcTemplate = new JdbcTemplate(sourceDs);
            String name_value = (String) jdbcTemplate.query("select NAME FROM JOIN_NAME WHERE JOIN_ID = "
                                                            + idColum.getValue().toString(), new ResultSetExtractor() {

                public Object extractData(ResultSet rs) throws SQLException, DataAccessException {
                    if (rs.next()) {
                        return rs.getString("NAME");
                    }

                    return null;
                }
            });

            ColumnMeta nameMeta = new ColumnMeta("name", Types.VARCHAR);
            ColumnValue nameColumn = new ColumnValue(nameMeta, name_value);
            record.addColumn(nameColumn);
        }
        return super.translator(record);
    }
}