@SuppressWarnings("unchecked") public EntityInfoBuilder<T> addColumn(String columnName, EntityFieldType fieldType, Function<T, Object> accessor) { return addColumn(new ColumnInfo(columnName, fieldType, (Function<Object, Object>) accessor)); }
private void add(BufferedWriter writer, T entity) throws IOException { for (int i = 0; i < columns.size(); i++) { ColumnInfo column = columns.get(i); Object value = column.getAccessor().apply(entity); if (value != null) { String valueStr = typeSerializer.toString(value, column.getFieldType()); String escapedValue = csvEscaper.escapeAndDelimite(valueStr); writer.write(escapedValue); } else if (config.isAlwaysDelimitText()) { writer.write(emptyText); } if (i < columns.size() - 1) { writer.write(config.getFieldSeparator()); } } writer.write(config.getLineDelimiter()); }
private String getPrimaryKey(List<ColumnInfo> columns) { Optional<ColumnInfo> id = columns.stream().filter(col -> col.getFieldType().isIdentityId()).findFirst(); return id.map(col -> ", PRIMARY KEY (" + col.getColumnName() + ")").orElse(""); }
@Test public void testExistentPathField() { EntityInfoBuilder<SimpleEntity> builder = new EntityInfoBuilder<>(SimpleEntity.class, "simple_entity"); builder.addField("city.name", "city_name"); EntityInfoHelper entityInfo = new EntityInfoHelper(builder); ColumnInfo column = entityInfo.findColumn("city_name"); assertEquals("city_name", column.getColumnName()); assertEquals(FieldTypeEnum.STRING, column.getFieldType().getFieldType()); assertFalse(column.getFieldType().isPrimitive()); assertEquals(city.getName(), column.getAccessor().apply(simple)); }
@Test public void testAddMultipleFields() { EntityInfoBuilder<SimpleEntity> builder = new EntityInfoBuilder<>(SimpleEntity.class, "simple_entity"); builder.addFields("name", "birthDay"); EntityInfoHelper entityInfo = new EntityInfoHelper(builder); ColumnInfo columnName = entityInfo.findColumn("name"); assertEquals("name", columnName.getColumnName()); assertEquals(simple.getName(), columnName.getAccessor().apply(simple)); ColumnInfo columnBirthday = entityInfo.findColumn("birthday"); assertEquals("birthday", columnBirthday.getColumnName()); assertEquals(simple.getBirthDay(), columnBirthday.getAccessor().apply(simple)); }
private void validate(String columnName) { long count = columns.stream().filter(f -> f.getColumnName().equals(columnName)).count(); if (count > 0) { throw new RuntimeException("Column " + columnName + " declared more than one time"); } }
public List<ColumnInfo> getNotIdentityColumns() { return columns.stream().filter(f -> !f.getFieldType().isIdentityId()).collect(Collectors.toList()); }
@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)); }
@Test public void testImplicitColumnName() { EntityInfoBuilder<SimpleEntity> builder = new EntityInfoBuilder<>(SimpleEntity.class, "simple_entity"); builder.addField("birthDay"); EntityInfoHelper entityInfo = new EntityInfoHelper(builder); ColumnInfo column = entityInfo.findColumn("birthday"); assertEquals("birthday", column.getColumnName()); assertEquals(simple.getBirthDay(), column.getAccessor().apply(simple)); }
private void writeHeader(BufferedWriter writer, List<ColumnInfo> columns) throws IOException { for (int i = 0; i < columns.size(); i++) { ColumnInfo info = columns.get(i); writer.write(csvEscaper.escapeAndDelimite(info.getColumnName())); if (i < columns.size() - 1) { writer.write(config.getFieldSeparator()); } } writer.write(config.getLineDelimiter()); }
private String getAutoIncrement(ColumnInfo columnInfo) { EntityFieldType fieldType = columnInfo.getFieldType(); if (!fieldType.isIdentityId()) { return ""; } FieldTypeEnum type = fieldType.getFieldType(); switch (type) { case BYTE: case INT: case LONG: case SHORT: case BIGINTEGER: return " AUTO_INCREMENT"; default: logger.warn("Declared IDENTITY @Id strategy over non int type"); return ""; } }
@Test public void testExplicitDateField() { EntityInfoBuilder<SimpleEntity> builder = new EntityInfoBuilder<>(SimpleEntity.class, "simple_entity"); builder.addField("birthDay", "birthday", FieldTypeEnum.DATE); EntityInfoHelper entityInfo = new EntityInfoHelper(builder); ColumnInfo column = entityInfo.findColumn("birthday"); assertEquals("birthday", column.getColumnName()); assertEquals(FieldTypeEnum.DATE, column.getFieldType().getFieldType()); assertFalse(column.getFieldType().isPrimitive()); assertEquals(simple.getBirthDay(), column.getAccessor().apply(simple)); }
private String getPrimaryKey(List<ColumnInfo> columns) { Optional<ColumnInfo> id = columns.stream().filter(col -> col.getFieldType().isIdentityId()).findFirst(); return id.map(col -> ", PRIMARY KEY (`" + col.getColumnName() + "`)").orElse(""); }
@Override public <T> void add(StringContent stringContent, T entity) { for (int i = 0; i < columns.size(); i++) { ColumnInfo info = columns.get(i); Object value = info.getAccessor().apply(entity); if (value != null) { String valueStr = typeSerializer.toString(value, info.getFieldType()); String escapedValue = escaper.escapeForLoadFile(valueStr); stringContent.append(escapedValue); } else { stringContent.append("\\N"); } stringContent.append(FIELD_TERMINATED_CHAR); } stringContent.append(LINE_TERMINATED_CHAR); }
@Test public void testImplicitColumnNameComposed() { EntityInfoBuilder<SimpleEntity> builder = new EntityInfoBuilder<>(SimpleEntity.class, "simple_entity"); builder.addField("city.name"); EntityInfoHelper entityInfo = new EntityInfoHelper(builder); ColumnInfo column = entityInfo.findColumn("city_name"); assertEquals("city_name", column.getColumnName()); assertEquals(city.getName(), column.getAccessor().apply(simple)); }
public EntityInfo buildEntity() { ColumnInfo c1 = new ColumnInfo("column1", null, null); ColumnInfo c2 = new ColumnInfo("column2", null, null); return new EntityInfo(null, "simple_table", Arrays.asList(c1, c2)); }
public ColumnInfo findColumn(String columnName) { return entityInfo.getColumns().stream().filter(c -> c.getColumnName().equals(columnName)).findFirst().get(); }
@Test public void testExistentFieldInHierarchy() { EntityInfoBuilder<SimpleEntityEx> builder = new EntityInfoBuilder<>(SimpleEntityEx.class, "simple_entity"); builder.addField("height", "height"); EntityInfoHelper entityInfo = new EntityInfoHelper(builder); ColumnInfo column = entityInfo.findColumn("height"); assertEquals("height", column.getColumnName()); assertEquals(FieldTypeEnum.INT, column.getFieldType().getFieldType()); assertTrue(column.getFieldType().isPrimitive()); assertEquals(simpleEx.getHeight(), column.getAccessor().apply(simpleEx)); }
@Override public String createTableSentence(EntityInfo entityInfo) { StringBuilder sb = new StringBuilder("CREATE TABLE "); sb.append(entityInfo.getTableName()); sb.append(" ("); List<ColumnInfo> columns = entityInfo.getColumns(); for (int i = 0; i < columns.size(); i++) { ColumnInfo columnInfo = columns.get(i); String dbType = getDbType(columnInfo.getFieldType()); if (dbType == null) { throw new RuntimeException("Type not found for " + columnInfo.getFieldType().getFieldType().name()); } sb.append(columnInfo.getColumnName()).append(" "); sb.append(dbType); if (columnInfo.getFieldType().isPrimitive()) { sb.append(" NOT NULL"); } if (i < columns.size() - 1) { sb.append(", "); } } sb.append(getPrimaryKey(columns)); sb.append(")"); return sb.toString(); }
@Override public <T> void add(StringContent stringContent, T entity) { for (int i = 0; i < columns.size(); i++) { ColumnInfo info = columns.get(i); Object value = info.getAccessor().apply(entity); if (value != null) { String valueStr = typeSerializer.toString(value, info.getFieldType()); String escapedValue = escaper.escapeForStdIn(valueStr); stringContent.append(escapedValue); } else { stringContent.append("\\N"); } if (i < columns.size() - 1) { stringContent.append(DELIMITER_CHAR); } } stringContent.append(NEWLINE_CHAR); }