GP: Add Format Custom to External Table DDL generation

上级 e51a49aa
......@@ -35,7 +35,8 @@ import java.util.stream.Collectors;
public class GreenplumExternalTable extends PostgreTableRegular {
public enum FormatType {
c("CSV"),
t("TEXT");
t("TEXT"),
b("CUSTOM");
private String formatType;
......@@ -148,7 +149,8 @@ public class GreenplumExternalTable extends PostgreTableRegular {
ddlBuilder.append("\n) " + determineExecutionLocation() + "\n");
}
ddlBuilder.append("FORMAT '" + this.getFormatType().getValue() + "' ( " + this.getFormatOptions() + " )");
ddlBuilder.append("FORMAT '" + this.getFormatType().getValue() + "' ( "
+ generateFormatOptions(this.getFormatType(), this.getFormatOptions()) + " )");
if (this.getEncoding() != null && this.getEncoding().length() > 0) {
ddlBuilder.append("\nENCODING '" + this.getEncoding() + "'");
......@@ -161,6 +163,15 @@ public class GreenplumExternalTable extends PostgreTableRegular {
return ddlBuilder.toString();
}
private String generateFormatOptions(FormatType formatType, String formatOptions) {
if(formatType.equals(FormatType.b)){
String[] formatSpecTokens = formatOptions.split(" ");
String formatterSpec = formatSpecTokens.length >= 2 ? formatSpecTokens[1] : "";
return "FORMATTER=" + formatterSpec;
}
return formatOptions;
}
private String determineExecutionLocation() {
if (this.getExecLocation() != null && this.getExecLocation().equalsIgnoreCase("MASTER_ONLY")) {
return "ON MASTER";
......
......@@ -263,6 +263,29 @@ public class GreenplumExternalTableTest {
Assert.assertEquals(expectedDDL, table.generateDDL(monitor));
}
@Test
public void generateDDL_whenTableHasACustomFormatType_returnsDDLStringWithACustomFormat()
throws DBException, SQLException {
PostgreTableColumn mockPostgreTableColumn = mockDbColumn("column1", "int4", 1);
List<PostgreTableColumn> tableColumns = Collections.singletonList(mockPostgreTableColumn);
Mockito.when(mockResults.getString("fmttype")).thenReturn("b");
Mockito.when(mockResults.getString("fmtopts")).thenReturn("FORMATTER 'formatter_export_s'");
GreenplumExternalTable table = new GreenplumExternalTable(mockSchema, mockResults);
addMockColumnsToTableCache(tableColumns, table);
String expectedDDL =
"CREATE EXTERNAL TABLE sampleDatabase.sampleSchema.sampleTable (\n\tcolumn1 int4\n)\n" +
"LOCATION (\n" +
"\t'gpfdist://filehost:8081/*.txt'\n" +
") ON ALL\n" +
"FORMAT 'CUSTOM' ( FORMATTER='formatter_export_s' )\n" +
"ENCODING 'UTF8'";
Assert.assertEquals(expectedDDL, table.generateDDL(monitor));
}
private PostgreTableColumn mockDbColumn(String columnName, String columnType, int ordinalPosition) {
PostgreTableColumn mockPostgreTableColumn = Mockito.mock(PostgreTableColumn.class);
Mockito.when(mockPostgreTableColumn.getName()).thenReturn(columnName);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册