private static EntityInfo configureEntityMapping() { EntityInfoBuilder<Trip> entityInfo = new EntityInfoBuilder<>(Trip.class); entityInfo.addField("bikeId"); entityInfo.addField("tripduration"); entityInfo.addColumn("startdate", FieldTypeEnum.STRING, trip -> toDate(trip.getStarttime())); entityInfo.addField("startStationId"); entityInfo.addColumn("stopdate", FieldTypeEnum.STRING, trip -> toDate(trip.getStoptime())); entityInfo.addField("endStationId"); entityInfo.addField("userType"); entityInfo.addColumn("age", FieldTypeEnum.INT, trip -> getAge(trip.getBirthYear())); entityInfo.addColumn("gender", FieldTypeEnum.STRING, trip -> getGender(trip.getGender())); return entityInfo.build(); }
public static EntityInfoBuilder<SomeEntity> createBuilderForSomeEntity() { EntityInfoBuilder<SomeEntity> entityBuilder = new EntityInfoBuilder<>(SomeEntity.class); entityBuilder.addFields("name", "age"); return entityBuilder; }
CitiBikeReader<Trip> reader = new CitiBikeReader<>("/tmp", str -> new TripParser(str)); EntityInfo entityInfo= new EntityInfoBuilder<>(Trip.class, "bike_trip") .addField("id", "id", true) //Identify field as autogenerated primary key .addField("tripDuration", "tripduration") .addField("startTime", "starttime") .addField("stopTime", "stoptime") .addField("startStation.id", "start_station_id") .addField("startStation.name", "start_station_name") .addField("startStation.latitude", "start_station_latitude") .addField("startStation.longitude", "start_station_longitude") .addField("endStation.id", "end_station_id") .addField("endStation.name", "end_station_name") .addField("endStation.latitude", "end_station_latitude") .addField("endStation.longitude", "end_station_longitude") .addField("bikeId", "bike_id") .addField("userType", "user_type") .addField("birthYear", "birth_year") .addField("gender", "gender") .build();
@Test public void childColumnNamesCanCollision() { EntityInfoBuilder<Collision> builder = new EntityInfoBuilder<>(Collision.class, "collision_entity"); builder.addField("city_name"); assertThrows(RuntimeException.class, () -> { builder.addField("city.name"); }); }
@Test public void canCreateSyntheticColumns() throws IOException { EntityInfoBuilder<SomeEntity> entityBuilder = new EntityInfoBuilder<>(SomeEntity.class); entityBuilder.addFields("name", "age"); entityBuilder.addColumn("adult", FieldTypeEnum.BOOLEAN, e -> e.getAge() >= 18); CsvConfiguration<SomeEntity> config = new CsvConfiguration<>(entityBuilder.build()); String result = writeCsvToString(config, new SomeEntity("John", 10), new SomeEntity("Amanda", 34)); assertEquals("name,age,adult" + ls + "John,10,false" + ls + "Amanda,34,true" + ls, result); }
CitiBikeReader<Map<String, Object>> reader = new CitiBikeReader<>("/tmp", str -> new TripParserToMap(str)); EntityInfo entityInfo= new EntityInfoBuilder<>(Map.class, "bike_trip") .addColumn("tripduration", INT, map -> map.get("TripDuration")) .addColumn("starttime", TIMESTAMP, map -> map.get("StartTime")) .addColumn("stoptime", TIMESTAMP, map -> map.get("StopTime")) .addColumn("start_station_id", INT, map -> map.get("StartStationId")) .addColumn("start_station_name", STRING, map -> map.get("StartStationName")) .addColumn("start_station_latitude", DOUBLE, map -> map.get("StartStationLatitude")) .addColumn("start_station_longitude", DOUBLE, map -> map.get("StartStationLongitude")) .addColumn("end_station_id", INT, map -> map.get("EndStationId")) .addColumn("end_station_name", STRING, map -> map.get("EndStationName")) .addColumn("end_station_latitude", DOUBLE, map -> map.get("EndStationLatitude")) .addColumn("end_station_longitude", DOUBLE, map -> map.get("EndStationLongitude")) .addColumn("bike_id", LONG, map -> map.get("BikeId")) .addColumn("user_type", STRING, map -> map.get("UserType")) .addColumn("birth_year", INT, map -> map.get("BirthYear")) .addColumn("gender", CHAR, map -> map.get("Gender")) .build();
@Test public void testColumnCapturedValue() { String value = "Some Value"; EntityInfoBuilder<SimpleEntity> builder = new EntityInfoBuilder<>(SimpleEntity.class, "simple_entity"); builder.addColumn("some_column", FieldTypeEnum.STRING, obj -> value); EntityInfoHelper entityInfo = new EntityInfoHelper(builder); ColumnInfo column = entityInfo.findColumn("some_column"); assertEquals("some_column", column.getColumnName()); assertEquals(FieldTypeEnum.STRING, column.getFieldType().getFieldType()); assertFalse(column.getFieldType().isPrimitive()); assertEquals(value, column.getAccessor().apply(simple)); }
public static void main(String[] args) throws FileNotFoundException, IOException { CitiBikeReader<Trip> reader = new CitiBikeReader<>("/tmp", str -> new TripParser(str)); EntityInfoBuilder<Trip> entityInfo = new EntityInfoBuilder<>(Trip.class); entityInfo.addFields("bikeId", "tripduration", "starttime", "startStationId", "stoptime", "endStationId", "userType", "birthYear", "gender"); CsvConfiguration<Trip> csvConfiguration = new Builder<Trip>(entityInfo.build()).build(); CsvWriter<Trip> csvWriter = new CsvWriter<>(csvConfiguration); try (FileOutputStream fos = new FileOutputStream(new File("/tmp/trips.csv"))) { reader.forEachCsvInZip(trips -> { try { csvWriter.writeAll(fos, trips); } catch (IOException e) { e.printStackTrace(); } }); } }
public EntityInfoBuilder<T> addFields(String... fieldPaths) { for (String fieldPath : fieldPaths) { addField(fieldPath); } return this; }
public EntityInfoBuilder<T> addColumn(String columnName, FieldTypeEnum fieldTypeEnum, Function<T, Object> accessor) { return addColumn(columnName, fieldTypeEnum, false, accessor); }
EntityInfoHelper(EntityInfoBuilder<?> builder) { entityInfo = builder.build(); }
@Test public void testNonExistentFieldInHierarchy() { EntityInfoBuilder<SimpleEntityEx> builder = new EntityInfoBuilder<>(SimpleEntityEx.class, "simple_entity"); assertThrows(NoSuchFieldException.class, () -> { builder.addField("noField", "someName"); }); }
@Test public void canChangeDefaultSerializer() throws IOException { EntityInfoBuilder<SomeEntity> entityBuilder = new EntityInfoBuilder<>(SomeEntity.class); entityBuilder.addFields("name", "age"); entityBuilder.addColumn("adult", FieldTypeEnum.BOOLEAN, e -> e.getAge() >= 18); BaseTypeSerializer serializer = new BaseTypeSerializer(); serializer.add(FieldTypeEnum.BOOLEAN, (obj) -> ((Boolean) obj).booleanValue() ? "1" : "0"); Builder<SomeEntity> config = new Builder<>(entityBuilder.build()); config.typeSerializer(serializer); String result = writeCsvToString(config.build(), new SomeEntity("John", 10), new SomeEntity("Amanda", 34)); assertEquals("name,age,adult" + ls + "John,10,0" + ls + "Amanda,34,1" + ls, result); }
CitiBikeReader<List<Object>> reader = new CitiBikeReader<>("/tmp", str -> new TripParserToMap(str)); EntityInfo entityInfo= new EntityInfoBuilder<>(List.class, "bike_trip") .addColumn("tripduration", INT, map -> map.get(0)) .addColumn("starttime", TIMESTAMP, map -> map.get(1)) .addColumn("stoptime", TIMESTAMP, map -> map.get(2)) .addColumn("start_station_id", INT, map -> map.get(3)) .addColumn("start_station_name", STRING, map -> map.get(4)) .addColumn("start_station_latitude", DOUBLE, map -> map.get(5)) .addColumn("start_station_longitude", DOUBLE, map -> map.get(6)) .addColumn("end_station_id", INT, map -> map.get(7)) .addColumn("end_station_name", STRING, map -> map.get(8)) .addColumn("end_station_latitude", DOUBLE, map -> map.get(9)) .addColumn("end_station_longitude", DOUBLE, map -> map.get(10)) .addColumn("bike_id", LONG, map -> map.get(11)) .addColumn("user_type", STRING, map -> map.get(12)) .addColumn("birth_year", INT, map -> map.get(13)) .addColumn("gender", CHAR, map -> map.get(14)) .build();
@Test public void testSimpleColumnDeclaration() { EntityInfoBuilder<SimpleEntity> builder = new EntityInfoBuilder<>(SimpleEntity.class, "simple_entity"); builder.addColumn("name", FieldTypeEnum.STRING, SimpleEntity::getName); EntityInfoHelper entityInfo = new EntityInfoHelper(builder); ColumnInfo column = entityInfo.findColumn("name"); assertEquals("name", column.getColumnName()); assertEquals(FieldTypeEnum.STRING, column.getFieldType().getFieldType()); assertFalse(column.getFieldType().isPrimitive()); assertEquals(simple.getName(), column.getAccessor().apply(simple)); }
public static void main(String[] args) throws FileNotFoundException, IOException { CitiBikeReader<Trip> reader = new CitiBikeReader<>("/tmp", str -> new TripParser(str)); EntityInfoBuilder<Trip> entityInfo = new EntityInfoBuilder<>(Trip.class); entityInfo.addFields("bikeId", "starttime", "startStationId", "stoptime", "endStationId", "userType"); CsvConfiguration<Trip> csvConfiguration = new Builder<>(Trip.class) .entityInfo(entityInfo.build()) .alwaysDelimitText(true) .fieldSeparator(';') .lineDelimiter("\n") .textDelimiter('\'') .header(false) .build(); CsvWriter<Trip> csvWriter = new CsvWriter<>(csvConfiguration); try (FileOutputStream fos = new FileOutputStream(new File("/tmp/trips.csv"))) { reader.forEachCsvInZip(trips -> { try { csvWriter.writeAll(fos, trips); } catch (IOException e) { e.printStackTrace(); } }); } }
public EntityInfoBuilder<T> addField(String fieldPath, String columnName) { return addField(fieldPath, columnName, false); }
public EntityInfoBuilder<T> addColumn(String columnName, FieldTypeEnum fieldTypeEnum, boolean primitive, Function<T, Object> accessor) { return addColumn(columnName, fieldTypeEnum, primitive, false, accessor); }
@Test public void emptyCollectionOnlyGeneratesHeader() throws IOException { CsvConfiguration<SomeEntity> config = new CsvConfiguration<>(createBuilderForSomeEntity().build()); String result = writeCsvToString(config, Collections.emptyList()); assertEquals("name,age" + ls, result); }