add settings to file upload
This makes it possible to define properties for the uploaded CSV files. Currently we can define the separator and which columns are to be ignored.
This commit is contained in:
@@ -8,37 +8,54 @@ import java.util.Set;
|
||||
import org.lucares.utils.Preconditions;
|
||||
|
||||
public class CsvReaderSettings {
|
||||
private final byte separator;
|
||||
private byte separator;
|
||||
|
||||
private final Set<String> ignoreColumnNames = new HashSet<String>();
|
||||
private Set<String> ignoreColumnNames = new HashSet<String>();
|
||||
|
||||
public CsvReaderSettings(final byte separator, final String... ignoreColumnNames) {
|
||||
this(separator, List.of(ignoreColumnNames));
|
||||
public CsvReaderSettings() {
|
||||
separator = ',';
|
||||
}
|
||||
|
||||
public CsvReaderSettings(final char separator, final String... ignoreColumnNames) {
|
||||
this(separator, List.of(ignoreColumnNames));
|
||||
private CsvReaderSettings(final byte separator, final Collection<String> ignoreColumns) {
|
||||
|
||||
this.separator = separator;
|
||||
this.ignoreColumnNames.addAll(ignoreColumns);
|
||||
}
|
||||
|
||||
public CsvReaderSettings(final char separator, final Collection<String> ignoreColumnNames) {
|
||||
this((byte) separator, ignoreColumnNames);
|
||||
public static CsvReaderSettings create(final byte separator, final String... ignoreColumnNames) {
|
||||
return new CsvReaderSettings(separator, List.of(ignoreColumnNames));
|
||||
}
|
||||
|
||||
public static CsvReaderSettings create(final char separator, final String... ignoreColumnNames) {
|
||||
return CsvReaderSettings.create(separator, List.of(ignoreColumnNames));
|
||||
}
|
||||
|
||||
public static CsvReaderSettings create(final char separator, final Collection<String> ignoreColumnNames) {
|
||||
Preconditions.checkTrue(separator == (byte) separator,
|
||||
"Only separators that fulfill separator == (byte)separator are supported. "
|
||||
+ "This restriction is because the parsing algorithm skips the overhead of "
|
||||
+ "translating bytes to characters.");
|
||||
}
|
||||
|
||||
public CsvReaderSettings(final byte separator, final Collection<String> ignoreColumns) {
|
||||
|
||||
this.separator = separator;
|
||||
this.ignoreColumnNames.addAll(ignoreColumns);
|
||||
return new CsvReaderSettings((byte) separator, ignoreColumnNames);
|
||||
}
|
||||
|
||||
public byte getSeparator() {
|
||||
return separator;
|
||||
}
|
||||
|
||||
public void setSeparator(final byte separator) {
|
||||
this.separator = separator;
|
||||
}
|
||||
|
||||
public Set<String> getIgnoreColumnNames() {
|
||||
return ignoreColumnNames;
|
||||
}
|
||||
|
||||
public void setIgnoreColumnNames(final Set<String> ignoreColumnNames) {
|
||||
this.ignoreColumnNames = ignoreColumnNames;
|
||||
}
|
||||
|
||||
public boolean isIgnoredColumn(final String columnName) {
|
||||
return ignoreColumnNames.contains(columnName);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -65,7 +65,8 @@ public final class IngestionHandler implements Callable<Void> {
|
||||
handleInputStream(gzip);
|
||||
} else {
|
||||
in.reset();
|
||||
final CsvToEntryTransformer csvTransformer = new CsvToEntryTransformer(queue, new CsvReaderSettings(','));
|
||||
final CsvToEntryTransformer csvTransformer = new CsvToEntryTransformer(queue,
|
||||
CsvReaderSettings.create(','));
|
||||
csvTransformer.readCSV(in);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,6 +54,7 @@ import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import org.springframework.web.bind.annotation.ResponseStatus;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
@@ -322,13 +323,14 @@ public class PdbController implements HardcodedValues, PropertyKeys {
|
||||
return result;
|
||||
}
|
||||
|
||||
@PostMapping(path = "/data")
|
||||
@PostMapping(path = "/data", consumes = MediaType.MULTIPART_MIXED_VALUE)
|
||||
@ResponseBody
|
||||
@ResponseStatus(code = HttpStatus.CREATED)
|
||||
public String handleCsvFileUpload(@RequestParam("file") final MultipartFile[] files)
|
||||
public String handleCsvFileUpload(@RequestParam("file") final MultipartFile[] files,
|
||||
@RequestPart("settings") final CsvReaderSettings csvReaderSettings)
|
||||
throws IllegalStateException, IOException {
|
||||
|
||||
csvUploadHandler.ingest(List.of(files), new CsvReaderSettings(','));
|
||||
csvUploadHandler.ingest(List.of(files), csvReaderSettings);
|
||||
return ""; // return value might become a job id that can be used to cancel, or observe
|
||||
// status
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user