package com.tresata.cascading.opencsv;
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
import java.util.Properties;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.mapred.JobConf;
import cascading.flow.FlowProcess;
import cascading.flow.hadoop.HadoopFlowConnector;
import cascading.flow.hadoop.HadoopFlowProcess;
import cascading.pipe.Pipe;
import cascading.pipe.Each;
import cascading.operation.Debug;
import cascading.tap.hadoop.Hfs;
import cascading.tap.Tap;
import cascading.tap.SinkMode;
import cascading.tuple.Fields;
import cascading.tuple.TupleEntryIterator;
import cascading.tuple.Tuple;
import org.junit.Test;
import static org.junit.Assert.assertTrue;
public class OpenCsvSchemeTest {
static final String DATA_DIR = "test/data";
static final String COMPARE_DIR = "test/compare";
static final String TMP_DIR = "tmp";
public static boolean compareTaps(final Tap source1, final Tap source2, final Configuration conf) throws IOException {
final FlowProcess flowProcess1 = new HadoopFlowProcess(new JobConf(conf));
source1.getScheme().retrieveSourceFields(flowProcess1, source1);
final TupleEntryIterator iter1 = source1.openForRead(new HadoopFlowProcess(new JobConf(conf)));
final FlowProcess flowProcess2 = new HadoopFlowProcess(new JobConf(conf));
source2.getScheme().retrieveSourceFields(flowProcess2, source2);
final TupleEntryIterator iter2 = source2.openForRead(new HadoopFlowProcess(new JobConf(conf)));
if (!iter1.getFields().equals(iter2.getFields()))
return false;
List<Tuple> list1 = new ArrayList<Tuple>();
while (iter1.hasNext())
list1.add(new Tuple(iter1.next().getTuple()));
iter1.close();
Collections.sort(list1);
List<Tuple> list2 = new ArrayList<Tuple>();
while (iter2.hasNext())
list2.add(new Tuple(iter2.next().getTuple()));
iter2.close();
Collections.sort(list2);
return list1.equals(list2);
}
@Test
public void testWithHeader() throws Exception {
final String inputFile = "quoted_header.csv";
final String outputDir = "quoted_header";
final String compareFile = "quoted_header.csv";
final Properties props = new Properties();
final Configuration conf = new Configuration();
final Tap source = new Hfs(new OpenCsvScheme(), DATA_DIR + "/" + inputFile, SinkMode.KEEP);
final Tap sink = new Hfs(new OpenCsvScheme(), TMP_DIR + "/" + outputDir, SinkMode.REPLACE);
final Pipe pipe = new Each(new Pipe("test"), new Debug());
new HadoopFlowConnector(props).connect(source, sink, pipe).complete();
final Tap compare = new Hfs(new OpenCsvScheme(), COMPARE_DIR + "/" + compareFile, SinkMode.KEEP);
assertTrue(compareTaps(sink, compare, conf) == true);
}
@Test
public void testHeaderless() throws Exception {
final String inputFile = "quoted_headerless.csv";
final String outputDir = "quoted_headerless";
final String compareFile = "quoted_headerless.csv";
final Properties props = new Properties();
final Configuration conf = new Configuration();
final Tap source = new Hfs(new OpenCsvScheme(new Fields("id", "product", "descr")), DATA_DIR + "/" + inputFile, SinkMode.KEEP);
final Tap sink = new Hfs(new OpenCsvScheme(new Fields("id", "product", "descr")), TMP_DIR + "/" + outputDir, SinkMode.REPLACE);
final Pipe pipe = new Each(new Pipe("test"), new Debug());
new HadoopFlowConnector(props).connect(source, sink, pipe).complete();
final Tap compare = new Hfs(new OpenCsvScheme(new Fields("id", "product", "descr")), COMPARE_DIR + "/" + compareFile, SinkMode.KEEP);
assertTrue(compareTaps(sink, compare, conf) == true);
}
}