package com.xiaomi.infra.galaxy.client.io;
import com.xiaomi.infra.galaxy.api.io.RecordReader;
import com.xiaomi.infra.galaxy.api.io.RecordWriter;
import com.xiaomi.infra.galaxy.io.thrift.Compression;
import com.xiaomi.infra.galaxy.sds.thrift.DataType;
import com.xiaomi.infra.galaxy.sds.thrift.Datum;
import com.xiaomi.infra.galaxy.sds.thrift.DatumUtil;
import com.xiaomi.infra.galaxy.sds.thrift.SLFileType;
import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import static org.junit.Assert.assertEquals;
public class SDSRecordReaderWriterTest {
private static String[] cities = { "北京", "Beihai", "Dalian", "Dandong", "Fuzhou", "Guangzhou",
"Haikou", "Hankou", "Huangpu", "Jiujiang", "Lianyungang", "Nanjing", "Nantong", "Ningbo",
"Qingdao", "Qinhuangdao", "Rizhao", "Sanya", "Shanghai", "Shantou", "Shenzhen",
"Tianjin", "Weihai", "Wenzhou", "Xiamen", "Yangzhou", "Yantai" };
@Test
public void testSerialization() throws Exception {
Map<String, DataType> typeMap = new HashMap<String, DataType>();
typeMap.put("cityId", DataType.STRING);
typeMap.put("timestamp", DataType.INT64);
typeMap.put("score", DataType.DOUBLE);
typeMap.put("pm25", DataType.INT64);
List<Map<String, DataType>> typesList = new ArrayList<Map<String, DataType>>();
typesList.add(typeMap);
typesList.add(null);
Compression[] compressions = { Compression.NONE, Compression.SNAPPY };
int[] counts = { 0, 1, 10000 };
SLFileType[] fileTypes = { SLFileType.DATUM_MAP, SLFileType.RC_BASIC };
for (Map<String, DataType> types : typesList) {
for (Compression compression : compressions) {
for (SLFileType fileType : fileTypes) {
for (int count : counts) {
Random rand = new Random(0);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
RecordWriter<Map<String, Datum>> recordWriter = null;
try {
recordWriter = SDSRecordReaderWriterFactory.getRecordWriter(outputStream, types,
fileType, compression);
} catch (UnsupportedOperationException uoe) {
System.out.println(fileType + "." + compression + ":\tunsupported");
continue;
}
List<Map<String, Datum>> records = new ArrayList<Map<String, Datum>>();
for (int i = 0; i < count; i++) {
Date now = new Date();
Map<String, Datum> record = new HashMap<String, Datum>();
record.put("cityId", DatumUtil.toDatum(cities[i % cities.length]));
record.put("timestamp", DatumUtil.toDatum(now.getTime()));
record.put("score", DatumUtil.toDatum((double) rand.nextInt(100)));
if (rand.nextBoolean()) { // test null value
record.put("pm25", DatumUtil.toDatum((long) rand.nextInt(500)));
}
recordWriter.append(record);
records.add(record);
}
recordWriter.seal();
System.out.println(fileType + "." + compression + " file size:\t"
+ outputStream.size());
recordWriter.close();
InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
RecordReader<Map<String, Datum>> recordReader =
SDSRecordReaderWriterFactory.getRecordReader(inputStream);
List<Map<String, Datum>> actual = new ArrayList<Map<String, Datum>>();
while (recordReader.hasNext()) {
actual.add(recordReader.next());
}
recordReader.close();
assertEquals(records, actual);
}
}
}
}
}
}